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