Skip to content
/ rust Public
forked from rust-lang/rust

Commit 77ed437

Browse files
committed
Fix simd_bswap for i8/u8
1 parent 89acdae commit 77ed437

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

compiler/rustc_codegen_llvm/src/intrinsic.rs

+10-11
Original file line numberDiff line numberDiff line change
@@ -2096,29 +2096,28 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
20962096
sym::simd_cttz => "cttz",
20972097
_ => unreachable!(),
20982098
};
2099-
let llvm_intrinsic = &format!(
2100-
"llvm.{}.v{}i{}",
2101-
intrinsic_name,
2102-
in_len,
2103-
in_elem.int_size_and_signed(bx.tcx()).0.bits(),
2104-
);
2099+
let int_size = in_elem.int_size_and_signed(bx.tcx()).0.bits();
2100+
let llvm_intrinsic = &format!("llvm.{}.v{}i{}", intrinsic_name, in_len, int_size,);
21052101

2106-
return Ok(if matches!(name, sym::simd_ctlz | sym::simd_cttz) {
2102+
return if name == sym::simd_bswap && int_size == 8 {
2103+
// byte swap is no-op for i8/u8
2104+
Ok(args[0].immediate())
2105+
} else if matches!(name, sym::simd_ctlz | sym::simd_cttz) {
21072106
let fn_ty = bx.type_func(&[vec_ty, bx.type_i1()], vec_ty);
21082107
let f = bx.declare_cfn(llvm_intrinsic, llvm::UnnamedAddr::No, fn_ty);
2109-
bx.call(
2108+
Ok(bx.call(
21102109
fn_ty,
21112110
None,
21122111
None,
21132112
f,
21142113
&[args[0].immediate(), bx.const_int(bx.type_i1(), 0)],
21152114
None,
2116-
)
2115+
))
21172116
} else {
21182117
let fn_ty = bx.type_func(&[vec_ty], vec_ty);
21192118
let f = bx.declare_cfn(llvm_intrinsic, llvm::UnnamedAddr::No, fn_ty);
2120-
bx.call(fn_ty, None, None, f, &[args[0].immediate()], None)
2121-
});
2119+
Ok(bx.call(fn_ty, None, None, f, &[args[0].immediate()], None))
2120+
};
21222121
}
21232122

21242123
if name == sym::simd_arith_offset {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// run-pass
2+
#![feature(repr_simd, platform_intrinsics)]
3+
#![allow(non_camel_case_types)]
4+
5+
#[repr(simd)]
6+
#[derive(Copy, Clone)]
7+
struct i8x4([i8; 4]);
8+
9+
#[repr(simd)]
10+
#[derive(Copy, Clone)]
11+
struct u8x4([u8; 4]);
12+
13+
extern "platform-intrinsic" {
14+
fn simd_bswap<T>(x: T) -> T;
15+
}
16+
17+
fn main() {
18+
unsafe {
19+
assert_eq!(simd_bswap(i8x4([0, 1, 2, 3])).0, [0, 1, 2, 3]);
20+
assert_eq!(simd_bswap(u8x4([0, 1, 2, 3])).0, [0, 1, 2, 3]);
21+
}
22+
}

0 commit comments

Comments
 (0)