xref: /freebsd/contrib/llvm-project/llvm/lib/Target/PowerPC/PPCMachineFunctionInfo.cpp (revision ba94a95402f335c8e7aa8e28ebdad43361c65909)
1  //===-- PPCMachineFunctionInfo.cpp - Private data used for PowerPC --------===//
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  #include "PPCMachineFunctionInfo.h"
10  #include "llvm/ADT/Twine.h"
11  #include "llvm/BinaryFormat/XCOFF.h"
12  #include "llvm/IR/DataLayout.h"
13  #include "llvm/MC/MCContext.h"
14  #include "llvm/Support/CommandLine.h"
15  
16  using namespace llvm;
17  static cl::opt<bool> PPCDisableNonVolatileCR(
18      "ppc-disable-non-volatile-cr",
19      cl::desc("Disable the use of non-volatile CR register fields"),
20      cl::init(false), cl::Hidden);
21  
22  void PPCFunctionInfo::anchor() {}
23  PPCFunctionInfo::PPCFunctionInfo(const MachineFunction &MF)
24      : DisableNonVolatileCR(PPCDisableNonVolatileCR) {}
25  
26  MCSymbol *PPCFunctionInfo::getPICOffsetSymbol(MachineFunction &MF) const {
27    const DataLayout &DL = MF.getDataLayout();
28    return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
29                                             Twine(MF.getFunctionNumber()) +
30                                             "$poff");
31  }
32  
33  MCSymbol *PPCFunctionInfo::getGlobalEPSymbol(MachineFunction &MF) const {
34    const DataLayout &DL = MF.getDataLayout();
35    return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
36                                             "func_gep" +
37                                             Twine(MF.getFunctionNumber()));
38  }
39  
40  MCSymbol *PPCFunctionInfo::getLocalEPSymbol(MachineFunction &MF) const {
41    const DataLayout &DL = MF.getDataLayout();
42    return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
43                                             "func_lep" +
44                                             Twine(MF.getFunctionNumber()));
45  }
46  
47  MCSymbol *PPCFunctionInfo::getTOCOffsetSymbol(MachineFunction &MF) const {
48    const DataLayout &DL = MF.getDataLayout();
49    return MF.getContext().getOrCreateSymbol(Twine(DL.getPrivateGlobalPrefix()) +
50                                             "func_toc" +
51                                             Twine(MF.getFunctionNumber()));
52  }
53  
54  bool PPCFunctionInfo::isLiveInSExt(Register VReg) const {
55    for (const std::pair<Register, ISD::ArgFlagsTy> &LiveIn : LiveInAttrs)
56      if (LiveIn.first == VReg)
57        return LiveIn.second.isSExt();
58    return false;
59  }
60  
61  bool PPCFunctionInfo::isLiveInZExt(Register VReg) const {
62    for (const std::pair<Register, ISD::ArgFlagsTy> &LiveIn : LiveInAttrs)
63      if (LiveIn.first == VReg)
64        return LiveIn.second.isZExt();
65    return false;
66  }
67  
68  void PPCFunctionInfo::appendParameterType(ParamType Type) {
69  
70    ParamtersType.push_back(Type);
71    switch (Type) {
72    case FixedType:
73      ++FixedParmsNum;
74      return;
75    case ShortFloatingPoint:
76    case LongFloatingPoint:
77      ++FloatingParmsNum;
78      return;
79    case VectorChar:
80    case VectorShort:
81    case VectorInt:
82    case VectorFloat:
83      ++VectorParmsNum;
84      return;
85    }
86    llvm_unreachable("Error ParamType type.");
87  }
88  
89  uint32_t PPCFunctionInfo::getVecExtParmsType() const {
90  
91    uint32_t VectExtParamInfo = 0;
92    unsigned ShiftBits = 32 - XCOFF::TracebackTable::WidthOfParamType;
93    int Bits = 0;
94  
95    if (!hasVectorParms())
96      return 0;
97  
98    for (const auto &Elt : ParamtersType) {
99      switch (Elt) {
100      case VectorChar:
101        VectExtParamInfo <<= XCOFF::TracebackTable::WidthOfParamType;
102        VectExtParamInfo |=
103            XCOFF::TracebackTable::ParmTypeIsVectorCharBit >> ShiftBits;
104        Bits += XCOFF::TracebackTable::WidthOfParamType;
105        break;
106      case VectorShort:
107        VectExtParamInfo <<= XCOFF::TracebackTable::WidthOfParamType;
108        VectExtParamInfo |=
109            XCOFF::TracebackTable::ParmTypeIsVectorShortBit >> ShiftBits;
110        Bits += XCOFF::TracebackTable::WidthOfParamType;
111        break;
112      case VectorInt:
113        VectExtParamInfo <<= XCOFF::TracebackTable::WidthOfParamType;
114        VectExtParamInfo |=
115            XCOFF::TracebackTable::ParmTypeIsVectorIntBit >> ShiftBits;
116        Bits += XCOFF::TracebackTable::WidthOfParamType;
117        break;
118      case VectorFloat:
119        VectExtParamInfo <<= XCOFF::TracebackTable::WidthOfParamType;
120        VectExtParamInfo |=
121            XCOFF::TracebackTable::ParmTypeIsVectorFloatBit >> ShiftBits;
122        Bits += XCOFF::TracebackTable::WidthOfParamType;
123        break;
124      default:
125        break;
126      }
127  
128      // There are only 32bits in the VectExtParamInfo.
129      if (Bits >= 32)
130        break;
131    }
132    return Bits < 32 ? VectExtParamInfo << (32 - Bits) : VectExtParamInfo;
133  }
134  
135  uint32_t PPCFunctionInfo::getParmsType() const {
136    uint32_t ParamsTypeInfo = 0;
137    unsigned ShiftBits = 32 - XCOFF::TracebackTable::WidthOfParamType;
138  
139    int Bits = 0;
140    for (const auto &Elt : ParamtersType) {
141  
142      if (Bits > 31 || (Bits > 30 && (Elt != FixedType || hasVectorParms())))
143        break;
144  
145      switch (Elt) {
146      case FixedType:
147        if (hasVectorParms()) {
148          //'00'  ==> fixed parameter if HasVectorParms is true.
149          ParamsTypeInfo <<= XCOFF::TracebackTable::WidthOfParamType;
150          ParamsTypeInfo |=
151              XCOFF::TracebackTable::ParmTypeIsFixedBits >> ShiftBits;
152          Bits += XCOFF::TracebackTable::WidthOfParamType;
153        } else {
154          //'0'  ==> fixed parameter if HasVectorParms is false.
155          ParamsTypeInfo <<= 1;
156          ++Bits;
157        }
158        break;
159      case ShortFloatingPoint:
160        // '10'b => floating point short parameter.
161        ParamsTypeInfo <<= XCOFF::TracebackTable::WidthOfParamType;
162        ParamsTypeInfo |=
163            XCOFF::TracebackTable::ParmTypeIsFloatingBits >> ShiftBits;
164        Bits += XCOFF::TracebackTable::WidthOfParamType;
165        break;
166      case LongFloatingPoint:
167        // '11'b => floating point long parameter.
168        ParamsTypeInfo <<= XCOFF::TracebackTable::WidthOfParamType;
169        ParamsTypeInfo |=
170            XCOFF::TracebackTable::ParmTypeIsDoubleBits >> ShiftBits;
171        Bits += XCOFF::TracebackTable::WidthOfParamType;
172        break;
173      case VectorChar:
174      case VectorShort:
175      case VectorInt:
176      case VectorFloat:
177        //	'01' ==> vector parameter
178        ParamsTypeInfo <<= XCOFF::TracebackTable::WidthOfParamType;
179        ParamsTypeInfo |=
180            XCOFF::TracebackTable::ParmTypeIsVectorBits >> ShiftBits;
181        Bits += XCOFF::TracebackTable::WidthOfParamType;
182        break;
183      }
184    }
185  
186    return Bits < 32 ? ParamsTypeInfo << (32 - Bits) : ParamsTypeInfo;
187  }
188