Index: include/llvm/CodeGen/MachineValueType.h =================================================================== --- include/llvm/CodeGen/MachineValueType.h +++ include/llvm/CodeGen/MachineValueType.h @@ -17,6 +17,7 @@ #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MathExtras.h" +#include "llvm/ADT/iterator_range.h" namespace llvm { @@ -575,6 +576,49 @@ /// returned as Other, otherwise they are invalid. static MVT getVT(Type *Ty, bool HandleUnknown = false); + private: + /// A simple iterator over the MVT::SimpleValueType enum. + struct mvt_iterator { + SimpleValueType VT; + mvt_iterator(SimpleValueType VT) : VT(VT) {} + MVT operator*() const { return VT; } + bool operator!=(const mvt_iterator &LHS) const { return VT != LHS.VT; } + mvt_iterator operator++() { + SimpleValueType OldVT = VT; + VT = (MVT::SimpleValueType)((int)VT + 1); + assert((int)VT <= MVT::MAX_ALLOWED_VALUETYPE && + "MVT iterator overflowed."); + return OldVT; + } + }; + /// A range of the MVT::SimpleValueType enum. + typedef iterator_range mvt_range; + + public: + /// @name SimpleValueType Iteration + /// @{ + static mvt_range all_types() { + return mvt_range((MVT::SimpleValueType)0, MVT::LAST_VALUETYPE); + } + static mvt_range integer_types() { + return mvt_range(MVT::FIRST_INTEGER_VALUETYPE, + MVT::LAST_INTEGER_VALUETYPE); + } + static mvt_range fp_types() { + return mvt_range(MVT::FIRST_FP_VALUETYPE, MVT::LAST_FP_VALUETYPE); + } + static mvt_range vector_types() { + return mvt_range(MVT::FIRST_VECTOR_VALUETYPE, MVT::LAST_VECTOR_VALUETYPE); + } + static mvt_range integer_vector_types() { + return mvt_range(MVT::FIRST_INTEGER_VECTOR_VALUETYPE, + MVT::LAST_INTEGER_VECTOR_VALUETYPE); + } + static mvt_range fp_vector_types() { + return mvt_range(MVT::FIRST_FP_VECTOR_VALUETYPE, + MVT::LAST_FP_VECTOR_VALUETYPE); + } + /// @} }; } // End llvm namespace Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -1082,9 +1082,8 @@ setOperationAction(ISD::FP_EXTEND, MVT::v2f32, Custom); setOperationAction(ISD::FP_ROUND, MVT::v2f32, Custom); - for (int i = MVT::FIRST_VECTOR_VALUETYPE; i <= MVT::LAST_VECTOR_VALUETYPE; - ++i) - setLoadExtAction(ISD::EXTLOAD, (MVT::SimpleValueType)i, MVT::v2f32, Legal); + for (MVT VT : MVT::vector_types()) + setLoadExtAction(ISD::EXTLOAD, VT, MVT::v2f32, Legal); setOperationAction(ISD::BITCAST, MVT::v2i32, Custom); setOperationAction(ISD::BITCAST, MVT::v4i16, Custom);