mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 16:24:23 +00:00
XCore target: Lower RETURNADDR
Only handles a depth of zero (the same as FRAMEADDR) git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198613 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -212,6 +212,7 @@ LowerOperation(SDValue Op, SelectionDAG &DAG) const {
|
|||||||
case ISD::ADD:
|
case ISD::ADD:
|
||||||
case ISD::SUB: return ExpandADDSUB(Op.getNode(), DAG);
|
case ISD::SUB: return ExpandADDSUB(Op.getNode(), DAG);
|
||||||
case ISD::FRAMEADDR: return LowerFRAMEADDR(Op, DAG);
|
case ISD::FRAMEADDR: return LowerFRAMEADDR(Op, DAG);
|
||||||
|
case ISD::RETURNADDR: return LowerRETURNADDR(Op, DAG);
|
||||||
case ISD::INIT_TRAMPOLINE: return LowerINIT_TRAMPOLINE(Op, DAG);
|
case ISD::INIT_TRAMPOLINE: return LowerINIT_TRAMPOLINE(Op, DAG);
|
||||||
case ISD::ADJUST_TRAMPOLINE: return LowerADJUST_TRAMPOLINE(Op, DAG);
|
case ISD::ADJUST_TRAMPOLINE: return LowerADJUST_TRAMPOLINE(Op, DAG);
|
||||||
case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
|
case ISD::INTRINSIC_WO_CHAIN: return LowerINTRINSIC_WO_CHAIN(Op, DAG);
|
||||||
@ -792,17 +793,39 @@ LowerVASTART(SDValue Op, SelectionDAG &DAG) const
|
|||||||
|
|
||||||
SDValue XCoreTargetLowering::LowerFRAMEADDR(SDValue Op,
|
SDValue XCoreTargetLowering::LowerFRAMEADDR(SDValue Op,
|
||||||
SelectionDAG &DAG) const {
|
SelectionDAG &DAG) const {
|
||||||
SDLoc dl(Op);
|
// This nodes represent llvm.frameaddress on the DAG.
|
||||||
|
// It takes one operand, the index of the frame address to return.
|
||||||
|
// An index of zero corresponds to the current function's frame address.
|
||||||
|
// An index of one to the parent's frame address, and so on.
|
||||||
// Depths > 0 not supported yet!
|
// Depths > 0 not supported yet!
|
||||||
if (cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue() > 0)
|
if (cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue() > 0)
|
||||||
return SDValue();
|
return SDValue();
|
||||||
|
|
||||||
MachineFunction &MF = DAG.getMachineFunction();
|
MachineFunction &MF = DAG.getMachineFunction();
|
||||||
const TargetRegisterInfo *RegInfo = getTargetMachine().getRegisterInfo();
|
const TargetRegisterInfo *RegInfo = getTargetMachine().getRegisterInfo();
|
||||||
return DAG.getCopyFromReg(DAG.getEntryNode(), dl,
|
return DAG.getCopyFromReg(DAG.getEntryNode(), SDLoc(Op),
|
||||||
RegInfo->getFrameRegister(MF), MVT::i32);
|
RegInfo->getFrameRegister(MF), MVT::i32);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SDValue XCoreTargetLowering::
|
||||||
|
LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const {
|
||||||
|
// This nodes represent llvm.returnaddress on the DAG.
|
||||||
|
// It takes one operand, the index of the return address to return.
|
||||||
|
// An index of zero corresponds to the current function's return address.
|
||||||
|
// An index of one to the parent's return address, and so on.
|
||||||
|
// Depths > 0 not supported yet!
|
||||||
|
if (cast<ConstantSDNode>(Op.getOperand(0))->getZExtValue() > 0)
|
||||||
|
return SDValue();
|
||||||
|
|
||||||
|
MachineFunction &MF = DAG.getMachineFunction();
|
||||||
|
XCoreFunctionInfo *XFI = MF.getInfo<XCoreFunctionInfo>();
|
||||||
|
int FI = XFI->createLRSpillSlot(MF);
|
||||||
|
SDValue FIN = DAG.getFrameIndex(FI, MVT::i32);
|
||||||
|
return DAG.getLoad(getPointerTy(), SDLoc(Op), DAG.getEntryNode(), FIN,
|
||||||
|
MachinePointerInfo::getFixedStack(FI), false, false,
|
||||||
|
false, 0);
|
||||||
|
}
|
||||||
|
|
||||||
SDValue XCoreTargetLowering::
|
SDValue XCoreTargetLowering::
|
||||||
LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const {
|
LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const {
|
||||||
return Op.getOperand(0);
|
return Op.getOperand(0);
|
||||||
|
@ -158,6 +158,7 @@ namespace llvm {
|
|||||||
SDValue LowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerUMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerSMUL_LOHI(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerFRAMEADDR(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
SDValue LowerRETURNADDR(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerINIT_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerADJUST_TRAMPOLINE(SDValue Op, SelectionDAG &DAG) const;
|
||||||
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
|
SDValue LowerINTRINSIC_WO_CHAIN(SDValue Op, SelectionDAG &DAG) const;
|
||||||
|
46
test/CodeGen/XCore/llvm-intrinsics.ll
Normal file
46
test/CodeGen/XCore/llvm-intrinsics.ll
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
; RUN: llc < %s -march=xcore | FileCheck %s
|
||||||
|
|
||||||
|
declare i8* @llvm.frameaddress(i32) nounwind readnone
|
||||||
|
define i8* @FA0() nounwind {
|
||||||
|
entry:
|
||||||
|
; CHECK-LABEL: FA0
|
||||||
|
; CHECK: ldaw r0, sp[0]
|
||||||
|
; CHECK-NEXT: retsp 0
|
||||||
|
%0 = call i8* @llvm.frameaddress(i32 0)
|
||||||
|
ret i8* %0
|
||||||
|
}
|
||||||
|
|
||||||
|
define i8* @FA1() nounwind {
|
||||||
|
entry:
|
||||||
|
; CHECK-LABEL: FA1
|
||||||
|
; CHECK: entsp 100
|
||||||
|
; CHECK-NEXT: ldaw r0, sp[0]
|
||||||
|
; CHECK-NEXT: retsp 100
|
||||||
|
%0 = alloca [100 x i32]
|
||||||
|
%1 = call i8* @llvm.frameaddress(i32 0)
|
||||||
|
ret i8* %1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
declare i8* @llvm.returnaddress(i32) nounwind readnone
|
||||||
|
define i8* @RA0() nounwind {
|
||||||
|
entry:
|
||||||
|
; CHECK-LABEL: RA0
|
||||||
|
; CHECK: stw lr, sp[0]
|
||||||
|
; CHECK-NEXT: ldw r0, sp[0]
|
||||||
|
; CHECK-NEXT: ldw lr, sp[0]
|
||||||
|
; CHECK-NEXT: retsp 0
|
||||||
|
%0 = call i8* @llvm.returnaddress(i32 0)
|
||||||
|
ret i8* %0
|
||||||
|
}
|
||||||
|
|
||||||
|
define i8* @RA1() nounwind {
|
||||||
|
entry:
|
||||||
|
; CHECK-LABEL: RA1
|
||||||
|
; CHECK: entsp 100
|
||||||
|
; CHECK-NEXT: ldw r0, sp[100]
|
||||||
|
; CHECK-NEXT: retsp 100
|
||||||
|
%0 = alloca [100 x i32]
|
||||||
|
%1 = call i8* @llvm.returnaddress(i32 0)
|
||||||
|
ret i8* %1
|
||||||
|
}
|
Reference in New Issue
Block a user