Skip to content

Commit f770952

Browse files
committed
Implement the int part of the gather family vendor intrinsics
1 parent 996a121 commit f770952

File tree

1 file changed

+16
-6
lines changed

1 file changed

+16
-6
lines changed

src/intrinsics/llvm_x86.rs

+16-6
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)