File tree 7 files changed +171
-0
lines changed
compiler-rt/compiler-rt-cdylib
7 files changed +171
-0
lines changed Original file line number Diff line number Diff line change @@ -60,6 +60,17 @@ fn main() {
60
60
"addsf3.c" ,
61
61
"powidf2.c" ,
62
62
"powisf2.c" ,
63
+ // 128 bit integers
64
+ "lshrti3.c" ,
65
+ "modti3.c" ,
66
+ "muloti4.c" ,
67
+ "multi3.c" ,
68
+ "udivmodti4.c" ,
69
+ "udivti3.c" ,
70
+ "umodti3.c" ,
71
+ "ashlti3.c" ,
72
+ "ashrti3.c" ,
73
+ "divti3.c" ,
63
74
] ) ;
64
75
65
76
for src in sources. files . iter ( ) {
Original file line number Diff line number Diff line change @@ -58,6 +58,33 @@ declare!(___adddf3, __adddf3);
58
58
declare ! ( ___powisf2, __powisf2) ;
59
59
declare ! ( ___powidf2, __powidf2) ;
60
60
61
+ #[ cfg( all( not( windows) , target_pointer_width="64" ) ) ]
62
+ pub mod int_128 {
63
+ extern {
64
+ fn __lshrti3 ( ) ;
65
+ fn __modti3 ( ) ;
66
+ fn __muloti4 ( ) ;
67
+ fn __multi3 ( ) ;
68
+ fn __udivmodti4 ( ) ;
69
+ fn __udivti3 ( ) ;
70
+ fn __umodti3 ( ) ;
71
+ fn __ashlti3 ( ) ;
72
+ fn __ashrti3 ( ) ;
73
+ fn __divti3 ( ) ;
74
+ }
75
+
76
+ declare ! ( ___lshrti3, __lshrti3) ;
77
+ declare ! ( ___modti3, __modti3) ;
78
+ declare ! ( ___muloti4, __muloti4) ;
79
+ declare ! ( ___multi3, __multi3) ;
80
+ declare ! ( ___udivmodti4, __udivmodti4) ;
81
+ declare ! ( ___udivti3, __udivti3) ;
82
+ declare ! ( ___umodti3, __umodti3) ;
83
+ declare ! ( ___ashlti3, __ashlti3) ;
84
+ declare ! ( ___ashrti3, __ashrti3) ;
85
+ declare ! ( ___divti3, __divti3) ;
86
+ }
87
+
61
88
#[ lang = "eh_personality" ]
62
89
fn eh_personality ( ) { }
63
90
#[ lang = "panic_fmt" ]
Original file line number Diff line number Diff line change @@ -120,3 +120,27 @@ mod tests {
120
120
}
121
121
}
122
122
}
123
+
124
+ #[ cfg( test) ]
125
+ #[ cfg( all( not( windows) , target_pointer_width="64" ) ) ]
126
+ mod tests_i128 {
127
+ use qc:: I128 ;
128
+
129
+ check ! {
130
+ fn __multi3( f: extern fn ( i128 , i128 ) -> i128 , a: I128 , b: I128 )
131
+ -> Option <i128 > {
132
+ Some ( f( a. 0 , b. 0 ) )
133
+ }
134
+ fn __muloti4( f: extern fn ( i128 , i128 , & mut i32 ) -> i128 ,
135
+ a: I128 ,
136
+ b: I128 ) -> Option <( i128 , i32 ) > {
137
+ let ( a, b) = ( a. 0 , b. 0 ) ;
138
+ let mut overflow = 2 ;
139
+ let r = f( a, b, & mut overflow) ;
140
+ if overflow != 0 && overflow != 1 {
141
+ return None
142
+ }
143
+ Some ( ( r, overflow) )
144
+ }
145
+ }
146
+ }
Original file line number Diff line number Diff line change @@ -162,3 +162,29 @@ mod tests {
162
162
}
163
163
}
164
164
}
165
+
166
+ #[ cfg( test) ]
167
+ #[ cfg( all( not( windows) , target_pointer_width="64" ) ) ]
168
+ mod tests_i128 {
169
+ use qc:: U128 ;
170
+
171
+ check ! {
172
+ fn __divti3( f: extern fn ( i128 , i128 ) -> i128 , n: U128 , d: U128 ) -> Option <i128 > {
173
+ let ( n, d) = ( n. 0 as i128 , d. 0 as i128 ) ;
174
+ if d == 0 {
175
+ None
176
+ } else {
177
+ Some ( f( n, d) )
178
+ }
179
+ }
180
+
181
+ fn __modti3( f: extern fn ( i128 , i128 ) -> i128 , n: U128 , d: U128 ) -> Option <i128 > {
182
+ let ( n, d) = ( n. 0 as i128 , d. 0 as i128 ) ;
183
+ if d == 0 {
184
+ None
185
+ } else {
186
+ Some ( f( n, d) )
187
+ }
188
+ }
189
+ }
190
+ }
Original file line number Diff line number Diff line change @@ -103,3 +103,39 @@ mod tests {
103
103
}
104
104
}
105
105
}
106
+
107
+ #[ cfg( test) ]
108
+ #[ cfg( all( not( windows) , target_pointer_width="64" ) ) ]
109
+ mod tests_i128 {
110
+ use qc:: { I128 , U128 } ;
111
+
112
+ // NOTE We purposefully stick to `u32` for `b` here because we want "small" values (b < 64)
113
+ check ! {
114
+ fn __ashlti3( f: extern fn ( u128 , u32 ) -> u128 , a: U128 , b: u32 ) -> Option <u128 > {
115
+ let a = a. 0 ;
116
+ if b >= 64 {
117
+ None
118
+ } else {
119
+ Some ( f( a, b) )
120
+ }
121
+ }
122
+
123
+ fn __ashrti3( f: extern fn ( i128 , u32 ) -> i128 , a: I128 , b: u32 ) -> Option <i128 > {
124
+ let a = a. 0 ;
125
+ if b >= 64 {
126
+ None
127
+ } else {
128
+ Some ( f( a, b) )
129
+ }
130
+ }
131
+
132
+ fn __lshrti3( f: extern fn ( u128 , u32 ) -> u128 , a: U128 , b: u32 ) -> Option <u128 > {
133
+ let a = a. 0 ;
134
+ if b >= 128 {
135
+ None
136
+ } else {
137
+ Some ( f( a, b) )
138
+ }
139
+ }
140
+ }
141
+ }
Original file line number Diff line number Diff line change @@ -380,3 +380,48 @@ mod tests {
380
380
}
381
381
}
382
382
}
383
+
384
+ #[ cfg( test) ]
385
+ #[ cfg( all( not( windows) , target_pointer_width="64" ) ) ]
386
+ mod tests_i128 {
387
+ use qc:: U128 ;
388
+
389
+ check ! {
390
+ fn __udivti3( f: extern fn ( u128 , u128 ) -> u128 ,
391
+ n: U128 ,
392
+ d: U128 ) -> Option <u128 > {
393
+ let ( n, d) = ( n. 0 , d. 0 ) ;
394
+ if d == 0 {
395
+ None
396
+ } else {
397
+ Some ( f( n, d) )
398
+ }
399
+ }
400
+
401
+ fn __umodti3( f: extern fn ( u128 , u128 ) -> u128 ,
402
+ n: U128 ,
403
+ d: U128 ) -> Option <u128 > {
404
+ let ( n, d) = ( n. 0 , d. 0 ) ;
405
+ if d == 0 {
406
+ None
407
+ } else {
408
+ Some ( f( n, d) )
409
+ }
410
+ }
411
+
412
+ fn __udivmodti4( f: extern fn ( u128 , u128 , Option <& mut u128 >) -> u128 ,
413
+ n: U128 ,
414
+ d: U128 ) -> Option <u128 > {
415
+ let ( n, d) = ( n. 0 , d. 0 ) ;
416
+ if d == 0 {
417
+ None
418
+ } else {
419
+ // FIXME fix the segfault when the remainder is requested
420
+ /*let mut r = 0;
421
+ let q = f(n, d, Some(&mut r));
422
+ Some((q, r))*/
423
+ Some ( f( n, d, None ) )
424
+ }
425
+ }
426
+ }
427
+ }
Original file line number Diff line number Diff line change @@ -144,6 +144,8 @@ macro_rules! arbitrary_large {
144
144
145
145
arbitrary_large ! ( I64 : i64 ) ;
146
146
arbitrary_large ! ( U64 : u64 ) ;
147
+ arbitrary_large ! ( I128 : i128 ) ;
148
+ arbitrary_large ! ( U128 : u128 ) ;
147
149
148
150
macro_rules! arbitrary_float {
149
151
( $TY: ident : $ty: ident) => {
You can’t perform that action at this time.
0 commit comments