diff --git a/cranelift/codegen/meta/src/cdsl/typevar.rs b/cranelift/codegen/meta/src/cdsl/typevar.rs index 752b458b2a..c1027bf847 100644 --- a/cranelift/codegen/meta/src/cdsl/typevar.rs +++ b/cranelift/codegen/meta/src/cdsl/typevar.rs @@ -302,7 +302,7 @@ impl TypeVar { pub fn to_rust_code(&self) -> String { match &self.base { Some(base) => format!( - "{}.{}()", + "{}.{}().unwrap()", base.type_var.to_rust_code(), base.derived_func.name() ), diff --git a/cranelift/codegen/meta/src/shared/legalize.rs b/cranelift/codegen/meta/src/shared/legalize.rs index 5bd9b5f4f0..9a0d6cffde 100644 --- a/cranelift/codegen/meta/src/shared/legalize.rs +++ b/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. for &op in &[bnot, popcnt] { for &int_ty in &[I8, I16] { diff --git a/cranelift/frontend/src/switch.rs b/cranelift/frontend/src/switch.rs index 7719de1752..f4711e4591 100644 --- a/cranelift/frontend/src/switch.rs +++ b/cranelift/frontend/src/switch.rs @@ -276,6 +276,11 @@ impl Switch { bx.switch_to_block(new_block); // 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) } else { discr @@ -648,8 +653,9 @@ block4: jump block5 block5: - v2 = ireduce.i32 v0 - br_table v2, block3, jt0" + v2, v3 = isplit.i128 v0 + v4 = ireduce.i32 v2 + br_table v4, block3, jt0" ); } }