@@ -74,12 +74,20 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
7474 ret. write_cvalue ( fx, val) ;
7575 }
7676
77- "llvm.x86.avx2.gather.d.ps"
77+ "llvm.x86.avx2.gather.d.d"
78+ | "llvm.x86.avx2.gather.d.q"
79+ | "llvm.x86.avx2.gather.d.ps"
7880 | "llvm.x86.avx2.gather.d.pd"
81+ | "llvm.x86.avx2.gather.d.d.256"
82+ | "llvm.x86.avx2.gather.d.q.256"
7983 | "llvm.x86.avx2.gather.d.ps.256"
8084 | "llvm.x86.avx2.gather.d.pd.256"
85+ | "llvm.x86.avx2.gather.q.d"
86+ | "llvm.x86.avx2.gather.q.q"
8187 | "llvm.x86.avx2.gather.q.ps"
8288 | "llvm.x86.avx2.gather.q.pd"
89+ | "llvm.x86.avx2.gather.q.d.256"
90+ | "llvm.x86.avx2.gather.q.q.256"
8391 | "llvm.x86.avx2.gather.q.ps.256"
8492 | "llvm.x86.avx2.gather.q.pd.256" => {
8593 // https://www.intel.com/content/www/us/en/docs/intrinsics-guide/index.html#text=_mm_i64gather_pd&ig_expand=3818
@@ -94,10 +102,8 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
94102 let ( index_lane_count, index_lane_ty) = index. layout ( ) . ty . simd_size_and_type ( fx. tcx ) ;
95103 let ( mask_lane_count, mask_lane_ty) = mask. layout ( ) . ty . simd_size_and_type ( fx. tcx ) ;
96104 let ( ret_lane_count, ret_lane_ty) = ret. layout ( ) . ty . simd_size_and_type ( fx. tcx ) ;
97- assert ! ( src_lane_ty. is_floating_point ( ) ) ;
105+ assert_eq ! ( src_lane_ty, ret_lane_ty ) ;
98106 assert ! ( index_lane_ty. is_integral( ) ) ;
99- assert ! ( mask_lane_ty. is_floating_point( ) ) ;
100- assert ! ( ret_lane_ty. is_floating_point( ) ) ;
101107 assert_eq ! ( src_lane_count, mask_lane_count) ;
102108 assert_eq ! ( src_lane_count, ret_lane_count) ;
103109
@@ -122,8 +128,12 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
122128 let res_lane = fx. bcx . append_block_param ( next, lane_clif_ty) ;
123129
124130 let mask_lane = match mask_lane_clif_ty {
125- types:: F32 => fx. bcx . ins ( ) . band_imm ( mask_lane, 0x8000_0000u64 as i64 ) ,
126- types:: F64 => fx. bcx . ins ( ) . band_imm ( mask_lane, 0x8000_0000_0000_0000u64 as i64 ) ,
131+ types:: I32 | types:: F32 => {
132+ fx. bcx . ins ( ) . band_imm ( mask_lane, 0x8000_0000u64 as i64 )
133+ }
134+ types:: I64 | types:: F64 => {
135+ fx. bcx . ins ( ) . band_imm ( mask_lane, 0x8000_0000_0000_0000u64 as i64 )
136+ }
127137 _ => unreachable ! ( ) ,
128138 } ;
129139 fx. bcx . ins ( ) . brif ( mask_lane, if_enabled, & [ ] , if_disabled, & [ ] ) ;
0 commit comments