Browse Source

Native Int16 and Uint16 types (#783)

This change is to introduce native precision types for shader model 6.2. With native half (float16) types, we will introduce native int16/uint16 types with same command line option. This means that one option will disable all min precision types. For now, int16/uint16 types will be exposed on HLSL level as int16_t and uint16_t.

This change also includes some constant buffer fixes for 16 bit types, as well as int64 types.
Young Kim 7 years ago
parent
commit
44db464c32

+ 1 - 1
lib/HLSL/DxilCompType.cpp

@@ -327,7 +327,7 @@ const char *CompType::GetName() const {
 
 
 static const char *s_TypeKindHLSLNames[(unsigned)CompType::Kind::LastEntry] = {
 static const char *s_TypeKindHLSLNames[(unsigned)CompType::Kind::LastEntry] = {
   "unknown",
   "unknown",
-  "bool", "short", "unsigned short", "int", "uint", "int64_t", "uint64_t",
+  "bool", "int16_t", "uint16_t", "int", "uint", "int64_t", "uint64_t",
   "half", "float", "double",
   "half", "float", "double",
   "snorm_half", "unorm_half", "snorm_float", "unorm_float", "snorm_double", "unorm_double",
   "snorm_half", "unorm_half", "snorm_float", "unorm_float", "snorm_double", "unorm_double",
 };
 };

+ 2 - 0
lib/HLSL/DxilGenerationPass.cpp

@@ -2068,6 +2068,8 @@ void DxilTranslateRawBuffer::ReplaceMinPrecisionRawBufferLoadByType(
       IRBuilder<> CIBuilder(CI);
       IRBuilder<> CIBuilder(CI);
       SmallVector<Value *, 5> newFuncArgs;
       SmallVector<Value *, 5> newFuncArgs;
       // opcode, handle, index, elementOffset, mask
       // opcode, handle, index, elementOffset, mask
+      // Compiler is generating correct element offset even for min precision types
+      // So no need to recalculate here
       for (unsigned i = 0; i < 5; ++i) {
       for (unsigned i = 0; i < 5; ++i) {
         newFuncArgs.emplace_back(CI->getArgOperand(i));
         newFuncArgs.emplace_back(CI->getArgOperand(i));
       }
       }

+ 5 - 3
lib/HLSL/DxilOperations.cpp

@@ -126,7 +126,7 @@ const OP::OpCodeProperty OP::m_OpCodeProps[(unsigned)OP::OpCode::NumOpCodes] = {
   // Resources                                                                                                              void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64  function attribute
   // Resources                                                                                                              void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64  function attribute
   {  OC::CreateHandle,            "CreateHandle",             OCC::CreateHandle,             "createHandle",                true, false, false, false, false, false, false, false, false, Attribute::ReadOnly, },
   {  OC::CreateHandle,            "CreateHandle",             OCC::CreateHandle,             "createHandle",                true, false, false, false, false, false, false, false, false, Attribute::ReadOnly, },
   {  OC::CBufferLoad,             "CBufferLoad",              OCC::CBufferLoad,              "cbufferLoad",                false,  true,  true,  true, false,  true,  true,  true,  true, Attribute::ReadOnly, },
   {  OC::CBufferLoad,             "CBufferLoad",              OCC::CBufferLoad,              "cbufferLoad",                false,  true,  true,  true, false,  true,  true,  true,  true, Attribute::ReadOnly, },
-  {  OC::CBufferLoadLegacy,       "CBufferLoadLegacy",        OCC::CBufferLoadLegacy,        "cbufferLoadLegacy",          false,  true,  true,  true, false, false,  true,  true, false, Attribute::ReadOnly, },
+  {  OC::CBufferLoadLegacy,       "CBufferLoadLegacy",        OCC::CBufferLoadLegacy,        "cbufferLoadLegacy",          false,  true,  true,  true, false, false,  true,  true,  true, Attribute::ReadOnly, },
 
 
   // Resources - sample                                                                                                     void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64  function attribute
   // Resources - sample                                                                                                     void,     h,     f,     d,    i1,    i8,   i16,   i32,   i64  function attribute
   {  OC::Sample,                  "Sample",                   OCC::Sample,                   "sample",                     false,  true,  true, false, false, false, false, false, false, Attribute::ReadOnly, },
   {  OC::Sample,                  "Sample",                   OCC::Sample,                   "sample",                     false,  true,  true, false, false, false, false, false, false, Attribute::ReadOnly, },
@@ -982,11 +982,13 @@ Type *OP::GetCBufferRetType(Type *pOverloadType) {
   if (m_pCBufferRetType[TypeSlot] == nullptr) {
   if (m_pCBufferRetType[TypeSlot] == nullptr) {
     string TypeName("dx.types.CBufRet.");
     string TypeName("dx.types.CBufRet.");
     TypeName += GetOverloadTypeName(TypeSlot);
     TypeName += GetOverloadTypeName(TypeSlot);
-    if (pOverloadType->isDoubleTy()) {
+    Type *i64Ty = Type::getInt64Ty(pOverloadType->getContext());
+    Type *i16Ty = Type::getInt16Ty(pOverloadType->getContext());
+    if (pOverloadType->isDoubleTy() || pOverloadType == i64Ty) {
       Type *FieldTypes[2] = { pOverloadType, pOverloadType };
       Type *FieldTypes[2] = { pOverloadType, pOverloadType };
       m_pCBufferRetType[TypeSlot] = GetOrCreateStructType(m_Ctx, FieldTypes, TypeName, m_pModule);
       m_pCBufferRetType[TypeSlot] = GetOrCreateStructType(m_Ctx, FieldTypes, TypeName, m_pModule);
     }
     }
-    else if (!UseMinPrecision() && pOverloadType->isHalfTy()) {
+    else if (!UseMinPrecision() && (pOverloadType->isHalfTy() || pOverloadType == i16Ty)) {
       TypeName += ".8"; // dx.types.CBufRet.fp16.8 for buffer of 8 halves
       TypeName += ".8"; // dx.types.CBufRet.fp16.8 for buffer of 8 halves
       Type *FieldTypes[8] = {
       Type *FieldTypes[8] = {
           pOverloadType, pOverloadType, pOverloadType, pOverloadType,
           pOverloadType, pOverloadType, pOverloadType, pOverloadType,

+ 26 - 9
lib/HLSL/HLOperationLower.cpp

@@ -4905,15 +4905,19 @@ void TranslateCBOperations(Value *handle, Value *ptr, Value *offset, OP *hlslOP,
 Value *GenerateCBLoadLegacy(Value *handle, Value *legacyIdx,
 Value *GenerateCBLoadLegacy(Value *handle, Value *legacyIdx,
                             unsigned channelOffset, Type *EltTy, OP *hlslOP,
                             unsigned channelOffset, Type *EltTy, OP *hlslOP,
                             IRBuilder<> &Builder) {
                             IRBuilder<> &Builder) {
-  DXASSERT((channelOffset) < 4, "legacy cbuffer don't across 16 bytes register.");
   Constant *OpArg = hlslOP->GetU32Const((unsigned)OP::OpCode::CBufferLoadLegacy);
   Constant *OpArg = hlslOP->GetU32Const((unsigned)OP::OpCode::CBufferLoadLegacy);
 
 
   Type *i1Ty = Type::getInt1Ty(EltTy->getContext());
   Type *i1Ty = Type::getInt1Ty(EltTy->getContext());
   Type *doubleTy = Type::getDoubleTy(EltTy->getContext());
   Type *doubleTy = Type::getDoubleTy(EltTy->getContext());
+  Type *halfTy = Type::getHalfTy(EltTy->getContext());
   Type *i64Ty = Type::getInt64Ty(EltTy->getContext());
   Type *i64Ty = Type::getInt64Ty(EltTy->getContext());
+  Type *i16Ty = Type::getInt16Ty(EltTy->getContext());
   bool isBool = EltTy == i1Ty;
   bool isBool = EltTy == i1Ty;
   bool is64 = (EltTy == doubleTy) | (EltTy == i64Ty);
   bool is64 = (EltTy == doubleTy) | (EltTy == i64Ty);
+  bool is16 = (EltTy == halfTy || EltTy == i16Ty) && !hlslOP->UseMinPrecision();
   bool isNormal = !isBool && !is64;
   bool isNormal = !isBool && !is64;
+  DXASSERT((is16 && channelOffset < 8) || channelOffset < 4,
+           "legacy cbuffer don't across 16 bytes register.");
   if (isNormal) {
   if (isNormal) {
     Function *CBLoad = hlslOP->GetOpFunc(OP::OpCode::CBufferLoadLegacy, EltTy);
     Function *CBLoad = hlslOP->GetOpFunc(OP::OpCode::CBufferLoadLegacy, EltTy);
     Value *loadLegacy = Builder.CreateCall(CBLoad, {OpArg, handle, legacyIdx});
     Value *loadLegacy = Builder.CreateCall(CBLoad, {OpArg, handle, legacyIdx});
@@ -4945,12 +4949,15 @@ Value *GenerateCBLoadLegacy(Value *handle, Value *legacyIdx,
   Type *doubleTy = Type::getDoubleTy(EltTy->getContext());
   Type *doubleTy = Type::getDoubleTy(EltTy->getContext());
   Type *i64Ty = Type::getInt64Ty(EltTy->getContext());
   Type *i64Ty = Type::getInt64Ty(EltTy->getContext());
   Type *halfTy = Type::getHalfTy(EltTy->getContext());
   Type *halfTy = Type::getHalfTy(EltTy->getContext());
+  Type *shortTy = Type::getInt16Ty(EltTy->getContext());
 
 
   bool isBool = EltTy == i1Ty;
   bool isBool = EltTy == i1Ty;
   bool is64 = (EltTy == doubleTy) | (EltTy == i64Ty);
   bool is64 = (EltTy == doubleTy) | (EltTy == i64Ty);
-  bool is16 = EltTy == halfTy && !hlslOP->UseMinPrecision();
+  bool is16 = (EltTy == shortTy || EltTy == halfTy) && !hlslOP->UseMinPrecision();
   bool isNormal = !isBool && !is64 && !is16;
   bool isNormal = !isBool && !is64 && !is16;
-  DXASSERT(is16 || (channelOffset + vecSize) <= 4, "legacy cbuffer don't across 16 bytes register.");
+  DXASSERT((is16 && channelOffset + vecSize <= 8) ||
+               (channelOffset + vecSize) <= 4,
+           "legacy cbuffer don't across 16 bytes register.");
   if (isNormal) {
   if (isNormal) {
     Function *CBLoad = hlslOP->GetOpFunc(OP::OpCode::CBufferLoadLegacy, EltTy);
     Function *CBLoad = hlslOP->GetOpFunc(OP::OpCode::CBufferLoadLegacy, EltTy);
     Value *loadLegacy = Builder.CreateCall(CBLoad, {OpArg, handle, legacyIdx});
     Value *loadLegacy = Builder.CreateCall(CBLoad, {OpArg, handle, legacyIdx});
@@ -4964,8 +4971,6 @@ Value *GenerateCBLoadLegacy(Value *handle, Value *legacyIdx,
     Function *CBLoad = hlslOP->GetOpFunc(OP::OpCode::CBufferLoadLegacy, EltTy);
     Function *CBLoad = hlslOP->GetOpFunc(OP::OpCode::CBufferLoadLegacy, EltTy);
     Value *loadLegacy = Builder.CreateCall(CBLoad, {OpArg, handle, legacyIdx});
     Value *loadLegacy = Builder.CreateCall(CBLoad, {OpArg, handle, legacyIdx});
     Value *Result = UndefValue::get(VectorType::get(EltTy, vecSize));
     Value *Result = UndefValue::get(VectorType::get(EltTy, vecSize));
-    // index aligned by 2 bytes not 4 bytes
-    channelOffset *= 2;
     for (unsigned i = 0; i < vecSize; ++i) {
     for (unsigned i = 0; i < vecSize; ++i) {
       Value *NewElt = Builder.CreateExtractValue(loadLegacy, channelOffset + i);
       Value *NewElt = Builder.CreateExtractValue(loadLegacy, channelOffset + i);
       Result = Builder.CreateInsertElement(Result, NewElt, i);
       Result = Builder.CreateInsertElement(Result, NewElt, i);
@@ -5353,10 +5358,22 @@ void TranslateCBGepLegacy(GetElementPtrInst *GEP, Value *handle,
       StructType *ST = cast<StructType>(*GEPIt);
       StructType *ST = cast<StructType>(*GEPIt);
       DxilStructAnnotation *annotation = dxilTypeSys.GetStructAnnotation(ST);
       DxilStructAnnotation *annotation = dxilTypeSys.GetStructAnnotation(ST);
       fieldAnnotation = &annotation->GetFieldAnnotation(immIdx);
       fieldAnnotation = &annotation->GetFieldAnnotation(immIdx);
-      unsigned structOffset = fieldAnnotation->GetCBufferOffset() >>2;
-      channel += structOffset;
-      unsigned idxInc = channel >> 2;
-      channel = channel & 3;
+
+      unsigned idxInc = 0;
+      unsigned structOffset = 0;
+      if (fieldAnnotation->GetCompType().Is16Bit() &&
+          !hlslOP->UseMinPrecision()) {
+        structOffset = fieldAnnotation->GetCBufferOffset() >> 1;
+        channel += structOffset;
+        idxInc = channel >> 3;
+        channel = channel & 0x7;
+      }
+      else {
+        structOffset = fieldAnnotation->GetCBufferOffset() >> 2;
+        channel += structOffset;
+        idxInc = channel >> 2;
+        channel = channel & 0x3;
+      }
       if (idxInc) 
       if (idxInc) 
         legacyIndex = Builder.CreateAdd(legacyIndex, hlslOP->GetU32Const(idxInc));
         legacyIndex = Builder.CreateAdd(legacyIndex, hlslOP->GetU32Const(idxInc));
     } else if (GEPIt->isArrayTy()) {
     } else if (GEPIt->isArrayTy()) {

+ 3 - 1
tools/clang/include/clang/AST/HlslTypes.h

@@ -64,12 +64,14 @@ enum HLSLScalarType {
   HLSLScalarType_int_lit,
   HLSLScalarType_int_lit,
   HLSLScalarType_int64,
   HLSLScalarType_int64,
   HLSLScalarType_uint64,
   HLSLScalarType_uint64,
+  HLSLScalarType_int16,
+  HLSLScalarType_uint16
 };
 };
 
 
 HLSLScalarType MakeUnsigned(HLSLScalarType T);
 HLSLScalarType MakeUnsigned(HLSLScalarType T);
 
 
 static const HLSLScalarType HLSLScalarType_minvalid = HLSLScalarType_bool;
 static const HLSLScalarType HLSLScalarType_minvalid = HLSLScalarType_bool;
-static const HLSLScalarType HLSLScalarType_max = HLSLScalarType_uint64;
+static const HLSLScalarType HLSLScalarType_max = HLSLScalarType_uint16;
 static const size_t HLSLScalarTypeCount = static_cast<size_t>(HLSLScalarType_max) + 1;
 static const size_t HLSLScalarTypeCount = static_cast<size_t>(HLSLScalarType_max) + 1;
 
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

+ 24 - 8
tools/clang/lib/AST/ASTContextHLSL.cpp

@@ -68,6 +68,8 @@ const char* HLSLScalarTypeNames[] = {
   "literal float",
   "literal float",
   "int64_t",
   "int64_t",
   "uint64_t",
   "uint64_t",
+  "int16_t",
+  "uint16_t"
 };
 };
 
 
 static_assert(HLSLScalarTypeCount == _countof(HLSLScalarTypeNames), "otherwise scalar constants are not aligned");
 static_assert(HLSLScalarTypeCount == _countof(HLSLScalarTypeNames), "otherwise scalar constants are not aligned");
@@ -118,14 +120,21 @@ static HLSLScalarType FindScalarTypeByName(const char *typeName, const size_t ty
         return HLSLScalarType_double;
         return HLSLScalarType_double;
       }
       }
       break;
       break;
-    case 7: // int64_t
+    case 7: // int64_t, int16_t
       if (typeName[0] == 'i' && typeName[1] == 'n') {
       if (typeName[0] == 'i' && typeName[1] == 'n') {
-        if (strncmp(typeName, "int64_t", 7))
-          break;
-        return HLSLScalarType_int64;
+        if (typeName[3] == '6') {
+          if (strncmp(typeName, "int64_t", 7))
+            break;
+          return HLSLScalarType_int64;
+        }
+        else if (typeName[3] == '1') {
+          if (strncmp(typeName, "int16_t", 7))
+            break;
+          return HLSLScalarType_int16;
+        }
       }
       }
       break;
       break;
-    case 8: // min12int, min16int, uint64_t
+    case 8: // min12int, min16int, uint64_t, uint16_t
       if (typeName[0] == 'm' && typeName[1] == 'i') {
       if (typeName[0] == 'm' && typeName[1] == 'i') {
         if (typeName[4] == '2') {
         if (typeName[4] == '2') {
           if (strncmp(typeName, "min12int", 8))
           if (strncmp(typeName, "min12int", 8))
@@ -139,9 +148,16 @@ static HLSLScalarType FindScalarTypeByName(const char *typeName, const size_t ty
         }
         }
       }
       }
       if (typeName[0] == 'u' && typeName[1] == 'i') {
       if (typeName[0] == 'u' && typeName[1] == 'i') {
-        if (strncmp(typeName, "uint64_t", 8))
-          break;
-        return HLSLScalarType_uint64;
+        if (typeName[4] == '6') {
+          if (strncmp(typeName, "uint64_t", 7))
+            break;
+          return HLSLScalarType_uint64;
+        }
+        else if (typeName[4] == '1') {
+          if (strncmp(typeName, "uint16_t", 7))
+            break;
+          return HLSLScalarType_uint16;
+        }
       }
       }
       break;
       break;
     case 9: // min16uint
     case 9: // min16uint

+ 2 - 0
tools/clang/lib/AST/HlslTypes.cpp

@@ -500,6 +500,8 @@ HLSLScalarType MakeUnsigned(HLSLScalarType T) {
         return HLSLScalarType_uint_min16;
         return HLSLScalarType_uint_min16;
     case HLSLScalarType_int64:
     case HLSLScalarType_int64:
         return HLSLScalarType_uint64;
         return HLSLScalarType_uint64;
+    case HLSLScalarType_int16:
+        return HLSLScalarType_uint16;
     }
     }
     return T;
     return T;
 }
 }

+ 3 - 1
tools/clang/lib/CodeGen/CGHLSLMS.cpp

@@ -568,7 +568,9 @@ static unsigned AlignBaseOffset(unsigned baseOffset, unsigned size,
     if (BT->getKind() == clang::BuiltinType::Kind::Double ||
     if (BT->getKind() == clang::BuiltinType::Kind::Double ||
       BT->getKind() == clang::BuiltinType::Kind::LongLong)
       BT->getKind() == clang::BuiltinType::Kind::LongLong)
       scalarSizeInBytes = 8;
       scalarSizeInBytes = 8;
-    else if (BT->getKind() == clang::BuiltinType::Kind::Half)
+    else if (BT->getKind() == clang::BuiltinType::Kind::Half ||
+      BT->getKind() == clang::BuiltinType::Kind::Short ||
+      BT->getKind() == clang::BuiltinType::Kind::UShort)
       scalarSizeInBytes = 2;
       scalarSizeInBytes = 2;
   }
   }
 
 

+ 13 - 14
tools/clang/lib/Sema/SemaHLSL.cpp

@@ -3059,12 +3059,10 @@ public:
         m_sema->Diag(loc, diag::warn_hlsl_sema_minprecision_promotion) << "min16float" << "half";
         m_sema->Diag(loc, diag::warn_hlsl_sema_minprecision_promotion) << "min16float" << "half";
       }
       }
       else if (type == HLSLScalarType_int_min16) {
       else if (type == HLSLScalarType_int_min16) {
-        // TODO: change promotion to short once we support int16
-        m_sema->Diag(loc, diag::warn_hlsl_sema_minprecision_promotion) << "min16int" << "int";
+        m_sema->Diag(loc, diag::warn_hlsl_sema_minprecision_promotion) << "min16int" << "int16_t";
       }
       }
       else if (type == HLSLScalarType_uint_min16) {
       else if (type == HLSLScalarType_uint_min16) {
-        // TODO: change promotion to unsigned short once we support int16
-        m_sema->Diag(loc, diag::warn_hlsl_sema_minprecision_promotion) << "min16uint" << "uint";
+        m_sema->Diag(loc, diag::warn_hlsl_sema_minprecision_promotion) << "min16uint" << "uint16_t";
       }
       }
     }
     }
   }
   }
@@ -3297,8 +3295,8 @@ public:
       case BuiltinType::Half: return m_context->getLangOpts().UseMinPrecision ? AR_BASIC_MIN16FLOAT : AR_BASIC_FLOAT16;
       case BuiltinType::Half: return m_context->getLangOpts().UseMinPrecision ? AR_BASIC_MIN16FLOAT : AR_BASIC_FLOAT16;
       case BuiltinType::Int: return AR_BASIC_INT32;
       case BuiltinType::Int: return AR_BASIC_INT32;
       case BuiltinType::UInt: return AR_BASIC_UINT32;
       case BuiltinType::UInt: return AR_BASIC_UINT32;
-      case BuiltinType::Short: return AR_BASIC_MIN16INT;    // rather than AR_BASIC_INT16
-      case BuiltinType::UShort: return AR_BASIC_MIN16UINT;  // rather than AR_BASIC_UINT16
+      case BuiltinType::Short: return m_context->getLangOpts().UseMinPrecision ? AR_BASIC_MIN16INT : AR_BASIC_INT16;
+      case BuiltinType::UShort: return m_context->getLangOpts().UseMinPrecision ? AR_BASIC_MIN16UINT : AR_BASIC_UINT16;
       case BuiltinType::Long: return AR_BASIC_INT32;
       case BuiltinType::Long: return AR_BASIC_INT32;
       case BuiltinType::ULong: return AR_BASIC_UINT32;
       case BuiltinType::ULong: return AR_BASIC_UINT32;
       case BuiltinType::LongLong: return AR_BASIC_INT64;
       case BuiltinType::LongLong: return AR_BASIC_INT64;
@@ -3376,8 +3374,8 @@ public:
     case AR_BASIC_LITERAL_INT:    return HLSLScalarType_int_lit;
     case AR_BASIC_LITERAL_INT:    return HLSLScalarType_int_lit;
     case AR_BASIC_INT8:           return HLSLScalarType_int;
     case AR_BASIC_INT8:           return HLSLScalarType_int;
     case AR_BASIC_UINT8:          return HLSLScalarType_uint;
     case AR_BASIC_UINT8:          return HLSLScalarType_uint;
-    case AR_BASIC_INT16:          return HLSLScalarType_uint;
-    case AR_BASIC_UINT16:         return HLSLScalarType_uint;
+    case AR_BASIC_INT16:          return HLSLScalarType_int16;
+    case AR_BASIC_UINT16:         return HLSLScalarType_uint16;
     case AR_BASIC_INT32:          return HLSLScalarType_int;
     case AR_BASIC_INT32:          return HLSLScalarType_int;
     case AR_BASIC_UINT32:         return HLSLScalarType_uint;
     case AR_BASIC_UINT32:         return HLSLScalarType_uint;
     case AR_BASIC_MIN10FLOAT:     return HLSLScalarType_float_min10;
     case AR_BASIC_MIN10FLOAT:     return HLSLScalarType_float_min10;
@@ -3408,8 +3406,8 @@ public:
     case AR_BASIC_LITERAL_INT:    return m_context->LitIntTy;
     case AR_BASIC_LITERAL_INT:    return m_context->LitIntTy;
     case AR_BASIC_INT8:           return m_context->IntTy;
     case AR_BASIC_INT8:           return m_context->IntTy;
     case AR_BASIC_UINT8:          return m_context->UnsignedIntTy;
     case AR_BASIC_UINT8:          return m_context->UnsignedIntTy;
-    case AR_BASIC_INT16:          return m_context->IntTy;
-    case AR_BASIC_UINT16:         return m_context->UnsignedIntTy;
+    case AR_BASIC_INT16:          return m_context->ShortTy;
+    case AR_BASIC_UINT16:         return m_context->UnsignedShortTy;
     case AR_BASIC_INT32:          return m_context->IntTy;
     case AR_BASIC_INT32:          return m_context->IntTy;
     case AR_BASIC_UINT32:         return m_context->UnsignedIntTy;
     case AR_BASIC_UINT32:         return m_context->UnsignedIntTy;
     case AR_BASIC_INT64:          return m_context->LongLongTy;
     case AR_BASIC_INT64:          return m_context->LongLongTy;
@@ -4454,14 +4452,15 @@ void HLSLExternalSource::AddBaseTypes()
   m_baseTypes[HLSLScalarType_double] = m_context->DoubleTy;
   m_baseTypes[HLSLScalarType_double] = m_context->DoubleTy;
   m_baseTypes[HLSLScalarType_float_min10] = m_context->HalfTy;
   m_baseTypes[HLSLScalarType_float_min10] = m_context->HalfTy;
   m_baseTypes[HLSLScalarType_float_min16] = m_context->HalfTy;
   m_baseTypes[HLSLScalarType_float_min16] = m_context->HalfTy;
-   // TODO: Change promotion to other type once we introduce int16
-  m_baseTypes[HLSLScalarType_int_min12] = m_context->getLangOpts().UseMinPrecision ? m_context->ShortTy : m_context->IntTy;
-  m_baseTypes[HLSLScalarType_int_min16] = m_context->getLangOpts().UseMinPrecision ? m_context->ShortTy : m_context->IntTy;
-  m_baseTypes[HLSLScalarType_uint_min16] = m_context->getLangOpts().UseMinPrecision ? m_context->UnsignedShortTy : m_context->UnsignedIntTy;
+  m_baseTypes[HLSLScalarType_int_min12] = m_context->ShortTy;
+  m_baseTypes[HLSLScalarType_int_min16] = m_context->ShortTy;
+  m_baseTypes[HLSLScalarType_uint_min16] = m_context->UnsignedShortTy;
   m_baseTypes[HLSLScalarType_float_lit] = m_context->LitFloatTy;
   m_baseTypes[HLSLScalarType_float_lit] = m_context->LitFloatTy;
   m_baseTypes[HLSLScalarType_int_lit] = m_context->LitIntTy;
   m_baseTypes[HLSLScalarType_int_lit] = m_context->LitIntTy;
   m_baseTypes[HLSLScalarType_int64] = m_context->LongLongTy;
   m_baseTypes[HLSLScalarType_int64] = m_context->LongLongTy;
   m_baseTypes[HLSLScalarType_uint64] = m_context->UnsignedLongLongTy;
   m_baseTypes[HLSLScalarType_uint64] = m_context->UnsignedLongLongTy;
+  m_baseTypes[HLSLScalarType_int16] = m_context->ShortTy;
+  m_baseTypes[HLSLScalarType_uint16] = m_context->UnsignedShortTy;
 }
 }
 
 
 void HLSLExternalSource::AddHLSLScalarTypes()
 void HLSLExternalSource::AddHLSLScalarTypes()

+ 17 - 0
tools/clang/test/CodeGenHLSL/cbuffer64Types.hlsl

@@ -0,0 +1,17 @@
+// RUN: %dxc -E main -T ps_6_2 %s | FileCheck %s
+
+// CHECK: %dx.types.CBufRet.f64 = type { double, double }
+// CHECK: %dx.types.CBufRet.i64 = type { i64, i64 }
+// CHECK: call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %Foo_buffer, i32 0)
+// CHECK: call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %Foo_buffer, i32 1)
+// CHECK: call %dx.types.CBufRet.i64 @dx.op.cbufferLoadLegacy.i64(i32 59, %dx.types.Handle %Foo_buffer, i32 2)
+// CHECK: call %dx.types.CBufRet.i64 @dx.op.cbufferLoadLegacy.i64(i32 59, %dx.types.Handle %Foo_buffer, i32 3)
+
+cbuffer Foo {
+  double4 d;
+  int64_t4 i;
+}
+
+float4 main() : SV_Target {
+  return d + i;
+}

+ 144 - 73
tools/clang/test/CodeGenHLSL/cbufferHalf-struct.hlsl

@@ -23,62 +23,6 @@
 
 
 // CHECK:   } f                                             ; Offset:    0 Size:    96
 // CHECK:   } f                                             ; Offset:    0 Size:    96
 
 
-// CHECK:   struct struct.Bar
-// CHECK:   {
-// CHECK:       half h1;                                    ; Offset:    0
-// CHECK:       half h2;                                    ; Offset:    2
-// CHECK:       half h3;                                    ; Offset:    4
-// CHECK:       half2 h4;                                   ; Offset:    6
-// CHECK:       half3 h5;                                   ; Offset:   10
-
-// CHECK:       half3 h7;                                   ; Offset:   16
-// CHECK:       half4 h8;                                   ; Offset:   22
-// CHECK:       half h9;                                    ; Offset:   30
-
-// CHECK:       half4 h10;                                  ; Offset:   32
-// CHECK:       half3 h11;                                  ; Offset:   40
-
-// CHECK:       half2 h12;                                  ; Offset:   48
-// CHECK:       half3 h13;                                  ; Offset:   52
-// CHECK:       half2 h14;                                  ; Offset:   58
-// CHECK:   } b                                             ; Offset:    0 Size:    62
-
-// CHECK: %dx.types.CBufRet.f16.8 = type { half, half, half, half, half, half, half, half }
-
-// CHECK: %f_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 0, i1 false)  ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %f_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %f_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 1
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %f_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %f_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 3
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %f_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %f_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 7
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %f_buffer, i32 3)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %f_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %f_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %f_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %f_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 1
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %b_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
-
 struct Foo {
 struct Foo {
   half h1;
   half h1;
   float3 f3;
   float3 f3;
@@ -94,35 +38,162 @@ struct Foo {
 
 
   double d1;
   double d1;
   half3 h3_1;
   half3 h3_1;
-  
-  int   i1;
+
+  int i1;
   double d2;
   double d2;
 };
 };
 
 
+
+// CHECK:   struct struct.Bar
+// CHECK:   {
+// CHECK:       half h1;                                    ; Offset:    0
+// CHECK:       half h2;                                    ; Offset:    2
+// CHECK:       half h3;                                    ; Offset:    4
+// CHECK:       half2 h4;                                   ; Offset:    6
+// CHECK:       half3 h5;                                   ; Offset:   10
+
+// CHECK:       half3 h6;                                   ; Offset:   16
+// CHECK:       half4 h7;                                   ; Offset:   22
+// CHECK:       half h8;                                    ; Offset:   30
+
+// CHECK:       half4 h9;                                   ; Offset:   32
+// CHECK:       half3 h10;                                  ; Offset:   40
+
+// CHECK:       half2 h11;                                  ; Offset:   48
+// CHECK:       half3 h12;                                  ; Offset:   52
+// CHECK:       half2 h13;                                  ; Offset:   58
+
+
+// CHECK:       half h14;                                   ; Offset:   62
+// CHECK:       half h16;                                   ; Offset:   64
+// CHECK:       half h17;                                   ; Offset:   66
+// CHECK:       half h18;                                   ; Offset:   68
+// CHECK:       half h19;                                   ; Offset:   70
+// CHECK:       half h20;                                   ; Offset:   72
+// CHECK:       half h21;                                   ; Offset:   74
+// CHECK:       half h22;                                   ; Offset:   76
+// CHECK:       half h23;                                   ; Offset:   78
+
+// CHECK:   } b                                             ; Offset:    0 Size:    80
+
 struct Bar {
 struct Bar {
   half h1;
   half h1;
   half h2;
   half h2;
   half h3;
   half h3;
   half2 h4;
   half2 h4;
   half3 h5;
   half3 h5;
-  
-  half3 h7;
-  half4 h8;
-  half h9;
-
-  half4 h10;
-  half3 h11;
-  
-  half2 h12;
-  half3 h13;
-  half2 h14;
+
+  half3 h6;
+  half4 h7;
+  half h8;
+
+  half4 h9;
+  half3 h10;
+
+  half2 h11;
+  half3 h12;
+  half2 h13;
+  half  h14;
+
+  half h16;
+  half h17;
+  half h18;
+  half h19;
+  half h20;
+  half h21;
+  half h22;
+  half h23;
+
 };
 };
 
 
 ConstantBuffer<Foo> f : register(b0);
 ConstantBuffer<Foo> f : register(b0);
 ConstantBuffer<Bar> b : register(b1);
 ConstantBuffer<Bar> b : register(b1);
 
 
-float4 main() : SV_Target {
-  return f.h1 + f.f3.x + f.h2.x + f.h2.y + f.f3_1.z + f.f2.x + f.h4.x + f.h4.y 
-  + f.h4.z + f.h4.w + f.h2_1.x + f.h2_1.y + f.h3.x + f.h3.y + f.h3.z + f.d1 + f.h3_1.x + f.i1 + f.d2
-  + b.h1;
+// CHECK: %dx.types.CBufRet.f16.8 = type { half, half, half, half, half, half, half, half }
+
+
+float4 main() : SV_Target  {
+  return f.h1 + f.f3.x
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %f_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %f_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 1
+  + f.h2.x + f.h2.y + f.f3_1.z
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %f_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %f_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 3
+  + f.f2.x + f.h4.x + f.h4.y + f.h4.z + f.h4.w
+  // CHECK: call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %f_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %f_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 7
+  + f.h2_1.x + f.h2_1.y + f.h3.x + f.h3.y + f.h3.z
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %f_buffer, i32 3)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  + f.d1 + f.h3_1.x
+  // CHECK: call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %f_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %f_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  + f.i1 + f.d2
+  // CHECK: call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %f_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %f_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 1
+  + b.h1 + b.h2 + b.h3 + b.h4.x + b.h5.y + b.h5.x + b.h5.y + b.h5.z +
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %b_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 7
+  + b.h6.x + b.h6.y + b.h6.z + b.h7.x + b.h7.y + b.h7.z + b.h7.w + b.h8
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %b_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 7
+  + b.h9.x + b.h9.y + b.h9.z + b.h9.w + b.h10.x + b.h10.y + b.h10.z
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %b_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  + b.h11.x + b.h11.y + b.h12.x + b.h12.y + b.h12.z + b.h13.x + b.h13.y + b.h14
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %b_buffer, i32 3)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  + b.h16 + b.h17 + b.h18 + b.h19 + b.h20 + b.h21 + b.h22 + b.h23;
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %b_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 7
 }
 }

+ 147 - 73
tools/clang/test/CodeGenHLSL/cbufferHalf.hlsl

@@ -25,6 +25,26 @@
 // CHECK:   } Foo                                             ; Offset:    0 Size:    96
 // CHECK:   } Foo                                             ; Offset:    0 Size:    96
 // CHECK: }
 // CHECK: }
 
 
+cbuffer Foo {
+  half f_h1;
+  float3 f_f3;
+
+  half2 f_h2;
+  float3 f_f3_1;
+
+  float2 f_f2;
+  half4 f_h4;
+
+  half2 f_h2_1;
+  half3 f_h3;
+
+  double f_d1;
+  half3 f_h3_1;
+
+  int    f_i1;
+  double f_d2;
+}
+
 // CHECK: cbuffer Bar
 // CHECK: cbuffer Bar
 // CHECK: {
 // CHECK: {
 // CHECK:   struct Bar
 // CHECK:   struct Bar
@@ -35,69 +55,30 @@
 // CHECK:       half2 b_h4;                                   ; Offset:    6
 // CHECK:       half2 b_h4;                                   ; Offset:    6
 // CHECK:       half3 b_h5;                                   ; Offset:   10
 // CHECK:       half3 b_h5;                                   ; Offset:   10
 
 
-// CHECK:       half3 b_h7;                                   ; Offset:   16
-// CHECK:       half4 b_h8;                                   ; Offset:   22
-// CHECK:       half b_h9;                                    ; Offset:   30
+// CHECK:       half3 b_h6;                                   ; Offset:   16
+// CHECK:       half4 b_h7;                                   ; Offset:   22
+// CHECK:       half b_h8;                                    ; Offset:   30
 
 
-// CHECK:       half4 b_h10;                                  ; Offset:   32
-// CHECK:       half3 b_h11;                                  ; Offset:   40
+// CHECK:       half4 b_h9;                                   ; Offset:   32
+// CHECK:       half3 b_h10;                                  ; Offset:   40
 
 
-// CHECK:       half2 b_h12;                                  ; Offset:   48
-// CHECK:       half3 b_h13;                                  ; Offset:   52
-// CHECK:       half2 b_h14;                                  ; Offset:   58
-// CHECK:   } Bar                                             ; Offset:    0 Size:    62
-// CHECK: }
+// CHECK:       half2 b_h11;                                  ; Offset:   48
+// CHECK:       half3 b_h12;                                  ; Offset:   52
+// CHECK:       half2 b_h13;                                  ; Offset:   58
 
 
-// CHECK: %dx.types.CBufRet.f16.8 = type { half, half, half, half, half, half, half, half }
 
 
-// CHECK: %Foo_buffer = call %dx.types.Handle @dx.op.createHandle(i32 57, i8 2, i32 0, i32 0, i1 false)  ; CreateHandle(resourceClass,rangeId,index,nonUniformIndex)
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Foo_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %Foo_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 1
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Foo_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %Foo_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 3
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %Foo_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Foo_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 7
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Foo_buffer, i32 3)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %Foo_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Foo_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %Foo_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 0
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %Foo_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 1
-// CHECK: {{%[0-9]+}} = call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Bar_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
-// CHECK: {{%[0-9]+}} = extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+// CHECK:       half b_h14;                                   ; Offset:   62
+// CHECK:       half b_h16;                                   ; Offset:   64
+// CHECK:       half b_h17;                                   ; Offset:   66
+// CHECK:       half b_h18;                                   ; Offset:   68
+// CHECK:       half b_h19;                                   ; Offset:   70
+// CHECK:       half b_h20;                                   ; Offset:   72
+// CHECK:       half b_h21;                                   ; Offset:   74
+// CHECK:       half b_h22;                                   ; Offset:   76
+// CHECK:       half b_h23;                                   ; Offset:   78
 
 
-cbuffer Foo {
-  half f_h1;
-  float3 f_f3;
-  half2 f_h2;
-  float3 f_f3_1;
-  float2 f_f2;
-  half4 f_h4;
-  half2 f_h2_1;
-  half3 f_h3;
-  double f_d1;
-  half3 f_h3_1;
-  int   f_i1;
-  double f_d2;
-}
+// CHECK:   } Bar                                             ; Offset:    0 Size:    80
+// CHECK: }
 
 
 cbuffer Bar {
 cbuffer Bar {
   half b_h1;
   half b_h1;
@@ -105,21 +86,114 @@ cbuffer Bar {
   half b_h3;
   half b_h3;
   half2 b_h4;
   half2 b_h4;
   half3 b_h5;
   half3 b_h5;
-  
-  half3 b_h7;
-  half4 b_h8;
-  half b_h9;
-
-  half4 b_h10;
-  half3 b_h11;
-  
-  half2 b_h12;
-  half3 b_h13;
-  half2 b_h14;
+
+  half3 b_h6;
+  half4 b_h7;
+  half b_h8;
+
+  half4 b_h9;
+  half3 b_h10;
+
+  half2 b_h11;
+  half3 b_h12;
+  half2 b_h13;
+  half  b_h14;
+
+  half b_h16;
+  half b_h17;
+  half b_h18;
+  half b_h19;
+  half b_h20;
+  half b_h21;
+  half b_h22;
+  half b_h23;
+
 }
 }
 
 
-float4 main() : SV_Target {
-  return f_h1 + f_f3.x + f_h2.x + f_h2.y + f_f3_1.z + f_f2.x + f_h4.x + f_h4.y 
-  + f_h4.z + f_h4.w + f_h2_1.x + f_h2_1.y + f_h3.x + f_h3.y + f_h3.z + f_d1 + f_h3_1.x + f_i1 + f_d2
-  + b_h1;
+// CHECK: %dx.types.CBufRet.f16.8 = type { half, half, half, half, half, half, half, half }
+
+float4 main() : SV_Target  {
+  return f_h1 + f_f3.x
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Foo_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %Foo_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 1
+  + f_h2.x + f_h2.y + f_f3_1.z
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Foo_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %Foo_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 3
+  + f_f2.x + f_h4.x + f_h4.y + f_h4.z + f_h4.w
+  // CHECK: call %dx.types.CBufRet.f32 @dx.op.cbufferLoadLegacy.f32(i32 59, %dx.types.Handle %Foo_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f32 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Foo_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 7
+  + f_h2_1.x + f_h2_1.y + f_h3.x + f_h3.y + f_h3.z
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Foo_buffer, i32 3)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  + f_d1 + f_h3_1.x
+  // CHECK: call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %Foo_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Foo_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  + f_i1 + f_d2
+  // CHECK: call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %Foo_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %Foo_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 1
+  + b_h1 + b_h2 + b_h3 + b_h4.x + b_h5.y + b_h5.x + b_h5.y + b_h5.z +
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Bar_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 7
+  + b_h6.x + b_h6.y + b_h6.z + b_h7.x + b_h7.y + b_h7.z + b_h7.w + b_h8
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Bar_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 7
+  + b_h9.x + b_h9.y + b_h9.z + b_h9.w + b_h10.x + b_h10.y + b_h10.z
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Bar_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  + b_h11.x + b_h11.y + b_h12.x + b_h12.y + b_h12.z + b_h13.x + b_h13.y + b_h14
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Bar_buffer, i32 3)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  + b_h16 + b_h17 + b_h18 + b_h19 + b_h20 + b_h21 + b_h22 + b_h23;
+  // CHECK: call %dx.types.CBufRet.f16.8 @dx.op.cbufferLoadLegacy.f16(i32 59, %dx.types.Handle %Bar_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.f16.8 {{%[0-9]+}}, 7
 }
 }

+ 198 - 0
tools/clang/test/CodeGenHLSL/cbufferInt16-struct.hlsl

@@ -0,0 +1,198 @@
+// RUN: %dxc -E main -T ps_6_2 -no-min-precision %s | FileCheck %s
+
+// CHECK: Use native low precision
+// CHECK:   struct struct.Foo
+// CHECK:   {
+// CHECK:       int16_t h1;                               ; Offset:    0
+// CHECK:       int3 f3;                                  ; Offset:    4
+
+// CHECK:       int16_t2 h2;                              ; Offset:   16
+// CHECK:       int3 f3_1;                                ; Offset:   20
+
+// CHECK:       int2 f2;                                  ; Offset:   32
+// CHECK:       int16_t4 h4;                              ; Offset:   40
+
+// CHECK:       int16_t2 h2_1;                            ; Offset:   48
+// CHECK:       int16_t3 h3;                              ; Offset:   52
+
+// CHECK:       double d1;                                ; Offset:   64
+// CHECK:       int16_t3 h3_1;                            ; Offset:   72
+
+// CHECK:       int i1;                                   ; Offset:   80
+// CHECK:       double d2;                                ; Offset:   88
+
+// CHECK:   } f                                           ; Offset:    0 Size:    96
+
+struct Foo {
+  int16_t h1;
+  int3 f3;
+
+  int16_t2 h2;
+  int3 f3_1;
+
+  int2 f2;
+  int16_t4 h4;
+
+  int16_t2 h2_1;
+  int16_t3 h3;
+
+  double d1;
+  int16_t3 h3_1;
+
+  int    i1;
+  double d2;
+};
+
+
+// CHECK:   struct struct.Bar
+// CHECK:   {
+// CHECK:       int16_t h1;                                    ; Offset:    0
+// CHECK:       uint16_t h2;                                   ; Offset:    2
+// CHECK:       int16_t h3;                                    ; Offset:    4
+// CHECK:       uint16_t2 h4;                                  ; Offset:    6
+// CHECK:       int16_t3 h5;                                   ; Offset:   10
+
+// CHECK:       uint16_t3 h6;                                  ; Offset:   16
+// CHECK:       int16_t4 h7;                                   ; Offset:   22
+// CHECK:       int16_t h8;                                    ; Offset:   30
+
+// CHECK:       uint16_t4 h9;                                  ; Offset:   32
+// CHECK:       int16_t3 h10;                                  ; Offset:   40
+
+// CHECK:       uint16_t2 h11;                                 ; Offset:   48
+// CHECK:       int16_t3 h12;                                  ; Offset:   52
+// CHECK:       int16_t2 h13;                                  ; Offset:   58
+
+
+// CHECK:       uint16_t h14;                                  ; Offset:   62
+// CHECK:       int16_t h16;                                   ; Offset:   64
+// CHECK:       int16_t h17;                                   ; Offset:   66
+// CHECK:       uint16_t h18;                                  ; Offset:   68
+// CHECK:       int16_t h19;                                   ; Offset:   70
+// CHECK:       int16_t h20;                                   ; Offset:   72
+// CHECK:       int16_t h21;                                   ; Offset:   74
+// CHECK:       uint16_t h22;                                  ; Offset:   76
+// CHECK:       int16_t h23;                                   ; Offset:   78
+
+// CHECK:   } b                                             ; Offset:    0 Size:    80
+
+struct Bar {
+  int16_t h1;
+  uint16_t h2;
+  int16_t h3;
+  uint16_t2 h4;
+  int16_t3 h5;
+
+  uint16_t3 h6;
+  int16_t4 h7;
+  int16_t h8;
+
+  uint16_t4 h9;
+  int16_t3 h10;
+
+  uint16_t2 h11;
+  int16_t3 h12;
+  int16_t2 h13;
+  uint16_t  h14;
+
+  int16_t h16;
+  int16_t h17;
+  uint16_t h18;
+  int16_t h19;
+  int16_t h20;
+  int16_t h21;
+  uint16_t h22;
+  int16_t h23;
+
+};
+
+ConstantBuffer<Foo> f : register(b0);
+ConstantBuffer<Bar> b : register(b1);
+
+// CHECK: %dx.types.CBufRet.i16.8 = type { i16, i16, i16, i16, i16, i16, i16, i16 }
+
+int4 main() : SV_Target  {
+  return f.h1 + f.f3.x
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %f_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %f_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 1
+  + f.h2.x + f.h2.y + f.f3_1.z
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %f_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %f_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 3
+  + f.f2.x + f.h4.x + f.h4.y + f.h4.z + f.h4.w
+  // CHECK: call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %f_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %f_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 7
+  + f.h2_1.x + f.h2_1.y + f.h3.x + f.h3.y + f.h3.z
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %f_buffer, i32 3)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  + f.d1 + f.h3_1.x
+  // CHECK: call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %f_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %f_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  + f.i1 + f.d2
+  // CHECK: call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %f_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %f_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 1
+  + b.h1 + b.h2 + b.h3 + b.h4.x + b.h5.y + b.h5.x + b.h5.y + b.h5.z +
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %b_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 7
+  + b.h6.x + b.h6.y + b.h6.z + b.h7.x + b.h7.y + b.h7.z + b.h7.w + b.h8
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %b_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 7
+  + b.h9.x + b.h9.y + b.h9.z + b.h9.w + b.h10.x + b.h10.y + b.h10.z
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %b_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  + b.h11.x + b.h11.y + b.h12.x + b.h12.y + b.h12.z + b.h13.x + b.h13.y + b.h14
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %b_buffer, i32 3)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  + b.h16 + b.h17 + b.h18 + b.h19 + b.h20 + b.h21 + b.h22 + b.h23;
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %b_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 7
+}

+ 197 - 0
tools/clang/test/CodeGenHLSL/cbufferInt16.hlsl

@@ -0,0 +1,197 @@
+// RUN: %dxc -E main -T ps_6_2 -no-min-precision %s | FileCheck %s
+
+// CHECK: Use native low precision
+// CHECK: cbuffer Foo
+// CHECK: {
+// CHECK:   struct Foo
+// CHECK:   {
+// CHECK:       int16_t f_h1;                               ; Offset:    0
+// CHECK:       int3 f_f3;                                  ; Offset:    4
+
+// CHECK:       int16_t2 f_h2;                              ; Offset:   16
+// CHECK:       int3 f_f3_1;                                ; Offset:   20
+
+// CHECK:       int2 f_f2;                                  ; Offset:   32
+// CHECK:       int16_t4 f_h4;                              ; Offset:   40
+
+// CHECK:       int16_t2 f_h2_1;                            ; Offset:   48
+// CHECK:       int16_t3 f_h3;                              ; Offset:   52
+
+// CHECK:       double f_d1;                                ; Offset:   64
+// CHECK:       int16_t3 f_h3_1;                            ; Offset:   72
+
+// CHECK:       int f_i1;                                   ; Offset:   80
+// CHECK:       double f_d2;                                ; Offset:   88
+// CHECK:   } Foo                                           ; Offset:    0 Size:    96
+// CHECK: }
+
+cbuffer Foo {
+  int16_t f_h1;
+  int3 f_f3;
+
+  int16_t2 f_h2;
+  int3 f_f3_1;
+
+  int2 f_f2;
+  int16_t4 f_h4;
+
+  int16_t2 f_h2_1;
+  int16_t3 f_h3;
+
+  double f_d1;
+  int16_t3 f_h3_1;
+
+  int   f_i1;
+  double f_d2;
+}
+
+// CHECK: cbuffer Bar
+// CHECK: {
+// CHECK:   struct Bar
+// CHECK:   {
+// CHECK:       int16_t b_h1;                                    ; Offset:    0
+// CHECK:       int16_t b_h2;                                    ; Offset:    2
+// CHECK:       int16_t b_h3;                                    ; Offset:    4
+// CHECK:       int16_t2 b_h4;                                   ; Offset:    6
+// CHECK:       int16_t3 b_h5;                                   ; Offset:   10
+
+// CHECK:       int16_t3 b_h6;                                   ; Offset:   16
+// CHECK:       int16_t4 b_h7;                                   ; Offset:   22
+// CHECK:       int16_t b_h8;                                    ; Offset:   30
+
+// CHECK:       int16_t4 b_h9;                                   ; Offset:   32
+// CHECK:       int16_t3 b_h10;                                  ; Offset:   40
+
+// CHECK:       int16_t2 b_h11;                                  ; Offset:   48
+// CHECK:       int16_t3 b_h12;                                  ; Offset:   52
+// CHECK:       int16_t2 b_h13;                                  ; Offset:   58
+
+
+// CHECK:       int16_t b_h14;                                   ; Offset:   62
+// CHECK:       int16_t b_h16;                                   ; Offset:   64
+// CHECK:       int16_t b_h17;                                   ; Offset:   66
+// CHECK:       int16_t b_h18;                                   ; Offset:   68
+// CHECK:       int16_t b_h19;                                   ; Offset:   70
+// CHECK:       int16_t b_h20;                                   ; Offset:   72
+// CHECK:       int16_t b_h21;                                   ; Offset:   74
+// CHECK:       int16_t b_h22;                                   ; Offset:   76
+// CHECK:       int16_t b_h23;                                   ; Offset:   78
+
+// CHECK:   } Bar                                             ; Offset:    0 Size:    80
+// CHECK: }
+
+cbuffer Bar {
+  int16_t b_h1;
+  int16_t b_h2;
+  int16_t b_h3;
+  int16_t2 b_h4;
+  int16_t3 b_h5;
+
+  int16_t3 b_h6;
+  int16_t4 b_h7;
+  int16_t b_h8;
+
+  int16_t4 b_h9;
+  int16_t3 b_h10;
+
+  int16_t2 b_h11;
+  int16_t3 b_h12;
+  int16_t2 b_h13;
+  int16_t  b_h14;
+
+  int16_t b_h16;
+  int16_t b_h17;
+  int16_t b_h18;
+  int16_t b_h19;
+  int16_t b_h20;
+  int16_t b_h21;
+  int16_t b_h22;
+  int16_t b_h23;
+
+}
+
+float4 main() : SV_Target  {
+  return f_h1 + f_f3.x
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %Foo_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %Foo_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 1
+  + f_h2.x + f_h2.y + f_f3_1.z
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %Foo_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %Foo_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 3
+  + f_f2.x + f_h4.x + f_h4.y + f_h4.z + f_h4.w
+  // CHECK: call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %Foo_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %Foo_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 7
+  + f_h2_1.x + f_h2_1.y + f_h3.x + f_h3.y + f_h3.z
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %Foo_buffer, i32 3)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  + f_d1 + f_h3_1.x
+  // CHECK: call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %Foo_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %Foo_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  + f_i1 + f_d2
+  // CHECK: call %dx.types.CBufRet.i32 @dx.op.cbufferLoadLegacy.i32(i32 59, %dx.types.Handle %Foo_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i32 {{%[0-9]+}}, 0
+  // CHECK: call %dx.types.CBufRet.f64 @dx.op.cbufferLoadLegacy.f64(i32 59, %dx.types.Handle %Foo_buffer, i32 5)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.f64 {{%[0-9]+}}, 1
+  + b_h1 + b_h2 + b_h3 + b_h4.x + b_h5.y + b_h5.x + b_h5.y + b_h5.z +
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %Bar_buffer, i32 0)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 7
+  + b_h6.x + b_h6.y + b_h6.z + b_h7.x + b_h7.y + b_h7.z + b_h7.w + b_h8
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %Bar_buffer, i32 1)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 7
+  + b_h9.x + b_h9.y + b_h9.z + b_h9.w + b_h10.x + b_h10.y + b_h10.z
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %Bar_buffer, i32 2)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  + b_h11.x + b_h11.y + b_h12.x + b_h12.y + b_h12.z + b_h13.x + b_h13.y + b_h14
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %Bar_buffer, i32 3)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  + b_h16 + b_h17 + b_h18 + b_h19 + b_h20 + b_h21 + b_h22 + b_h23;
+  // CHECK: call %dx.types.CBufRet.i16.8 @dx.op.cbufferLoadLegacy.i16(i32 59, %dx.types.Handle %Bar_buffer, i32 4)  ; CBufferLoadLegacy(handle,regIndex)
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 0
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 1
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 2
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 3
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 4
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 5
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 6
+  // CHECK: extractvalue %dx.types.CBufRet.i16.8 {{%[0-9]+}}, 7
+}

+ 4 - 4
tools/clang/test/CodeGenHLSL/precise1.hlsl

@@ -1,9 +1,9 @@
 // RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
 // RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
 
 
-// CHECK: min16f
-// CHECK: min16u
-// CHECK: min16i
-// CHECK: min16i
+// CHECK: fp16
+// CHECK: uint16
+// CHECK: int16
+// CHECK: int16
 // CHECK: fadd float
 // CHECK: fadd float
 // CHECK: fadd float
 // CHECK: fadd float
 
 

+ 47 - 10
tools/clang/test/CodeGenHLSL/signature_packing_by_width.hlsl

@@ -1,16 +1,53 @@
 // RUN: %dxc -E main -T ps_6_2 -no-min-precision %s | FileCheck %s
 // RUN: %dxc -E main -T ps_6_2 -no-min-precision %s | FileCheck %s
 
 
-// TODO: Update this file when we introduce i8/i16.
+// TODO: Update this file when we introduce i8
 
 
-// CHECK: {{![0-9]+}} = !{i32 0, !"A", i8 8, i8 0, {{![0-9]+}}, i8 2, i32 1, i8 2, i32 0, i8 0, null}
-// CHECK: {{![0-9]+}} = !{i32 1, !"B", i8 9, i8 0, {{![0-9]+}}, i8 2, i32 1, i8 2, i32 1, i8 0, null}
-// CHECK: {{![0-9]+}} = !{i32 2, !"C", i8 8, i8 0, {{![0-9]+}}, i8 2, i32 1, i8 3, i32 2, i8 0, null}
-// CHECK: {{![0-9]+}} = !{i32 3, !"D", i8 9, i8 0, {{![0-9]+}}, i8 2, i32 1, i8 2, i32 1, i8 2, null}
-// CHECK: {{![0-9]+}} = !{i32 4, !"E", i8 4, i8 0, {{![0-9]+}}, i8 1, i32 1, i8 1, i32 3, i8 0, null}
-// CHECK: {{![0-9]+}} = !{i32 5, !"F", i8 8, i8 0, {{![0-9]+}}, i8 2, i32 1, i8 2, i32 0, i8 2, null}
-// CHECK: {{![0-9]+}} = !{i32 6, !"G", i8 8, i8 0, {{![0-9]+}}, i8 2, i32 1, i8 1, i32 2, i8 3, null}
+// Checking if signature elements are packed by interpolation mode and data width with up to 4 elements.
 
 
-float4 main(min16float2 a : A, float2 b : B, half3 c : C, 
-            float2 d : D, int e : E, half2 f : F, half g : G) : SV_Target {
+// CHECK: ; Name                 Index   Mask Register SysValue  Format   Used
+// CHECK: ; -------------------- ----- ------ -------- -------- ------- ------
+// CHECK: ; A                        0   xy          0     NONE    fp16
+// CHECK: ; F                        0     zw        0     NONE    fp16
+// CHECK: ; B                        0   xy          1     NONE   float
+// CHECK: ; D                        0     zw        1     NONE   float
+// CHECK: ; C                        0   xyz         2     NONE    fp16
+// CHECK: ; G                        0      w        2     NONE    fp16
+// CHECK: ; SV_PrimitiveID           0   x           3   PRIMID    uint
+// CHECK: ; E                        0   x           4     NONE     int
+// CHECK: ; I                        0    y          4     NONE     int
+// CHECK: ; H                        0   x           5     NONE   int16
+// CHECK: ; J                        0    yzw        5     NONE    fp16
+// CHECK: ; K                        0   xy          6     NONE   int16
+// CHECK: ; N                        0     z         6     NONE    fp16
+// CHECK: ; O                        0      w        6     NONE  uint16
+// CHECK: ; L                        0   xy          7     NONE    fp16
+// CHECK: ; Q                        0     z         7     NONE    fp16
+// CHECK: ; P                        0   xy          8     NONE  uint16
+// CHECK: ; SV_SampleIndex           0    N/A  special   SAMPLE    uint     NO
+
+// CHECK: !{i32 0, !"A", i8 8, i8 0, !{{[0-9]+}}, i8 2, i32 1, i8 2, i32 0, i8 0, null}
+// CHECK: !{i32 1, !"B", i8 9, i8 0, !{{[0-9]+}}, i8 2, i32 1, i8 2, i32 1, i8 0, null}
+// CHECK: !{i32 2, !"C", i8 8, i8 0, !{{[0-9]+}}, i8 2, i32 1, i8 3, i32 2, i8 0, null}
+// CHECK: !{i32 3, !"SV_PrimitiveID", i8 5, i8 10, !{{[0-9]+}}, i8 1, i32 1, i8 1, i32 3, i8 0, null}
+// CHECK: !{i32 4, !"D", i8 9, i8 0, !{{[0-9]+}}, i8 2, i32 1, i8 2, i32 1, i8 2, null}
+// CHECK: !{i32 5, !"E", i8 4, i8 0, !{{[0-9]+}}, i8 1, i32 1, i8 1, i32 4, i8 0, null}
+// CHECK: !{i32 6, !"F", i8 8, i8 0, !{{[0-9]+}}, i8 2, i32 1, i8 2, i32 0, i8 2, null}
+// CHECK: !{i32 7, !"G", i8 8, i8 0, !{{[0-9]+}}, i8 2, i32 1, i8 1, i32 2, i8 3, null}
+// CHECK: !{i32 8, !"H", i8 2, i8 0, !{{[0-9]+}}, i8 1, i32 1, i8 1, i32 5, i8 0, null}
+// CHECK: !{i32 9, !"I", i8 4, i8 0, !{{[0-9]+}}, i8 1, i32 1, i8 1, i32 4, i8 1, null}
+// CHECK: !{i32 10, !"J", i8 8, i8 0, !{{[0-9]+}}, i8 1, i32 1, i8 3, i32 5, i8 1, null}
+// CHECK: !{i32 11, !"K", i8 2, i8 0, !{{[0-9]+}}, i8 1, i32 1, i8 2, i32 6, i8 0, null}
+// CHECK: !{i32 12, !"L", i8 8, i8 0, !{{[0-9]+}}, i8 2, i32 1, i8 2, i32 7, i8 0, null}
+// CHECK: !{i32 13, !"N", i8 8, i8 0, !{{[0-9]+}}, i8 1, i32 1, i8 1, i32 6, i8 2, null}
+// CHECK: !{i32 14, !"SV_SampleIndex", i8 5, i8 12, !{{[0-9]+}}, i8 1, i32 1, i8 1, i32 -1, i8 -1, null}
+// CHECK: !{i32 15, !"O", i8 3, i8 0, !12, i8 1, i32 1, i8 1, i32 6, i8 3, null}
+// CHECK: !{i32 16, !"P", i8 3, i8 0, !12, i8 1, i32 1, i8 2, i32 8, i8 0, null}
+// CHECK: !{i32 17, !"Q", i8 8, i8 0, !12, i8 2, i32 1, i8 1, i32 7, i8 2, null}
+
+float4 main(min16float2 a : A, float2 b : B, half3 c : C, uint id : SV_PrimitiveID,
+            float2 d : D, int e : E, half2 f : F, half g : G,
+            min16int h : H, int i : I, nointerpolation min16float3 j : J,
+            min16int2 k : K, half2 l : L, nointerpolation half n : N, uint sample_idx : SV_SampleIndex, uint16_t o : O,
+            vector<uint16_t,2> p : P, half q : Q) : SV_Target {
   return 1;
   return 1;
 }
 }

+ 10 - 10
tools/clang/test/CodeGenHLSL/struct_buf5.hlsl

@@ -1,21 +1,21 @@
 // RUN: %dxc -E main -T ps_6_2 -no-min-precision %s | FileCheck %s
 // RUN: %dxc -E main -T ps_6_2 -no-min-precision %s | FileCheck %s
-// CHECK: call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32
-// CHECK: call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32
-// CHECK: call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32
-// CHECK: call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32
+// CHECK: call %dx.types.ResRet.i16 @dx.op.rawBufferLoad.i16
+// CHECK: call %dx.types.ResRet.i16 @dx.op.rawBufferLoad.i16
+// CHECK: call %dx.types.ResRet.i16 @dx.op.rawBufferLoad.i16
+// CHECK: call %dx.types.ResRet.i16 @dx.op.rawBufferLoad.i16
 
 
-// CHECK: call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32
-// CHECK: call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32
-// CHECK: call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32
-// CHECK: call %dx.types.ResRet.i32 @dx.op.rawBufferLoad.i32
+// CHECK: call %dx.types.ResRet.i16 @dx.op.rawBufferLoad.i16
+// CHECK: call %dx.types.ResRet.i16 @dx.op.rawBufferLoad.i16
+// CHECK: call %dx.types.ResRet.i16 @dx.op.rawBufferLoad.i16
+// CHECK: call %dx.types.ResRet.i16 @dx.op.rawBufferLoad.i16
 
 
 // CHECK: call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16
 // CHECK: call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16
 // CHECK: call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16
 // CHECK: call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16
 // CHECK: call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16
 // CHECK: call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16
 // CHECK: call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16
 // CHECK: call %dx.types.ResRet.f16 @dx.op.rawBufferLoad.f16
 
 
-// CHECK: call void @dx.op.rawBufferStore.i32
-// CHECK: call void @dx.op.rawBufferStore.i32
+// CHECK: call void @dx.op.rawBufferStore.i16
+// CHECK: call void @dx.op.rawBufferStore.i16
 
 
 struct MyStruct {
 struct MyStruct {
   min16int mi1;
   min16int mi1;

+ 42 - 25
tools/clang/test/CodeGenHLSL/struct_buf_new_layout.hlsl

@@ -1,42 +1,46 @@
 // RUN: %dxc -E main -T ps_6_2 -no-min-precision %s  | FileCheck %s
 // RUN: %dxc -E main -T ps_6_2 -no-min-precision %s  | FileCheck %s
 
 
-// CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 0, half 0xH3C00, half 0xH3C00, half 0xH3C00, half undef, i8 7, i32 2)
-// CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 8, i32 2, i32 2, i32 2, i32 2, i8 15, i32 4)
-// CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 24, half 0xH4200, half 0xH4200, half 0xH4200, half undef, i8 7, i32 2)
-// CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 30, half 0xH4400, half 0xH4400, half 0xH4400, half 0xH4400, i8 15, i32 2)
-// CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 40, i32 %1, i32 %2, i32 undef, i32 undef, i8 3, i32 8)
-// CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 48, half 0xH4600, half undef, half undef, half undef, i8 1, i32 2)
-// CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 50, half 0xH4700, half undef, half undef, half undef, i8 1, i32 2)
-// CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 52, half 0xH4800, half undef, half undef, half undef, i8 1, i32 2)
-// CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 56, i32 9, i32 undef, i32 undef, i32 undef, i8 1, i32 4)
-// CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb2_UAV_structbuf, i32 0, i32 0, i32 %4, i32 %5, i32 undef, i32 undef, i8 3, i32 8)
-// CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb2_UAV_structbuf, i32 0, i32 8, half 0xH4000, half 0xH4000, half 0xH4000, half undef, i8 7, i32 2)
-// CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb2_UAV_structbuf, i32 0, i32 16, i32 3, i32 undef, i32 undef, i32 undef, i8 1, i32 4)
-
 struct MyStruct1
 struct MyStruct1
 {
 {
-    half3  m_1;
-    int4   m_2;
-    half3  m_3;
-    half4  m_4;
-    double m_5;
-    half   m_6;
-    half   m_7;
-    half   m_8;
-    int    m_9;
+    half3   m_1;
+    int4    m_2;
+    half3   m_3;
+    half4   m_4;
+    double  m_5;
+    half    m_6;
+    half    m_7;
+    half    m_8;
+    int     m_9;
+    int16_t m_10;
+    uint16_t4 m_11;
 };
 };
 
 
 struct MyStruct2
 struct MyStruct2
 {
 {
-    double m_1;
-    half3  m_2;
-    int    m_3;
+    double    m_1;
+    half3     m_2;
+    int       m_3;
+    int16_t   m_4;
+    float     m_5;
+    uint16_t3 m_6;
+    double    m_7;
 };
 };
 
 
 RWStructuredBuffer<MyStruct1> g_sb1: register(u0);
 RWStructuredBuffer<MyStruct1> g_sb1: register(u0);
 RWStructuredBuffer<MyStruct2> g_sb2: register(u1);
 RWStructuredBuffer<MyStruct2> g_sb2: register(u1);
 
 
 float4 main() : SV_Target {
 float4 main() : SV_Target {
+    // CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 0, half 0xH3C00, half 0xH3C00, half 0xH3C00, half undef, i8 7, i32 2)
+    // CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 8, i32 2, i32 2, i32 2, i32 2, i8 15, i32 4)
+    // CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 24, half 0xH4200, half 0xH4200, half 0xH4200, half undef, i8 7, i32 2)
+    // CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 30, half 0xH4400, half 0xH4400, half 0xH4400, half 0xH4400, i8 15, i32 2)
+    // CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 40, i32 %{{.*}}, i32 %{{.*}}, i32 undef, i32 undef, i8 3, i32 8)
+    // CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 48, half 0xH4600, half undef, half undef, half undef, i8 1, i32 2)
+    // CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 50, half 0xH4700, half undef, half undef, half undef, i8 1, i32 2)
+    // CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 52, half 0xH4800, half undef, half undef, half undef, i8 1, i32 2)
+    // CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 56, i32 9, i32 undef, i32 undef, i32 undef, i8 1, i32 4)
+    // CHECK: call void @dx.op.rawBufferStore.i16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 60, i16 10, i16 undef, i16 undef, i16 undef, i8 1, i32 2)
+    // CHECK: call void @dx.op.rawBufferStore.i16(i32 140, %dx.types.Handle %g_sb1_UAV_structbuf, i32 0, i32 62, i16 11, i16 11, i16 11, i16 11, i8 15, i32 2)
     MyStruct1 myStruct;
     MyStruct1 myStruct;
     myStruct.m_1 = 1;
     myStruct.m_1 = 1;
     myStruct.m_2 = 2;
     myStruct.m_2 = 2;
@@ -47,12 +51,25 @@ float4 main() : SV_Target {
     myStruct.m_7 = 7;
     myStruct.m_7 = 7;
     myStruct.m_8 = 8;
     myStruct.m_8 = 8;
     myStruct.m_9 = 9;
     myStruct.m_9 = 9;
+    myStruct.m_10 = 10;
+    myStruct.m_11 = 11;
     g_sb1[0] = myStruct;
     g_sb1[0] = myStruct;
 
 
+    // CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb2_UAV_structbuf, i32 0, i32 0, i32 %{{.*}}, i32 %{{.*}}, i32 undef, i32 undef, i8 3, i32 8)
+    // CHECK: call void @dx.op.rawBufferStore.f16(i32 140, %dx.types.Handle %g_sb2_UAV_structbuf, i32 0, i32 8, half 0xH4000, half 0xH4000, half 0xH4000, half undef, i8 7, i32 2)
+    // CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb2_UAV_structbuf, i32 0, i32 16, i32 3, i32 undef, i32 undef, i32 undef, i8 1, i32 4)
+    // CHECK: call void @dx.op.rawBufferStore.i16(i32 140, %dx.types.Handle %g_sb2_UAV_structbuf, i32 0, i32 20, i16 4, i16 undef, i16 undef, i16 undef, i8 1, i32 2)
+    // CHECK: call void @dx.op.rawBufferStore.f32(i32 140, %dx.types.Handle %g_sb2_UAV_structbuf, i32 0, i32 24, float 5.000000e+00, float undef, float undef, float undef, i8 1, i32 4)
+    // CHECK: call void @dx.op.rawBufferStore.i16(i32 140, %dx.types.Handle %g_sb2_UAV_structbuf, i32 0, i32 28, i16 6, i16 6, i16 6, i16 undef, i8 7, i32 2)
+    // CHECK: call void @dx.op.rawBufferStore.i32(i32 140, %dx.types.Handle %g_sb2_UAV_structbuf, i32 0, i32 40, i32 %{{.*}}, i32 %{{.*}}, i32 undef, i32 undef, i8 3, i32 8) 
     MyStruct2 myStruct2;
     MyStruct2 myStruct2;
     myStruct2.m_1 = 1;
     myStruct2.m_1 = 1;
     myStruct2.m_2 = 2;
     myStruct2.m_2 = 2;
     myStruct2.m_3 = 3;
     myStruct2.m_3 = 3;
+    myStruct2.m_4 = 4;
+    myStruct2.m_5 = 5;
+    myStruct2.m_6 = 6;
+    myStruct2.m_7 = 7;
     g_sb2[0] = myStruct2;
     g_sb2[0] = myStruct2;
 
 
     return 1;
     return 1;

+ 21 - 21
tools/clang/test/HLSL/scalar-assignments-exact-precision.hlsl

@@ -87,9 +87,9 @@ half left53; float right53; left53 = right53;      /* expected-warning {{convers
 half left54; double right54; left54 = right54; // expected-warning {{conversion from larger type 'double' to smaller type 'half', possible loss of data}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 half left54; double right54; left54 = right54; // expected-warning {{conversion from larger type 'double' to smaller type 'half', possible loss of data}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 half left55; min16float right55; left55 = right55;          /* expected-warning {{min16float is promoted to half}} */
 half left55; min16float right55; left55 = right55;          /* expected-warning {{min16float is promoted to half}} */
 half left56; min10float right56; left56 = right56;  // expected-warning {{min10float is promoted to half}}
 half left56; min10float right56; left56 = right56;  // expected-warning {{min10float is promoted to half}}
-half left57; min16int right57; left57 = right57;    /* expected-warning {{conversion from larger type 'min16int' to smaller type 'half', possible loss of data}} expected-warning {{min16int is promoted to int}} */
-half left58; min12int right58; left58 = right58;  // expected-warning {{conversion from larger type 'min12int' to smaller type 'half', possible loss of data}} expected-warning {{min12int is promoted to min16int}}
-half left59; min16uint right59; left59 = right59; /* expected-warning {{conversion from larger type 'min16uint' to smaller type 'half', possible loss of data}} expected-warning {{min16uint is promoted to uint}} */
+half left57; min16int right57; left57 = right57;    /* expected-warning {{min16int is promoted to int}} */
+half left58; min12int right58; left58 = right58;  // expected-warning {{min12int is promoted to min16int}}
+half left59; min16uint right59; left59 = right59; /* expected-warning {{min16uint is promoted to uint}} */
 float left60; bool right60; left60 = right60;
 float left60; bool right60; left60 = right60;
 float left61; int right61; left61 = right61;
 float left61; int right61; left61 = right61;
 float left62; uint right62; left62 = right62;
 float left62; uint right62; left62 = right62;
@@ -123,9 +123,9 @@ min16float left89; float right89; left89 = right89; // expected-warning {{conver
 min16float left90; double right90; left90 = right90; // expected-warning {{conversion from larger type 'double' to smaller type 'min16float', possible loss of data}} expected-warning {{min16float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16float left90; double right90; left90 = right90; // expected-warning {{conversion from larger type 'double' to smaller type 'min16float', possible loss of data}} expected-warning {{min16float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16float left91; min16float right91; left91 = right91;    /* expected-warning {{min16float is promoted to half}} expected-warning {{min16float is promoted to half}} */
 min16float left91; min16float right91; left91 = right91;    /* expected-warning {{min16float is promoted to half}} expected-warning {{min16float is promoted to half}} */
 min16float left92; min10float right92; left92 = right92;  // expected-warning {{min10float is promoted to half}} expected-warning {{min16float is promoted to half}}
 min16float left92; min10float right92; left92 = right92;  // expected-warning {{min10float is promoted to half}} expected-warning {{min16float is promoted to half}}
-min16float left93; min16int right93; left93 = right93;    /* expected-warning {{conversion from larger type 'min16int' to smaller type 'min16float', possible loss of data}} expected-warning {{min16float is promoted to half}} expected-warning {{min16int is promoted to int}} */
-min16float left94; min12int right94; left94 = right94;  // expected-warning {{conversion from larger type 'min12int' to smaller type 'min16float', possible loss of data}} expected-warning {{min12int is promoted to min16int}} expected-warning {{min16float is promoted to half}}
-min16float left95; min16uint right95; left95 = right95; /* expected-warning {{conversion from larger type 'min16uint' to smaller type 'min16float', possible loss of data}} expected-warning {{min16float is promoted to half}} expected-warning {{min16uint is promoted to uint}} */
+min16float left93; min16int right93; left93 = right93;    /* expected-warning {{min16float is promoted to half}} expected-warning {{min16int is promoted to int}} */
+min16float left94; min12int right94; left94 = right94;  // expected-warning {{min12int is promoted to min16int}} expected-warning {{min16float is promoted to half}}
+min16float left95; min16uint right95; left95 = right95; /* expected-warning {{min16float is promoted to half}} expected-warning {{min16uint is promoted to uint}} */
 min10float left96; bool right96; left96 = right96;  // expected-warning {{min10float is promoted to half}}
 min10float left96; bool right96; left96 = right96;  // expected-warning {{min10float is promoted to half}}
 min10float left97; int right97; left97 = right97; // expected-warning {{conversion from larger type 'int' to smaller type 'min10float', possible loss of data}} expected-warning {{min10float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min10float left97; int right97; left97 = right97; // expected-warning {{conversion from larger type 'int' to smaller type 'min10float', possible loss of data}} expected-warning {{min10float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min10float left98; uint right98; left98 = right98; // expected-warning {{conversion from larger type 'uint' to smaller type 'min10float', possible loss of data}} expected-warning {{min10float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min10float left98; uint right98; left98 = right98; // expected-warning {{conversion from larger type 'uint' to smaller type 'min10float', possible loss of data}} expected-warning {{min10float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
@@ -135,15 +135,15 @@ min10float left101; float right101; left101 = right101; // expected-warning {{co
 min10float left102; double right102; left102 = right102; // expected-warning {{conversion from larger type 'double' to smaller type 'min10float', possible loss of data}} expected-warning {{min10float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min10float left102; double right102; left102 = right102; // expected-warning {{conversion from larger type 'double' to smaller type 'min10float', possible loss of data}} expected-warning {{min10float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min10float left103; min16float right103; left103 = right103; // expected-warning {{min10float is promoted to half}} expected-warning {{min16float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min10float left103; min16float right103; left103 = right103; // expected-warning {{min10float is promoted to half}} expected-warning {{min16float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min10float left104; min10float right104; left104 = right104;  // expected-warning {{min10float is promoted to half}} expected-warning {{min10float is promoted to half}} //
 min10float left104; min10float right104; left104 = right104;  // expected-warning {{min10float is promoted to half}} expected-warning {{min10float is promoted to half}} //
-min10float left105; min16int right105; left105 = right105; // expected-warning {{conversion from larger type 'min16int' to smaller type 'min10float', possible loss of data}} expected-warning {{min10float is promoted to half}} expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
-min10float left106; min12int right106; left106 = right106; // expected-warning {{conversion from larger type 'min12int' to smaller type 'min10float', possible loss of data}} expected-warning {{min10float is promoted to half}} expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
-min10float left107; min16uint right107; left107 = right107; // expected-warning {{conversion from larger type 'min16uint' to smaller type 'min10float', possible loss of data}} expected-warning {{min10float is promoted to half}} expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
+min10float left105; min16int right105; left105 = right105; // expected-warning {{min10float is promoted to half}} expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
+min10float left106; min12int right106; left106 = right106; // expected-warning {{min10float is promoted to half}} expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
+min10float left107; min16uint right107; left107 = right107; // expected-warning {{min10float is promoted to half}} expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min16int left108; bool right108; left108 = right108;        /* expected-warning {{min16int is promoted to int}} */
 min16int left108; bool right108; left108 = right108;        /* expected-warning {{min16int is promoted to int}} */
-min16int left109; int right109; left109 = right109; // expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
-min16int left110; uint right110; left110 = right110; // expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
-min16int left111; dword right111; left111 = right111; // expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
+min16int left109; int right109; left109 = right109; // expected-warning {{conversion from larger type 'int' to smaller type 'min16int', possible loss of data}} expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
+min16int left110; uint right110; left110 = right110; // expected-warning {{conversion from larger type 'uint' to smaller type 'min16int', possible loss of data}} expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
+min16int left111; dword right111; left111 = right111; // expected-warning {{conversion from larger type 'dword' to smaller type 'min16int', possible loss of data}} expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16int left112; half right112; left112 = right112; // expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16int left112; half right112; left112 = right112; // expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
-min16int left113; float right113; left113 = right113; // expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
+min16int left113; float right113; left113 = right113; // expected-warning {{conversion from larger type 'float' to smaller type 'min16int', possible loss of data}} expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16int left114; double right114; left114 = right114; // expected-warning {{conversion from larger type 'double' to smaller type 'min16int', possible loss of data}} expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16int left114; double right114; left114 = right114; // expected-warning {{conversion from larger type 'double' to smaller type 'min16int', possible loss of data}} expected-warning {{min16int is promoted to int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16int left115; min16float right115; left115 = right115;    /* expected-warning {{min16float is promoted to half}} expected-warning {{min16int is promoted to int}} */
 min16int left115; min16float right115; left115 = right115;    /* expected-warning {{min16float is promoted to half}} expected-warning {{min16int is promoted to int}} */
 min16int left116; min10float right116; left116 = right116;  // expected-warning {{min10float is promoted to half}} expected-warning {{min16int is promoted to int}}
 min16int left116; min10float right116; left116 = right116;  // expected-warning {{min10float is promoted to half}} expected-warning {{min16int is promoted to int}}
@@ -151,11 +151,11 @@ min16int left117; min16int right117; left117 = right117;    /* expected-warning
 min16int left118; min12int right118; left118 = right118;  // expected-warning {{min12int is promoted to min16int}} expected-warning {{min16int is promoted to int}}
 min16int left118; min12int right118; left118 = right118;  // expected-warning {{min12int is promoted to min16int}} expected-warning {{min16int is promoted to int}}
 min16int left119; min16uint right119; left119 = right119; /* expected-warning {{min16int is promoted to int}} expected-warning {{min16uint is promoted to uint}} */
 min16int left119; min16uint right119; left119 = right119; /* expected-warning {{min16int is promoted to int}} expected-warning {{min16uint is promoted to uint}} */
 min12int left120; bool right120; left120 = right120;  // expected-warning {{min12int is promoted to min16int}}
 min12int left120; bool right120; left120 = right120;  // expected-warning {{min12int is promoted to min16int}}
-min12int left121; int right121; left121 = right121; // expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
-min12int left122; uint right122; left122 = right122; // expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
-min12int left123; dword right123; left123 = right123; // expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
+min12int left121; int right121; left121 = right121; // expected-warning {{conversion from larger type 'int' to smaller type 'min12int', possible loss of data}} expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
+min12int left122; uint right122; left122 = right122; // expected-warning {{conversion from larger type 'uint' to smaller type 'min12int', possible loss of data}} expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
+min12int left123; dword right123; left123 = right123; // expected-warning {{conversion from larger type 'dword' to smaller type 'min12int', possible loss of data}} expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min12int left124; half right124; left124 = right124; // expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min12int left124; half right124; left124 = right124; // expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
-min12int left125; float right125; left125 = right125; // expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
+min12int left125; float right125; left125 = right125; // expected-warning {{conversion from larger type 'float' to smaller type 'min12int', possible loss of data}} expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min12int left126; double right126; left126 = right126; // expected-warning {{conversion from larger type 'double' to smaller type 'min12int', possible loss of data}} expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min12int left126; double right126; left126 = right126; // expected-warning {{conversion from larger type 'double' to smaller type 'min12int', possible loss of data}} expected-warning {{min12int is promoted to min16int}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min12int left127; min16float right127; left127 = right127; // expected-warning {{min12int is promoted to min16int}} expected-warning {{min16float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min12int left127; min16float right127; left127 = right127; // expected-warning {{min12int is promoted to min16int}} expected-warning {{min16float is promoted to half}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min12int left128; min10float right128; left128 = right128;  // expected-warning {{min10float is promoted to half}} expected-warning {{min12int is promoted to min16int}} //
 min12int left128; min10float right128; left128 = right128;  // expected-warning {{min10float is promoted to half}} expected-warning {{min12int is promoted to min16int}} //
@@ -163,11 +163,11 @@ min12int left129; min16int right129; left129 = right129; // expected-warning {{m
 min12int left130; min12int right130; left130 = right130;  // expected-warning {{min12int is promoted to min16int}} expected-warning {{min12int is promoted to min16int}} //
 min12int left130; min12int right130; left130 = right130;  // expected-warning {{min12int is promoted to min16int}} expected-warning {{min12int is promoted to min16int}} //
 min12int left131; min16uint right131; left131 = right131; // expected-warning {{min12int is promoted to min16int}} expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min12int left131; min16uint right131; left131 = right131; // expected-warning {{min12int is promoted to min16int}} expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}} //
 min16uint left132; bool right132; left132 = right132;     /* expected-warning {{min16uint is promoted to uint}} */
 min16uint left132; bool right132; left132 = right132;     /* expected-warning {{min16uint is promoted to uint}} */
-min16uint left133; int right133; left133 = right133; // expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
-min16uint left134; uint right134; left134 = right134; // expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
-min16uint left135; dword right135; left135 = right135; // expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
+min16uint left133; int right133; left133 = right133; // expected-warning {{conversion from larger type 'int' to smaller type 'min16uint', possible loss of data}} expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
+min16uint left134; uint right134; left134 = right134; // expected-warning {{conversion from larger type 'uint' to smaller type 'min16uint', possible loss of data}} expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
+min16uint left135; dword right135; left135 = right135; // expected-warning {{conversion from larger type 'dword' to smaller type 'min16uint', possible loss of data}} expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16uint left136; half right136; left136 = right136; // expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16uint left136; half right136; left136 = right136; // expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
-min16uint left137; float right137; left137 = right137; // expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
+min16uint left137; float right137; left137 = right137; // expected-warning {{conversion from larger type 'float' to smaller type 'min16uint', possible loss of data}} expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16uint left138; double right138; left138 = right138; // expected-warning {{conversion from larger type 'double' to smaller type 'min16uint', possible loss of data}} expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16uint left138; double right138; left138 = right138; // expected-warning {{conversion from larger type 'double' to smaller type 'min16uint', possible loss of data}} expected-warning {{min16uint is promoted to uint}} fxc-warning {{X3205: conversion from larger type to smaller, possible loss of data}}
 min16uint left139; min16float right139; left139 = right139;    /* expected-warning {{min16float is promoted to half}} expected-warning {{min16uint is promoted to uint}} */
 min16uint left139; min16float right139; left139 = right139;    /* expected-warning {{min16float is promoted to half}} expected-warning {{min16uint is promoted to uint}} */
 min16uint left140; min10float right140; left140 = right140;  // expected-warning {{min10float is promoted to half}} expected-warning {{min16uint is promoted to uint}}
 min16uint left140; min10float right140; left140 = right140;  // expected-warning {{min10float is promoted to half}} expected-warning {{min16uint is promoted to uint}}

+ 3 - 3
tools/clang/tools/dxcompiler/dxcdisassembler.cpp

@@ -206,13 +206,13 @@ void PrintSignature(LPCSTR pName, const DxilProgramSignature *pSignature,
       pFormat = "uint";
       pFormat = "uint";
       break;
       break;
     case DxilProgramSigCompType::UInt16:
     case DxilProgramSigCompType::UInt16:
-      pFormat = "min16u";
+      pFormat = "uint16";
       break;
       break;
     case DxilProgramSigCompType::SInt16:
     case DxilProgramSigCompType::SInt16:
-      pFormat = "min16i";
+      pFormat = "int16";
       break;
       break;
     case DxilProgramSigCompType::Float16:
     case DxilProgramSigCompType::Float16:
-      pFormat = "min16f";
+      pFormat = "fp16";
       break;
       break;
     case DxilProgramSigCompType::UInt64:
     case DxilProgramSigCompType::UInt64:
       pFormat = "uint64";
       pFormat = "uint64";

+ 18 - 0
tools/clang/unittests/HLSL/CompilerTest.cpp

@@ -503,11 +503,14 @@ public:
   TEST_METHOD(CodeGenCbuffer3_51)
   TEST_METHOD(CodeGenCbuffer3_51)
   TEST_METHOD(CodeGenCbuffer5_51)
   TEST_METHOD(CodeGenCbuffer5_51)
   TEST_METHOD(CodeGenCbuffer6_51)
   TEST_METHOD(CodeGenCbuffer6_51)
+  TEST_METHOD(CodeGenCbuffer64Types)
   TEST_METHOD(CodeGenCbufferAlloc)
   TEST_METHOD(CodeGenCbufferAlloc)
   TEST_METHOD(CodeGenCbufferAllocLegacy)
   TEST_METHOD(CodeGenCbufferAllocLegacy)
   TEST_METHOD(CodeGenCbufferHalf)
   TEST_METHOD(CodeGenCbufferHalf)
   TEST_METHOD(CodeGenCbufferHalfStruct)
   TEST_METHOD(CodeGenCbufferHalfStruct)
   TEST_METHOD(CodeGenCbufferInLoop)
   TEST_METHOD(CodeGenCbufferInLoop)
+  TEST_METHOD(CodeGenCbufferInt16)
+  TEST_METHOD(CodeGenCbufferInt16Struct)
   TEST_METHOD(CodeGenCbufferMinPrec)
   TEST_METHOD(CodeGenCbufferMinPrec)
   TEST_METHOD(CodeGenClass)
   TEST_METHOD(CodeGenClass)
   TEST_METHOD(CodeGenClip)
   TEST_METHOD(CodeGenClip)
@@ -3156,6 +3159,11 @@ TEST_F(CompilerTest, CodeGenCbuffer6_51) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\cbuffer6.51.hlsl");
   CodeGenTestCheck(L"..\\CodeGenHLSL\\cbuffer6.51.hlsl");
 }
 }
 
 
+TEST_F(CompilerTest, CodeGenCbuffer64Types) {
+  if (m_ver.SkipDxilVersion(1, 2)) return;
+  CodeGenTestCheck(L"..\\CodeGenHLSL\\cbuffer64Types.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenCbufferAlloc) {
 TEST_F(CompilerTest, CodeGenCbufferAlloc) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\cbufferAlloc.hlsl");
   CodeGenTestCheck(L"..\\CodeGenHLSL\\cbufferAlloc.hlsl");
 }
 }
@@ -3178,6 +3186,16 @@ TEST_F(CompilerTest, CodeGenCbufferInLoop) {
   CodeGenTest(L"..\\CodeGenHLSL\\cbufferInLoop.hlsl");
   CodeGenTest(L"..\\CodeGenHLSL\\cbufferInLoop.hlsl");
 }
 }
 
 
+TEST_F(CompilerTest, CodeGenCbufferInt16) {
+  if (m_ver.SkipDxilVersion(1, 2)) return;
+  CodeGenTestCheck(L"..\\CodeGenHLSL\\cbufferInt16.hlsl");
+}
+
+TEST_F(CompilerTest, CodeGenCbufferInt16Struct) {
+  if (m_ver.SkipDxilVersion(1, 2)) return;
+  CodeGenTestCheck(L"..\\CodeGenHLSL\\cbufferInt16-struct.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenCbufferMinPrec) {
 TEST_F(CompilerTest, CodeGenCbufferMinPrec) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\cbufferMinPrec.hlsl");
   CodeGenTestCheck(L"..\\CodeGenHLSL\\cbufferMinPrec.hlsl");
 }
 }

+ 1 - 1
utils/hct/hctdb.py

@@ -557,7 +557,7 @@ class db_dxil(object):
             db_dxil_param(3, "u32", "byteOffset", "linear byte offset of value"),
             db_dxil_param(3, "u32", "byteOffset", "linear byte offset of value"),
             db_dxil_param(4, "u32", "alignment", "load access alignment", is_const=True)])
             db_dxil_param(4, "u32", "alignment", "load access alignment", is_const=True)])
         next_op_idx += 1
         next_op_idx += 1
-        self.add_dxil_op("CBufferLoadLegacy", next_op_idx, "CBufferLoadLegacy", "loads a value from a constant buffer resource", "hfdwi", "ro", [
+        self.add_dxil_op("CBufferLoadLegacy", next_op_idx, "CBufferLoadLegacy", "loads a value from a constant buffer resource", "hfdwil", "ro", [
             db_dxil_param(0, "$cb", "", "the value for the constant buffer variable"),
             db_dxil_param(0, "$cb", "", "the value for the constant buffer variable"),
             db_dxil_param(2, "res", "handle", "cbuffer handle"),
             db_dxil_param(2, "res", "handle", "cbuffer handle"),
             db_dxil_param(3, "u32", "regIndex", "0-based index into cbuffer instance")])
             db_dxil_param(3, "u32", "regIndex", "0-based index into cbuffer instance")])