mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-14 15:39:00 +00:00
Initial x86 support for BlockAddresses.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@85557 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8c2b52552c
commit
f705adbe5e
@ -329,6 +329,10 @@ void X86MCInstLower::Lower(const MachineInstr *MI, MCInst &OutMI) const {
|
||||
case MachineOperand::MO_ConstantPoolIndex:
|
||||
MCOp = LowerSymbolOperand(MO, GetConstantPoolIndexSymbol(MO));
|
||||
break;
|
||||
case MachineOperand::MO_BlockAddress:
|
||||
MCOp = LowerSymbolOperand(MO, AsmPrinter.GetBlockAddressSymbol(
|
||||
MO.getBlockAddress()));
|
||||
break;
|
||||
}
|
||||
|
||||
OutMI.addOperand(MCOp);
|
||||
|
@ -328,11 +328,13 @@ X86TargetLowering::X86TargetLowering(X86TargetMachine &TM)
|
||||
if (Subtarget->is64Bit())
|
||||
setOperationAction(ISD::GlobalTLSAddress, MVT::i64, Custom);
|
||||
setOperationAction(ISD::ExternalSymbol , MVT::i32 , Custom);
|
||||
setOperationAction(ISD::BlockAddress , MVT::i32 , Custom);
|
||||
if (Subtarget->is64Bit()) {
|
||||
setOperationAction(ISD::ConstantPool , MVT::i64 , Custom);
|
||||
setOperationAction(ISD::JumpTable , MVT::i64 , Custom);
|
||||
setOperationAction(ISD::GlobalAddress , MVT::i64 , Custom);
|
||||
setOperationAction(ISD::ExternalSymbol, MVT::i64 , Custom);
|
||||
setOperationAction(ISD::BlockAddress , MVT::i64 , Custom);
|
||||
}
|
||||
// 64-bit addm sub, shl, sra, srl (iff 32-bit x86)
|
||||
setOperationAction(ISD::SHL_PARTS , MVT::i32 , Custom);
|
||||
@ -4692,6 +4694,24 @@ X86TargetLowering::LowerExternalSymbol(SDValue Op, SelectionDAG &DAG) {
|
||||
return Result;
|
||||
}
|
||||
|
||||
SDValue
|
||||
X86TargetLowering::LowerBlockAddress(SDValue Op, SelectionDAG &DAG) {
|
||||
unsigned WrapperKind = X86ISD::Wrapper;
|
||||
CodeModel::Model M = getTargetMachine().getCodeModel();
|
||||
if (Subtarget->isPICStyleRIPRel() &&
|
||||
(M == CodeModel::Small || M == CodeModel::Kernel))
|
||||
WrapperKind = X86ISD::WrapperRIP;
|
||||
|
||||
DebugLoc DL = Op.getDebugLoc();
|
||||
|
||||
BlockAddress *BA = cast<BlockAddressSDNode>(Op)->getBlockAddress();
|
||||
SDValue Result = DAG.getBlockAddress(BA, DL, /*isTarget=*/true);
|
||||
|
||||
Result = DAG.getNode(WrapperKind, DL, getPointerTy(), Result);
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
SDValue
|
||||
X86TargetLowering::LowerGlobalAddress(const GlobalValue *GV, DebugLoc dl,
|
||||
int64_t Offset,
|
||||
@ -7019,6 +7039,7 @@ SDValue X86TargetLowering::LowerOperation(SDValue Op, SelectionDAG &DAG) {
|
||||
case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG);
|
||||
case ISD::GlobalTLSAddress: return LowerGlobalTLSAddress(Op, DAG);
|
||||
case ISD::ExternalSymbol: return LowerExternalSymbol(Op, DAG);
|
||||
case ISD::BlockAddress: return LowerBlockAddress(Op, DAG);
|
||||
case ISD::SHL_PARTS:
|
||||
case ISD::SRA_PARTS:
|
||||
case ISD::SRL_PARTS: return LowerShift(Op, DAG);
|
||||
|
@ -635,6 +635,7 @@ namespace llvm {
|
||||
SDValue LowerINSERT_VECTOR_ELT_SSE4(SDValue Op, SelectionDAG &DAG);
|
||||
SDValue LowerSCALAR_TO_VECTOR(SDValue Op, SelectionDAG &DAG);
|
||||
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG);
|
||||
SDValue LowerBlockAddress(SDValue Op, SelectionDAG &DAG);
|
||||
SDValue LowerGlobalAddress(const GlobalValue *GV, DebugLoc dl,
|
||||
int64_t Offset, SelectionDAG &DAG) const;
|
||||
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG);
|
||||
|
@ -1595,6 +1595,8 @@ def : Pat<(i64 (X86Wrapper tglobaladdr :$dst)),
|
||||
(MOV64ri tglobaladdr :$dst)>, Requires<[FarData]>;
|
||||
def : Pat<(i64 (X86Wrapper texternalsym:$dst)),
|
||||
(MOV64ri texternalsym:$dst)>, Requires<[FarData]>;
|
||||
def : Pat<(i64 (X86Wrapper tblockaddress:$dst)),
|
||||
(MOV64ri tblockaddress:$dst)>, Requires<[FarData]>;
|
||||
|
||||
// In static codegen with small code model, we can get the address of a label
|
||||
// into a register with 'movl'. FIXME: This is a hack, the 'imm' predicate of
|
||||
@ -1607,6 +1609,8 @@ def : Pat<(i64 (X86Wrapper tglobaladdr :$dst)),
|
||||
(MOV64ri64i32 tglobaladdr :$dst)>, Requires<[SmallCode]>;
|
||||
def : Pat<(i64 (X86Wrapper texternalsym:$dst)),
|
||||
(MOV64ri64i32 texternalsym:$dst)>, Requires<[SmallCode]>;
|
||||
def : Pat<(i64 (X86Wrapper tblockaddress:$dst)),
|
||||
(MOV64ri64i32 tblockaddress:$dst)>, Requires<[SmallCode]>;
|
||||
|
||||
// In kernel code model, we can get the address of a label
|
||||
// into a register with 'movq'. FIXME: This is a hack, the 'imm' predicate of
|
||||
@ -1619,6 +1623,8 @@ def : Pat<(i64 (X86Wrapper tglobaladdr :$dst)),
|
||||
(MOV64ri32 tglobaladdr :$dst)>, Requires<[KernelCode]>;
|
||||
def : Pat<(i64 (X86Wrapper texternalsym:$dst)),
|
||||
(MOV64ri32 texternalsym:$dst)>, Requires<[KernelCode]>;
|
||||
def : Pat<(i64 (X86Wrapper tblockaddress:$dst)),
|
||||
(MOV64ri32 tblockaddress:$dst)>, Requires<[KernelCode]>;
|
||||
|
||||
// If we have small model and -static mode, it is safe to store global addresses
|
||||
// directly as immediates. FIXME: This is really a hack, the 'imm' predicate
|
||||
@ -1635,6 +1641,9 @@ def : Pat<(store (i64 (X86Wrapper tglobaladdr:$src)), addr:$dst),
|
||||
def : Pat<(store (i64 (X86Wrapper texternalsym:$src)), addr:$dst),
|
||||
(MOV64mi32 addr:$dst, texternalsym:$src)>,
|
||||
Requires<[NearData, IsStatic]>;
|
||||
def : Pat<(store (i64 (X86Wrapper tblockaddress:$src)), addr:$dst),
|
||||
(MOV64mi32 addr:$dst, tblockaddress:$src)>,
|
||||
Requires<[NearData, IsStatic]>;
|
||||
|
||||
// Calls
|
||||
// Direct PC relative function call for small code model. 32-bit displacement
|
||||
|
@ -3789,6 +3789,7 @@ def : Pat<(i32 (X86Wrapper tjumptable :$dst)), (MOV32ri tjumptable :$dst)>;
|
||||
def : Pat<(i32 (X86Wrapper tglobaltlsaddr:$dst)),(MOV32ri tglobaltlsaddr:$dst)>;
|
||||
def : Pat<(i32 (X86Wrapper tglobaladdr :$dst)), (MOV32ri tglobaladdr :$dst)>;
|
||||
def : Pat<(i32 (X86Wrapper texternalsym:$dst)), (MOV32ri texternalsym:$dst)>;
|
||||
def : Pat<(i32 (X86Wrapper tblockaddress:$dst)), (MOV32ri tblockaddress:$dst)>;
|
||||
|
||||
def : Pat<(add GR32:$src1, (X86Wrapper tconstpool:$src2)),
|
||||
(ADD32ri GR32:$src1, tconstpool:$src2)>;
|
||||
@ -3798,11 +3799,15 @@ def : Pat<(add GR32:$src1, (X86Wrapper tglobaladdr :$src2)),
|
||||
(ADD32ri GR32:$src1, tglobaladdr:$src2)>;
|
||||
def : Pat<(add GR32:$src1, (X86Wrapper texternalsym:$src2)),
|
||||
(ADD32ri GR32:$src1, texternalsym:$src2)>;
|
||||
def : Pat<(add GR32:$src1, (X86Wrapper tblockaddress:$src2)),
|
||||
(ADD32ri GR32:$src1, tblockaddress:$src2)>;
|
||||
|
||||
def : Pat<(store (i32 (X86Wrapper tglobaladdr:$src)), addr:$dst),
|
||||
(MOV32mi addr:$dst, tglobaladdr:$src)>;
|
||||
def : Pat<(store (i32 (X86Wrapper texternalsym:$src)), addr:$dst),
|
||||
(MOV32mi addr:$dst, texternalsym:$src)>;
|
||||
def : Pat<(store (i32 (X86Wrapper tblockaddress:$src)), addr:$dst),
|
||||
(MOV32mi addr:$dst, tblockaddress:$src)>;
|
||||
|
||||
// Calls
|
||||
// tailcall stuff
|
||||
|
Loading…
Reference in New Issue
Block a user