aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/Target/X86/X86FastISel.cpp14
-rw-r--r--lib/Target/X86/X86NaClRewritePass.cpp20
2 files changed, 31 insertions, 3 deletions
diff --git a/lib/Target/X86/X86FastISel.cpp b/lib/Target/X86/X86FastISel.cpp
index 0b213e9a90..318f2398e5 100644
--- a/lib/Target/X86/X86FastISel.cpp
+++ b/lib/Target/X86/X86FastISel.cpp
@@ -578,6 +578,20 @@ bool X86FastISel::X86SelectAddress(const Value *V, X86AddressMode &AM) {
// If all else fails, try to materialize the value in a register.
if (!AM.GV || !Subtarget->isPICStyleRIPRel()) {
+ // @LOCALMOD-START
+ if (Subtarget->isTargetNaCl()) {
+ // We can materialize into a memory address only if
+ // no registers have been defined (and hence, we
+ // aren't modifying an existing memory reference).
+ if ((AM.Base.Reg == 0) && (AM.IndexReg == 0)) {
+ // Put into index register so that the NaCl rewrite pass will
+ // convert this to a 64-bit address.
+ AM.IndexReg = getRegForValue(V);
+ return AM.IndexReg != 0;
+ }
+ return false;
+ }
+ // @LOCALMOD-END
if (AM.Base.Reg == 0) {
AM.Base.Reg = getRegForValue(V);
return AM.Base.Reg != 0;
diff --git a/lib/Target/X86/X86NaClRewritePass.cpp b/lib/Target/X86/X86NaClRewritePass.cpp
index d78de24924..86bb45584e 100644
--- a/lib/Target/X86/X86NaClRewritePass.cpp
+++ b/lib/Target/X86/X86NaClRewritePass.cpp
@@ -536,9 +536,23 @@ bool X86NaClRewritePass::ApplyMemorySFI(MachineBasicBlock &MBB,
assert(Scale.getImm() == 1);
AddrReg = 0;
} else {
- assert(!BaseReg.getReg() && "Unexpected relative register pair");
- BaseReg.setReg(UseZeroBasedSandbox ? 0 : X86::R15);
- AddrReg = IndexReg.getReg();
+ if (!BaseReg.getReg()) {
+ // No base, fill in relative.
+ BaseReg.setReg(UseZeroBasedSandbox ? 0 : X86::R15);
+ AddrReg = IndexReg.getReg();
+ } else if (!UseZeroBasedSandbox) {
+ // Switch base and index registers if index register is undefined.
+ // That is do conversions like "mov d(%r,0,0) -> mov d(%r15, %r, 1)".
+ assert (!IndexReg.getReg()
+ && "Unexpected index and base register");
+ IndexReg.setReg(BaseReg.getReg());
+ Scale.setImm(1);
+ BaseReg.setReg(X86::R15);
+ AddrReg = IndexReg.getReg();
+ } else {
+ llvm_unreachable(
+ "Unexpected index and base register");
+ }
}
if (AddrReg) {