@@ -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 {
0 commit comments