Home | History | Annotate | Line # | Download | only in CodeGen
      1 //===----------- ValueTypes.cpp - Implementation of EVT methods -----------===//
      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 "llvm/CodeGen/ValueTypes.h"
     10 #include "llvm/ADT/StringExtras.h"
     11 #include "llvm/IR/DerivedTypes.h"
     12 #include "llvm/IR/Type.h"
     13 #include "llvm/Support/ErrorHandling.h"
     14 #include "llvm/Support/TypeSize.h"
     15 using namespace llvm;
     16 
     17 EVT EVT::changeExtendedTypeToInteger() const {
     18   assert(isExtended() && "Type is not extended!");
     19   LLVMContext &Context = LLVMTy->getContext();
     20   return getIntegerVT(Context, getSizeInBits());
     21 }
     22 
     23 EVT EVT::changeExtendedVectorElementTypeToInteger() const {
     24   assert(isExtended() && "Type is not extended!");
     25   LLVMContext &Context = LLVMTy->getContext();
     26   EVT IntTy = getIntegerVT(Context, getScalarSizeInBits());
     27   return getVectorVT(Context, IntTy, getVectorNumElements(),
     28                      isScalableVector());
     29 }
     30 
     31 EVT EVT::changeExtendedVectorElementType(EVT EltVT) const {
     32   assert(isExtended() && "Type is not extended!");
     33   LLVMContext &Context = LLVMTy->getContext();
     34   return getVectorVT(Context, EltVT, getVectorElementCount());
     35 }
     36 
     37 EVT EVT::getExtendedIntegerVT(LLVMContext &Context, unsigned BitWidth) {
     38   EVT VT;
     39   VT.LLVMTy = IntegerType::get(Context, BitWidth);
     40   assert(VT.isExtended() && "Type is not extended!");
     41   return VT;
     42 }
     43 
     44 EVT EVT::getExtendedVectorVT(LLVMContext &Context, EVT VT, unsigned NumElements,
     45                              bool IsScalable) {
     46   EVT ResultVT;
     47   ResultVT.LLVMTy =
     48       VectorType::get(VT.getTypeForEVT(Context), NumElements, IsScalable);
     49   assert(ResultVT.isExtended() && "Type is not extended!");
     50   return ResultVT;
     51 }
     52 
     53 EVT EVT::getExtendedVectorVT(LLVMContext &Context, EVT VT, ElementCount EC) {
     54   EVT ResultVT;
     55   ResultVT.LLVMTy = VectorType::get(VT.getTypeForEVT(Context), EC);
     56   assert(ResultVT.isExtended() && "Type is not extended!");
     57   return ResultVT;
     58 }
     59 
     60 bool EVT::isExtendedFloatingPoint() const {
     61   assert(isExtended() && "Type is not extended!");
     62   return LLVMTy->isFPOrFPVectorTy();
     63 }
     64 
     65 bool EVT::isExtendedInteger() const {
     66   assert(isExtended() && "Type is not extended!");
     67   return LLVMTy->isIntOrIntVectorTy();
     68 }
     69 
     70 bool EVT::isExtendedScalarInteger() const {
     71   assert(isExtended() && "Type is not extended!");
     72   return LLVMTy->isIntegerTy();
     73 }
     74 
     75 bool EVT::isExtendedVector() const {
     76   assert(isExtended() && "Type is not extended!");
     77   return LLVMTy->isVectorTy();
     78 }
     79 
     80 bool EVT::isExtended16BitVector() const {
     81   return isExtendedVector() && getExtendedSizeInBits() == 16;
     82 }
     83 
     84 bool EVT::isExtended32BitVector() const {
     85   return isExtendedVector() && getExtendedSizeInBits() == 32;
     86 }
     87 
     88 bool EVT::isExtended64BitVector() const {
     89   return isExtendedVector() && getExtendedSizeInBits() == 64;
     90 }
     91 
     92 bool EVT::isExtended128BitVector() const {
     93   return isExtendedVector() && getExtendedSizeInBits() == 128;
     94 }
     95 
     96 bool EVT::isExtended256BitVector() const {
     97   return isExtendedVector() && getExtendedSizeInBits() == 256;
     98 }
     99 
    100 bool EVT::isExtended512BitVector() const {
    101   return isExtendedVector() && getExtendedSizeInBits() == 512;
    102 }
    103 
    104 bool EVT::isExtended1024BitVector() const {
    105   return isExtendedVector() && getExtendedSizeInBits() == 1024;
    106 }
    107 
    108 bool EVT::isExtended2048BitVector() const {
    109   return isExtendedVector() && getExtendedSizeInBits() == 2048;
    110 }
    111 
    112 bool EVT::isExtendedFixedLengthVector() const {
    113   return isExtendedVector() && isa<FixedVectorType>(LLVMTy);
    114 }
    115 
    116 bool EVT::isExtendedScalableVector() const {
    117   return isExtendedVector() && isa<ScalableVectorType>(LLVMTy);
    118 }
    119 
    120 EVT EVT::getExtendedVectorElementType() const {
    121   assert(isExtended() && "Type is not extended!");
    122   return EVT::getEVT(cast<VectorType>(LLVMTy)->getElementType());
    123 }
    124 
    125 unsigned EVT::getExtendedVectorNumElements() const {
    126   assert(isExtended() && "Type is not extended!");
    127   ElementCount EC = cast<VectorType>(LLVMTy)->getElementCount();
    128   if (EC.isScalable()) {
    129     WithColor::warning()
    130         << "The code that requested the fixed number of elements has made the "
    131            "assumption that this vector is not scalable. This assumption was "
    132            "not correct, and this may lead to broken code\n";
    133   }
    134   return EC.getKnownMinValue();
    135 }
    136 
    137 ElementCount EVT::getExtendedVectorElementCount() const {
    138   assert(isExtended() && "Type is not extended!");
    139   return cast<VectorType>(LLVMTy)->getElementCount();
    140 }
    141 
    142 TypeSize EVT::getExtendedSizeInBits() const {
    143   assert(isExtended() && "Type is not extended!");
    144   if (IntegerType *ITy = dyn_cast<IntegerType>(LLVMTy))
    145     return TypeSize::Fixed(ITy->getBitWidth());
    146   if (VectorType *VTy = dyn_cast<VectorType>(LLVMTy))
    147     return VTy->getPrimitiveSizeInBits();
    148   llvm_unreachable("Unrecognized extended type!");
    149 }
    150 
    151 /// getEVTString - This function returns value type as a string, e.g. "i32".
    152 std::string EVT::getEVTString() const {
    153   switch (V.SimpleTy) {
    154   default:
    155     if (isVector())
    156       return (isScalableVector() ? "nxv" : "v") +
    157              utostr(getVectorElementCount().getKnownMinValue()) +
    158              getVectorElementType().getEVTString();
    159     if (isInteger())
    160       return "i" + utostr(getSizeInBits());
    161     if (isFloatingPoint())
    162       return "f" + utostr(getSizeInBits());
    163     llvm_unreachable("Invalid EVT!");
    164   case MVT::bf16:      return "bf16";
    165   case MVT::ppcf128:   return "ppcf128";
    166   case MVT::isVoid:    return "isVoid";
    167   case MVT::Other:     return "ch";
    168   case MVT::Glue:      return "glue";
    169   case MVT::x86mmx:    return "x86mmx";
    170   case MVT::x86amx:    return "x86amx";
    171   case MVT::Metadata:  return "Metadata";
    172   case MVT::Untyped:   return "Untyped";
    173   case MVT::funcref:   return "funcref";
    174   case MVT::externref: return "externref";
    175   }
    176 }
    177 
    178 /// getTypeForEVT - This method returns an LLVM type corresponding to the
    179 /// specified EVT.  For integer types, this returns an unsigned type.  Note
    180 /// that this will abort for types that cannot be represented.
    181 Type *EVT::getTypeForEVT(LLVMContext &Context) const {
    182   switch (V.SimpleTy) {
    183   default:
    184     assert(isExtended() && "Type is not extended!");
    185     return LLVMTy;
    186   case MVT::isVoid:  return Type::getVoidTy(Context);
    187   case MVT::i1:      return Type::getInt1Ty(Context);
    188   case MVT::i8:      return Type::getInt8Ty(Context);
    189   case MVT::i16:     return Type::getInt16Ty(Context);
    190   case MVT::i32:     return Type::getInt32Ty(Context);
    191   case MVT::i64:     return Type::getInt64Ty(Context);
    192   case MVT::i128:    return IntegerType::get(Context, 128);
    193   case MVT::f16:     return Type::getHalfTy(Context);
    194   case MVT::bf16:     return Type::getBFloatTy(Context);
    195   case MVT::f32:     return Type::getFloatTy(Context);
    196   case MVT::f64:     return Type::getDoubleTy(Context);
    197   case MVT::f80:     return Type::getX86_FP80Ty(Context);
    198   case MVT::f128:    return Type::getFP128Ty(Context);
    199   case MVT::ppcf128: return Type::getPPC_FP128Ty(Context);
    200   case MVT::x86mmx:  return Type::getX86_MMXTy(Context);
    201   case MVT::x86amx:  return Type::getX86_AMXTy(Context);
    202   case MVT::v1i1:
    203     return FixedVectorType::get(Type::getInt1Ty(Context), 1);
    204   case MVT::v2i1:
    205     return FixedVectorType::get(Type::getInt1Ty(Context), 2);
    206   case MVT::v4i1:
    207     return FixedVectorType::get(Type::getInt1Ty(Context), 4);
    208   case MVT::v8i1:
    209     return FixedVectorType::get(Type::getInt1Ty(Context), 8);
    210   case MVT::v16i1:
    211     return FixedVectorType::get(Type::getInt1Ty(Context), 16);
    212   case MVT::v32i1:
    213     return FixedVectorType::get(Type::getInt1Ty(Context), 32);
    214   case MVT::v64i1:
    215     return FixedVectorType::get(Type::getInt1Ty(Context), 64);
    216   case MVT::v128i1:
    217     return FixedVectorType::get(Type::getInt1Ty(Context), 128);
    218   case MVT::v256i1:
    219     return FixedVectorType::get(Type::getInt1Ty(Context), 256);
    220   case MVT::v512i1:
    221     return FixedVectorType::get(Type::getInt1Ty(Context), 512);
    222   case MVT::v1024i1:
    223     return FixedVectorType::get(Type::getInt1Ty(Context), 1024);
    224   case MVT::v1i8:
    225     return FixedVectorType::get(Type::getInt8Ty(Context), 1);
    226   case MVT::v2i8:
    227     return FixedVectorType::get(Type::getInt8Ty(Context), 2);
    228   case MVT::v4i8:
    229     return FixedVectorType::get(Type::getInt8Ty(Context), 4);
    230   case MVT::v8i8:
    231     return FixedVectorType::get(Type::getInt8Ty(Context), 8);
    232   case MVT::v16i8:
    233     return FixedVectorType::get(Type::getInt8Ty(Context), 16);
    234   case MVT::v32i8:
    235     return FixedVectorType::get(Type::getInt8Ty(Context), 32);
    236   case MVT::v64i8:
    237     return FixedVectorType::get(Type::getInt8Ty(Context), 64);
    238   case MVT::v128i8:
    239     return FixedVectorType::get(Type::getInt8Ty(Context), 128);
    240   case MVT::v256i8:
    241     return FixedVectorType::get(Type::getInt8Ty(Context), 256);
    242   case MVT::v1i16:
    243     return FixedVectorType::get(Type::getInt16Ty(Context), 1);
    244   case MVT::v2i16:
    245     return FixedVectorType::get(Type::getInt16Ty(Context), 2);
    246   case MVT::v3i16:
    247     return FixedVectorType::get(Type::getInt16Ty(Context), 3);
    248   case MVT::v4i16:
    249     return FixedVectorType::get(Type::getInt16Ty(Context), 4);
    250   case MVT::v8i16:
    251     return FixedVectorType::get(Type::getInt16Ty(Context), 8);
    252   case MVT::v16i16:
    253     return FixedVectorType::get(Type::getInt16Ty(Context), 16);
    254   case MVT::v32i16:
    255     return FixedVectorType::get(Type::getInt16Ty(Context), 32);
    256   case MVT::v64i16:
    257     return FixedVectorType::get(Type::getInt16Ty(Context), 64);
    258   case MVT::v128i16:
    259     return FixedVectorType::get(Type::getInt16Ty(Context), 128);
    260   case MVT::v256i16:
    261     return FixedVectorType::get(Type::getInt16Ty(Context), 256);
    262   case MVT::v1i32:
    263     return FixedVectorType::get(Type::getInt32Ty(Context), 1);
    264   case MVT::v2i32:
    265     return FixedVectorType::get(Type::getInt32Ty(Context), 2);
    266   case MVT::v3i32:
    267     return FixedVectorType::get(Type::getInt32Ty(Context), 3);
    268   case MVT::v4i32:
    269     return FixedVectorType::get(Type::getInt32Ty(Context), 4);
    270   case MVT::v5i32:
    271     return FixedVectorType::get(Type::getInt32Ty(Context), 5);
    272   case MVT::v8i32:
    273     return FixedVectorType::get(Type::getInt32Ty(Context), 8);
    274   case MVT::v16i32:
    275     return FixedVectorType::get(Type::getInt32Ty(Context), 16);
    276   case MVT::v32i32:
    277     return FixedVectorType::get(Type::getInt32Ty(Context), 32);
    278   case MVT::v64i32:
    279     return FixedVectorType::get(Type::getInt32Ty(Context), 64);
    280   case MVT::v128i32:
    281     return FixedVectorType::get(Type::getInt32Ty(Context), 128);
    282   case MVT::v256i32:
    283     return FixedVectorType::get(Type::getInt32Ty(Context), 256);
    284   case MVT::v512i32:
    285     return FixedVectorType::get(Type::getInt32Ty(Context), 512);
    286   case MVT::v1024i32:
    287     return FixedVectorType::get(Type::getInt32Ty(Context), 1024);
    288   case MVT::v2048i32:
    289     return FixedVectorType::get(Type::getInt32Ty(Context), 2048);
    290   case MVT::v1i64:
    291     return FixedVectorType::get(Type::getInt64Ty(Context), 1);
    292   case MVT::v2i64:
    293     return FixedVectorType::get(Type::getInt64Ty(Context), 2);
    294   case MVT::v4i64:
    295     return FixedVectorType::get(Type::getInt64Ty(Context), 4);
    296   case MVT::v8i64:
    297     return FixedVectorType::get(Type::getInt64Ty(Context), 8);
    298   case MVT::v16i64:
    299     return FixedVectorType::get(Type::getInt64Ty(Context), 16);
    300   case MVT::v32i64:
    301     return FixedVectorType::get(Type::getInt64Ty(Context), 32);
    302   case MVT::v64i64:
    303     return FixedVectorType::get(Type::getInt64Ty(Context), 64);
    304   case MVT::v128i64:
    305     return FixedVectorType::get(Type::getInt64Ty(Context), 128);
    306   case MVT::v256i64:
    307     return FixedVectorType::get(Type::getInt64Ty(Context), 256);
    308   case MVT::v1i128:
    309     return FixedVectorType::get(Type::getInt128Ty(Context), 1);
    310   case MVT::v1f16:
    311     return FixedVectorType::get(Type::getHalfTy(Context), 1);
    312   case MVT::v2f16:
    313     return FixedVectorType::get(Type::getHalfTy(Context), 2);
    314   case MVT::v3f16:
    315     return FixedVectorType::get(Type::getHalfTy(Context), 3);
    316   case MVT::v4f16:
    317     return FixedVectorType::get(Type::getHalfTy(Context), 4);
    318   case MVT::v8f16:
    319     return FixedVectorType::get(Type::getHalfTy(Context), 8);
    320   case MVT::v16f16:
    321     return FixedVectorType::get(Type::getHalfTy(Context), 16);
    322   case MVT::v32f16:
    323     return FixedVectorType::get(Type::getHalfTy(Context), 32);
    324   case MVT::v64f16:
    325     return FixedVectorType::get(Type::getHalfTy(Context), 64);
    326   case MVT::v128f16:
    327     return FixedVectorType::get(Type::getHalfTy(Context), 128);
    328   case MVT::v256f16:
    329     return FixedVectorType::get(Type::getHalfTy(Context), 256);
    330   case MVT::v2bf16:
    331     return FixedVectorType::get(Type::getBFloatTy(Context), 2);
    332   case MVT::v3bf16:
    333     return FixedVectorType::get(Type::getBFloatTy(Context), 3);
    334   case MVT::v4bf16:
    335     return FixedVectorType::get(Type::getBFloatTy(Context), 4);
    336   case MVT::v8bf16:
    337     return FixedVectorType::get(Type::getBFloatTy(Context), 8);
    338   case MVT::v16bf16:
    339     return FixedVectorType::get(Type::getBFloatTy(Context), 16);
    340   case MVT::v32bf16:
    341     return FixedVectorType::get(Type::getBFloatTy(Context), 32);
    342   case MVT::v64bf16:
    343     return FixedVectorType::get(Type::getBFloatTy(Context), 64);
    344   case MVT::v128bf16:
    345     return FixedVectorType::get(Type::getBFloatTy(Context), 128);
    346   case MVT::v1f32:
    347     return FixedVectorType::get(Type::getFloatTy(Context), 1);
    348   case MVT::v2f32:
    349     return FixedVectorType::get(Type::getFloatTy(Context), 2);
    350   case MVT::v3f32:
    351     return FixedVectorType::get(Type::getFloatTy(Context), 3);
    352   case MVT::v4f32:
    353     return FixedVectorType::get(Type::getFloatTy(Context), 4);
    354   case MVT::v5f32:
    355     return FixedVectorType::get(Type::getFloatTy(Context), 5);
    356   case MVT::v8f32:
    357     return FixedVectorType::get(Type::getFloatTy(Context), 8);
    358   case MVT::v16f32:
    359     return FixedVectorType::get(Type::getFloatTy(Context), 16);
    360   case MVT::v32f32:
    361     return FixedVectorType::get(Type::getFloatTy(Context), 32);
    362   case MVT::v64f32:
    363     return FixedVectorType::get(Type::getFloatTy(Context), 64);
    364   case MVT::v128f32:
    365     return FixedVectorType::get(Type::getFloatTy(Context), 128);
    366   case MVT::v256f32:
    367     return FixedVectorType::get(Type::getFloatTy(Context), 256);
    368   case MVT::v512f32:
    369     return FixedVectorType::get(Type::getFloatTy(Context), 512);
    370   case MVT::v1024f32:
    371     return FixedVectorType::get(Type::getFloatTy(Context), 1024);
    372   case MVT::v2048f32:
    373     return FixedVectorType::get(Type::getFloatTy(Context), 2048);
    374   case MVT::v1f64:
    375     return FixedVectorType::get(Type::getDoubleTy(Context), 1);
    376   case MVT::v2f64:
    377     return FixedVectorType::get(Type::getDoubleTy(Context), 2);
    378   case MVT::v4f64:
    379     return FixedVectorType::get(Type::getDoubleTy(Context), 4);
    380   case MVT::v8f64:
    381     return FixedVectorType::get(Type::getDoubleTy(Context), 8);
    382   case MVT::v16f64:
    383     return FixedVectorType::get(Type::getDoubleTy(Context), 16);
    384   case MVT::v32f64:
    385     return FixedVectorType::get(Type::getDoubleTy(Context), 32);
    386   case MVT::v64f64:
    387     return FixedVectorType::get(Type::getDoubleTy(Context), 64);
    388   case MVT::v128f64:
    389     return FixedVectorType::get(Type::getDoubleTy(Context), 128);
    390   case MVT::v256f64:
    391     return FixedVectorType::get(Type::getDoubleTy(Context), 256);
    392   case MVT::nxv1i1:
    393     return ScalableVectorType::get(Type::getInt1Ty(Context), 1);
    394   case MVT::nxv2i1:
    395     return ScalableVectorType::get(Type::getInt1Ty(Context), 2);
    396   case MVT::nxv4i1:
    397     return ScalableVectorType::get(Type::getInt1Ty(Context), 4);
    398   case MVT::nxv8i1:
    399     return ScalableVectorType::get(Type::getInt1Ty(Context), 8);
    400   case MVT::nxv16i1:
    401     return ScalableVectorType::get(Type::getInt1Ty(Context), 16);
    402   case MVT::nxv32i1:
    403     return ScalableVectorType::get(Type::getInt1Ty(Context), 32);
    404   case MVT::nxv64i1:
    405     return ScalableVectorType::get(Type::getInt1Ty(Context), 64);
    406   case MVT::nxv1i8:
    407     return ScalableVectorType::get(Type::getInt8Ty(Context), 1);
    408   case MVT::nxv2i8:
    409     return ScalableVectorType::get(Type::getInt8Ty(Context), 2);
    410   case MVT::nxv4i8:
    411     return ScalableVectorType::get(Type::getInt8Ty(Context), 4);
    412   case MVT::nxv8i8:
    413     return ScalableVectorType::get(Type::getInt8Ty(Context), 8);
    414   case MVT::nxv16i8:
    415     return ScalableVectorType::get(Type::getInt8Ty(Context), 16);
    416   case MVT::nxv32i8:
    417     return ScalableVectorType::get(Type::getInt8Ty(Context), 32);
    418   case MVT::nxv64i8:
    419     return ScalableVectorType::get(Type::getInt8Ty(Context), 64);
    420   case MVT::nxv1i16:
    421     return ScalableVectorType::get(Type::getInt16Ty(Context), 1);
    422   case MVT::nxv2i16:
    423     return ScalableVectorType::get(Type::getInt16Ty(Context), 2);
    424   case MVT::nxv4i16:
    425     return ScalableVectorType::get(Type::getInt16Ty(Context), 4);
    426   case MVT::nxv8i16:
    427     return ScalableVectorType::get(Type::getInt16Ty(Context), 8);
    428   case MVT::nxv16i16:
    429     return ScalableVectorType::get(Type::getInt16Ty(Context), 16);
    430   case MVT::nxv32i16:
    431     return ScalableVectorType::get(Type::getInt16Ty(Context), 32);
    432   case MVT::nxv1i32:
    433     return ScalableVectorType::get(Type::getInt32Ty(Context), 1);
    434   case MVT::nxv2i32:
    435     return ScalableVectorType::get(Type::getInt32Ty(Context), 2);
    436   case MVT::nxv4i32:
    437     return ScalableVectorType::get(Type::getInt32Ty(Context), 4);
    438   case MVT::nxv8i32:
    439     return ScalableVectorType::get(Type::getInt32Ty(Context), 8);
    440   case MVT::nxv16i32:
    441     return ScalableVectorType::get(Type::getInt32Ty(Context), 16);
    442   case MVT::nxv32i32:
    443     return ScalableVectorType::get(Type::getInt32Ty(Context), 32);
    444   case MVT::nxv1i64:
    445     return ScalableVectorType::get(Type::getInt64Ty(Context), 1);
    446   case MVT::nxv2i64:
    447     return ScalableVectorType::get(Type::getInt64Ty(Context), 2);
    448   case MVT::nxv4i64:
    449     return ScalableVectorType::get(Type::getInt64Ty(Context), 4);
    450   case MVT::nxv8i64:
    451     return ScalableVectorType::get(Type::getInt64Ty(Context), 8);
    452   case MVT::nxv16i64:
    453     return ScalableVectorType::get(Type::getInt64Ty(Context), 16);
    454   case MVT::nxv32i64:
    455     return ScalableVectorType::get(Type::getInt64Ty(Context), 32);
    456   case MVT::nxv1f16:
    457     return ScalableVectorType::get(Type::getHalfTy(Context), 1);
    458   case MVT::nxv2f16:
    459     return ScalableVectorType::get(Type::getHalfTy(Context), 2);
    460   case MVT::nxv4f16:
    461     return ScalableVectorType::get(Type::getHalfTy(Context), 4);
    462   case MVT::nxv8f16:
    463     return ScalableVectorType::get(Type::getHalfTy(Context), 8);
    464   case MVT::nxv16f16:
    465     return ScalableVectorType::get(Type::getHalfTy(Context), 16);
    466   case MVT::nxv32f16:
    467     return ScalableVectorType::get(Type::getHalfTy(Context), 32);
    468   case MVT::nxv1bf16:
    469     return ScalableVectorType::get(Type::getBFloatTy(Context), 1);
    470   case MVT::nxv2bf16:
    471     return ScalableVectorType::get(Type::getBFloatTy(Context), 2);
    472   case MVT::nxv4bf16:
    473     return ScalableVectorType::get(Type::getBFloatTy(Context), 4);
    474   case MVT::nxv8bf16:
    475     return ScalableVectorType::get(Type::getBFloatTy(Context), 8);
    476   case MVT::nxv1f32:
    477     return ScalableVectorType::get(Type::getFloatTy(Context), 1);
    478   case MVT::nxv2f32:
    479     return ScalableVectorType::get(Type::getFloatTy(Context), 2);
    480   case MVT::nxv4f32:
    481     return ScalableVectorType::get(Type::getFloatTy(Context), 4);
    482   case MVT::nxv8f32:
    483     return ScalableVectorType::get(Type::getFloatTy(Context), 8);
    484   case MVT::nxv16f32:
    485     return ScalableVectorType::get(Type::getFloatTy(Context), 16);
    486   case MVT::nxv1f64:
    487     return ScalableVectorType::get(Type::getDoubleTy(Context), 1);
    488   case MVT::nxv2f64:
    489     return ScalableVectorType::get(Type::getDoubleTy(Context), 2);
    490   case MVT::nxv4f64:
    491     return ScalableVectorType::get(Type::getDoubleTy(Context), 4);
    492   case MVT::nxv8f64:
    493     return ScalableVectorType::get(Type::getDoubleTy(Context), 8);
    494   case MVT::Metadata: return Type::getMetadataTy(Context);
    495   }
    496 }
    497 
    498 /// Return the value type corresponding to the specified type.  This returns all
    499 /// pointers as MVT::iPTR.  If HandleUnknown is true, unknown types are returned
    500 /// as Other, otherwise they are invalid.
    501 MVT MVT::getVT(Type *Ty, bool HandleUnknown){
    502   switch (Ty->getTypeID()) {
    503   default:
    504     if (HandleUnknown) return MVT(MVT::Other);
    505     llvm_unreachable("Unknown type!");
    506   case Type::VoidTyID:
    507     return MVT::isVoid;
    508   case Type::IntegerTyID:
    509     return getIntegerVT(cast<IntegerType>(Ty)->getBitWidth());
    510   case Type::HalfTyID:      return MVT(MVT::f16);
    511   case Type::BFloatTyID:    return MVT(MVT::bf16);
    512   case Type::FloatTyID:     return MVT(MVT::f32);
    513   case Type::DoubleTyID:    return MVT(MVT::f64);
    514   case Type::X86_FP80TyID:  return MVT(MVT::f80);
    515   case Type::X86_MMXTyID:   return MVT(MVT::x86mmx);
    516   case Type::X86_AMXTyID:   return MVT(MVT::x86amx);
    517   case Type::FP128TyID:     return MVT(MVT::f128);
    518   case Type::PPC_FP128TyID: return MVT(MVT::ppcf128);
    519   case Type::PointerTyID:   return MVT(MVT::iPTR);
    520   case Type::FixedVectorTyID:
    521   case Type::ScalableVectorTyID: {
    522     VectorType *VTy = cast<VectorType>(Ty);
    523     return getVectorVT(
    524       getVT(VTy->getElementType(), /*HandleUnknown=*/ false),
    525             VTy->getElementCount());
    526   }
    527   }
    528 }
    529 
    530 /// getEVT - Return the value type corresponding to the specified type.  This
    531 /// returns all pointers as MVT::iPTR.  If HandleUnknown is true, unknown types
    532 /// are returned as Other, otherwise they are invalid.
    533 EVT EVT::getEVT(Type *Ty, bool HandleUnknown){
    534   switch (Ty->getTypeID()) {
    535   default:
    536     return MVT::getVT(Ty, HandleUnknown);
    537   case Type::IntegerTyID:
    538     return getIntegerVT(Ty->getContext(), cast<IntegerType>(Ty)->getBitWidth());
    539   case Type::FixedVectorTyID:
    540   case Type::ScalableVectorTyID: {
    541     VectorType *VTy = cast<VectorType>(Ty);
    542     return getVectorVT(Ty->getContext(),
    543                        getEVT(VTy->getElementType(), /*HandleUnknown=*/ false),
    544                        VTy->getElementCount());
    545   }
    546   }
    547 }
    548