machinst x64: fix JmpUnknown register mapping;

This commit is contained in:
Benjamin Bouvier
2020-07-06 14:49:35 +02:00
parent fe7dd41435
commit aa7db7fd7b

View File

@@ -832,12 +832,7 @@ fn x64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
// regalloc.rs will "fix" this for us by removing the the modified set from the use and def // regalloc.rs will "fix" this for us by removing the the modified set from the use and def
// sets. // sets.
match inst { match inst {
Inst::Alu_RMI_R { Inst::Alu_RMI_R { src, dst, .. } => {
is_64: _,
op: _,
src,
dst,
} => {
src.get_regs_as_uses(collector); src.get_regs_as_uses(collector);
collector.add_mod(*dst); collector.add_mod(*dst);
} }
@@ -895,18 +890,13 @@ fn x64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
collector.add_use(*src); collector.add_use(*src);
dst.get_regs_as_uses(collector); dst.get_regs_as_uses(collector);
} }
Inst::Shift_R { Inst::Shift_R { num_bits, dst, .. } => {
is_64: _,
kind: _,
num_bits,
dst,
} => {
if num_bits.is_none() { if num_bits.is_none() {
collector.add_use(regs::rcx()); collector.add_use(regs::rcx());
} }
collector.add_mod(*dst); collector.add_mod(*dst);
} }
Inst::Cmp_RMI_R { size: _, src, dst } => { Inst::Cmp_RMI_R { src, dst, .. } => {
src.get_regs_as_uses(collector); src.get_regs_as_uses(collector);
collector.add_use(*dst); // yes, really `add_use` collector.add_use(*dst); // yes, really `add_use`
} }
@@ -954,12 +944,15 @@ fn x64_get_regs(inst: &Inst, collector: &mut RegUsageCollector) {
collector.add_def(*tmp2); collector.add_def(*tmp2);
} }
Inst::JmpUnknown { target } => {
target.get_regs_as_uses(collector);
}
Inst::Ret Inst::Ret
| Inst::EpiloguePlaceholder | Inst::EpiloguePlaceholder
| Inst::JmpKnown { .. } | Inst::JmpKnown { .. }
| Inst::JmpCond { .. } | Inst::JmpCond { .. }
| Inst::Nop { .. } | Inst::Nop { .. }
| Inst::JmpUnknown { .. }
| Inst::TrapIf { .. } | Inst::TrapIf { .. }
| Inst::VirtualSPOffsetAdj { .. } | Inst::VirtualSPOffsetAdj { .. }
| Inst::Hlt | Inst::Hlt
@@ -996,15 +989,11 @@ fn map_mod<RUM: RegUsageMapper>(m: &RUM, r: &mut Writable<Reg>) {
impl Amode { impl Amode {
fn map_uses<RUM: RegUsageMapper>(&mut self, map: &RUM) { fn map_uses<RUM: RegUsageMapper>(&mut self, map: &RUM) {
match self { match self {
Amode::ImmReg { Amode::ImmReg { ref mut base, .. } => map_use(map, base),
simm32: _,
ref mut base,
} => map_use(map, base),
Amode::ImmRegRegShift { Amode::ImmRegRegShift {
simm32: _,
ref mut base, ref mut base,
ref mut index, ref mut index,
shift: _, ..
} => { } => {
map_use(map, base); map_use(map, base);
map_use(map, index); map_use(map, index);
@@ -1021,7 +1010,7 @@ impl RegMemImm {
match self { match self {
RegMemImm::Reg { ref mut reg } => map_use(map, reg), RegMemImm::Reg { ref mut reg } => map_use(map, reg),
RegMemImm::Mem { ref mut addr } => addr.map_uses(map), RegMemImm::Mem { ref mut addr } => addr.map_uses(map),
RegMemImm::Imm { simm32: _ } => {} RegMemImm::Imm { .. } => {}
} }
} }
} }
@@ -1082,15 +1071,11 @@ fn x64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
map_use(mapper, src); map_use(mapper, src);
dst.map_uses(mapper); dst.map_uses(mapper);
} }
Inst::Imm_R { Inst::Imm_R { ref mut dst, .. } => map_def(mapper, dst),
dst_is_64: _,
simm64: _,
ref mut dst,
} => map_def(mapper, dst),
Inst::Mov_R_R { Inst::Mov_R_R {
is_64: _,
ref mut src, ref mut src,
ref mut dst, ref mut dst,
..
} => { } => {
map_use(mapper, src); map_use(mapper, src);
map_def(mapper, dst); map_def(mapper, dst);
@@ -1123,18 +1108,13 @@ fn x64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
map_use(mapper, src); map_use(mapper, src);
dst.map_uses(mapper); dst.map_uses(mapper);
} }
Inst::Shift_R { Inst::Shift_R { ref mut dst, .. } => {
is_64: _,
kind: _,
num_bits: _,
ref mut dst,
} => {
map_mod(mapper, dst); map_mod(mapper, dst);
} }
Inst::Cmp_RMI_R { Inst::Cmp_RMI_R {
size: _,
ref mut src, ref mut src,
ref mut dst, ref mut dst,
..
} => { } => {
src.map_uses(mapper); src.map_uses(mapper);
map_use(mapper, dst); map_use(mapper, dst);
@@ -1192,12 +1172,13 @@ fn x64_map_regs<RUM: RegUsageMapper>(inst: &mut Inst, mapper: &RUM) {
map_def(mapper, tmp2); map_def(mapper, tmp2);
} }
Inst::JmpUnknown { ref mut target } => target.map_uses(mapper),
Inst::Ret Inst::Ret
| Inst::EpiloguePlaceholder | Inst::EpiloguePlaceholder
| Inst::JmpKnown { .. } | Inst::JmpKnown { .. }
| Inst::JmpCond { .. } | Inst::JmpCond { .. }
| Inst::Nop { .. } | Inst::Nop { .. }
| Inst::JmpUnknown { .. }
| Inst::TrapIf { .. } | Inst::TrapIf { .. }
| Inst::VirtualSPOffsetAdj { .. } | Inst::VirtualSPOffsetAdj { .. }
| Inst::Ud2 { .. } | Inst::Ud2 { .. }
@@ -1255,9 +1236,7 @@ impl MachInst for Inst {
&Self::Ret | &Self::EpiloguePlaceholder => MachTerminator::Ret, &Self::Ret | &Self::EpiloguePlaceholder => MachTerminator::Ret,
&Self::JmpKnown { dst } => MachTerminator::Uncond(dst.as_label().unwrap()), &Self::JmpKnown { dst } => MachTerminator::Uncond(dst.as_label().unwrap()),
&Self::JmpCond { &Self::JmpCond {
cc: _, taken, not_taken, ..
taken,
not_taken,
} => MachTerminator::Cond(taken.as_label().unwrap(), not_taken.as_label().unwrap()), } => MachTerminator::Cond(taken.as_label().unwrap(), not_taken.as_label().unwrap()),
&Self::JmpTableSeq { &Self::JmpTableSeq {
ref targets_for_term, ref targets_for_term,