| OLD | NEW |
| 1 //===- subzero/src/IceTypes.cpp - Primitive type properties ---------------===// | 1 //===- subzero/src/IceTypes.cpp - Primitive type properties ---------------===// |
| 2 // | 2 // |
| 3 // The Subzero Code Generator | 3 // The Subzero Code Generator |
| 4 // | 4 // |
| 5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
| 6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
| 7 // | 7 // |
| 8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
| 9 /// | 9 /// |
| 10 /// \file | 10 /// \file |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 IceType_##CompareResult \ | 126 IceType_##CompareResult \ |
| 127 } \ | 127 } \ |
| 128 , | 128 , |
| 129 ICETYPE_PROPS_TABLE | 129 ICETYPE_PROPS_TABLE |
| 130 #undef X | 130 #undef X |
| 131 }; | 131 }; |
| 132 | 132 |
| 133 } // end anonymous namespace | 133 } // end anonymous namespace |
| 134 | 134 |
| 135 const char *targetArchString(const TargetArch Arch) { | 135 const char *targetArchString(const TargetArch Arch) { |
| 136 size_t Index = static_cast<size_t>(Arch); | 136 if (Arch < TargetArch_NUM) |
| 137 if (Index < TargetArch_NUM) | 137 return TargetArchName[Arch]; |
| 138 return TargetArchName[Index]; | |
| 139 llvm_unreachable("Invalid target arch for targetArchString"); | 138 llvm_unreachable("Invalid target arch for targetArchString"); |
| 140 return "???"; | 139 return "???"; |
| 141 } | 140 } |
| 142 | 141 |
| 143 size_t typeWidthInBytes(Type Ty) { | 142 size_t typeWidthInBytes(Type Ty) { |
| 144 int8_t Shift = typeWidthInBytesLog2(Ty); | 143 int8_t Shift = typeWidthInBytesLog2(Ty); |
| 145 return (Shift < 0) ? 0 : 1 << Shift; | 144 return (Shift < 0) ? 0 : 1 << Shift; |
| 146 } | 145 } |
| 147 | 146 |
| 148 int8_t typeWidthInBytesLog2(Type Ty) { | 147 int8_t typeWidthInBytesLog2(Type Ty) { |
| 149 size_t Index = static_cast<size_t>(Ty); | 148 if (Ty < IceType_NUM) |
| 150 if (Index < IceType_NUM) | 149 return TypeAttributes[Ty].TypeWidthInBytesLog2; |
| 151 return TypeAttributes[Index].TypeWidthInBytesLog2; | |
| 152 llvm_unreachable("Invalid type for typeWidthInBytesLog2()"); | 150 llvm_unreachable("Invalid type for typeWidthInBytesLog2()"); |
| 153 return 0; | 151 return 0; |
| 154 } | 152 } |
| 155 | 153 |
| 156 size_t typeAlignInBytes(Type Ty) { | 154 size_t typeAlignInBytes(Type Ty) { |
| 157 size_t Index = static_cast<size_t>(Ty); | 155 if (Ty < IceType_NUM) |
| 158 if (Index < IceType_NUM) | 156 return TypeAttributes[Ty].TypeAlignInBytes; |
| 159 return TypeAttributes[Index].TypeAlignInBytes; | |
| 160 llvm_unreachable("Invalid type for typeAlignInBytes()"); | 157 llvm_unreachable("Invalid type for typeAlignInBytes()"); |
| 161 return 1; | 158 return 1; |
| 162 } | 159 } |
| 163 | 160 |
| 164 size_t typeNumElements(Type Ty) { | 161 size_t typeNumElements(Type Ty) { |
| 165 size_t Index = static_cast<size_t>(Ty); | 162 if (Ty < IceType_NUM) |
| 166 if (Index < IceType_NUM) | 163 return TypeAttributes[Ty].TypeNumElements; |
| 167 return TypeAttributes[Index].TypeNumElements; | |
| 168 llvm_unreachable("Invalid type for typeNumElements()"); | 164 llvm_unreachable("Invalid type for typeNumElements()"); |
| 169 return 1; | 165 return 1; |
| 170 } | 166 } |
| 171 | 167 |
| 172 Type typeElementType(Type Ty) { | 168 Type typeElementType(Type Ty) { |
| 173 size_t Index = static_cast<size_t>(Ty); | 169 if (Ty < IceType_NUM) |
| 174 if (Index < IceType_NUM) | 170 return TypeAttributes[Ty].TypeElementType; |
| 175 return TypeAttributes[Index].TypeElementType; | |
| 176 llvm_unreachable("Invalid type for typeElementType()"); | 171 llvm_unreachable("Invalid type for typeElementType()"); |
| 177 return IceType_void; | 172 return IceType_void; |
| 178 } | 173 } |
| 179 | 174 |
| 180 bool isVectorType(Type Ty) { | 175 bool isVectorType(Type Ty) { |
| 181 size_t Index = static_cast<size_t>(Ty); | 176 if (Ty < IceType_NUM) |
| 182 if (Index < IceType_NUM) | 177 return TypePropertiesTable[Ty].TypeIsVectorType; |
| 183 return TypePropertiesTable[Index].TypeIsVectorType; | |
| 184 llvm_unreachable("Invalid type for isVectorType()"); | 178 llvm_unreachable("Invalid type for isVectorType()"); |
| 185 return false; | 179 return false; |
| 186 } | 180 } |
| 187 | 181 |
| 188 bool isIntegerType(Type Ty) { | 182 bool isIntegerType(Type Ty) { |
| 189 size_t Index = static_cast<size_t>(Ty); | 183 if (Ty < IceType_NUM) |
| 190 if (Index < IceType_NUM) | 184 return TypePropertiesTable[Ty].TypeIsIntegerType; |
| 191 return TypePropertiesTable[Index].TypeIsIntegerType; | |
| 192 llvm_unreachable("Invalid type for isIntegerType()"); | 185 llvm_unreachable("Invalid type for isIntegerType()"); |
| 193 return false; | 186 return false; |
| 194 } | 187 } |
| 195 | 188 |
| 196 bool isScalarIntegerType(Type Ty) { | 189 bool isScalarIntegerType(Type Ty) { |
| 197 size_t Index = static_cast<size_t>(Ty); | 190 if (Ty < IceType_NUM) |
| 198 if (Index < IceType_NUM) | 191 return TypePropertiesTable[Ty].TypeIsScalarIntegerType; |
| 199 return TypePropertiesTable[Index].TypeIsScalarIntegerType; | |
| 200 llvm_unreachable("Invalid type for isScalIntegerType()"); | 192 llvm_unreachable("Invalid type for isScalIntegerType()"); |
| 201 return false; | 193 return false; |
| 202 } | 194 } |
| 203 | 195 |
| 204 bool isVectorIntegerType(Type Ty) { | 196 bool isVectorIntegerType(Type Ty) { |
| 205 size_t Index = static_cast<size_t>(Ty); | 197 if (Ty < IceType_NUM) |
| 206 if (Index < IceType_NUM) | 198 return TypePropertiesTable[Ty].TypeIsVectorIntegerType; |
| 207 return TypePropertiesTable[Index].TypeIsVectorIntegerType; | |
| 208 llvm_unreachable("Invalid type for isVectorIntegerType()"); | 199 llvm_unreachable("Invalid type for isVectorIntegerType()"); |
| 209 return false; | 200 return false; |
| 210 } | 201 } |
| 211 | 202 |
| 212 bool isIntegerArithmeticType(Type Ty) { | 203 bool isIntegerArithmeticType(Type Ty) { |
| 213 size_t Index = static_cast<size_t>(Ty); | 204 if (Ty < IceType_NUM) |
| 214 if (Index < IceType_NUM) | 205 return TypePropertiesTable[Ty].TypeIsIntegerArithmeticType; |
| 215 return TypePropertiesTable[Index].TypeIsIntegerArithmeticType; | |
| 216 llvm_unreachable("Invalid type for isIntegerArithmeticType()"); | 206 llvm_unreachable("Invalid type for isIntegerArithmeticType()"); |
| 217 return false; | 207 return false; |
| 218 } | 208 } |
| 219 | 209 |
| 220 bool isFloatingType(Type Ty) { | 210 bool isFloatingType(Type Ty) { |
| 221 size_t Index = static_cast<size_t>(Ty); | 211 if (Ty < IceType_NUM) |
| 222 if (Index < IceType_NUM) | 212 return TypePropertiesTable[Ty].TypeIsFloatingType; |
| 223 return TypePropertiesTable[Index].TypeIsFloatingType; | |
| 224 llvm_unreachable("Invalid type for isFloatingType()"); | 213 llvm_unreachable("Invalid type for isFloatingType()"); |
| 225 return false; | 214 return false; |
| 226 } | 215 } |
| 227 | 216 |
| 228 bool isScalarFloatingType(Type Ty) { | 217 bool isScalarFloatingType(Type Ty) { |
| 229 size_t Index = static_cast<size_t>(Ty); | 218 if (Ty < IceType_NUM) |
| 230 if (Index < IceType_NUM) | 219 return TypePropertiesTable[Ty].TypeIsScalarFloatingType; |
| 231 return TypePropertiesTable[Index].TypeIsScalarFloatingType; | |
| 232 llvm_unreachable("Invalid type for isScalarFloatingType()"); | 220 llvm_unreachable("Invalid type for isScalarFloatingType()"); |
| 233 return false; | 221 return false; |
| 234 } | 222 } |
| 235 | 223 |
| 236 bool isVectorFloatingType(Type Ty) { | 224 bool isVectorFloatingType(Type Ty) { |
| 237 size_t Index = static_cast<size_t>(Ty); | 225 if (Ty < IceType_NUM) |
| 238 if (Index < IceType_NUM) | 226 return TypePropertiesTable[Ty].TypeIsVectorFloatingType; |
| 239 return TypePropertiesTable[Index].TypeIsVectorFloatingType; | |
| 240 llvm_unreachable("Invalid type for isVectorFloatingType()"); | 227 llvm_unreachable("Invalid type for isVectorFloatingType()"); |
| 241 return false; | 228 return false; |
| 242 } | 229 } |
| 243 | 230 |
| 244 bool isLoadStoreType(Type Ty) { | 231 bool isLoadStoreType(Type Ty) { |
| 245 size_t Index = static_cast<size_t>(Ty); | 232 if (Ty < IceType_NUM) |
| 246 if (Index < IceType_NUM) | 233 return TypePropertiesTable[Ty].TypeIsLoadStoreType; |
| 247 return TypePropertiesTable[Index].TypeIsLoadStoreType; | |
| 248 llvm_unreachable("Invalid type for isLoadStoreType()"); | 234 llvm_unreachable("Invalid type for isLoadStoreType()"); |
| 249 return false; | 235 return false; |
| 250 } | 236 } |
| 251 | 237 |
| 252 bool isCallParameterType(Type Ty) { | 238 bool isCallParameterType(Type Ty) { |
| 253 size_t Index = static_cast<size_t>(Ty); | 239 if (Ty < IceType_NUM) |
| 254 if (Index < IceType_NUM) | 240 return TypePropertiesTable[Ty].TypeIsCallParameterType; |
| 255 return TypePropertiesTable[Index].TypeIsCallParameterType; | |
| 256 llvm_unreachable("Invalid type for isCallParameterType()"); | 241 llvm_unreachable("Invalid type for isCallParameterType()"); |
| 257 return false; | 242 return false; |
| 258 } | 243 } |
| 259 | 244 |
| 260 Type getCompareResultType(Type Ty) { | 245 Type getCompareResultType(Type Ty) { |
| 261 size_t Index = static_cast<size_t>(Ty); | 246 if (Ty < IceType_NUM) |
| 262 if (Index < IceType_NUM) | 247 return TypePropertiesTable[Ty].CompareResultType; |
| 263 return TypePropertiesTable[Index].CompareResultType; | |
| 264 llvm_unreachable("Invalid type for getCompareResultType"); | 248 llvm_unreachable("Invalid type for getCompareResultType"); |
| 265 return IceType_void; | 249 return IceType_void; |
| 266 } | 250 } |
| 267 | 251 |
| 268 SizeT getScalarIntBitWidth(Type Ty) { | 252 SizeT getScalarIntBitWidth(Type Ty) { |
| 269 assert(isScalarIntegerType(Ty)); | 253 assert(isScalarIntegerType(Ty)); |
| 270 if (Ty == IceType_i1) | 254 if (Ty == IceType_i1) |
| 271 return 1; | 255 return 1; |
| 272 return typeWidthInBytes(Ty) * CHAR_BIT; | 256 return typeWidthInBytes(Ty) * CHAR_BIT; |
| 273 } | 257 } |
| 274 | 258 |
| 275 // ======================== Dump routines ======================== // | 259 // ======================== Dump routines ======================== // |
| 276 | 260 |
| 277 const char *typeString(Type Ty) { | 261 const char *typeString(Type Ty) { |
| 278 size_t Index = static_cast<size_t>(Ty); | 262 if (Ty < IceType_NUM) |
| 279 if (Index < IceType_NUM) | 263 return TypeAttributes[Ty].DisplayString; |
| 280 return TypeAttributes[Index].DisplayString; | |
| 281 llvm_unreachable("Invalid type for typeString"); | 264 llvm_unreachable("Invalid type for typeString"); |
| 282 return "???"; | 265 return "???"; |
| 283 } | 266 } |
| 284 | 267 |
| 285 const char *regClassString(RegClass C) { | 268 const char *regClassString(RegClass C) { |
| 286 if (static_cast<size_t>(C) < IceType_NUM) | 269 if (static_cast<size_t>(C) < IceType_NUM) |
| 287 return TypeAttributes[C].RegClassString; | 270 return TypeAttributes[C].RegClassString; |
| 288 llvm_unreachable("Invalid type for regClassString"); | 271 llvm_unreachable("Invalid type for regClassString"); |
| 289 return "???"; | 272 return "???"; |
| 290 } | 273 } |
| 291 | 274 |
| 292 void FuncSigType::dump(Ostream &Stream) const { | 275 void FuncSigType::dump(Ostream &Stream) const { |
| 293 if (!BuildDefs::dump()) | 276 if (!BuildDefs::dump()) |
| 294 return; | 277 return; |
| 295 Stream << ReturnType << " ("; | 278 Stream << ReturnType << " ("; |
| 296 bool IsFirst = true; | 279 bool IsFirst = true; |
| 297 for (const Type ArgTy : ArgList) { | 280 for (const Type ArgTy : ArgList) { |
| 298 if (IsFirst) { | 281 if (IsFirst) { |
| 299 IsFirst = false; | 282 IsFirst = false; |
| 300 } else { | 283 } else { |
| 301 Stream << ", "; | 284 Stream << ", "; |
| 302 } | 285 } |
| 303 Stream << ArgTy; | 286 Stream << ArgTy; |
| 304 } | 287 } |
| 305 Stream << ")"; | 288 Stream << ")"; |
| 306 } | 289 } |
| 307 | 290 |
| 308 } // end of namespace Ice | 291 } // end of namespace Ice |
| OLD | NEW |