1e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson//===----------- ValueTypes.cpp - Implementation of EVT methods -----------===//
2edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
357bf3287dd15a26073be4dae2204463264328e44Chris Lattner//                     The LLVM Compiler Infrastructure
457bf3287dd15a26073be4dae2204463264328e44Chris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
857bf3287dd15a26073be4dae2204463264328e44Chris Lattner//===----------------------------------------------------------------------===//
957bf3287dd15a26073be4dae2204463264328e44Chris Lattner//
1057bf3287dd15a26073be4dae2204463264328e44Chris Lattner// This file implements methods in the CodeGen/ValueTypes.h header.
1157bf3287dd15a26073be4dae2204463264328e44Chris Lattner//
1257bf3287dd15a26073be4dae2204463264328e44Chris Lattner//===----------------------------------------------------------------------===//
1357bf3287dd15a26073be4dae2204463264328e44Chris Lattner
1457bf3287dd15a26073be4dae2204463264328e44Chris Lattner#include "llvm/CodeGen/ValueTypes.h"
15d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/ADT/StringExtras.h"
160b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/DerivedTypes.h"
170b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/LLVMContext.h"
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Type.h"
19c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwin#include "llvm/Support/ErrorHandling.h"
2057bf3287dd15a26073be4dae2204463264328e44Chris Lattnerusing namespace llvm;
2157bf3287dd15a26073be4dae2204463264328e44Chris Lattner
2228b77e968d2b01fc9da724762bd8ddcd80650e32Duncan SandsEVT EVT::changeExtendedVectorElementTypeToInteger() const {
2328b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands  LLVMContext &Context = LLVMTy->getContext();
2428b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands  EVT IntTy = getIntegerVT(Context, getVectorElementType().getSizeInBits());
2528b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands  return getVectorVT(Context, IntTy, getVectorNumElements());
2628b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands}
2728b77e968d2b01fc9da724762bd8ddcd80650e32Duncan Sands
2823b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen AndersonEVT EVT::getExtendedIntegerVT(LLVMContext &Context, unsigned BitWidth) {
29e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT;
301d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  VT.LLVMTy = IntegerType::get(Context, BitWidth);
3138bb2f8d094a7e98d07b258ec5b722b07ad45dcbDan Gohman  assert(VT.isExtended() && "Type is not extended!");
323a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman  return VT;
333a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}
343a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman
3523b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen AndersonEVT EVT::getExtendedVectorVT(LLVMContext &Context, EVT VT,
3623b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson                             unsigned NumElements) {
37e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT ResultVT;
3823b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  ResultVT.LLVMTy = VectorType::get(VT.getTypeForEVT(Context), NumElements);
3938bb2f8d094a7e98d07b258ec5b722b07ad45dcbDan Gohman  assert(ResultVT.isExtended() && "Type is not extended!");
403a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman  return ResultVT;
413a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}
423a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman
43e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtendedFloatingPoint() const {
443a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman  assert(isExtended() && "Type is not extended!");
45b0bc6c361da9009e8414efde317d9bbff755f6c0Duncan Sands  return LLVMTy->isFPOrFPVectorTy();
463a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}
473a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman
48e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtendedInteger() const {
493a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman  assert(isExtended() && "Type is not extended!");
50b0bc6c361da9009e8414efde317d9bbff755f6c0Duncan Sands  return LLVMTy->isIntOrIntVectorTy();
513a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}
523a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman
53e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtendedVector() const {
543a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman  assert(isExtended() && "Type is not extended!");
551df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands  return LLVMTy->isVectorTy();
563a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}
573a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman
583e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmowbool EVT::isExtended16BitVector() const {
59542b716bbcb3fa1b3354bc71bb84327921f73da3Craig Topper  return isExtendedVector() && getExtendedSizeInBits() == 16;
603e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow}
613e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow
623e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmowbool EVT::isExtended32BitVector() const {
63542b716bbcb3fa1b3354bc71bb84327921f73da3Craig Topper  return isExtendedVector() && getExtendedSizeInBits() == 32;
643e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow}
653e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow
66e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtended64BitVector() const {
67542b716bbcb3fa1b3354bc71bb84327921f73da3Craig Topper  return isExtendedVector() && getExtendedSizeInBits() == 64;
683a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}
693a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman
70e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtended128BitVector() const {
71542b716bbcb3fa1b3354bc71bb84327921f73da3Craig Topper  return isExtendedVector() && getExtendedSizeInBits() == 128;
723a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}
733a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman
74e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonbool EVT::isExtended256BitVector() const {
75542b716bbcb3fa1b3354bc71bb84327921f73da3Craig Topper  return isExtendedVector() && getExtendedSizeInBits() == 256;
769b9838dbd4593e988b0614bb170427f153b14931David Greene}
779b9838dbd4593e988b0614bb170427f153b14931David Greene
78dbf67fefeaccfeb53fb9d6098180ba1f29e682d5Evan Chengbool EVT::isExtended512BitVector() const {
79542b716bbcb3fa1b3354bc71bb84327921f73da3Craig Topper  return isExtendedVector() && getExtendedSizeInBits() == 512;
80dbf67fefeaccfeb53fb9d6098180ba1f29e682d5Evan Cheng}
81dbf67fefeaccfeb53fb9d6098180ba1f29e682d5Evan Cheng
82b3fb028ebde36fab441a731aebe3a21bc30bda9aMicah Villmowbool EVT::isExtended1024BitVector() const {
83542b716bbcb3fa1b3354bc71bb84327921f73da3Craig Topper  return isExtendedVector() && getExtendedSizeInBits() == 1024;
84b3fb028ebde36fab441a731aebe3a21bc30bda9aMicah Villmow}
85b3fb028ebde36fab441a731aebe3a21bc30bda9aMicah Villmow
86e50ed30282bb5b4a9ed952580523f2dda16215acOwen AndersonEVT EVT::getExtendedVectorElementType() const {
873a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman  assert(isExtended() && "Type is not extended!");
88e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  return EVT::getEVT(cast<VectorType>(LLVMTy)->getElementType());
893a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}
903a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman
91e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonunsigned EVT::getExtendedVectorNumElements() const {
923a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman  assert(isExtended() && "Type is not extended!");
933a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman  return cast<VectorType>(LLVMTy)->getNumElements();
943a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}
953a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman
96e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonunsigned EVT::getExtendedSizeInBits() const {
973a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman  assert(isExtended() && "Type is not extended!");
98db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  if (IntegerType *ITy = dyn_cast<IntegerType>(LLVMTy))
993a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman    return ITy->getBitWidth();
100db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner  if (VectorType *VTy = dyn_cast<VectorType>(LLVMTy))
1013a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman    return VTy->getBitWidth();
10250bee42b54cd9aec5f49566307df2b0cf23afcf6Craig Topper  llvm_unreachable("Unrecognized extended type!");
1033a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman}
1043a5797d94662d1e3cd52ade56bc16e159ec05838Dan Gohman
105e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson/// getEVTString - This function returns value type as a string, e.g. "i32".
106e50ed30282bb5b4a9ed952580523f2dda16215acOwen Andersonstd::string EVT::getEVTString() const {
107825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  switch (V.SimpleTy) {
1087f32156bb9c017b71971c52fac892fa7b9b06dd2Dan Gohman  default:
10983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    if (isVector())
11083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands      return "v" + utostr(getVectorNumElements()) +
111e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson             getVectorElementType().getEVTString();
11283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    if (isInteger())
11383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands      return "i" + utostr(getSizeInBits());
114e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    llvm_unreachable("Invalid EVT!");
115825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::i1:      return "i1";
116825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::i8:      return "i8";
117825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::i16:     return "i16";
118825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::i32:     return "i32";
119825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::i64:     return "i64";
120825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::i128:    return "i128";
121e3376ecd504300ae529c902135f51baffbdc2824Dan Gohman  case MVT::f16:     return "f16";
122825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::f32:     return "f32";
123825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::f64:     return "f64";
124825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::f80:     return "f80";
125825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::f128:    return "f128";
126825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::ppcf128: return "ppcf128";
127825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::isVoid:  return "isVoid";
128825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::Other:   return "ch";
129f1b4eafbfec976f939ec0ea3e8acf91cef5363e3Chris Lattner  case MVT::Glue:    return "glue";
130d8dd5757e0e31c55bb15498aa1d75fad08850c5aBill Wendling  case MVT::x86mmx:  return "x86mmx";
1313e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v2i1:    return "v2i1";
1323e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v4i1:    return "v4i1";
1333e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v8i1:    return "v8i1";
1343e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v16i1:   return "v16i1";
13594d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v32i1:   return "v32i1";
13694d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v64i1:   return "v64i1";
137477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu  case MVT::v1i8:    return "v1i8";
138825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v2i8:    return "v2i8";
139825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v4i8:    return "v4i8";
140825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v8i8:    return "v8i8";
141825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v16i8:   return "v16i8";
142825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v32i8:   return "v32i8";
14394d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v64i8:   return "v64i8";
1443e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v1i16:   return "v1i16";
145825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v2i16:   return "v2i16";
146825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v4i16:   return "v4i16";
147825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v8i16:   return "v8i16";
148825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v16i16:  return "v16i16";
14994d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v32i16:  return "v32i16";
1503e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v1i32:   return "v1i32";
151825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v2i32:   return "v2i32";
152825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v4i32:   return "v4i32";
153825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v8i32:   return "v8i32";
154b3fb028ebde36fab441a731aebe3a21bc30bda9aMicah Villmow  case MVT::v16i32:  return "v16i32";
155825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v1i64:   return "v1i64";
156825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v2i64:   return "v2i64";
157825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v4i64:   return "v4i64";
158dbf67fefeaccfeb53fb9d6098180ba1f29e682d5Evan Cheng  case MVT::v8i64:   return "v8i64";
159b3fb028ebde36fab441a731aebe3a21bc30bda9aMicah Villmow  case MVT::v16i64:  return "v16i64";
160477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu  case MVT::v1f32:   return "v1f32";
161825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v2f32:   return "v2f32";
162ddfda5cd1648c4cae12e6f62c3d86a36be3aefe4Pete Cooper  case MVT::v2f16:   return "v2f16";
163da750239bd1f02aef403baa4805805fb580e78e1Pete Cooper  case MVT::v4f16:   return "v4f16";
1640fe3792a2fd6ed9c20d8bf8eb3689672cb30c1c7Jack Carter  case MVT::v8f16:   return "v8f16";
165825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v4f32:   return "v4f32";
166825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v8f32:   return "v8f32";
16794d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v16f32:  return "v16f32";
168477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu  case MVT::v1f64:   return "v1f64";
169825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v2f64:   return "v2f64";
170825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case MVT::v4f64:   return "v4f64";
17194d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v8f64:   return "v8f64";
172350df33d722200b429838136d25bc6359c4bc1e4Dale Johannesen  case MVT::Metadata:return "Metadata";
17399aa14ff64c92eab347d23696e358361d3bd90eaOwen Anderson  case MVT::Untyped: return "Untyped";
17457bf3287dd15a26073be4dae2204463264328e44Chris Lattner  }
17557bf3287dd15a26073be4dae2204463264328e44Chris Lattner}
17657bf3287dd15a26073be4dae2204463264328e44Chris Lattner
177e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson/// getTypeForEVT - This method returns an LLVM type corresponding to the
178e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson/// specified EVT.  For integer types, this returns an unsigned type.  Note
17983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands/// that this will abort for types that cannot be represented.
180db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris LattnerType *EVT::getTypeForEVT(LLVMContext &Context) const {
181825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  switch (V.SimpleTy) {
1827f32156bb9c017b71971c52fac892fa7b9b06dd2Dan Gohman  default:
1839a99325141ca9c67165bbdabbc5a854a5c679a23Dan Gohman    assert(isExtended() && "Type is not extended!");
1849a99325141ca9c67165bbdabbc5a854a5c679a23Dan Gohman    return LLVMTy;
1851d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::isVoid:  return Type::getVoidTy(Context);
1861d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::i1:      return Type::getInt1Ty(Context);
1871d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::i8:      return Type::getInt8Ty(Context);
1881d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::i16:     return Type::getInt16Ty(Context);
1891d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::i32:     return Type::getInt32Ty(Context);
1901d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::i64:     return Type::getInt64Ty(Context);
1911d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::i128:    return IntegerType::get(Context, 128);
192e3376ecd504300ae529c902135f51baffbdc2824Dan Gohman  case MVT::f16:     return Type::getHalfTy(Context);
1931d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::f32:     return Type::getFloatTy(Context);
1941d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::f64:     return Type::getDoubleTy(Context);
1951d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::f80:     return Type::getX86_FP80Ty(Context);
1961d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::f128:    return Type::getFP128Ty(Context);
1971d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::ppcf128: return Type::getPPC_FP128Ty(Context);
198bb811a244567aa8a1522203f15588f4d001b7353Dale Johannesen  case MVT::x86mmx:  return Type::getX86_MMXTy(Context);
1993e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v2i1:    return VectorType::get(Type::getInt1Ty(Context), 2);
2003e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v4i1:    return VectorType::get(Type::getInt1Ty(Context), 4);
2013e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v8i1:    return VectorType::get(Type::getInt1Ty(Context), 8);
2023e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v16i1:   return VectorType::get(Type::getInt1Ty(Context), 16);
20394d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v32i1:   return VectorType::get(Type::getInt1Ty(Context), 32);
20494d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v64i1:   return VectorType::get(Type::getInt1Ty(Context), 64);
205477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu  case MVT::v1i8:    return VectorType::get(Type::getInt8Ty(Context), 1);
2061d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v2i8:    return VectorType::get(Type::getInt8Ty(Context), 2);
2071d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v4i8:    return VectorType::get(Type::getInt8Ty(Context), 4);
2081d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v8i8:    return VectorType::get(Type::getInt8Ty(Context), 8);
2091d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v16i8:   return VectorType::get(Type::getInt8Ty(Context), 16);
2101d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v32i8:   return VectorType::get(Type::getInt8Ty(Context), 32);
21194d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v64i8:   return VectorType::get(Type::getInt8Ty(Context), 64);
2123e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v1i16:   return VectorType::get(Type::getInt16Ty(Context), 1);
2131d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v2i16:   return VectorType::get(Type::getInt16Ty(Context), 2);
2141d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v4i16:   return VectorType::get(Type::getInt16Ty(Context), 4);
2151d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v8i16:   return VectorType::get(Type::getInt16Ty(Context), 8);
2161d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v16i16:  return VectorType::get(Type::getInt16Ty(Context), 16);
21794d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v32i16:  return VectorType::get(Type::getInt16Ty(Context), 32);
2183e9b6db60ff5864d6789f768610a3509dac0b5efMicah Villmow  case MVT::v1i32:   return VectorType::get(Type::getInt32Ty(Context), 1);
2191d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v2i32:   return VectorType::get(Type::getInt32Ty(Context), 2);
2201d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v4i32:   return VectorType::get(Type::getInt32Ty(Context), 4);
2211d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v8i32:   return VectorType::get(Type::getInt32Ty(Context), 8);
222b3fb028ebde36fab441a731aebe3a21bc30bda9aMicah Villmow  case MVT::v16i32:  return VectorType::get(Type::getInt32Ty(Context), 16);
2231d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v1i64:   return VectorType::get(Type::getInt64Ty(Context), 1);
2241d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v2i64:   return VectorType::get(Type::getInt64Ty(Context), 2);
2251d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v4i64:   return VectorType::get(Type::getInt64Ty(Context), 4);
226dbf67fefeaccfeb53fb9d6098180ba1f29e682d5Evan Cheng  case MVT::v8i64:   return VectorType::get(Type::getInt64Ty(Context), 8);
227b3fb028ebde36fab441a731aebe3a21bc30bda9aMicah Villmow  case MVT::v16i64:  return VectorType::get(Type::getInt64Ty(Context), 16);
228ddfda5cd1648c4cae12e6f62c3d86a36be3aefe4Pete Cooper  case MVT::v2f16:   return VectorType::get(Type::getHalfTy(Context), 2);
229da750239bd1f02aef403baa4805805fb580e78e1Pete Cooper  case MVT::v4f16:   return VectorType::get(Type::getHalfTy(Context), 4);
2300fe3792a2fd6ed9c20d8bf8eb3689672cb30c1c7Jack Carter  case MVT::v8f16:   return VectorType::get(Type::getHalfTy(Context), 8);
231477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu  case MVT::v1f32:   return VectorType::get(Type::getFloatTy(Context), 1);
2321d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v2f32:   return VectorType::get(Type::getFloatTy(Context), 2);
2331d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v4f32:   return VectorType::get(Type::getFloatTy(Context), 4);
2341d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v8f32:   return VectorType::get(Type::getFloatTy(Context), 8);
23594d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v16f32:   return VectorType::get(Type::getFloatTy(Context), 16);
236477fc628b3c9ce1c970d4a678dd5607b15242cc8Jiangning Liu  case MVT::v1f64:   return VectorType::get(Type::getDoubleTy(Context), 1);
2371d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v2f64:   return VectorType::get(Type::getDoubleTy(Context), 2);
2381d0be15f89cb5056e20e2d24faa8d6afb1573bcaOwen Anderson  case MVT::v4f64:   return VectorType::get(Type::getDoubleTy(Context), 4);
23994d7ab7da4601d0caa75e7cffcf542214fb830a8Elena Demikhovsky  case MVT::v8f64:   return VectorType::get(Type::getDoubleTy(Context), 8);
240e4b275610a7a05b7ee4c0378a906a6330e4c4ab0Devang Patel  case MVT::Metadata: return Type::getMetadataTy(Context);
2419b9838dbd4593e988b0614bb170427f153b14931David Greene }
24257bf3287dd15a26073be4dae2204463264328e44Chris Lattner}
2432df6dc579ca7c85a20d2d221f4df32fbb26fc97aChris Lattner
244c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund/// Return the value type corresponding to the specified type.  This returns all
245c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund/// pointers as MVT::iPTR.  If HandleUnknown is true, unknown types are returned
246c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund/// as Other, otherwise they are invalid.
247c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik HagglundMVT MVT::getVT(Type *Ty, bool HandleUnknown){
2482df6dc579ca7c85a20d2d221f4df32fbb26fc97aChris Lattner  switch (Ty->getTypeID()) {
249bb58b9c3c03dda9d03e92a9dd2a0d00dfb922331Chris Lattner  default:
250825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (HandleUnknown) return MVT(MVT::Other);
251c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("Unknown type!");
2522df6dc579ca7c85a20d2d221f4df32fbb26fc97aChris Lattner  case Type::VoidTyID:
25323b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson    return MVT::isVoid;
2542df6dc579ca7c85a20d2d221f4df32fbb26fc97aChris Lattner  case Type::IntegerTyID:
255c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund    return getIntegerVT(cast<IntegerType>(Ty)->getBitWidth());
256e3376ecd504300ae529c902135f51baffbdc2824Dan Gohman  case Type::HalfTyID:      return MVT(MVT::f16);
257825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case Type::FloatTyID:     return MVT(MVT::f32);
258825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case Type::DoubleTyID:    return MVT(MVT::f64);
259825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case Type::X86_FP80TyID:  return MVT(MVT::f80);
26029fc6f35a5a284e0c304b1877e9acf040bfca339Dale Johannesen  case Type::X86_MMXTyID:   return MVT(MVT::x86mmx);
261825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case Type::FP128TyID:     return MVT(MVT::f128);
262825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case Type::PPC_FP128TyID: return MVT(MVT::ppcf128);
263825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  case Type::PointerTyID:   return MVT(MVT::iPTR);
2647f32156bb9c017b71971c52fac892fa7b9b06dd2Dan Gohman  case Type::VectorTyID: {
265db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner    VectorType *VTy = cast<VectorType>(Ty);
266c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund    return getVectorVT(
267c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund      getVT(VTy->getElementType(), false), VTy->getNumElements());
268c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund  }
269c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund  }
270c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund}
271c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund
272c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund/// getEVT - Return the value type corresponding to the specified type.  This
273c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund/// returns all pointers as MVT::iPTR.  If HandleUnknown is true, unknown types
274c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund/// are returned as Other, otherwise they are invalid.
275c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik HagglundEVT EVT::getEVT(Type *Ty, bool HandleUnknown){
276c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund  switch (Ty->getTypeID()) {
277c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund  default:
278c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund    return MVT::getVT(Ty, HandleUnknown);
279c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund  case Type::IntegerTyID:
280c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund    return getIntegerVT(Ty->getContext(), cast<IntegerType>(Ty)->getBitWidth());
281c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund  case Type::VectorTyID: {
282c698d3a2a40f0909d16cbe857685f0f22cb9ae43Patrik Hagglund    VectorType *VTy = cast<VectorType>(Ty);
28323b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson    return getVectorVT(Ty->getContext(), getEVT(VTy->getElementType(), false),
28483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                       VTy->getNumElements());
2857f32156bb9c017b71971c52fac892fa7b9b06dd2Dan Gohman  }
2862df6dc579ca7c85a20d2d221f4df32fbb26fc97aChris Lattner  }
287a573f5962840f10241f96da8ba93645688fc00b8Bob Wilson}
288