machinst x64: fix JmpUnknown register mapping;
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user