@@ -74,12 +74,20 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
74
74
ret. write_cvalue ( fx, val) ;
75
75
}
76
76
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"
78
80
| "llvm.x86.avx2.gather.d.pd"
81
+ | "llvm.x86.avx2.gather.d.d.256"
82
+ | "llvm.x86.avx2.gather.d.q.256"
79
83
| "llvm.x86.avx2.gather.d.ps.256"
80
84
| "llvm.x86.avx2.gather.d.pd.256"
85
+ | "llvm.x86.avx2.gather.q.d"
86
+ | "llvm.x86.avx2.gather.q.q"
81
87
| "llvm.x86.avx2.gather.q.ps"
82
88
| "llvm.x86.avx2.gather.q.pd"
89
+ | "llvm.x86.avx2.gather.q.d.256"
90
+ | "llvm.x86.avx2.gather.q.q.256"
83
91
| "llvm.x86.avx2.gather.q.ps.256"
84
92
| "llvm.x86.avx2.gather.q.pd.256" => {
85
93
// 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>(
94
102
let ( index_lane_count, index_lane_ty) = index. layout ( ) . ty . simd_size_and_type ( fx. tcx ) ;
95
103
let ( mask_lane_count, mask_lane_ty) = mask. layout ( ) . ty . simd_size_and_type ( fx. tcx ) ;
96
104
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 ) ;
98
106
assert ! ( index_lane_ty. is_integral( ) ) ;
99
- assert ! ( mask_lane_ty. is_floating_point( ) ) ;
100
- assert ! ( ret_lane_ty. is_floating_point( ) ) ;
101
107
assert_eq ! ( src_lane_count, mask_lane_count) ;
102
108
assert_eq ! ( src_lane_count, ret_lane_count) ;
103
109
@@ -122,8 +128,12 @@ pub(crate) fn codegen_x86_llvm_intrinsic_call<'tcx>(
122
128
let res_lane = fx. bcx . append_block_param ( next, lane_clif_ty) ;
123
129
124
130
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
+ }
127
137
_ => unreachable ! ( ) ,
128
138
} ;
129
139
fx. bcx . ins ( ) . brif ( mask_lane, if_enabled, & [ ] , if_disabled, & [ ] ) ;
0 commit comments