Skip to content

Commit e2c211f

Browse files
committed
Constify all x86 rustc_args_required_const intrinsics
1 parent 342cb5c commit e2c211f

File tree

7 files changed

+163
-31
lines changed

7 files changed

+163
-31
lines changed

crates/core_arch/src/x86/avx.rs

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1579,7 +1579,13 @@ pub unsafe fn _mm256_insertf128_si256(a: __m256i, b: __m128i, imm8: i32) -> __m2
15791579
#[rustc_args_required_const(2)]
15801580
#[stable(feature = "simd_x86", since = "1.27.0")]
15811581
pub unsafe fn _mm256_insert_epi8(a: __m256i, i: i8, index: i32) -> __m256i {
1582-
transmute(simd_insert(a.as_i8x32(), (index as u32) & 31, i))
1582+
let a = a.as_i8x32();
1583+
macro_rules! call {
1584+
($index:expr) => {
1585+
simd_insert(a, $index, i)
1586+
};
1587+
}
1588+
transmute(constify_imm5!((index & 31), call))
15831589
}
15841590

15851591
/// Copies `a` to result, and inserts the 16-bit integer `i` into result
@@ -1592,7 +1598,13 @@ pub unsafe fn _mm256_insert_epi8(a: __m256i, i: i8, index: i32) -> __m256i {
15921598
#[rustc_args_required_const(2)]
15931599
#[stable(feature = "simd_x86", since = "1.27.0")]
15941600
pub unsafe fn _mm256_insert_epi16(a: __m256i, i: i16, index: i32) -> __m256i {
1595-
transmute(simd_insert(a.as_i16x16(), (index as u32) & 15, i))
1601+
let a = a.as_i16x16();
1602+
macro_rules! call {
1603+
($index:expr) => {
1604+
simd_insert(a, $index, i)
1605+
};
1606+
}
1607+
transmute(constify_imm4!((index & 15), call))
15961608
}
15971609

15981610
/// Copies `a` to result, and inserts the 32-bit integer `i` into result
@@ -1605,7 +1617,13 @@ pub unsafe fn _mm256_insert_epi16(a: __m256i, i: i16, index: i32) -> __m256i {
16051617
#[rustc_args_required_const(2)]
16061618
#[stable(feature = "simd_x86", since = "1.27.0")]
16071619
pub unsafe fn _mm256_insert_epi32(a: __m256i, i: i32, index: i32) -> __m256i {
1608-
transmute(simd_insert(a.as_i32x8(), (index as u32) & 7, i))
1620+
let a = a.as_i32x8();
1621+
macro_rules! call {
1622+
($index:expr) => {
1623+
simd_insert(a, $index, i)
1624+
};
1625+
}
1626+
transmute(constify_imm8!((index & 7), call))
16091627
}
16101628

16111629
/// Loads 256-bits (composed of 4 packed double-precision (64-bit)

crates/core_arch/src/x86/avx2.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3744,8 +3744,13 @@ pub unsafe fn _mm256_xor_si256(a: __m256i, b: __m256i) -> __m256i {
37443744
#[rustc_args_required_const(1)]
37453745
#[stable(feature = "simd_x86", since = "1.27.0")]
37463746
pub unsafe fn _mm256_extract_epi8(a: __m256i, imm8: i32) -> i32 {
3747-
let imm8 = (imm8 & 31) as u32;
3748-
simd_extract::<_, u8>(a.as_u8x32(), imm8) as i32
3747+
let a = a.as_u8x32();
3748+
macro_rules! call {
3749+
($imm5:expr) => {
3750+
simd_extract::<_, u8>(a, $imm5) as i32
3751+
};
3752+
}
3753+
constify_imm5!((imm8 & 31), call)
37493754
}
37503755

37513756
/// Extracts a 16-bit integer from `a`, selected with `imm8`. Returns a 32-bit
@@ -3760,8 +3765,13 @@ pub unsafe fn _mm256_extract_epi8(a: __m256i, imm8: i32) -> i32 {
37603765
#[rustc_args_required_const(1)]
37613766
#[stable(feature = "simd_x86", since = "1.27.0")]
37623767
pub unsafe fn _mm256_extract_epi16(a: __m256i, imm8: i32) -> i32 {
3763-
let imm8 = (imm8 & 15) as u32;
3764-
simd_extract::<_, u16>(a.as_u16x16(), imm8) as i32
3768+
let a = a.as_u16x16();
3769+
macro_rules! call {
3770+
($imm4:expr) => {
3771+
simd_extract::<_, u16>(a, $imm4) as i32
3772+
};
3773+
}
3774+
constify_imm4!((imm8 & 15), call)
37653775
}
37663776

37673777
/// Extracts a 32-bit integer from `a`, selected with `imm8`.
@@ -3773,8 +3783,13 @@ pub unsafe fn _mm256_extract_epi16(a: __m256i, imm8: i32) -> i32 {
37733783
#[rustc_args_required_const(1)]
37743784
#[stable(feature = "simd_x86", since = "1.27.0")]
37753785
pub unsafe fn _mm256_extract_epi32(a: __m256i, imm8: i32) -> i32 {
3776-
let imm8 = (imm8 & 7) as u32;
3777-
simd_extract(a.as_i32x8(), imm8)
3786+
let a = a.as_i32x8();
3787+
macro_rules! call {
3788+
($imm3:expr) => {
3789+
simd_extract(a, $imm3)
3790+
};
3791+
}
3792+
constify_imm3!((imm8 & 7), call)
37783793
}
37793794

37803795
/// Returns the first element of the input vector of `[4 x double]`.

crates/core_arch/src/x86/sse2.rs

Lines changed: 63 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -506,7 +506,13 @@ pub unsafe fn _mm_bsrli_si128(a: __m128i, imm8: i32) -> __m128i {
506506
#[rustc_args_required_const(1)]
507507
#[stable(feature = "simd_x86", since = "1.27.0")]
508508
pub unsafe fn _mm_slli_epi16(a: __m128i, imm8: i32) -> __m128i {
509-
transmute(pslliw(a.as_i16x8(), imm8))
509+
let a = a.as_i16x8();
510+
macro_rules! call {
511+
($imm8:expr) => {
512+
transmute(pslliw(a, $imm8))
513+
};
514+
}
515+
constify_imm8!(imm8, call)
510516
}
511517

512518
/// Shifts packed 16-bit integers in `a` left by `count` while shifting in
@@ -530,7 +536,13 @@ pub unsafe fn _mm_sll_epi16(a: __m128i, count: __m128i) -> __m128i {
530536
#[rustc_args_required_const(1)]
531537
#[stable(feature = "simd_x86", since = "1.27.0")]
532538
pub unsafe fn _mm_slli_epi32(a: __m128i, imm8: i32) -> __m128i {
533-
transmute(psllid(a.as_i32x4(), imm8))
539+
let a = a.as_i32x4();
540+
macro_rules! call {
541+
($imm8:expr) => {
542+
transmute(psllid(a, $imm8))
543+
};
544+
}
545+
constify_imm8!(imm8, call)
534546
}
535547

536548
/// Shifts packed 32-bit integers in `a` left by `count` while shifting in
@@ -554,7 +566,13 @@ pub unsafe fn _mm_sll_epi32(a: __m128i, count: __m128i) -> __m128i {
554566
#[rustc_args_required_const(1)]
555567
#[stable(feature = "simd_x86", since = "1.27.0")]
556568
pub unsafe fn _mm_slli_epi64(a: __m128i, imm8: i32) -> __m128i {
557-
transmute(pslliq(a.as_i64x2(), imm8))
569+
let a = a.as_i64x2();
570+
macro_rules! call {
571+
($imm8:expr) => {
572+
transmute(pslliq(a, $imm8))
573+
};
574+
}
575+
constify_imm8!(imm8, call)
558576
}
559577

560578
/// Shifts packed 64-bit integers in `a` left by `count` while shifting in
@@ -579,7 +597,13 @@ pub unsafe fn _mm_sll_epi64(a: __m128i, count: __m128i) -> __m128i {
579597
#[rustc_args_required_const(1)]
580598
#[stable(feature = "simd_x86", since = "1.27.0")]
581599
pub unsafe fn _mm_srai_epi16(a: __m128i, imm8: i32) -> __m128i {
582-
transmute(psraiw(a.as_i16x8(), imm8))
600+
let a = a.as_i16x8();
601+
macro_rules! call {
602+
($imm8:expr) => {
603+
transmute(psraiw(a, $imm8))
604+
};
605+
}
606+
constify_imm8!(imm8, call)
583607
}
584608

585609
/// Shifts packed 16-bit integers in `a` right by `count` while shifting in sign
@@ -604,7 +628,13 @@ pub unsafe fn _mm_sra_epi16(a: __m128i, count: __m128i) -> __m128i {
604628
#[rustc_args_required_const(1)]
605629
#[stable(feature = "simd_x86", since = "1.27.0")]
606630
pub unsafe fn _mm_srai_epi32(a: __m128i, imm8: i32) -> __m128i {
607-
transmute(psraid(a.as_i32x4(), imm8))
631+
let a = a.as_i32x4();
632+
macro_rules! call {
633+
($imm8:expr) => {
634+
transmute(psraid(a, $imm8))
635+
};
636+
}
637+
constify_imm8!(imm8, call)
608638
}
609639

610640
/// Shifts packed 32-bit integers in `a` right by `count` while shifting in sign
@@ -696,7 +726,13 @@ unsafe fn _mm_srli_si128_impl(a: __m128i, imm8: i32) -> __m128i {
696726
#[rustc_args_required_const(1)]
697727
#[stable(feature = "simd_x86", since = "1.27.0")]
698728
pub unsafe fn _mm_srli_epi16(a: __m128i, imm8: i32) -> __m128i {
699-
transmute(psrliw(a.as_i16x8(), imm8))
729+
let a = a.as_i16x8();
730+
macro_rules! call {
731+
($imm8:expr) => {
732+
transmute(psrliw(a, $imm8))
733+
};
734+
}
735+
constify_imm8!(imm8, call)
700736
}
701737

702738
/// Shifts packed 16-bit integers in `a` right by `count` while shifting in
@@ -721,7 +757,13 @@ pub unsafe fn _mm_srl_epi16(a: __m128i, count: __m128i) -> __m128i {
721757
#[rustc_args_required_const(1)]
722758
#[stable(feature = "simd_x86", since = "1.27.0")]
723759
pub unsafe fn _mm_srli_epi32(a: __m128i, imm8: i32) -> __m128i {
724-
transmute(psrlid(a.as_i32x4(), imm8))
760+
let a = a.as_i32x4();
761+
macro_rules! call {
762+
($imm8:expr) => {
763+
transmute(psrlid(a, $imm8))
764+
};
765+
}
766+
constify_imm8!(imm8, call)
725767
}
726768

727769
/// Shifts packed 32-bit integers in `a` right by `count` while shifting in
@@ -1375,7 +1417,13 @@ pub unsafe fn _mm_packus_epi16(a: __m128i, b: __m128i) -> __m128i {
13751417
#[rustc_args_required_const(1)]
13761418
#[stable(feature = "simd_x86", since = "1.27.0")]
13771419
pub unsafe fn _mm_extract_epi16(a: __m128i, imm8: i32) -> i32 {
1378-
simd_extract::<_, u16>(a.as_u16x8(), (imm8 & 7) as u32) as i32
1420+
let a = a.as_u16x8();
1421+
macro_rules! call {
1422+
($imm4:expr) => {
1423+
simd_extract::<_, u16>(a, $imm4) as i32
1424+
};
1425+
}
1426+
constify_imm4!((imm8 & 7), call)
13791427
}
13801428

13811429
/// Returns a new vector where the `imm8` element of `a` is replaced with `i`.
@@ -1387,7 +1435,13 @@ pub unsafe fn _mm_extract_epi16(a: __m128i, imm8: i32) -> i32 {
13871435
#[rustc_args_required_const(2)]
13881436
#[stable(feature = "simd_x86", since = "1.27.0")]
13891437
pub unsafe fn _mm_insert_epi16(a: __m128i, i: i32, imm8: i32) -> __m128i {
1390-
transmute(simd_insert(a.as_i16x8(), (imm8 & 7) as u32, i as i16))
1438+
let a = a.as_i16x8();
1439+
macro_rules! call {
1440+
($imm4:expr) => {
1441+
transmute(simd_insert(a, $imm4, i as i16))
1442+
};
1443+
}
1444+
constify_imm4!((imm8 & 7), call)
13911445
}
13921446

13931447
/// Returns a mask of the most significant bit of each element in `a`.

crates/core_arch/src/x86/sse41.rs

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,12 @@ pub unsafe fn _mm_blend_ps(a: __m128, b: __m128, imm4: i32) -> __m128 {
167167
#[rustc_args_required_const(1)]
168168
#[stable(feature = "simd_x86", since = "1.27.0")]
169169
pub unsafe fn _mm_extract_ps(a: __m128, imm8: i32) -> i32 {
170-
transmute(simd_extract::<_, f32>(a, imm8 as u32 & 0b11))
170+
macro_rules! call {
171+
($imm2:expr) => {
172+
transmute(simd_extract::<_, f32>(a, $imm2))
173+
};
174+
}
175+
constify_imm2!((imm8 & 0b11), call)
171176
}
172177

173178
/// Extracts an 8-bit integer from `a`, selected with `imm8`. Returns a 32-bit
@@ -182,8 +187,13 @@ pub unsafe fn _mm_extract_ps(a: __m128, imm8: i32) -> i32 {
182187
#[rustc_args_required_const(1)]
183188
#[stable(feature = "simd_x86", since = "1.27.0")]
184189
pub unsafe fn _mm_extract_epi8(a: __m128i, imm8: i32) -> i32 {
185-
let imm8 = (imm8 & 15) as u32;
186-
simd_extract::<_, u8>(a.as_u8x16(), imm8) as i32
190+
let a = a.as_u8x16();
191+
macro_rules! call {
192+
($imm4:expr) => {
193+
simd_extract::<_, u8>(a, $imm4) as i32
194+
};
195+
}
196+
constify_imm4!((imm8 & 15), call)
187197
}
188198

189199
/// Extracts an 32-bit integer from `a` selected with `imm8`
@@ -198,8 +208,13 @@ pub unsafe fn _mm_extract_epi8(a: __m128i, imm8: i32) -> i32 {
198208
#[rustc_args_required_const(1)]
199209
#[stable(feature = "simd_x86", since = "1.27.0")]
200210
pub unsafe fn _mm_extract_epi32(a: __m128i, imm8: i32) -> i32 {
201-
let imm8 = (imm8 & 3) as u32;
202-
simd_extract::<_, i32>(a.as_i32x4(), imm8)
211+
let a = a.as_i32x4();
212+
macro_rules! call {
213+
($imm2:expr) => {
214+
simd_extract::<_, i32>(a, $imm2)
215+
};
216+
}
217+
constify_imm2!((imm8 & 3), call)
203218
}
204219

205220
/// Select a single value in `a` to store at some position in `b`,
@@ -250,7 +265,13 @@ pub unsafe fn _mm_insert_ps(a: __m128, b: __m128, imm8: i32) -> __m128 {
250265
#[rustc_args_required_const(2)]
251266
#[stable(feature = "simd_x86", since = "1.27.0")]
252267
pub unsafe fn _mm_insert_epi8(a: __m128i, i: i32, imm8: i32) -> __m128i {
253-
transmute(simd_insert(a.as_i8x16(), (imm8 & 0b1111) as u32, i as i8))
268+
let a = a.as_i8x16();
269+
macro_rules! call {
270+
($imm4:expr) => {
271+
transmute(simd_insert(a, $imm4, i as i8))
272+
};
273+
}
274+
constify_imm4!((imm8 & 0b1111), call)
254275
}
255276

256277
/// Returns a copy of `a` with the 32-bit integer from `i` inserted at a
@@ -263,7 +284,13 @@ pub unsafe fn _mm_insert_epi8(a: __m128i, i: i32, imm8: i32) -> __m128i {
263284
#[rustc_args_required_const(2)]
264285
#[stable(feature = "simd_x86", since = "1.27.0")]
265286
pub unsafe fn _mm_insert_epi32(a: __m128i, i: i32, imm8: i32) -> __m128i {
266-
transmute(simd_insert(a.as_i32x4(), (imm8 & 0b11) as u32, i))
287+
let a = a.as_i32x4();
288+
macro_rules! call {
289+
($imm2:expr) => {
290+
transmute(simd_insert(a, $imm2, i))
291+
};
292+
}
293+
constify_imm2!((imm8 & 0b11), call)
267294
}
268295

269296
/// Compares packed 8-bit integers in `a` and `b` and returns packed maximum

crates/core_arch/src/x86_64/avx.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,13 @@ use crate::{
2828
// This intrinsic has no corresponding instruction.
2929
#[stable(feature = "simd_x86", since = "1.27.0")]
3030
pub unsafe fn _mm256_insert_epi64(a: __m256i, i: i64, index: i32) -> __m256i {
31-
transmute(simd_insert(a.as_i64x4(), (index as u32) & 3, i))
31+
let a = a.as_i64x4();
32+
match index & 3 {
33+
0 => transmute(simd_insert(a, 0, i)),
34+
1 => transmute(simd_insert(a, 1, i)),
35+
2 => transmute(simd_insert(a, 2, i)),
36+
_ => transmute(simd_insert(a, 3, i)),
37+
}
3238
}
3339

3440
#[cfg(test)]

crates/core_arch/src/x86_64/avx2.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,13 @@ use crate::core_arch::{simd_llvm::*, x86::*};
2929
// This intrinsic has no corresponding instruction.
3030
#[stable(feature = "simd_x86", since = "1.27.0")]
3131
pub unsafe fn _mm256_extract_epi64(a: __m256i, imm8: i32) -> i64 {
32-
let imm8 = (imm8 & 3) as u32;
33-
simd_extract(a.as_i64x4(), imm8)
32+
let a = a.as_i64x4();
33+
match imm8 & 3 {
34+
0 => simd_extract(a, 0),
35+
1 => simd_extract(a, 1),
36+
2 => simd_extract(a, 2),
37+
_ => simd_extract(a, 3),
38+
}
3439
}
3540

3641
#[cfg(test)]

crates/core_arch/src/x86_64/sse41.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@ use stdarch_test::assert_instr;
1717
#[rustc_args_required_const(1)]
1818
#[stable(feature = "simd_x86", since = "1.27.0")]
1919
pub unsafe fn _mm_extract_epi64(a: __m128i, imm8: i32) -> i64 {
20-
let imm8 = (imm8 & 1) as u32;
21-
simd_extract(a.as_i64x2(), imm8)
20+
let a = a.as_i64x2();
21+
match imm8 & 1 {
22+
0 => simd_extract(a, 0),
23+
_ => simd_extract(a, 1),
24+
}
2225
}
2326

2427
/// Returns a copy of `a` with the 64-bit integer from `i` inserted at a
@@ -31,7 +34,11 @@ pub unsafe fn _mm_extract_epi64(a: __m128i, imm8: i32) -> i64 {
3134
#[rustc_args_required_const(2)]
3235
#[stable(feature = "simd_x86", since = "1.27.0")]
3336
pub unsafe fn _mm_insert_epi64(a: __m128i, i: i64, imm8: i32) -> __m128i {
34-
transmute(simd_insert(a.as_i64x2(), (imm8 & 1) as u32, i))
37+
let a = a.as_i64x2();
38+
match imm8 & 1 {
39+
0 => transmute(simd_insert(a, 0, i)),
40+
_ => transmute(simd_insert(a, 1, i)),
41+
}
3542
}
3643

3744
#[cfg(test)]

0 commit comments

Comments
 (0)