Skip to content

Commit ae98a2f

Browse files
committed
Simplify some code based on newly implemented instructions
1 parent e9115eb commit ae98a2f

File tree

3 files changed

+28
-101
lines changed

3 files changed

+28
-101
lines changed

Cargo.lock

Lines changed: 15 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/base.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -575,12 +575,6 @@ fn codegen_stmt<'tcx>(
575575
_ => unreachable!("un op Not for {:?}", layout.ty),
576576
},
577577
UnOp::Neg => match layout.ty.kind() {
578-
ty::Int(IntTy::I128) => {
579-
// FIXME remove this case once ineg.i128 works
580-
let zero =
581-
CValue::const_val(fx, layout, ty::ScalarInt::null(layout.size));
582-
crate::num::codegen_int_binop(fx, BinOp::Sub, zero, operand)
583-
}
584578
ty::Int(_) => CValue::by_val(fx.bcx.ins().ineg(val), layout),
585579
ty::Float(_) => CValue::by_val(fx.bcx.ins().fneg(val), layout),
586580
_ => unreachable!("un op Neg for {:?}", layout.ty),

src/intrinsics/mod.rs

Lines changed: 13 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,7 @@ fn bool_to_zero_or_max_uint<'tcx>(
197197
ty => ty,
198198
};
199199

200-
let val = if int_ty == types::I8 { val } else { fx.bcx.ins().uextend(int_ty, val) };
201-
202-
// FIXME use bmask instead
203-
let mut res = fx.bcx.ins().ineg(val);
200+
let mut res = fx.bcx.ins().bmask(int_ty, val);
204201

205202
if ty.is_float() {
206203
res = fx.bcx.ins().bitcast(ty, res);
@@ -636,85 +633,21 @@ fn codegen_regular_intrinsic_call<'tcx>(
636633
ret.write_cvalue(fx, res);
637634
}
638635
sym::bswap => {
639-
// FIXME(CraneStation/cranelift#794) add bswap instruction to cranelift
640-
fn swap(bcx: &mut FunctionBuilder<'_>, v: Value) -> Value {
641-
match bcx.func.dfg.value_type(v) {
642-
types::I8 => v,
643-
644-
// https://code.woboq.org/gcc/include/bits/byteswap.h.html
645-
types::I16 => {
646-
let tmp1 = bcx.ins().ishl_imm(v, 8);
647-
let n1 = bcx.ins().band_imm(tmp1, 0xFF00);
648-
649-
let tmp2 = bcx.ins().ushr_imm(v, 8);
650-
let n2 = bcx.ins().band_imm(tmp2, 0x00FF);
651-
652-
bcx.ins().bor(n1, n2)
653-
}
654-
types::I32 => {
655-
let tmp1 = bcx.ins().ishl_imm(v, 24);
656-
let n1 = bcx.ins().band_imm(tmp1, 0xFF00_0000);
657-
658-
let tmp2 = bcx.ins().ishl_imm(v, 8);
659-
let n2 = bcx.ins().band_imm(tmp2, 0x00FF_0000);
660-
661-
let tmp3 = bcx.ins().ushr_imm(v, 8);
662-
let n3 = bcx.ins().band_imm(tmp3, 0x0000_FF00);
663-
664-
let tmp4 = bcx.ins().ushr_imm(v, 24);
665-
let n4 = bcx.ins().band_imm(tmp4, 0x0000_00FF);
666-
667-
let or_tmp1 = bcx.ins().bor(n1, n2);
668-
let or_tmp2 = bcx.ins().bor(n3, n4);
669-
bcx.ins().bor(or_tmp1, or_tmp2)
670-
}
671-
types::I64 => {
672-
let tmp1 = bcx.ins().ishl_imm(v, 56);
673-
let n1 = bcx.ins().band_imm(tmp1, 0xFF00_0000_0000_0000u64 as i64);
674-
675-
let tmp2 = bcx.ins().ishl_imm(v, 40);
676-
let n2 = bcx.ins().band_imm(tmp2, 0x00FF_0000_0000_0000u64 as i64);
677-
678-
let tmp3 = bcx.ins().ishl_imm(v, 24);
679-
let n3 = bcx.ins().band_imm(tmp3, 0x0000_FF00_0000_0000u64 as i64);
680-
681-
let tmp4 = bcx.ins().ishl_imm(v, 8);
682-
let n4 = bcx.ins().band_imm(tmp4, 0x0000_00FF_0000_0000u64 as i64);
683-
684-
let tmp5 = bcx.ins().ushr_imm(v, 8);
685-
let n5 = bcx.ins().band_imm(tmp5, 0x0000_0000_FF00_0000u64 as i64);
686-
687-
let tmp6 = bcx.ins().ushr_imm(v, 24);
688-
let n6 = bcx.ins().band_imm(tmp6, 0x0000_0000_00FF_0000u64 as i64);
689-
690-
let tmp7 = bcx.ins().ushr_imm(v, 40);
691-
let n7 = bcx.ins().band_imm(tmp7, 0x0000_0000_0000_FF00u64 as i64);
692-
693-
let tmp8 = bcx.ins().ushr_imm(v, 56);
694-
let n8 = bcx.ins().band_imm(tmp8, 0x0000_0000_0000_00FFu64 as i64);
695-
696-
let or_tmp1 = bcx.ins().bor(n1, n2);
697-
let or_tmp2 = bcx.ins().bor(n3, n4);
698-
let or_tmp3 = bcx.ins().bor(n5, n6);
699-
let or_tmp4 = bcx.ins().bor(n7, n8);
700-
701-
let or_tmp5 = bcx.ins().bor(or_tmp1, or_tmp2);
702-
let or_tmp6 = bcx.ins().bor(or_tmp3, or_tmp4);
703-
bcx.ins().bor(or_tmp5, or_tmp6)
704-
}
705-
types::I128 => {
706-
let (lo, hi) = bcx.ins().isplit(v);
707-
let lo = swap(bcx, lo);
708-
let hi = swap(bcx, hi);
709-
bcx.ins().iconcat(hi, lo)
710-
}
711-
ty => unreachable!("bswap {}", ty),
712-
}
713-
}
714636
intrinsic_args!(fx, args => (arg); intrinsic);
715637
let val = arg.load_scalar(fx);
716638

717-
let res = CValue::by_val(swap(&mut fx.bcx, val), arg.layout());
639+
let res = match fx.bcx.func.dfg.value_type(val) {
640+
types::I8 => val,
641+
types::I128 => {
642+
// FIXME(bytecodealliance/wasmtime#1092) bswap.i128 is not yet implemented
643+
let (lsb, msb) = fx.bcx.ins().isplit(val);
644+
let lsb_swap = fx.bcx.ins().bswap(lsb);
645+
let msb_swap = fx.bcx.ins().bswap(msb);
646+
fx.bcx.ins().iconcat(msb_swap, lsb_swap)
647+
}
648+
_ => fx.bcx.ins().bswap(val),
649+
};
650+
let res = CValue::by_val(res, arg.layout());
718651
ret.write_cvalue(fx, res);
719652
}
720653
sym::assert_inhabited | sym::assert_zero_valid | sym::assert_uninit_valid => {

0 commit comments

Comments
 (0)