Skip to content

Commit 43f9cc0

Browse files
committed
[WIP] Store vectors in registers
1 parent 64ca38e commit 43f9cc0

File tree

4 files changed

+26
-5
lines changed

4 files changed

+26
-5
lines changed

src/analyze.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub enum SsaKind {
1111

1212
pub fn analyze(fx: &FunctionCx<'_, '_, impl Backend>) -> IndexVec<Local, SsaKind> {
1313
let mut flag_map = fx.mir.local_decls.iter().map(|local_decl| {
14-
if fx.clif_type(local_decl.ty).is_some() {
14+
if fx.clif_type(fx.monomorphize(&local_decl.ty)).is_some() {
1515
SsaKind::Ssa
1616
} else {
1717
SsaKind::NotSsa

src/common.rs

+8
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,14 @@ pub fn clif_type_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Option<types:
6565
pointer_ty(tcx)
6666
}
6767
}
68+
_ if ty.is_simd() => {
69+
let (lane_type, lane_count) = crate::intrinsics::lane_type_and_count(
70+
tcx,
71+
tcx.layout_of(ParamEnv::reveal_all().and(ty)).unwrap(),
72+
);
73+
let lane_type = clif_type_from_ty(tcx, lane_type.ty)?;
74+
lane_type.by(u16::try_from(lane_count).unwrap()).expect("SIMD type with more than 255 lanes???")
75+
}
6876
ty::Param(_) => bug!("ty param {:?}", ty),
6977
_ => return None,
7078
})

src/lib.rs

+7-3
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,7 @@ fn build_isa(sess: &Session, enable_pic: bool) -> Box<dyn isa::TargetIsa + 'stat
257257
flags_builder.set("is_pic", "false").unwrap();
258258
}
259259
flags_builder.set("probestack_enabled", "false").unwrap(); // __cranelift_probestack is not provided
260+
flags_builder.set("enable_simd", "true").unwrap();
260261
flags_builder
261262
.set(
262263
"enable_verifier",
@@ -286,9 +287,12 @@ fn build_isa(sess: &Session, enable_pic: bool) -> Box<dyn isa::TargetIsa + 'stat
286287

287288
let target_triple = crate::target_triple(sess);
288289
let flags = settings::Flags::new(flags_builder);
289-
cranelift_codegen::isa::lookup(target_triple)
290-
.unwrap()
291-
.finish(flags)
290+
291+
let mut isa_builder = cranelift_codegen::isa::lookup(target_triple).unwrap();
292+
isa_builder.enable("skylake").unwrap();
293+
// FIXME set all enabled rust target features
294+
295+
isa_builder.finish(flags)
292296
}
293297

294298
/// This is the entrypoint for a hot plugged rustc_codegen_cranelift

src/pointer.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,16 @@ impl Pointer {
129129
PointerBase::Stack(stack_slot) => if ty == types::I128 || ty.is_vector() {
130130
// WORKAROUND for stack_load.i128 and stack_load.iXxY not being implemented
131131
let base_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0);
132-
fx.bcx.ins().load(ty, flags, base_addr, self.offset)
132+
/*if ty.is_vector() {
133+
let zero = fx.bcx.ins().iconst(ty.lane_type(), 0);
134+
let vec = fx.bcx.ins().splat(ty, zero);
135+
(0..u8::try_from(ty.lane_count()).unwrap()).fold(vec, |vec, idx| {
136+
let lane = fx.bcx.ins().load(ty.lane_type(), flags, base_addr, self.offset.try_add_i64(i64::from(idx) * i64::from(ty.lane_type().bytes())).unwrap());
137+
fx.bcx.ins().insertlane(vec, idx, lane)
138+
})
139+
} else {*/
140+
fx.bcx.ins().load(ty, flags, base_addr, self.offset)
141+
//}
133142
} else {
134143
fx.bcx.ins().stack_load(ty, stack_slot, self.offset)
135144
}

0 commit comments

Comments
 (0)