Skip to content

Commit 54cfe35

Browse files
committed
Add addcarry/subborrow intrinsics to platform_intrinsics
All of these LLVM intrinsics return aggregates, so they need to be compiler defined!
1 parent b890d51 commit 54cfe35

19 files changed

+88
-393
lines changed

src/librustc_platform_intrinsics/nvptx.rs

Whitespace-only changes.

src/librustc_platform_intrinsics/x86.rs

+20
Original file line numberDiff line numberDiff line change
@@ -44,5 +44,25 @@ pub fn find(name: &str) -> Option<Intrinsic> {
4444
output: &Type::Aggregate(false, &[&::U64, &::I32]),
4545
definition: Named("llvm.x86.rdseed.64")
4646
},
47+
"_addcarry_u32" => Intrinsic {
48+
inputs: &[&::I8, &::I32, &::I32],
49+
output: &Type::Aggregate(false, &[&::I8, &::I32]),
50+
definition: Named("llvm.x86.addcarry.32"),
51+
},
52+
"_addcarry_u64" => Intrinsic {
53+
inputs: &[&::I8, &::I64, &::I64],
54+
output: &Type::Aggregate(false, &[&::I8, &::I64]),
55+
definition: Named("llvm.x86.addcarry.64"),
56+
},
57+
"_subborrow_u32" => Intrinsic {
58+
inputs: &[&::I8, &::I32, &::I32],
59+
output: &Type::Aggregate(false, &[&::I8, &::I32]),
60+
definition: Named("llvm.x86.subborrow.32"),
61+
},
62+
"_subborrow_u64" => Intrinsic {
63+
inputs: &[&::I8, &::I64, &::I64],
64+
output: &Type::Aggregate(false, &[&::I8, &::I64]),
65+
definition: Named("llvm.x86.subborrow.64"),
66+
},
4767
}
4868
}

src/librustc_typeck/diagnostics.rs

+5-174
Original file line numberDiff line numberDiff line change
@@ -3379,180 +3379,6 @@ extern "platform-intrinsic" {
33793379
```
33803380
"##,
33813381

3382-
E0440: r##"
3383-
A platform-specific intrinsic function has the wrong number of type
3384-
parameters. Erroneous code example:
3385-
3386-
```compile_fail,E0440
3387-
#![feature(repr_simd)]
3388-
#![feature(platform_intrinsics)]
3389-
3390-
#[repr(simd)]
3391-
struct f64x2(f64, f64);
3392-
3393-
extern "platform-intrinsic" {
3394-
fn x86_mm_movemask_pd<T>(x: f64x2) -> i32;
3395-
// error: platform-specific intrinsic has wrong number of type
3396-
// parameters
3397-
}
3398-
```
3399-
3400-
Please refer to the function declaration to see if it corresponds
3401-
with yours. Example:
3402-
3403-
```
3404-
#![feature(repr_simd)]
3405-
#![feature(platform_intrinsics)]
3406-
3407-
#[repr(simd)]
3408-
struct f64x2(f64, f64);
3409-
3410-
extern "platform-intrinsic" {
3411-
fn x86_mm_movemask_pd(x: f64x2) -> i32;
3412-
}
3413-
```
3414-
"##,
3415-
3416-
E0441: r##"
3417-
An unknown platform-specific intrinsic function was used. Erroneous
3418-
code example:
3419-
3420-
```compile_fail,E0441
3421-
#![feature(repr_simd)]
3422-
#![feature(platform_intrinsics)]
3423-
3424-
#[repr(simd)]
3425-
struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
3426-
3427-
extern "platform-intrinsic" {
3428-
fn x86_mm_adds_ep16(x: i16x8, y: i16x8) -> i16x8;
3429-
// error: unrecognized platform-specific intrinsic function
3430-
}
3431-
```
3432-
3433-
Please verify that the function name wasn't misspelled, and ensure
3434-
that it is declared in the rust source code (in the file
3435-
src/librustc_platform_intrinsics/x86.rs). Example:
3436-
3437-
```
3438-
#![feature(repr_simd)]
3439-
#![feature(platform_intrinsics)]
3440-
3441-
#[repr(simd)]
3442-
struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
3443-
3444-
extern "platform-intrinsic" {
3445-
fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i16x8; // ok!
3446-
}
3447-
```
3448-
"##,
3449-
3450-
E0442: r##"
3451-
Intrinsic argument(s) and/or return value have the wrong type.
3452-
Erroneous code example:
3453-
3454-
```compile_fail,E0442
3455-
#![feature(repr_simd)]
3456-
#![feature(platform_intrinsics)]
3457-
3458-
#[repr(simd)]
3459-
struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8,
3460-
i8, i8, i8, i8, i8, i8, i8, i8);
3461-
#[repr(simd)]
3462-
struct i32x4(i32, i32, i32, i32);
3463-
#[repr(simd)]
3464-
struct i64x2(i64, i64);
3465-
3466-
extern "platform-intrinsic" {
3467-
fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
3468-
// error: intrinsic arguments/return value have wrong type
3469-
}
3470-
```
3471-
3472-
To fix this error, please refer to the function declaration to give
3473-
it the awaited types. Example:
3474-
3475-
```
3476-
#![feature(repr_simd)]
3477-
#![feature(platform_intrinsics)]
3478-
3479-
#[repr(simd)]
3480-
struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
3481-
3482-
extern "platform-intrinsic" {
3483-
fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i16x8; // ok!
3484-
}
3485-
```
3486-
"##,
3487-
3488-
E0443: r##"
3489-
Intrinsic argument(s) and/or return value have the wrong type.
3490-
Erroneous code example:
3491-
3492-
```compile_fail,E0443
3493-
#![feature(repr_simd)]
3494-
#![feature(platform_intrinsics)]
3495-
3496-
#[repr(simd)]
3497-
struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
3498-
#[repr(simd)]
3499-
struct i64x8(i64, i64, i64, i64, i64, i64, i64, i64);
3500-
3501-
extern "platform-intrinsic" {
3502-
fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i64x8;
3503-
// error: intrinsic argument/return value has wrong type
3504-
}
3505-
```
3506-
3507-
To fix this error, please refer to the function declaration to give
3508-
it the awaited types. Example:
3509-
3510-
```
3511-
#![feature(repr_simd)]
3512-
#![feature(platform_intrinsics)]
3513-
3514-
#[repr(simd)]
3515-
struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
3516-
3517-
extern "platform-intrinsic" {
3518-
fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i16x8; // ok!
3519-
}
3520-
```
3521-
"##,
3522-
3523-
E0444: r##"
3524-
A platform-specific intrinsic function has wrong number of arguments.
3525-
Erroneous code example:
3526-
3527-
```compile_fail,E0444
3528-
#![feature(repr_simd)]
3529-
#![feature(platform_intrinsics)]
3530-
3531-
#[repr(simd)]
3532-
struct f64x2(f64, f64);
3533-
3534-
extern "platform-intrinsic" {
3535-
fn x86_mm_movemask_pd(x: f64x2, y: f64x2, z: f64x2) -> i32;
3536-
// error: platform-specific intrinsic has invalid number of arguments
3537-
}
3538-
```
3539-
3540-
Please refer to the function declaration to see if it corresponds
3541-
with yours. Example:
3542-
3543-
```
3544-
#![feature(repr_simd)]
3545-
#![feature(platform_intrinsics)]
3546-
3547-
#[repr(simd)]
3548-
struct f64x2(f64, f64);
3549-
3550-
extern "platform-intrinsic" {
3551-
fn x86_mm_movemask_pd(x: f64x2) -> i32; // ok!
3552-
}
3553-
```
3554-
"##,
3555-
35563382
E0516: r##"
35573383
The `typeof` keyword is currently reserved but unimplemented.
35583384
Erroneous code example:
@@ -4891,6 +4717,11 @@ register_diagnostics! {
48914717
// E0372, // coherence not object safe
48924718
E0377, // the trait `CoerceUnsized` may only be implemented for a coercion
48934719
// between structures with the same definition
4720+
E0440, // errors associated with unstable platform intrinsics
4721+
E0441, // errors associated with unstable platform intrinsics
4722+
E0442, // errors associated with unstable platform intrinsics
4723+
E0443, // errors associated with unstable platform intrinsics
4724+
E0444, // errors associated with unstable platform intrinsics
48944725
E0533, // `{}` does not name a unit variant, unit struct or a constant
48954726
// E0563, // cannot determine a type for this `impl Trait`: {} // removed in 6383de15
48964727
E0564, // only named lifetimes are allowed in `impl Trait`,

src/test/run-pass/simd/simd-upgraded.rs

-34
This file was deleted.

src/test/ui/error-codes/E0440.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
struct f64x2(f64, f64);
1616

1717
extern "platform-intrinsic" {
18-
fn x86_mm_movemask_pd<T>(x: f64x2) -> i32; //~ ERROR E0440
18+
fn x86_rdrand16_step<T>(x: f64x2) -> i32; //~ ERROR E0440
1919
}
2020

2121
fn main () {

src/test/ui/error-codes/E0440.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
error[E0440]: platform-specific intrinsic has wrong number of type parameters: found 1, expected 0
22
--> $DIR/E0440.rs:18:5
33
|
4-
LL | fn x86_mm_movemask_pd<T>(x: f64x2) -> i32; //~ ERROR E0440
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4+
LL | fn x86_rdrand16_step<T>(x: f64x2) -> i32; //~ ERROR E0440
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66

77
error: aborting due to previous error
88

src/test/ui/error-codes/E0442.rs

+1-7
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,10 @@
1414
#[repr(simd)]
1515
struct i8x16(i8, i8, i8, i8, i8, i8, i8, i8,
1616
i8, i8, i8, i8, i8, i8, i8, i8);
17-
#[repr(simd)]
18-
struct i32x4(i32, i32, i32, i32);
19-
#[repr(simd)]
20-
struct i64x2(i64, i64);
2117

2218
extern "platform-intrinsic" {
23-
fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
19+
fn aarch64_vld2_s8(x: *const i8) -> (i8x16, i8x16);
2420
//~^ ERROR E0442
25-
//~| ERROR E0442
26-
//~| ERROR E0442
2721
}
2822

2923
fn main() {}

src/test/ui/error-codes/E0442.stderr

+5-17
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,9 @@
1-
error[E0442]: intrinsic argument 1 has wrong type: found vector with length 16, expected length 8
2-
--> $DIR/E0442.rs:23:5
1+
error[E0442]: intrinsic return value has wrong type: found vector with length 16, expected length 8
2+
--> $DIR/E0442.rs:19:5
33
|
4-
LL | fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4+
LL | fn aarch64_vld2_s8(x: *const i8) -> (i8x16, i8x16);
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66

7-
error[E0442]: intrinsic argument 2 has wrong type: found vector with length 4, expected length 8
8-
--> $DIR/E0442.rs:23:5
9-
|
10-
LL | fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
11-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
12-
13-
error[E0442]: intrinsic return value has wrong type: found vector with length 2, expected length 8
14-
--> $DIR/E0442.rs:23:5
15-
|
16-
LL | fn x86_mm_adds_epi16(x: i8x16, y: i32x4) -> i64x2;
17-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
18-
19-
error: aborting due to 3 previous errors
7+
error: aborting due to previous error
208

219
For more information about this error, try `rustc --explain E0442`.

src/test/ui/error-codes/E0443.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212
#![feature(platform_intrinsics)]
1313

1414
#[repr(simd)]
15-
struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16);
15+
struct i8x8(i8, i8, i8, i8, i8, i8, i8, i8);
1616
#[repr(simd)]
1717
struct i64x8(i64, i64, i64, i64, i64, i64, i64, i64);
1818

1919
extern "platform-intrinsic" {
20-
fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i64x8; //~ ERROR E0443
20+
fn aarch64_vld2_s8(x: *const i8) -> (i8x8, i64x8);
21+
//~^ ERROR E0443
2122
}
2223

2324
fn main() {}

src/test/ui/error-codes/E0443.stderr

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
error[E0443]: intrinsic return value has wrong type: found `i64x8`, expected `i16x8` which was used for this vector type previously in this signature
1+
error[E0443]: intrinsic return value has wrong type: found `i64x8`, expected `i8x8` which was used for this vector type previously in this signature
22
--> $DIR/E0443.rs:20:5
33
|
4-
LL | fn x86_mm_adds_epi16(x: i16x8, y: i16x8) -> i64x8; //~ ERROR E0443
4+
LL | fn aarch64_vld2_s8(x: *const i8) -> (i8x8, i64x8);
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66

77
error: aborting due to previous error

src/test/ui/error-codes/E0444.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
struct f64x2(f64, f64);
1616

1717
extern "platform-intrinsic" {
18-
fn x86_mm_movemask_pd(x: f64x2, y: f64x2, z: f64x2) -> i32; //~ ERROR E0444
18+
fn x86_rdseed16_step(x: f64x2, y: f64x2, z: f64x2) -> i32; //~ ERROR E0444
1919
}
2020

2121
fn main() {}

src/test/ui/error-codes/E0444.stderr

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
error[E0444]: platform-specific intrinsic has invalid number of arguments: found 3, expected 1
1+
error[E0444]: platform-specific intrinsic has invalid number of arguments: found 3, expected 0
22
--> $DIR/E0444.rs:18:5
33
|
4-
LL | fn x86_mm_movemask_pd(x: f64x2, y: f64x2, z: f64x2) -> i32; //~ ERROR E0444
5-
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
4+
LL | fn x86_rdseed16_step(x: f64x2, y: f64x2, z: f64x2) -> i32; //~ ERROR E0444
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66

77
error: aborting due to previous error
88

Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
error[E0444]: platform-specific intrinsic has invalid number of arguments: found 3, expected 1
1+
error[E0441]: unrecognized platform-specific intrinsic function: `x86_mm_movemask_pd`
22
--> $DIR/intrinsic-invalid-number-of-arguments.rs:20:5
33
|
44
LL | fn x86_mm_movemask_pd(x: f64x2, y: f64x2, z: f64x2) -> i32; //~ platform-specific intrinsic
55
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
66

77
error: aborting due to previous error
88

9-
For more information about this error, try `rustc --explain E0444`.
9+
For more information about this error, try `rustc --explain E0441`.

src/test/ui/platform-intrinsic-params.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@
99
// except according to those terms.
1010

1111
#![feature(platform_intrinsics)]
12+
1213
extern "platform-intrinsic" {
13-
fn x86_mm_movemask_ps() -> i32; //~ERROR found 0, expected 1
14+
fn aarch64_vld2_s8() -> i32; //~ERROR found 0, expected 1
1415
}
1516

1617
fn main() { }

0 commit comments

Comments
 (0)