mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-21 03:28:31 +00:00
Add a new MOV8rr_NOREX, and make X86's copyRegToReg use it when
either the source or destination is a physical h register. This fixes sqlite3 with the post-RA scheduler enabled. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69111 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1759f5e3bf
commit
6d9305c7fd
@ -1641,6 +1641,11 @@ X86InstrInfo::InsertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB,
|
||||
return Count;
|
||||
}
|
||||
|
||||
/// isHReg - Test if the given register is a physical h register.
|
||||
static bool isHReg(unsigned Reg) {
|
||||
return Reg == X86::AH || Reg == X86::BH || Reg == X86::CH || Reg == X86::DH;
|
||||
}
|
||||
|
||||
bool X86InstrInfo::copyRegToReg(MachineBasicBlock &MBB,
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg, unsigned SrcReg,
|
||||
@ -1658,7 +1663,12 @@ bool X86InstrInfo::copyRegToReg(MachineBasicBlock &MBB,
|
||||
} else if (DestRC == &X86::GR16RegClass) {
|
||||
Opc = X86::MOV16rr;
|
||||
} else if (DestRC == &X86::GR8RegClass) {
|
||||
Opc = X86::MOV8rr;
|
||||
// Copying two or from a physical H register requires a NOREX move. Otherwise
|
||||
// use a normal move.
|
||||
if (isHReg(DestReg) || isHReg(SrcReg))
|
||||
Opc = X86::MOV8rr_NOREX;
|
||||
else
|
||||
Opc = X86::MOV8rr;
|
||||
} else if (DestRC == &X86::GR64_RegClass) {
|
||||
Opc = X86::MOV64rr;
|
||||
} else if (DestRC == &X86::GR32_RegClass) {
|
||||
|
@ -783,10 +783,15 @@ def MOV32mr : I<0x89, MRMDestMem, (outs), (ins i32mem:$dst, GR32:$src),
|
||||
"mov{l}\t{$src, $dst|$dst, $src}",
|
||||
[(store GR32:$src, addr:$dst)]>;
|
||||
|
||||
// A version of MOV8mr that uses i8mem_NOREX so that it can be used for
|
||||
// storing h registers, which can't be encoded when a REX prefix is present.
|
||||
def MOV8mr_NOREX : I<0x88, MRMDestMem, (outs), (ins i8mem_NOREX:$dst, GR8:$src),
|
||||
"mov{b}\t{$src, $dst|$dst, $src} # NOREX", []>;
|
||||
// Versions of MOV8rr and MOV8mr that use i8mem_NOREX and GR8_NOREX so that they
|
||||
// can be used for copying and storing h registers, which can't be encoded when
|
||||
// a REX prefix is present.
|
||||
let neverHasSideEffects = 1 in
|
||||
def MOV8rr_NOREX : I<0x88, MRMDestReg, (outs GR8_NOREX:$dst), (ins GR8_NOREX:$src),
|
||||
"mov{b}\t{$src, $dst|$dst, $src} # NOREX", []>;
|
||||
def MOV8mr_NOREX : I<0x88, MRMDestMem,
|
||||
(outs), (ins i8mem_NOREX:$dst, GR8_NOREX:$src),
|
||||
"mov{b}\t{$src, $dst|$dst, $src} # NOREX", []>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Fixed-Register Multiplication and Division Instructions...
|
||||
|
Loading…
Reference in New Issue
Block a user