File tree Expand file tree Collapse file tree 7 files changed +171
-0
lines changed
compiler-rt/compiler-rt-cdylib Expand file tree Collapse file tree 7 files changed +171
-0
lines changed Original file line number Diff line number Diff line change @@ -60,6 +60,17 @@ fn main() {
6060 "addsf3.c" ,
6161 "powidf2.c" ,
6262 "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" ,
6374 ] ) ;
6475
6576 for src in sources. files . iter ( ) {
Original file line number Diff line number Diff line change @@ -58,6 +58,33 @@ declare!(___adddf3, __adddf3);
5858declare ! ( ___powisf2, __powisf2) ;
5959declare ! ( ___powidf2, __powidf2) ;
6060
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+
6188#[ lang = "eh_personality" ]
6289fn eh_personality ( ) { }
6390#[ lang = "panic_fmt" ]
Original file line number Diff line number Diff line change @@ -120,3 +120,27 @@ mod tests {
120120 }
121121 }
122122}
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 {
162162 }
163163 }
164164}
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 {
103103 }
104104 }
105105}
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 {
380380 }
381381 }
382382}
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 {
144144
145145arbitrary_large ! ( I64 : i64 ) ;
146146arbitrary_large ! ( U64 : u64 ) ;
147+ arbitrary_large ! ( I128 : i128 ) ;
148+ arbitrary_large ! ( U128 : u128 ) ;
147149
148150macro_rules! arbitrary_float {
149151 ( $TY: ident : $ty: ident) => {
You can’t perform that action at this time.
0 commit comments