Skip to content

Commit 47b45d1

Browse files
author
Jorge Aparicio
committed
adjust the check! macro to accept AAPCS intrinsics
1 parent 57085be commit 47b45d1

File tree

7 files changed

+52
-34
lines changed

7 files changed

+52
-34
lines changed

src/float/add.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -203,14 +203,14 @@ mod tests {
203203
use qc::{F32, F64};
204204

205205
check! {
206-
fn __addsf3(f: extern fn(f32, f32) -> f32,
206+
fn __addsf3(f: extern "C" fn(f32, f32) -> f32,
207207
a: F32,
208208
b: F32)
209209
-> Option<F32> {
210210
Some(F32(f(a.0, b.0)))
211211
}
212212

213-
fn __adddf3(f: extern fn(f64, f64) -> f64,
213+
fn __adddf3(f: extern "C" fn(f64, f64) -> f64,
214214
a: F64,
215215
b: F64) -> Option<F64> {
216216
Some(F64(f(a.0, b.0)))

src/float/pow.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ mod tests {
3434
use qc::{I32, F32, F64};
3535

3636
check! {
37-
fn __powisf2(f: extern fn(f32, i32) -> f32,
37+
fn __powisf2(f: extern "C" fn(f32, i32) -> f32,
3838
a: F32,
3939
b: I32) -> Option<F32> {
4040
Some(F32(f(a.0, b.0)))
4141
}
4242

43-
fn __powidf2(f: extern fn(f64, i32) -> f64,
43+
fn __powidf2(f: extern "C" fn(f64, i32) -> f64,
4444
a: F64,
4545
b: I32) -> Option<F64> {
4646
Some(F64(f(a.0, b.0)))

src/int/mul.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -99,12 +99,12 @@ mod tests {
9999
use qc::{I32, I64, U64};
100100

101101
check! {
102-
fn __muldi3(f: extern fn(u64, u64) -> u64, a: U64, b: U64)
102+
fn __muldi3(f: extern "C" fn(u64, u64) -> u64, a: U64, b: U64)
103103
-> Option<u64> {
104104
Some(f(a.0, b.0))
105105
}
106106

107-
fn __mulosi4(f: extern fn(i32, i32, &mut i32) -> i32,
107+
fn __mulosi4(f: extern "C" fn(i32, i32, &mut i32) -> i32,
108108
a: I32,
109109
b: I32) -> Option<(i32, i32)> {
110110
let (a, b) = (a.0, b.0);
@@ -116,7 +116,7 @@ mod tests {
116116
Some((r, overflow))
117117
}
118118

119-
fn __mulodi4(f: extern fn(i64, i64, &mut i32) -> i64,
119+
fn __mulodi4(f: extern "C" fn(i64, i64, &mut i32) -> i64,
120120
a: I64,
121121
b: I64) -> Option<(i64, i32)> {
122122
let (a, b) = (a.0, b.0);
@@ -139,11 +139,11 @@ mod tests_i128 {
139139
use qc::I128;
140140

141141
check! {
142-
fn __multi3(f: extern fn(i128, i128) -> i128, a: I128, b: I128)
142+
fn __multi3(f: extern "C" fn(i128, i128) -> i128, a: I128, b: I128)
143143
-> Option<i128> {
144144
Some(f(a.0, b.0))
145145
}
146-
fn __muloti4(f: extern fn(i128, i128, &mut i32) -> i128,
146+
fn __muloti4(f: extern "C" fn(i128, i128, &mut i32) -> i128,
147147
a: I128,
148148
b: I128) -> Option<(i128, i32)> {
149149
let (a, b) = (a.0, b.0);

src/int/sdiv.rs

+23-8
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ mod tests {
9999
use qc::{U32, U64};
100100

101101
check! {
102-
fn __divdi3(f: extern fn(i64, i64) -> i64, n: U64, d: U64) -> Option<i64> {
102+
fn __divdi3(f: extern "C" fn(i64, i64) -> i64, n: U64, d: U64) -> Option<i64> {
103103
let (n, d) = (n.0 as i64, d.0 as i64);
104104
if d == 0 {
105105
None
@@ -108,7 +108,7 @@ mod tests {
108108
}
109109
}
110110

111-
fn __moddi3(f: extern fn(i64, i64) -> i64, n: U64, d: U64) -> Option<i64> {
111+
fn __moddi3(f: extern "C" fn(i64, i64) -> i64, n: U64, d: U64) -> Option<i64> {
112112
let (n, d) = (n.0 as i64, d.0 as i64);
113113
if d == 0 {
114114
None
@@ -117,7 +117,8 @@ mod tests {
117117
}
118118
}
119119

120-
fn __divmoddi4(f: extern fn(i64, i64, &mut i64) -> i64,
120+
#[cfg(target_arch = "arm")]
121+
fn __divmoddi4(f: extern "aapcs" fn(i64, i64, &mut i64) -> i64,
121122
n: U64,
122123
d: U64) -> Option<(i64, i64)> {
123124
let (n, d) = (n.0 as i64, d.0 as i64);
@@ -130,7 +131,21 @@ mod tests {
130131
}
131132
}
132133

133-
fn __divsi3(f: extern fn(i32, i32) -> i32,
134+
#[cfg(not(target_arch = "arm"))]
135+
fn __divmoddi4(f: extern "C" fn(i64, i64, &mut i64) -> i64,
136+
n: U64,
137+
d: U64) -> Option<(i64, i64)> {
138+
let (n, d) = (n.0 as i64, d.0 as i64);
139+
if d == 0 {
140+
None
141+
} else {
142+
let mut r = 0;
143+
let q = f(n, d, &mut r);
144+
Some((q, r))
145+
}
146+
}
147+
148+
fn __divsi3(f: extern "C" fn(i32, i32) -> i32,
134149
n: U32,
135150
d: U32) -> Option<i32> {
136151
let (n, d) = (n.0 as i32, d.0 as i32);
@@ -141,7 +156,7 @@ mod tests {
141156
}
142157
}
143158

144-
fn __modsi3(f: extern fn(i32, i32) -> i32,
159+
fn __modsi3(f: extern "C" fn(i32, i32) -> i32,
145160
n: U32,
146161
d: U32) -> Option<i32> {
147162
let (n, d) = (n.0 as i32, d.0 as i32);
@@ -152,7 +167,7 @@ mod tests {
152167
}
153168
}
154169

155-
fn __divmodsi4(f: extern fn(i32, i32, &mut i32) -> i32,
170+
fn __divmodsi4(f: extern "C" fn(i32, i32, &mut i32) -> i32,
156171
n: U32,
157172
d: U32) -> Option<(i32, i32)> {
158173
let (n, d) = (n.0 as i32, d.0 as i32);
@@ -176,7 +191,7 @@ mod tests_i128 {
176191
use qc::U128;
177192
check! {
178193

179-
fn __divti3(f: extern fn(i128, i128) -> i128, n: U128, d: U128) -> Option<i128> {
194+
fn __divti3(f: extern "C" fn(i128, i128) -> i128, n: U128, d: U128) -> Option<i128> {
180195
let (n, d) = (n.0 as i128, d.0 as i128);
181196
if d == 0 {
182197
None
@@ -185,7 +200,7 @@ mod tests_i128 {
185200
}
186201
}
187202

188-
fn __modti3(f: extern fn(i128, i128) -> i128, n: U128, d: U128) -> Option<i128> {
203+
fn __modti3(f: extern "C" fn(i128, i128) -> i128, n: U128, d: U128) -> Option<i128> {
189204
let (n, d) = (n.0 as i128, d.0 as i128);
190205
if d == 0 {
191206
None

src/int/shift.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ mod tests {
7979

8080
// NOTE We purposefully stick to `u32` for `b` here because we want "small" values (b < 64)
8181
check! {
82-
fn __ashldi3(f: extern fn(u64, u32) -> u64, a: U64, b: u32) -> Option<u64> {
82+
fn __ashldi3(f: extern "C" fn(u64, u32) -> u64, a: U64, b: u32) -> Option<u64> {
8383
let a = a.0;
8484
if b >= 64 {
8585
None
@@ -88,7 +88,7 @@ mod tests {
8888
}
8989
}
9090

91-
fn __ashrdi3(f: extern fn(i64, u32) -> i64, a: I64, b: u32) -> Option<i64> {
91+
fn __ashrdi3(f: extern "C" fn(i64, u32) -> i64, a: I64, b: u32) -> Option<i64> {
9292
let a = a.0;
9393
if b >= 64 {
9494
None
@@ -97,7 +97,7 @@ mod tests {
9797
}
9898
}
9999

100-
fn __lshrdi3(f: extern fn(u64, u32) -> u64, a: U64, b: u32) -> Option<u64> {
100+
fn __lshrdi3(f: extern "C" fn(u64, u32) -> u64, a: U64, b: u32) -> Option<u64> {
101101
let a = a.0;
102102
if b >= 64 {
103103
None
@@ -118,7 +118,7 @@ mod tests_i128 {
118118

119119
// NOTE We purposefully stick to `u32` for `b` here because we want "small" values (b < 64)
120120
check! {
121-
fn __ashlti3(f: extern fn(u128, u32) -> u128, a: U128, b: u32) -> Option<u128> {
121+
fn __ashlti3(f: extern "C" fn(u128, u32) -> u128, a: U128, b: u32) -> Option<u128> {
122122
let a = a.0;
123123
if b >= 64 {
124124
None
@@ -127,7 +127,7 @@ mod tests_i128 {
127127
}
128128
}
129129

130-
fn __ashrti3(f: extern fn(i128, u32) -> i128, a: I128, b: u32) -> Option<i128> {
130+
fn __ashrti3(f: extern "C" fn(i128, u32) -> i128, a: I128, b: u32) -> Option<i128> {
131131
let a = a.0;
132132
if b >= 64 {
133133
None
@@ -136,7 +136,7 @@ mod tests_i128 {
136136
}
137137
}
138138

139-
fn __lshrti3(f: extern fn(u128, u32) -> u128, a: U128, b: u32) -> Option<u128> {
139+
fn __lshrti3(f: extern "C" fn(u128, u32) -> u128, a: U128, b: u32) -> Option<u128> {
140140
let a = a.0;
141141
if b >= 128 {
142142
None

src/int/udiv.rs

+9-9
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ mod tests {
318318
use qc::{U32, U64};
319319

320320
check! {
321-
fn __udivdi3(f: extern fn(u64, u64) -> u64, n: U64, d: U64) -> Option<u64> {
321+
fn __udivdi3(f: extern "C" fn(u64, u64) -> u64, n: U64, d: U64) -> Option<u64> {
322322
let (n, d) = (n.0, d.0);
323323
if d == 0 {
324324
None
@@ -327,7 +327,7 @@ mod tests {
327327
}
328328
}
329329

330-
fn __umoddi3(f: extern fn(u64, u64) -> u64, n: U64, d: U64) -> Option<u64> {
330+
fn __umoddi3(f: extern "C" fn(u64, u64) -> u64, n: U64, d: U64) -> Option<u64> {
331331
let (n, d) = (n.0, d.0);
332332
if d == 0 {
333333
None
@@ -336,7 +336,7 @@ mod tests {
336336
}
337337
}
338338

339-
fn __udivmoddi4(f: extern fn(u64, u64, Option<&mut u64>) -> u64,
339+
fn __udivmoddi4(f: extern "C" fn(u64, u64, Option<&mut u64>) -> u64,
340340
n: U64,
341341
d: U64) -> Option<(u64, u64)> {
342342
let (n, d) = (n.0, d.0);
@@ -349,7 +349,7 @@ mod tests {
349349
}
350350
}
351351

352-
fn __udivsi3(f: extern fn(u32, u32) -> u32, n: U32, d: U32) -> Option<u32> {
352+
fn __udivsi3(f: extern "C" fn(u32, u32) -> u32, n: U32, d: U32) -> Option<u32> {
353353
let (n, d) = (n.0, d.0);
354354
if d == 0 {
355355
None
@@ -358,7 +358,7 @@ mod tests {
358358
}
359359
}
360360

361-
fn __umodsi3(f: extern fn(u32, u32) -> u32, n: U32, d: U32) -> Option<u32> {
361+
fn __umodsi3(f: extern "C" fn(u32, u32) -> u32, n: U32, d: U32) -> Option<u32> {
362362
let (n, d) = (n.0, d.0);
363363
if d == 0 {
364364
None
@@ -367,7 +367,7 @@ mod tests {
367367
}
368368
}
369369

370-
fn __udivmodsi4(f: extern fn(u32, u32, Option<&mut u32>) -> u32,
370+
fn __udivmodsi4(f: extern "C" fn(u32, u32, Option<&mut u32>) -> u32,
371371
n: U32,
372372
d: U32) -> Option<(u32, u32)> {
373373
let (n, d) = (n.0, d.0);
@@ -391,7 +391,7 @@ mod tests_i128 {
391391
use qc::U128;
392392

393393
check! {
394-
fn __udivti3(f: extern fn(u128, u128) -> u128,
394+
fn __udivti3(f: extern "C" fn(u128, u128) -> u128,
395395
n: U128,
396396
d: U128) -> Option<u128> {
397397
let (n, d) = (n.0, d.0);
@@ -402,7 +402,7 @@ mod tests_i128 {
402402
}
403403
}
404404

405-
fn __umodti3(f: extern fn(u128, u128) -> u128,
405+
fn __umodti3(f: extern "C" fn(u128, u128) -> u128,
406406
n: U128,
407407
d: U128) -> Option<u128> {
408408
let (n, d) = (n.0, d.0);
@@ -413,7 +413,7 @@ mod tests_i128 {
413413
}
414414
}
415415

416-
fn __udivmodti4(f: extern fn(u128, u128, Option<&mut u128>) -> u128,
416+
fn __udivmodti4(f: extern "C" fn(u128, u128, Option<&mut u128>) -> u128,
417417
n: U128,
418418
d: U128) -> Option<u128> {
419419
let (n, d) = (n.0, d.0);

src/qc.rs

+5-2
Original file line numberDiff line numberDiff line change
@@ -240,15 +240,17 @@ arbitrary_float!(F64: f64);
240240
// fails.
241241
macro_rules! check {
242242
($(
243-
fn $name:ident($f:ident: extern fn($($farg:ty),*) -> $fret:ty,
243+
$(#[$cfg:meta])*
244+
fn $name:ident($f:ident: extern $abi:tt fn($($farg:ty),*) -> $fret:ty,
244245
$($arg:ident: $t:ty),*)
245246
-> Option<$ret:ty>
246247
{
247248
$($code:tt)*
248249
}
249250
)*) => (
250251
$(
251-
fn $name($f: extern fn($($farg),*) -> $fret,
252+
$(#[$cfg])*
253+
fn $name($f: extern $abi fn($($farg),*) -> $fret,
252254
$($arg: $t),*) -> Option<$ret> {
253255
$($code)*
254256
}
@@ -260,6 +262,7 @@ macro_rules! check {
260262
use quickcheck::TestResult;
261263

262264
$(
265+
$(#[$cfg])*
263266
#[test]
264267
fn $name() {
265268
fn my_check($($arg:$t),*) -> TestResult {

0 commit comments

Comments
 (0)