Add a test with a fixed register constraint.
Make sure we use the diverted register location for tied operands.
This commit is contained in:
@@ -13,3 +13,16 @@ ebb0:
|
|||||||
v2 = isub v0, v1
|
v2 = isub v0, v1
|
||||||
return v2
|
return v2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
; Fixed register constraint.
|
||||||
|
function %fixed_op() -> i32 {
|
||||||
|
ebb0:
|
||||||
|
; check: ,%rax]
|
||||||
|
; sameln: $v0 = iconst.i32 12
|
||||||
|
v0 = iconst.i32 12
|
||||||
|
v1 = iconst.i32 13
|
||||||
|
; The dynamic shift amount must be in %rcx
|
||||||
|
; check: regmove $v0, %rax -> %rcx
|
||||||
|
v2 = ishl v1, v0
|
||||||
|
return v2
|
||||||
|
}
|
||||||
|
|||||||
@@ -371,7 +371,8 @@ impl<'a> Context<'a> {
|
|||||||
for (op, lv) in constraints.outs.iter().zip(defs) {
|
for (op, lv) in constraints.outs.iter().zip(defs) {
|
||||||
if let ConstraintKind::Tied(num) = op.kind {
|
if let ConstraintKind::Tied(num) = op.kind {
|
||||||
let arg = dfg.inst_args(inst)[num as usize];
|
let arg = dfg.inst_args(inst)[num as usize];
|
||||||
locations[lv.value] = locations[arg];
|
let reg = self.divert.reg(arg, locations);
|
||||||
|
locations[lv.value] = ValueLoc::Reg(reg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user