mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-30 23:20:54 +00:00
[X86] Add a new LOW32_ADDR_ACCESS_RBP register class.
ABIs like NaCl uses 32-bit addresses but have 64-bit frame. The new register class reflects those constraints when choosing a register class for a address access. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268796 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
93cbe6ed35
commit
72d2da5ca3
@ -166,7 +166,15 @@ X86RegisterInfo::getPointerRegClass(const MachineFunction &MF,
|
||||
// we can still use 64-bit register as long as we know the high bits
|
||||
// are zeros.
|
||||
// Reflect that in the returned register class.
|
||||
return Is64Bit ? &X86::LOW32_ADDR_ACCESSRegClass : &X86::GR32RegClass;
|
||||
if (Is64Bit) {
|
||||
// When the target also allows 64-bit frame pointer and we do have a
|
||||
// frame, this is fine to use it for the address accesses as well.
|
||||
const X86FrameLowering *TFI = getFrameLowering(MF);
|
||||
return TFI->hasFP(MF) && TFI->Uses64BitFramePtr
|
||||
? &X86::LOW32_ADDR_ACCESS_RBPRegClass
|
||||
: &X86::LOW32_ADDR_ACCESSRegClass;
|
||||
}
|
||||
return &X86::GR32RegClass;
|
||||
case 1: // Normal GPRs except the stack pointer (for encoding reasons).
|
||||
if (Subtarget.isTarget64BitLP64())
|
||||
return &X86::GR64_NOSPRegClass;
|
||||
|
@ -427,6 +427,11 @@ def GR64_NOREX_NOSP : RegisterClass<"X86", [i64], 64,
|
||||
// which we do not have right now.
|
||||
def LOW32_ADDR_ACCESS : RegisterClass<"X86", [i32], 64, (add GR32, RIP)>;
|
||||
|
||||
// When RBP is used as a base pointer in a 32-bit addresses environement,
|
||||
// this is also safe to use the full register to access addresses.
|
||||
def LOW32_ADDR_ACCESS_RBP : RegisterClass<"X86", [i32], 64,
|
||||
(add LOW32_ADDR_ACCESS, RBP)>;
|
||||
|
||||
// A class to support the 'A' assembler constraint: EAX then EDX.
|
||||
def GR32_AD : RegisterClass<"X86", [i32], 32, (add EAX, EDX)>;
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: llc -mtriple=x86_64-pc-linux < %s | FileCheck %s
|
||||
; RUN: llc -mtriple=x86_64-pc-linux-gnux32 < %s | FileCheck -check-prefix=X32ABI %s
|
||||
; RUN: llc -mtriple=x86_64-pc-nacl < %s | FileCheck -check-prefix=NACL %s
|
||||
; RUN: llc -verify-machineinstrs -mtriple=x86_64-pc-linux < %s | FileCheck %s
|
||||
; RUN: llc -verify-machineinstrs -mtriple=x86_64-pc-linux-gnux32 < %s | FileCheck -check-prefix=X32ABI %s
|
||||
; RUN: llc -verify-machineinstrs -mtriple=x86_64-pc-nacl < %s | FileCheck -check-prefix=NACL %s
|
||||
|
||||
; x32 uses %esp, %ebp as stack and frame pointers
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user