1 //===---- PPCCCState.h - CCState with PowerPC specific extensions -----------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef PPCCCSTATE_H 10 #define PPCCCSTATE_H 11 12 #include "PPCISelLowering.h" 13 #include "llvm/ADT/BitVector.h" 14 #include "llvm/ADT/SmallVector.h" 15 #include "llvm/CodeGen/CallingConvLower.h" 16 17 namespace llvm { 18 19 class PPCCCState : public CCState { 20 public: 21 22 void 23 PreAnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs); 24 void 25 PreAnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins); 26 27 private: 28 29 // Records whether the value has been lowered from an ppcf128. 30 SmallVector<bool, 4> OriginalArgWasPPCF128; 31 32 public: PPCCCState(CallingConv::ID CC,bool isVarArg,MachineFunction & MF,SmallVectorImpl<CCValAssign> & locs,LLVMContext & C)33 PPCCCState(CallingConv::ID CC, bool isVarArg, MachineFunction &MF, 34 SmallVectorImpl<CCValAssign> &locs, LLVMContext &C) 35 : CCState(CC, isVarArg, MF, locs, C) {} 36 WasOriginalArgPPCF128(unsigned ValNo)37 bool WasOriginalArgPPCF128(unsigned ValNo) { return OriginalArgWasPPCF128[ValNo]; } clearWasPPCF128()38 void clearWasPPCF128() { OriginalArgWasPPCF128.clear(); } 39 }; 40 41 class AIXCCState : public CCState { 42 private: 43 BitVector IsFixed; 44 45 public: AIXCCState(CallingConv::ID CC,bool IsVarArg,MachineFunction & MF,SmallVectorImpl<CCValAssign> & Locs,LLVMContext & C)46 AIXCCState(CallingConv::ID CC, bool IsVarArg, MachineFunction &MF, 47 SmallVectorImpl<CCValAssign> &Locs, LLVMContext &C) 48 : CCState(CC, IsVarArg, MF, Locs, C) {} 49 AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> & Ins,CCAssignFn Fn)50 void AnalyzeFormalArguments(const SmallVectorImpl<ISD::InputArg> &Ins, 51 CCAssignFn Fn) { 52 // All formal arguments are fixed. 53 IsFixed.resize(Ins.size(), true); 54 CCState::AnalyzeFormalArguments(Ins, Fn); 55 } 56 AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> & Outs,CCAssignFn Fn)57 void AnalyzeCallOperands(const SmallVectorImpl<ISD::OutputArg> &Outs, 58 CCAssignFn Fn) { 59 // Record whether the call operand was a fixed argument. 60 IsFixed.resize(Outs.size(), false); 61 for (unsigned ValNo = 0, E = Outs.size(); ValNo != E; ++ValNo) 62 if (Outs[ValNo].IsFixed) 63 IsFixed.set(ValNo); 64 65 CCState::AnalyzeCallOperands(Outs, Fn); 66 } 67 isFixed(unsigned ValNo)68 bool isFixed(unsigned ValNo) const { return IsFixed.test(ValNo); } 69 }; 70 71 } // end namespace llvm 72 73 #endif 74