Skip to content

Commit 75d25ac

Browse files
committed
Auto merge of #45804 - gnzlbg:div_intr, r=alexcrichton
[intrinsics] add missing div and rem vector intrinsics
2 parents 563dc51 + 01ced6e commit 75d25ac

File tree

4 files changed

+23
-7
lines changed

4 files changed

+23
-7
lines changed

src/librustc_trans/intrinsic.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1203,7 +1203,8 @@ fn generic_simd_intrinsic<'a, 'tcx>(
12031203
simd_add: TyUint, TyInt => add, TyFloat => fadd;
12041204
simd_sub: TyUint, TyInt => sub, TyFloat => fsub;
12051205
simd_mul: TyUint, TyInt => mul, TyFloat => fmul;
1206-
simd_div: TyFloat => fdiv;
1206+
simd_div: TyUint => udiv, TyInt => sdiv, TyFloat => fdiv;
1207+
simd_rem: TyUint => urem, TyInt => srem, TyFloat => frem;
12071208
simd_shl: TyUint, TyInt => shl;
12081209
simd_shr: TyUint => lshr, TyInt => ashr;
12091210
simd_and: TyUint, TyInt => and;

src/librustc_typeck/check/intrinsic.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ pub fn check_platform_intrinsic_type<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
348348
"simd_eq" | "simd_ne" | "simd_lt" | "simd_le" | "simd_gt" | "simd_ge" => {
349349
(2, vec![param(0), param(0)], param(1))
350350
}
351-
"simd_add" | "simd_sub" | "simd_mul" |
351+
"simd_add" | "simd_sub" | "simd_mul" | "simd_rem" |
352352
"simd_div" | "simd_shl" | "simd_shr" |
353353
"simd_and" | "simd_or" | "simd_xor" => {
354354
(1, vec![param(0), param(0)], param(0))

src/test/compile-fail/simd-intrinsic-generic-arithmetic.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ extern "platform-intrinsic" {
2727
fn simd_sub<T>(x: T, y: T) -> T;
2828
fn simd_mul<T>(x: T, y: T) -> T;
2929
fn simd_div<T>(x: T, y: T) -> T;
30+
fn simd_rem<T>(x: T, y: T) -> T;
3031
fn simd_shl<T>(x: T, y: T) -> T;
3132
fn simd_shr<T>(x: T, y: T) -> T;
3233
fn simd_and<T>(x: T, y: T) -> T;
@@ -49,8 +50,12 @@ fn main() {
4950
simd_mul(x, x);
5051
simd_mul(y, y);
5152
simd_mul(z, z);
52-
53+
simd_div(x, x);
54+
simd_div(y, y);
5355
simd_div(z, z);
56+
simd_rem(x, x);
57+
simd_rem(y, y);
58+
simd_rem(z, z);
5459

5560
simd_shl(x, x);
5661
simd_shl(y, y);
@@ -84,10 +89,6 @@ fn main() {
8489
//~^ ERROR expected SIMD input type, found non-SIMD `i32`
8590

8691

87-
simd_div(x, x);
88-
//~^ ERROR unsupported operation on `i32x4` with element `i32`
89-
simd_div(y, y);
90-
//~^ ERROR unsupported operation on `u32x4` with element `u32`
9192
simd_shl(z, z);
9293
//~^ ERROR unsupported operation on `f32x4` with element `f32`
9394
simd_shr(z, z);

src/test/run-pass/simd-intrinsic-generic-arithmetic.rs

+14
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ extern "platform-intrinsic" {
3535
fn simd_sub<T>(x: T, y: T) -> T;
3636
fn simd_mul<T>(x: T, y: T) -> T;
3737
fn simd_div<T>(x: T, y: T) -> T;
38+
fn simd_rem<T>(x: T, y: T) -> T;
3839
fn simd_shl<T>(x: T, y: T) -> T;
3940
fn simd_shr<T>(x: T, y: T) -> T;
4041
fn simd_and<T>(x: T, y: T) -> T;
@@ -72,9 +73,22 @@ fn main() {
7273
all_eq!(simd_sub(z2, z1), f32x4(1.0, 1.0, 1.0, 1.0));
7374
all_eq!(simd_sub(z1, z2), f32x4(-1.0, -1.0, -1.0, -1.0));
7475

76+
all_eq!(simd_div(x1, x1), i32x4(1, 1, 1, 1));
77+
all_eq!(simd_div(i32x4(2, 4, 6, 8), i32x4(2, 2, 2, 2)), x1);
78+
all_eq!(simd_div(y1, y1), u32x4(1, 1, 1, 1));
79+
all_eq!(simd_div(u32x4(2, 4, 6, 8), u32x4(2, 2, 2, 2)), y1);
80+
all_eq!(simd_div(z1, z1), f32x4(1.0, 1.0, 1.0, 1.0));
7581
all_eq!(simd_div(z1, z2), f32x4(1.0/2.0, 2.0/3.0, 3.0/4.0, 4.0/5.0));
7682
all_eq!(simd_div(z2, z1), f32x4(2.0/1.0, 3.0/2.0, 4.0/3.0, 5.0/4.0));
7783

84+
all_eq!(simd_rem(x1, x1), i32x4(0, 0, 0, 0));
85+
all_eq!(simd_rem(x2, x1), i32x4(0, 1, 1, 1));
86+
all_eq!(simd_rem(y1, y1), u32x4(0, 0, 0, 0));
87+
all_eq!(simd_rem(y2, y1), u32x4(0, 1, 1, 1));
88+
all_eq!(simd_rem(z1, z1), f32x4(0.0, 0.0, 0.0, 0.0));
89+
all_eq!(simd_rem(z1, z2), z1);
90+
all_eq!(simd_rem(z2, z1), f32x4(0.0, 1.0, 1.0, 1.0));
91+
7892
all_eq!(simd_shl(x1, x2), i32x4(1 << 2, 2 << 3, 3 << 4, 4 << 5));
7993
all_eq!(simd_shl(x2, x1), i32x4(2 << 1, 3 << 2, 4 << 3, 5 << 4));
8094
all_eq!(simd_shl(y1, y2), u32x4(1 << 2, 2 << 3, 3 << 4, 4 << 5));

0 commit comments

Comments
 (0)