summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86CodeEmitter.cpp
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-09-13 19:07:28 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-09-13 19:07:28 +0000
commit92e5113d480546f448a1b7a3e5f9e794c449d135 (patch)
tree10ea7df5552c1b009d35c649307f9c1723d512c6 /llvm/lib/Target/X86/X86CodeEmitter.cpp
parent3a4dc7b4891dc5acd87ac28b4ebfc8a6a2471897 (diff)
downloadbcm5719-llvm-92e5113d480546f448a1b7a3e5f9e794c449d135.tar.gz
bcm5719-llvm-92e5113d480546f448a1b7a3e5f9e794c449d135.zip
Skip over first operand when determining REX prefix for two-address code.
llvm-svn: 30300
Diffstat (limited to 'llvm/lib/Target/X86/X86CodeEmitter.cpp')
-rw-r--r--llvm/lib/Target/X86/X86CodeEmitter.cpp21
1 files changed, 14 insertions, 7 deletions
diff --git a/llvm/lib/Target/X86/X86CodeEmitter.cpp b/llvm/lib/Target/X86/X86CodeEmitter.cpp
index 0ac8bc5f32a..8d1e91285ef 100644
--- a/llvm/lib/Target/X86/X86CodeEmitter.cpp
+++ b/llvm/lib/Target/X86/X86CodeEmitter.cpp
@@ -470,9 +470,12 @@ unsigned Emitter::determineREX(const MachineInstr &MI) {
REX |= 1 << 3;
if (MI.getNumOperands()) {
+ bool isTwoAddr = (Desc.Flags & M_2_ADDR_FLAG) != 0;
+
// If it accesses SPL, BPL, SIL, or DIL, then it requires a 0x40 REX prefix.
bool isTrunc8 = isX86_64TruncToByte(Opcode);
- for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
+ unsigned i = isTwoAddr ? 1 : 0;
+ for (unsigned e = MI.getNumOperands(); i != e; ++i) {
const MachineOperand& MO = MI.getOperand(i);
if (MO.isRegister()) {
unsigned Reg = MO.getReg();
@@ -493,7 +496,8 @@ unsigned Emitter::determineREX(const MachineInstr &MI) {
case X86II::MRMSrcReg: {
if (isX86_64ExtendedReg(MI.getOperand(0)))
REX |= 1 << 2;
- for (unsigned i = 1, e = MI.getNumOperands(); i != e; ++i) {
+ i = isTwoAddr ? 2 : 1;
+ for (unsigned e = MI.getNumOperands(); i != e; ++i) {
const MachineOperand& MO = MI.getOperand(i);
if (isX86_64ExtendedReg(MO))
REX |= 1 << 0;
@@ -504,7 +508,8 @@ unsigned Emitter::determineREX(const MachineInstr &MI) {
if (isX86_64ExtendedReg(MI.getOperand(0)))
REX |= 1 << 2;
unsigned Bit = 0;
- for (unsigned i = 1; i != 5; ++i) {
+ i = isTwoAddr ? 2 : 1;
+ for (; i != MI.getNumOperands(); ++i) {
const MachineOperand& MO = MI.getOperand(i);
if (MO.isRegister()) {
if (isX86_64ExtendedReg(MO))
@@ -519,11 +524,12 @@ unsigned Emitter::determineREX(const MachineInstr &MI) {
case X86II::MRM4m: case X86II::MRM5m:
case X86II::MRM6m: case X86II::MRM7m:
case X86II::MRMDestMem: {
- if (MI.getNumOperands() >= 5 &&
- isX86_64ExtendedReg(MI.getOperand(4)))
+ unsigned e = isTwoAddr ? 5 : 4;
+ i = isTwoAddr ? 1 : 0;
+ if (MI.getNumOperands() > e && isX86_64ExtendedReg(MI.getOperand(e)))
REX |= 1 << 2;
unsigned Bit = 0;
- for (unsigned i = 0; i != 4; ++i) {
+ for (; i != e; ++i) {
const MachineOperand& MO = MI.getOperand(i);
if (MO.isRegister()) {
if (isX86_64ExtendedReg(MO))
@@ -536,7 +542,8 @@ unsigned Emitter::determineREX(const MachineInstr &MI) {
default: {
if (isX86_64ExtendedReg(MI.getOperand(0)))
REX |= 1 << 0;
- for (unsigned i = 1, e = MI.getNumOperands(); i != e; ++i) {
+ i = isTwoAddr ? 2 : 1;
+ for (unsigned e = MI.getNumOperands(); i != e; ++i) {
const MachineOperand& MO = MI.getOperand(i);
if (isX86_64ExtendedReg(MO))
REX |= 1 << 2;
OpenPOWER on IntegriCloud