Skip to content

Commit b78e956

Browse files
committed
Add quickcheck tests
1 parent 417b07b commit b78e956

File tree

7 files changed

+171
-0
lines changed

7 files changed

+171
-0
lines changed

compiler-rt/compiler-rt-cdylib/build.rs

+11
Original file line numberDiff line numberDiff 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() {

compiler-rt/compiler-rt-cdylib/src/lib.rs

+27
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,33 @@ declare!(___adddf3, __adddf3);
5858
declare!(___powisf2, __powisf2);
5959
declare!(___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"]
6289
fn eh_personality() {}
6390
#[lang = "panic_fmt"]

src/int/mul.rs

+24
Original file line numberDiff line numberDiff 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+
}

src/int/sdiv.rs

+26
Original file line numberDiff line numberDiff 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+
}

src/int/shift.rs

+36
Original file line numberDiff line numberDiff 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+
}

src/int/udiv.rs

+45
Original file line numberDiff line numberDiff 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+
}

src/qc.rs

+2
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,8 @@ macro_rules! arbitrary_large {
144144

145145
arbitrary_large!(I64: i64);
146146
arbitrary_large!(U64: u64);
147+
arbitrary_large!(I128: i128);
148+
arbitrary_large!(U128: u128);
147149

148150
macro_rules! arbitrary_float {
149151
($TY:ident : $ty:ident) => {

0 commit comments

Comments
 (0)