Skip to content

Commit bd2544a

Browse files
committed
Add support for Dynamic extract/inserts in const-eval
1 parent 85efca6 commit bd2544a

File tree

2 files changed

+69
-68
lines changed

2 files changed

+69
-68
lines changed

compiler/rustc_const_eval/src/interpret/simd_intrinsics.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
7272
ret: Option<mir::BasicBlock>,
7373
) -> InterpResult<'tcx, bool> {
7474
match intrinsic_name {
75-
sym::simd_insert => {
75+
sym::simd_insert | sym::simd_insert_dyn => {
7676
let index = u64::from(self.read_scalar(&args[1])?.to_u32()?);
7777
let elem = &args[2];
7878
let (input, input_len) = self.project_to_simd(&args[0])?;
@@ -92,7 +92,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
9292
self.copy_op(&value, &place)?;
9393
}
9494
}
95-
sym::simd_extract => {
95+
sym::simd_extract | sym::simd_extract_dyn => {
9696
let index = u64::from(self.read_scalar(&args[1])?.to_u32()?);
9797
let (input, input_len) = self.project_to_simd(&args[0])?;
9898
// Bounds are not checked by typeck so we have to do it ourselves.

library/coretests/tests/simd_intrinsics.rs

Lines changed: 67 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -155,72 +155,6 @@ fn float_math() {
155155
}
156156
}
157157

158-
#[test]
159-
fn extract_insert_dyn() {
160-
let x2 = i32x2::from_array([20, 21]);
161-
let x4 = i32x4::from_array([40, 41, 42, 43]);
162-
let x8 = i32x8::from_array([80, 81, 82, 83, 84, 85, 86, 87]);
163-
unsafe {
164-
assert_eq!(simd_insert_dyn(x2, 0, 100), i32x2::from_array([100, 21]));
165-
assert_eq!(simd_insert_dyn(x2, 1, 100), i32x2::from_array([20, 100]));
166-
167-
assert_eq!(simd_insert_dyn(x4, 0, 100), i32x4::from_array([100, 41, 42, 43]));
168-
assert_eq!(simd_insert_dyn(x4, 1, 100), i32x4::from_array([40, 100, 42, 43]));
169-
assert_eq!(simd_insert_dyn(x4, 2, 100), i32x4::from_array([40, 41, 100, 43]));
170-
assert_eq!(simd_insert_dyn(x4, 3, 100), i32x4::from_array([40, 41, 42, 100]));
171-
172-
assert_eq!(
173-
simd_insert_dyn(x8, 0, 100),
174-
i32x8::from_array([100, 81, 82, 83, 84, 85, 86, 87])
175-
);
176-
assert_eq!(
177-
simd_insert_dyn(x8, 1, 100),
178-
i32x8::from_array([80, 100, 82, 83, 84, 85, 86, 87])
179-
);
180-
assert_eq!(
181-
simd_insert_dyn(x8, 2, 100),
182-
i32x8::from_array([80, 81, 100, 83, 84, 85, 86, 87])
183-
);
184-
assert_eq!(
185-
simd_insert_dyn(x8, 3, 100),
186-
i32x8::from_array([80, 81, 82, 100, 84, 85, 86, 87])
187-
);
188-
assert_eq!(
189-
simd_insert_dyn(x8, 4, 100),
190-
i32x8::from_array([80, 81, 82, 83, 100, 85, 86, 87])
191-
);
192-
assert_eq!(
193-
simd_insert_dyn(x8, 5, 100),
194-
i32x8::from_array([80, 81, 82, 83, 84, 100, 86, 87])
195-
);
196-
assert_eq!(
197-
simd_insert_dyn(x8, 6, 100),
198-
i32x8::from_array([80, 81, 82, 83, 84, 85, 100, 87])
199-
);
200-
assert_eq!(
201-
simd_insert_dyn(x8, 7, 100),
202-
i32x8::from_array([80, 81, 82, 83, 84, 85, 86, 100])
203-
);
204-
205-
assert_eq!(simd_extract_dyn(x2, 0), 20);
206-
assert_eq!(simd_extract_dyn(x2, 1), 21);
207-
208-
assert_eq!(simd_extract_dyn(x4, 0), 40);
209-
assert_eq!(simd_extract_dyn(x4, 1), 41);
210-
assert_eq!(simd_extract_dyn(x4, 2), 42);
211-
assert_eq!(simd_extract_dyn(x4, 3), 43);
212-
213-
assert_eq!(simd_extract_dyn(x8, 0), 80);
214-
assert_eq!(simd_extract_dyn(x8, 1), 81);
215-
assert_eq!(simd_extract_dyn(x8, 2), 82);
216-
assert_eq!(simd_extract_dyn(x8, 3), 83);
217-
assert_eq!(simd_extract_dyn(x8, 4), 84);
218-
assert_eq!(simd_extract_dyn(x8, 5), 85);
219-
assert_eq!(simd_extract_dyn(x8, 6), 86);
220-
assert_eq!(simd_extract_dyn(x8, 7), 87);
221-
}
222-
}
223-
224158
#[test]
225159
fn funnel_shifts() {
226160
let x1 = i32x4::from_array([1, 2, 3, 4]);
@@ -974,6 +908,73 @@ test_runtime_and_compiletime! {
974908
}
975909
}
976910

911+
912+
#[test]
913+
fn extract_insert_dyn() {
914+
let x2 = i32x2::from_array([20, 21]);
915+
let x4 = i32x4::from_array([40, 41, 42, 43]);
916+
let x8 = i32x8::from_array([80, 81, 82, 83, 84, 85, 86, 87]);
917+
unsafe {
918+
assert_eq!(simd_insert_dyn(x2, 0, 100), i32x2::from_array([100, 21]));
919+
assert_eq!(simd_insert_dyn(x2, 1, 100), i32x2::from_array([20, 100]));
920+
921+
assert_eq!(simd_insert_dyn(x4, 0, 100), i32x4::from_array([100, 41, 42, 43]));
922+
assert_eq!(simd_insert_dyn(x4, 1, 100), i32x4::from_array([40, 100, 42, 43]));
923+
assert_eq!(simd_insert_dyn(x4, 2, 100), i32x4::from_array([40, 41, 100, 43]));
924+
assert_eq!(simd_insert_dyn(x4, 3, 100), i32x4::from_array([40, 41, 42, 100]));
925+
926+
assert_eq!(
927+
simd_insert_dyn(x8, 0, 100),
928+
i32x8::from_array([100, 81, 82, 83, 84, 85, 86, 87])
929+
);
930+
assert_eq!(
931+
simd_insert_dyn(x8, 1, 100),
932+
i32x8::from_array([80, 100, 82, 83, 84, 85, 86, 87])
933+
);
934+
assert_eq!(
935+
simd_insert_dyn(x8, 2, 100),
936+
i32x8::from_array([80, 81, 100, 83, 84, 85, 86, 87])
937+
);
938+
assert_eq!(
939+
simd_insert_dyn(x8, 3, 100),
940+
i32x8::from_array([80, 81, 82, 100, 84, 85, 86, 87])
941+
);
942+
assert_eq!(
943+
simd_insert_dyn(x8, 4, 100),
944+
i32x8::from_array([80, 81, 82, 83, 100, 85, 86, 87])
945+
);
946+
assert_eq!(
947+
simd_insert_dyn(x8, 5, 100),
948+
i32x8::from_array([80, 81, 82, 83, 84, 100, 86, 87])
949+
);
950+
assert_eq!(
951+
simd_insert_dyn(x8, 6, 100),
952+
i32x8::from_array([80, 81, 82, 83, 84, 85, 100, 87])
953+
);
954+
assert_eq!(
955+
simd_insert_dyn(x8, 7, 100),
956+
i32x8::from_array([80, 81, 82, 83, 84, 85, 86, 100])
957+
);
958+
959+
assert_eq!(simd_extract_dyn(x2, 0), 20);
960+
assert_eq!(simd_extract_dyn(x2, 1), 21);
961+
962+
assert_eq!(simd_extract_dyn(x4, 0), 40);
963+
assert_eq!(simd_extract_dyn(x4, 1), 41);
964+
assert_eq!(simd_extract_dyn(x4, 2), 42);
965+
assert_eq!(simd_extract_dyn(x4, 3), 43);
966+
967+
assert_eq!(simd_extract_dyn(x8, 0), 80);
968+
assert_eq!(simd_extract_dyn(x8, 1), 81);
969+
assert_eq!(simd_extract_dyn(x8, 2), 82);
970+
assert_eq!(simd_extract_dyn(x8, 3), 83);
971+
assert_eq!(simd_extract_dyn(x8, 4), 84);
972+
assert_eq!(simd_extract_dyn(x8, 5), 85);
973+
assert_eq!(simd_extract_dyn(x8, 6), 86);
974+
assert_eq!(simd_extract_dyn(x8, 7), 87);
975+
}
976+
}
977+
977978
fn shuffle() {
978979
macro_rules! simd_shuffle {
979980
($a:expr, $b:expr, $swizzle:expr) => {

0 commit comments

Comments
 (0)