Simplify jump table instructions and add missing conversion;
This makes non-legalized jump table instructions operate on operands with pointer-sized types. This means we need to extend smaller types into the pointer-sized operand, when the two don't match.
This commit is contained in:
@@ -240,29 +240,34 @@ fn expand_br_table_jt(
|
||||
// $addr = iadd $base, $rel_addr
|
||||
// indirect_jump_table_br $addr, $jt
|
||||
|
||||
let table_size = func.jump_tables[table].len();
|
||||
let addr_ty = isa.pointer_type();
|
||||
let entry_ty = I32;
|
||||
|
||||
let ebb = func.layout.pp_ebb(inst);
|
||||
let jump_table_ebb = func.dfg.make_ebb();
|
||||
|
||||
let mut pos = FuncCursor::new(func).at_inst(inst);
|
||||
pos.use_srcloc(inst);
|
||||
|
||||
// Bounds check
|
||||
// Bounds check.
|
||||
let table_size = pos.func.jump_tables[table].len() as i64;
|
||||
let oob = pos
|
||||
.ins()
|
||||
.icmp_imm(IntCC::UnsignedGreaterThanOrEqual, arg, table_size as i64);
|
||||
.icmp_imm(IntCC::UnsignedGreaterThanOrEqual, arg, table_size);
|
||||
|
||||
pos.ins().brnz(oob, default_ebb, &[]);
|
||||
pos.ins().jump(jump_table_ebb, &[]);
|
||||
pos.insert_ebb(jump_table_ebb);
|
||||
|
||||
let addr_ty = isa.pointer_type();
|
||||
|
||||
let arg = if pos.func.dfg.value_type(arg) == addr_ty {
|
||||
arg
|
||||
} else {
|
||||
pos.ins().uextend(addr_ty, arg)
|
||||
};
|
||||
|
||||
let base_addr = pos.ins().jump_table_base(addr_ty, table);
|
||||
let entry = pos
|
||||
.ins()
|
||||
.jump_table_entry(addr_ty, arg, base_addr, entry_ty.bytes() as u8, table);
|
||||
.jump_table_entry(arg, base_addr, I32.bytes() as u8, table);
|
||||
|
||||
let addr = pos.ins().iadd(base_addr, entry);
|
||||
pos.ins().indirect_jump_table_br(addr, table);
|
||||
|
||||
Reference in New Issue
Block a user