diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2023-04-14 21:41:27 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2023-06-22 18:20:56 +0000 |
commit | bdd1243df58e60e85101c09001d9812a789b6bc4 (patch) | |
tree | a1ce621c7301dd47ba2ddc3b8eaa63b441389481 /contrib/llvm-project/llvm/lib/Target/CSKY/CSKYISelLowering.cpp | |
parent | 781624ca2d054430052c828ba8d2c2eaf2d733e7 (diff) | |
parent | e3b557809604d036af6e00c60f012c2025b59a5e (diff) |
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/CSKY/CSKYISelLowering.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/CSKY/CSKYISelLowering.cpp | 38 |
1 files changed, 35 insertions, 3 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYISelLowering.cpp b/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYISelLowering.cpp index 012de34c9809..a65a0283777f 100644 --- a/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYISelLowering.cpp +++ b/contrib/llvm-project/llvm/lib/Target/CSKY/CSKYISelLowering.cpp @@ -87,6 +87,9 @@ CSKYTargetLowering::CSKYTargetLowering(const TargetMachine &TM, setOperationAction(ISD::ExternalSymbol, MVT::i32, Custom); setOperationAction(ISD::GlobalTLSAddress, MVT::i32, Custom); setOperationAction(ISD::BlockAddress, MVT::i32, Custom); + if (!Subtarget.hasE2()) { + setOperationAction(ISD::ConstantPool, MVT::i32, Custom); + } setOperationAction(ISD::JumpTable, MVT::i32, Custom); setOperationAction(ISD::VASTART, MVT::Other, Custom); @@ -170,6 +173,8 @@ SDValue CSKYTargetLowering::LowerOperation(SDValue Op, return LowerJumpTable(Op, DAG); case ISD::BlockAddress: return LowerBlockAddress(Op, DAG); + case ISD::ConstantPool: + return LowerConstantPool(Op, DAG); case ISD::VASTART: return LowerVASTART(Op, DAG); case ISD::FRAMEADDR: @@ -359,7 +364,7 @@ SDValue CSKYTargetLowering::LowerFormalArguments( const unsigned XLenInBytes = 4; const MVT XLenVT = MVT::i32; - ArrayRef<MCPhysReg> ArgRegs = makeArrayRef(GPRArgRegs); + ArrayRef<MCPhysReg> ArgRegs = ArrayRef(GPRArgRegs); unsigned Idx = CCInfo.getFirstUnallocated(ArgRegs); const TargetRegisterClass *RC = &CSKY::GPRRegClass; MachineFrameInfo &MFI = MF.getFrameInfo(); @@ -702,8 +707,7 @@ SDValue CSKYTargetLowering::LowerCall(CallLoweringInfo &CLI, Glue = Chain.getValue(1); // Mark the end of the call, which is glued to the call itself. - Chain = DAG.getCALLSEQ_END(Chain, DAG.getConstant(NumBytes, DL, PtrVT, true), - DAG.getConstant(0, DL, PtrVT, true), Glue, DL); + Chain = DAG.getCALLSEQ_END(Chain, NumBytes, 0, Glue, DL); Glue = Chain.getValue(1); // Assign locations to each value returned by this call. @@ -1059,12 +1063,24 @@ SDValue CSKYTargetLowering::getTargetConstantPoolValue(BlockAddressSDNode *N, EVT Ty, SelectionDAG &DAG, unsigned Flags) const { + assert(N->getOffset() == 0); CSKYConstantPoolValue *CPV = CSKYConstantPoolConstant::Create( N->getBlockAddress(), CSKYCP::CPBlockAddress, 0, getModifier(Flags), false); return DAG.getTargetConstantPool(CPV, Ty); } +SDValue CSKYTargetLowering::getTargetConstantPoolValue(ConstantPoolSDNode *N, + EVT Ty, + SelectionDAG &DAG, + unsigned Flags) const { + assert(N->getOffset() == 0); + CSKYConstantPoolValue *CPV = CSKYConstantPoolConstant::Create( + N->getConstVal(), Type::getInt32Ty(*DAG.getContext()), + CSKYCP::CPConstPool, 0, getModifier(Flags), false); + return DAG.getTargetConstantPool(CPV, Ty); +} + SDValue CSKYTargetLowering::getTargetNode(GlobalAddressSDNode *N, SDLoc DL, EVT Ty, SelectionDAG &DAG, unsigned Flags) const { @@ -1090,6 +1106,14 @@ SDValue CSKYTargetLowering::getTargetNode(BlockAddressSDNode *N, SDLoc DL, Flags); } +SDValue CSKYTargetLowering::getTargetNode(ConstantPoolSDNode *N, SDLoc DL, + EVT Ty, SelectionDAG &DAG, + unsigned Flags) const { + + return DAG.getTargetConstantPool(N->getConstVal(), Ty, N->getAlign(), + N->getOffset(), Flags); +} + const char *CSKYTargetLowering::getTargetNodeName(unsigned Opcode) const { switch (Opcode) { default: @@ -1159,6 +1183,14 @@ SDValue CSKYTargetLowering::LowerBlockAddress(SDValue Op, return getAddr(N, DAG); } +SDValue CSKYTargetLowering::LowerConstantPool(SDValue Op, + SelectionDAG &DAG) const { + assert(!Subtarget.hasE2()); + ConstantPoolSDNode *N = cast<ConstantPoolSDNode>(Op); + + return getAddr(N, DAG); +} + SDValue CSKYTargetLowering::LowerVASTART(SDValue Op, SelectionDAG &DAG) const { MachineFunction &MF = DAG.getMachineFunction(); CSKYMachineFunctionInfo *FuncInfo = MF.getInfo<CSKYMachineFunctionInfo>(); |