mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-28 22:24:28 +00:00
[mips] Custom-legalize BR_JT.
In N64-static, GOT address is needed to compute the branch address. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176580 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -331,6 +331,7 @@ MipsTargetLowering(MipsTargetMachine &TM)
|
|||||||
AddPromotedToType(ISD::SETCC, MVT::i1, MVT::i32);
|
AddPromotedToType(ISD::SETCC, MVT::i1, MVT::i32);
|
||||||
|
|
||||||
// Mips Custom Operations
|
// Mips Custom Operations
|
||||||
|
setOperationAction(ISD::BR_JT, MVT::Other, Custom);
|
||||||
setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
|
setOperationAction(ISD::GlobalAddress, MVT::i32, Custom);
|
||||||
setOperationAction(ISD::BlockAddress, MVT::i32, Custom);
|
setOperationAction(ISD::BlockAddress, MVT::i32, Custom);
|
||||||
setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom);
|
setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom);
|
||||||
@ -396,7 +397,6 @@ MipsTargetLowering(MipsTargetMachine &TM)
|
|||||||
setOperationAction(ISD::UREM, MVT::i64, Expand);
|
setOperationAction(ISD::UREM, MVT::i64, Expand);
|
||||||
|
|
||||||
// Operations not directly supported by Mips.
|
// Operations not directly supported by Mips.
|
||||||
setOperationAction(ISD::BR_JT, MVT::Other, Expand);
|
|
||||||
setOperationAction(ISD::BR_CC, MVT::Other, Expand);
|
setOperationAction(ISD::BR_CC, MVT::Other, Expand);
|
||||||
setOperationAction(ISD::SELECT_CC, MVT::Other, Expand);
|
setOperationAction(ISD::SELECT_CC, MVT::Other, Expand);
|
||||||
setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand);
|
setOperationAction(ISD::UINT_TO_FP, MVT::i32, Expand);
|
||||||
@ -1039,6 +1039,7 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const
|
|||||||
{
|
{
|
||||||
switch (Op.getOpcode())
|
switch (Op.getOpcode())
|
||||||
{
|
{
|
||||||
|
case ISD::BR_JT: return LowerBR_JT(Op, DAG);
|
||||||
case ISD::BRCOND: return LowerBRCOND(Op, DAG);
|
case ISD::BRCOND: return LowerBRCOND(Op, DAG);
|
||||||
case ISD::ConstantPool: return LowerConstantPool(Op, DAG);
|
case ISD::ConstantPool: return LowerConstantPool(Op, DAG);
|
||||||
case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG);
|
case ISD::GlobalAddress: return LowerGlobalAddress(Op, DAG);
|
||||||
@ -2166,6 +2167,36 @@ MipsTargetLowering::EmitAtomicCmpSwapPartword(MachineInstr *MI,
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Misc Lower Operation implementation
|
// Misc Lower Operation implementation
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
|
SDValue MipsTargetLowering::LowerBR_JT(SDValue Op, SelectionDAG &DAG) const {
|
||||||
|
SDValue Chain = Op.getOperand(0);
|
||||||
|
SDValue Table = Op.getOperand(1);
|
||||||
|
SDValue Index = Op.getOperand(2);
|
||||||
|
DebugLoc DL = Op.getDebugLoc();
|
||||||
|
EVT PTy = getPointerTy();
|
||||||
|
unsigned EntrySize =
|
||||||
|
DAG.getMachineFunction().getJumpTableInfo()->getEntrySize(*getDataLayout());
|
||||||
|
|
||||||
|
Index = DAG.getNode(ISD::MUL, DL, PTy, Index,
|
||||||
|
DAG.getConstant(EntrySize, PTy));
|
||||||
|
SDValue Addr = DAG.getNode(ISD::ADD, DL, PTy, Index, Table);
|
||||||
|
|
||||||
|
EVT MemVT = EVT::getIntegerVT(*DAG.getContext(), EntrySize * 8);
|
||||||
|
Addr = DAG.getExtLoad(ISD::SEXTLOAD, DL, PTy, Chain, Addr,
|
||||||
|
MachinePointerInfo::getJumpTable(), MemVT, false, false,
|
||||||
|
0);
|
||||||
|
Chain = Addr.getValue(1);
|
||||||
|
|
||||||
|
if ((getTargetMachine().getRelocationModel() == Reloc::PIC_) || IsN64) {
|
||||||
|
// For PIC, the sequence is:
|
||||||
|
// BRIND(load(Jumptable + index) + RelocBase)
|
||||||
|
// RelocBase can be JumpTable, GOT or some sort of global base.
|
||||||
|
Addr = DAG.getNode(ISD::ADD, DL, PTy, Addr,
|
||||||
|
getPICJumpTableRelocBase(Table, DAG));
|
||||||
|
}
|
||||||
|
|
||||||
|
return DAG.getNode(ISD::BRIND, DL, MVT::Other, Chain, Addr);
|
||||||
|
}
|
||||||
|
|
||||||
SDValue MipsTargetLowering::
|
SDValue MipsTargetLowering::
|
||||||
LowerBRCOND(SDValue Op, SelectionDAG &DAG) const
|
LowerBRCOND(SDValue Op, SelectionDAG &DAG) const
|
||||||
{
|
{
|
||||||
|
@ -292,6 +292,7 @@ namespace llvm {
|
|||||||
const SDNode *CallNode, const Type *RetTy) const;
|
const SDNode *CallNode, const Type *RetTy) const;
|
||||||
|
|
||||||
// Lower Operand specifics
|
// Lower Operand specifics
|
||||||
|
SDValue LowerBR_JT(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerBRCOND(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerConstantPool(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerGlobalAddress(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
; RUN: llc < %s -march=mips -relocation-model=static | FileCheck %s -check-prefix=STATIC-O32
|
; RUN: llc < %s -march=mips -relocation-model=static | \
|
||||||
; RUN: llc < %s -march=mips -relocation-model=pic | FileCheck %s -check-prefix=PIC-O32
|
; RUN: FileCheck %s -check-prefix=STATIC-O32
|
||||||
; RUN: llc < %s -march=mips64 -relocation-model=pic -mcpu=mips64 -mattr=n64 | FileCheck %s -check-prefix=PIC-N64
|
; RUN: llc < %s -march=mips -relocation-model=pic | \
|
||||||
|
; RUN: FileCheck %s -check-prefix=PIC-O32
|
||||||
|
; RUN: llc < %s -march=mips64 -relocation-model=pic -mcpu=mips64 | \
|
||||||
|
; RUN: FileCheck %s -check-prefix=N64
|
||||||
|
; RUN: llc < %s -march=mips64 -relocation-model=static -mcpu=mips64 | \
|
||||||
|
; RUN: FileCheck %s -check-prefix=N64
|
||||||
|
|
||||||
define i32 @main() nounwind readnone {
|
define i32 @main() nounwind readnone {
|
||||||
entry:
|
entry:
|
||||||
@ -17,12 +22,12 @@ entry:
|
|||||||
; PIC-O32: lw $[[R4:[0-9]+]], %lo($JTI0_0)($[[R2]])
|
; PIC-O32: lw $[[R4:[0-9]+]], %lo($JTI0_0)($[[R2]])
|
||||||
; PIC-O32: addu $[[R5:[0-9]+]], $[[R4:[0-9]+]]
|
; PIC-O32: addu $[[R5:[0-9]+]], $[[R4:[0-9]+]]
|
||||||
; PIC-O32: jr $[[R5]]
|
; PIC-O32: jr $[[R5]]
|
||||||
; PIC-N64: dsll $[[R0:[0-9]+]], ${{[0-9]+}}, 3
|
; N64: dsll $[[R0:[0-9]+]], ${{[0-9]+}}, 3
|
||||||
; PIC-N64: ld $[[R1:[0-9]+]], %got_page($JTI0_0)
|
; N64: ld $[[R1:[0-9]+]], %got_page($JTI0_0)
|
||||||
; PIC-N64: daddu $[[R2:[0-9]+]], $[[R0:[0-9]+]], $[[R1]]
|
; N64: daddu $[[R2:[0-9]+]], $[[R0:[0-9]+]], $[[R1]]
|
||||||
; PIC-N64: ld $[[R4:[0-9]+]], %got_ofst($JTI0_0)($[[R2]])
|
; N64: ld $[[R4:[0-9]+]], %got_ofst($JTI0_0)($[[R2]])
|
||||||
; PIC-N64: daddu $[[R5:[0-9]+]], $[[R4:[0-9]+]]
|
; N64: daddu $[[R5:[0-9]+]], $[[R4:[0-9]+]]
|
||||||
; PIC-N64: jr $[[R5]]
|
; N64: jr $[[R5]]
|
||||||
switch i32 %0, label %bb4 [
|
switch i32 %0, label %bb4 [
|
||||||
i32 0, label %bb5
|
i32 0, label %bb5
|
||||||
i32 1, label %bb1
|
i32 1, label %bb1
|
||||||
@ -58,10 +63,10 @@ bb5: ; preds = %entry
|
|||||||
; PIC-O32: .gpword
|
; PIC-O32: .gpword
|
||||||
; PIC-O32: .gpword
|
; PIC-O32: .gpword
|
||||||
; PIC-O32: .gpword
|
; PIC-O32: .gpword
|
||||||
; PIC-N64: .align 3
|
; N64: .align 3
|
||||||
; PIC-N64: $JTI0_0:
|
; N64: $JTI0_0:
|
||||||
; PIC-N64: .gpdword
|
; N64: .gpdword
|
||||||
; PIC-N64: .gpdword
|
; N64: .gpdword
|
||||||
; PIC-N64: .gpdword
|
; N64: .gpdword
|
||||||
; PIC-N64: .gpdword
|
; N64: .gpdword
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user