Legalize load.i128 and store.i128 with arbitrary offsets
This commit is contained in:
@@ -567,3 +567,63 @@ fn expand_stack_store(
|
|||||||
mflags.set_aligned();
|
mflags.set_aligned();
|
||||||
pos.func.dfg.replace(inst).store(mflags, val, addr, 0);
|
pos.func.dfg.replace(inst).store(mflags, val, addr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Split a load into two parts before `iconcat`ing the result together.
|
||||||
|
fn narrow_load(
|
||||||
|
inst: ir::Inst,
|
||||||
|
func: &mut ir::Function,
|
||||||
|
_cfg: &mut ControlFlowGraph,
|
||||||
|
_isa: &dyn TargetIsa,
|
||||||
|
) {
|
||||||
|
let mut pos = FuncCursor::new(func).at_inst(inst);
|
||||||
|
pos.use_srcloc(inst);
|
||||||
|
|
||||||
|
let (ptr, offset, flags) = match pos.func.dfg[inst] {
|
||||||
|
ir::InstructionData::Load {
|
||||||
|
opcode: ir::Opcode::Load,
|
||||||
|
arg,
|
||||||
|
offset,
|
||||||
|
flags,
|
||||||
|
} => (arg, offset, flags),
|
||||||
|
_ => panic!("Expected load: {}", pos.func.dfg.display_inst(inst, None)),
|
||||||
|
};
|
||||||
|
|
||||||
|
let al = pos.ins().load(ir::types::I64, flags, ptr, offset);
|
||||||
|
let ah = pos.ins().load(
|
||||||
|
ir::types::I64,
|
||||||
|
flags,
|
||||||
|
ptr,
|
||||||
|
offset.try_add_i64(8).expect("load offset overflow"),
|
||||||
|
);
|
||||||
|
pos.func.dfg.replace(inst).iconcat(al, ah);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Split a store into two parts after `isplit`ing the value.
|
||||||
|
fn narrow_store(
|
||||||
|
inst: ir::Inst,
|
||||||
|
func: &mut ir::Function,
|
||||||
|
_cfg: &mut ControlFlowGraph,
|
||||||
|
_isa: &dyn TargetIsa,
|
||||||
|
) {
|
||||||
|
let mut pos = FuncCursor::new(func).at_inst(inst);
|
||||||
|
pos.use_srcloc(inst);
|
||||||
|
|
||||||
|
let (val, ptr, offset, flags) = match pos.func.dfg[inst] {
|
||||||
|
ir::InstructionData::Store {
|
||||||
|
opcode: ir::Opcode::Store,
|
||||||
|
args,
|
||||||
|
offset,
|
||||||
|
flags,
|
||||||
|
} => (args[0], args[1], offset, flags),
|
||||||
|
_ => panic!("Expected store: {}", pos.func.dfg.display_inst(inst, None)),
|
||||||
|
};
|
||||||
|
|
||||||
|
let (al, ah) = pos.func.dfg.replace(inst).isplit(val);
|
||||||
|
pos.ins().store(flags, al, ptr, offset);
|
||||||
|
pos.ins().store(
|
||||||
|
flags,
|
||||||
|
ah,
|
||||||
|
ptr,
|
||||||
|
offset.try_add_i64(8).expect("store offset overflow"),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|||||||
@@ -28,19 +28,19 @@ ebb0(v0: i128):
|
|||||||
}
|
}
|
||||||
|
|
||||||
function u0:2(i64, i128) fast {
|
function u0:2(i64, i128) fast {
|
||||||
; check: ebb0(v0: i64 [%rdi], v2: i64 [%rsi], v3: i64 [%rdx], v4: i64 [%rbp]):
|
; check: ebb0(v0: i64 [%rdi], v2: i64 [%rsi], v3: i64 [%rdx], v6: i64 [%rbp]):
|
||||||
ebb0(v0: i64, v1: i128):
|
ebb0(v0: i64, v1: i128):
|
||||||
; check: store v2, v0
|
; check: store v2, v0+8
|
||||||
; check: store v3, v0+8
|
; check: store v3, v0+16
|
||||||
store v1, v0
|
store v1, v0+8
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
function u0:3(i64) -> i128 fast {
|
function u0:3(i64) -> i128 fast {
|
||||||
ebb0(v0: i64):
|
ebb0(v0: i64):
|
||||||
; check: v2 = load.i64 v0
|
; check: v2 = load.i64 v0+8
|
||||||
; check: v3 = load.i64 v0+8
|
; check: v3 = load.i64 v0+16
|
||||||
v1 = load.i128 v0
|
v1 = load.i128 v0+8
|
||||||
; check: return v2, v3, v5
|
; check: return v2, v3, v5
|
||||||
return v1
|
return v1
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user