Skip to content

Commit 2903f1c

Browse files
committed
add simd_bswap and simd_bitreverse
1 parent 31ea518 commit 2903f1c

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

src/tools/miri/src/shims/intrinsics/simd.rs

+6
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
2929
| "fsqrt"
3030
| "ctlz"
3131
| "cttz"
32+
| "bswap"
33+
| "bitreverse"
3234
=> {
3335
let [op] = check_arg_count(args)?;
3436
let (op, op_len) = this.operand_to_simd(op)?;
@@ -54,6 +56,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
5456
"trunc" => Op::Round(rustc_apfloat::Round::TowardZero),
5557
"ctlz" => Op::Numeric(sym::ctlz),
5658
"cttz" => Op::Numeric(sym::cttz),
59+
"bswap" => Op::Numeric(sym::bswap),
60+
"bitreverse" => Op::Numeric(sym::bitreverse),
5761
_ => unreachable!(),
5862
};
5963

@@ -116,6 +120,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
116120
let bits_out = match name {
117121
sym::ctlz => u128::from(bits.leading_zeros()).checked_sub(extra).unwrap(),
118122
sym::cttz => u128::from((bits << extra).trailing_zeros()).checked_sub(extra).unwrap(),
123+
sym::bswap => (bits << extra).swap_bytes(),
124+
sym::bitreverse => (bits << extra).reverse_bits(),
119125
_ => unreachable!(),
120126
};
121127
Scalar::from_uint(bits_out, size)

src/tools/miri/tests/pass/portable-simd.rs

+13
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,19 @@ fn simd_ops_i32() {
202202
assert_eq!(b.trailing_zeros(), u32x4::from_array([0, 1, 0, 2]));
203203
assert_eq!(b.leading_ones(), u32x4::from_array([0, 0, 0, 30]));
204204
assert_eq!(b.trailing_ones(), u32x4::from_array([1, 0, 2, 0]));
205+
assert_eq!(
206+
b.swap_bytes(),
207+
i32x4::from_array([0x01000000, 0x02000000, 0x03000000, 0xfcffffffu32 as i32])
208+
);
209+
assert_eq!(
210+
b.reverse_bits(),
211+
i32x4::from_array([
212+
0x80000000u32 as i32,
213+
0x40000000,
214+
0xc0000000u32 as i32,
215+
0x3fffffffu32 as i32
216+
])
217+
);
205218
}
206219

207220
fn simd_mask() {

0 commit comments

Comments
 (0)