Browse Source

Fix Switch for 128bit integers

pull/2214/head
bjorn3 4 years ago
parent
commit
45ccc6940e
  1. 2
      cranelift/codegen/meta/src/cdsl/typevar.rs
  2. 11
      cranelift/codegen/meta/src/shared/legalize.rs
  3. 10
      cranelift/frontend/src/switch.rs

2
cranelift/codegen/meta/src/cdsl/typevar.rs

@ -302,7 +302,7 @@ impl TypeVar {
pub fn to_rust_code(&self) -> String { pub fn to_rust_code(&self) -> String {
match &self.base { match &self.base {
Some(base) => format!( Some(base) => format!(
"{}.{}()", "{}.{}().unwrap()",
base.type_var.to_rust_code(), base.type_var.to_rust_code(),
base.derived_func.name() base.derived_func.name()
), ),

11
cranelift/codegen/meta/src/shared/legalize.rs

@ -402,6 +402,17 @@ pub(crate) fn define(insts: &InstructionGroup, imm: &Immediates) -> TransformGro
); );
} }
let zero = Literal::constant(&imm.imm64, 0);
narrow.legalize(
def!(a = iadd_imm.I128(x, c)),
vec![
def!(yh = iconst.I64(zero)),
def!(yl = iconst.I64(c)),
def!(y = iconcat.I64(yh, yl)),
def!(a = iadd(x, y)),
],
);
// Widen instructions with one input operand. // Widen instructions with one input operand.
for &op in &[bnot, popcnt] { for &op in &[bnot, popcnt] {
for &int_ty in &[I8, I16] { for &int_ty in &[I8, I16] {

10
cranelift/frontend/src/switch.rs

@ -276,6 +276,11 @@ impl Switch {
bx.switch_to_block(new_block); bx.switch_to_block(new_block);
// Cast to u32, as br_table is not implemented for integers bigger than 32bits. // Cast to u32, as br_table is not implemented for integers bigger than 32bits.
let discr = if bx.func.dfg.value_type(discr) == types::I128 {
bx.ins().isplit(discr).0
} else {
discr
};
bx.ins().ireduce(types::I32, discr) bx.ins().ireduce(types::I32, discr)
} else { } else {
discr discr
@ -648,8 +653,9 @@ block4:
jump block5 jump block5
block5: block5:
v2 = ireduce.i32 v0 v2, v3 = isplit.i128 v0
br_table v2, block3, jt0" v4 = ireduce.i32 v2
br_table v4, block3, jt0"
); );
} }
} }

Loading…
Cancel
Save