Skip to content

Commit ca93bcb

Browse files
committed
Improve lane_type_and_count
1 parent 7ff01a4 commit ca93bcb

File tree

3 files changed

+15
-16
lines changed

3 files changed

+15
-16
lines changed

src/intrinsics/llvm.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ pub fn codegen_llvm_intrinsic_call<'tcx>(
3636

3737
// Used by `_mm_movemask_epi8` and `_mm256_movemask_epi8`
3838
llvm.x86.sse2.pmovmskb.128 | llvm.x86.avx2.pmovmskb | llvm.x86.sse2.movmsk.pd, (c a) {
39-
let (lane_layout, lane_count) = lane_type_and_count(fx, a.layout(), intrinsic);
39+
let (lane_layout, lane_count) = lane_type_and_count(fx.tcx, a.layout());
4040
let lane_ty = fx.clif_type(lane_layout.ty).unwrap();
4141
assert!(lane_count <= 32);
4242

src/intrinsics/mod.rs

+9-10
Original file line numberDiff line numberDiff line change
@@ -127,20 +127,19 @@ macro atomic_minmax($fx:expr, $cc:expr, <$T:ident> ($ptr:ident, $src:ident) -> $
127127
$ret.write_cvalue($fx, ret_val);
128128
}
129129

130-
fn lane_type_and_count<'tcx>(
131-
fx: &FunctionCx<'_, 'tcx, impl Backend>,
130+
pub fn lane_type_and_count<'tcx>(
131+
tcx: TyCtxt<'tcx>,
132132
layout: TyLayout<'tcx>,
133-
intrinsic: &str,
134133
) -> (TyLayout<'tcx>, u32) {
135134
assert!(layout.ty.is_simd());
136135
let lane_count = match layout.fields {
137136
layout::FieldPlacement::Array { stride: _, count } => u32::try_from(count).unwrap(),
138-
_ => panic!(
139-
"Non vector type {:?} passed to or returned from simd_* intrinsic {}",
140-
layout.ty, intrinsic
141-
),
137+
_ => unreachable!("lane_type_and_count({:?})", layout),
142138
};
143-
let lane_layout = layout.field(fx, 0);
139+
let lane_layout = layout.field(&ty::layout::LayoutCx {
140+
tcx,
141+
param_env: ParamEnv::reveal_all(),
142+
}, 0).unwrap();
144143
(lane_layout, lane_count)
145144
}
146145

@@ -161,8 +160,8 @@ fn simd_for_each_lane<'tcx, B: Backend>(
161160
assert_eq!(x.layout(), y.layout());
162161
let layout = x.layout();
163162

164-
let (lane_layout, lane_count) = lane_type_and_count(fx, layout, intrinsic);
165-
let (ret_lane_layout, ret_lane_count) = lane_type_and_count(fx, ret.layout(), intrinsic);
163+
let (lane_layout, lane_count) = lane_type_and_count(fx.tcx, layout);
164+
let (ret_lane_layout, ret_lane_count) = lane_type_and_count(fx.tcx, ret.layout());
166165
assert_eq!(lane_count, ret_lane_count);
167166

168167
for lane in 0..lane_count {

src/intrinsics/simd.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ pub fn codegen_simd_intrinsic_call<'tcx>(
2121
};
2222

2323
simd_cast, (c a) {
24-
let (lane_layout, lane_count) = lane_type_and_count(fx, a.layout(), intrinsic);
25-
let (ret_lane_layout, ret_lane_count) = lane_type_and_count(fx, ret.layout(), intrinsic);
24+
let (lane_layout, lane_count) = lane_type_and_count(fx.tcx, a.layout());
25+
let (ret_lane_layout, ret_lane_count) = lane_type_and_count(fx.tcx, ret.layout());
2626
assert_eq!(lane_count, ret_lane_count);
2727

2828
let ret_lane_ty = fx.clif_type(ret_lane_layout.ty).unwrap();
@@ -65,8 +65,8 @@ pub fn codegen_simd_intrinsic_call<'tcx>(
6565
assert_eq!(x.layout(), y.layout());
6666
let layout = x.layout();
6767

68-
let (lane_type, lane_count) = lane_type_and_count(fx, layout, intrinsic);
69-
let (ret_lane_type, ret_lane_count) = lane_type_and_count(fx, ret.layout(), intrinsic);
68+
let (lane_type, lane_count) = lane_type_and_count(fx.tcx, layout);
69+
let (ret_lane_type, ret_lane_count) = lane_type_and_count(fx.tcx, ret.layout());
7070

7171
assert_eq!(lane_type, ret_lane_type);
7272
assert_eq!(n, ret_lane_count);
@@ -124,7 +124,7 @@ pub fn codegen_simd_intrinsic_call<'tcx>(
124124
};
125125

126126
let idx = idx_const.val.try_to_bits(Size::from_bytes(4 /* u32*/)).expect(&format!("kind not scalar: {:?}", idx_const));
127-
let (_lane_type, lane_count) = lane_type_and_count(fx, v.layout(), intrinsic);
127+
let (_lane_type, lane_count) = lane_type_and_count(fx.tcx, v.layout());
128128
if idx >= lane_count.into() {
129129
fx.tcx.sess.span_fatal(fx.mir.span, &format!("[simd_extract] idx {} >= lane_count {}", idx, lane_count));
130130
}

0 commit comments

Comments
 (0)