@@ -2096,29 +2096,28 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
2096
2096
sym:: simd_cttz => "cttz" ,
2097
2097
_ => unreachable ! ( ) ,
2098
2098
} ;
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, ) ;
2105
2101
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) {
2107
2106
let fn_ty = bx. type_func ( & [ vec_ty, bx. type_i1 ( ) ] , vec_ty) ;
2108
2107
let f = bx. declare_cfn ( llvm_intrinsic, llvm:: UnnamedAddr :: No , fn_ty) ;
2109
- bx. call (
2108
+ Ok ( bx. call (
2110
2109
fn_ty,
2111
2110
None ,
2112
2111
None ,
2113
2112
f,
2114
2113
& [ args[ 0 ] . immediate ( ) , bx. const_int ( bx. type_i1 ( ) , 0 ) ] ,
2115
2114
None ,
2116
- )
2115
+ ) )
2117
2116
} else {
2118
2117
let fn_ty = bx. type_func ( & [ vec_ty] , vec_ty) ;
2119
2118
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
+ } ;
2122
2121
}
2123
2122
2124
2123
if name == sym:: simd_arith_offset {
0 commit comments