Home | History | Annotate | Line # | Download | only in PowerPC
      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:
     33   PPCCCState(CallingConv::ID CC, bool isVarArg, MachineFunction &MF,
     34              SmallVectorImpl<CCValAssign> &locs, LLVMContext &C)
     35         : CCState(CC, isVarArg, MF, locs, C) {}
     36 
     37   bool WasOriginalArgPPCF128(unsigned ValNo) { return OriginalArgWasPPCF128[ValNo]; }
     38   void clearWasPPCF128() { OriginalArgWasPPCF128.clear(); }
     39 };
     40 
     41 class AIXCCState : public CCState {
     42 private:
     43   BitVector IsFixed;
     44 
     45 public:
     46   AIXCCState(CallingConv::ID CC, bool IsVarArg, MachineFunction &MF,
     47              SmallVectorImpl<CCValAssign> &Locs, LLVMContext &C)
     48       : CCState(CC, IsVarArg, MF, Locs, C) {}
     49 
     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 
     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 
     68   bool isFixed(unsigned ValNo) const { return IsFixed.test(ValNo); }
     69 };
     70 
     71 } // end namespace llvm
     72 
     73 #endif
     74