Browse Source

Fix countbits, reversebits, firstbitlow intrinsics for int16 types (#1037)

Fix countbits, reversebits, firstbitlow intrinsics for int16 types
Young Kim 7 years ago
parent
commit
1e97116e9f

+ 5 - 6
include/dxc/dxcapi.internal.h

@@ -77,13 +77,12 @@ enum LEGAL_INTRINSIC_COMPTYPES {
   LICOMPTYPE_STRING = 23,
   LICOMPTYPE_WAVE = 24,
   LICOMPTYPE_UINT64 = 25,         // u64, int-literal
-  LICOMPTYPE_UINT16_32_64 = 26,      // u16, u32, u64, int-literal
-  LICOMPTYPE_FLOAT16 = 27,
-  LICOMPTYPE_INT16 = 28,
-  LICOMPTYPE_UINT16 = 29,
-  LICOMPTYPE_NUMERIC16_ONLY = 30,
+  LICOMPTYPE_FLOAT16 = 26,
+  LICOMPTYPE_INT16 = 27,
+  LICOMPTYPE_UINT16 = 28,
+  LICOMPTYPE_NUMERIC16_ONLY = 29,
 
-  LICOMPTYPE_COUNT = 31
+  LICOMPTYPE_COUNT = 30
 };
 
 static const BYTE IA_SPECIAL_BASE = 0xf0;

+ 4 - 12
tools/clang/lib/Sema/SemaHLSL.cpp

@@ -870,12 +870,14 @@ static const ArBasicKind g_UIntCT[] =
   AR_BASIC_UNKNOWN
 };
 
+// We use the first element for default if matching kind is missing in the list.
+// AR_BASIC_INT32 should be the default for any int since min precision integers should map to int32, not int16 or int64
 static const ArBasicKind g_AnyIntCT[] =
 {
-  AR_BASIC_INT16,
   AR_BASIC_INT32,
-  AR_BASIC_UINT16,
+  AR_BASIC_INT16,
   AR_BASIC_UINT32,
+  AR_BASIC_UINT16,
   AR_BASIC_INT64,
   AR_BASIC_UINT64,
   AR_BASIC_LITERAL_INT,
@@ -1081,15 +1083,6 @@ static const ArBasicKind g_UInt64CT[] =
   AR_BASIC_UNKNOWN
 };
 
-static const ArBasicKind g_UInt163264CT[] =
-{
-  AR_BASIC_UINT32,
-  AR_BASIC_UINT16,
-  AR_BASIC_UINT64,
-  AR_BASIC_LITERAL_INT,
-  AR_BASIC_UNKNOWN
-};
-
 static const ArBasicKind g_Float16CT[] =
 {
   AR_BASIC_FLOAT16,
@@ -1151,7 +1144,6 @@ const ArBasicKind* g_LegalIntrinsicCompTypes[] =
   g_StringCT,           // LICOMPTYPE_STRING
   g_WaveCT,             // LICOMPTYPE_WAVE
   g_UInt64CT,           // LICOMPTYPE_UINT64
-  g_UInt163264CT,       // LICOMPTYPE_UINT16_32_64
   g_Float16CT,          // LICOMPTYPE_FLOAT16
   g_Int16CT,            // LICOMPTYPE_INT16
   g_UInt16CT,           // LICOMPTYPE_UINT16

+ 4 - 4
tools/clang/lib/Sema/gen_intrin_main_tables_15.h

@@ -601,7 +601,7 @@ static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args85[] =
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args86[] =
 {
     {"countbits", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 0, LICOMPTYPE_UINT, IA_R, IA_C},
-    {"x", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_UINT16_32_64, IA_R, IA_C},
+    {"x", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_ANY_INT, IA_R, IA_C},
 };
 
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args87[] =
@@ -721,7 +721,7 @@ static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args104[] =
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args105[] =
 {
     {"firstbitlow", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 0, LICOMPTYPE_UINT, IA_R, IA_C},
-    {"x", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_UINT16_32_64, IA_R, IA_C},
+    {"x", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_ANY_INT, IA_R, IA_C},
 };
 
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args106[] =
@@ -971,8 +971,8 @@ static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args141[] =
 
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args142[] =
 {
-    {"reversebits", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_UINT16_32_64, IA_R, IA_C},
-    {"x", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_UINT16_32_64, IA_R, IA_C},
+    {"reversebits", AR_QUAL_OUT, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_ANY_INT, IA_R, IA_C},
+    {"x", AR_QUAL_IN, 1, LITEMPLATE_ANY, 1, LICOMPTYPE_ANY_INT, IA_R, IA_C},
 };
 
 static const HLSL_INTRINSIC_ARGUMENT g_Intrinsics_Args143[] =

+ 23 - 0
tools/clang/test/CodeGenHLSL/int16OpBits.hlsl

@@ -0,0 +1,23 @@
+// RUN: %dxc -E main -T cs_6_2 -enable-16bit-types %s | FileCheck %s
+
+// CHECK: @dx.op.unaryBits.i16
+// CHECK: @dx.op.unaryBits.i16
+// CHECK: @dx.op.unaryBits.i16
+
+struct SUnaryUintOp {
+    uint16_t input1;
+    uint16_t4 input2;
+    uint16_t4 output;
+};
+
+RWStructuredBuffer<SUnaryUintOp> g_buf;
+[numthreads(8,8,1)]
+void main(uint GI : SV_GroupIndex) {
+    SUnaryUintOp l = g_buf[GI];
+    int16_t output = 0;
+    output += countbits(l.input1);
+    output += reversebits(l.input2).x;
+    output += firstbitlow(l.input2).x;
+    l.output = output;
+    g_buf[GI] = l;
+};

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

@@ -609,6 +609,7 @@ public:
   TEST_METHOD(CodeGenInput2)
   TEST_METHOD(CodeGenInput3)
   TEST_METHOD(CodeGenInt16Op)
+  TEST_METHOD(CodeGenInt16OpBits)
   TEST_METHOD(CodeGenIntrinsic1)
   TEST_METHOD(CodeGenIntrinsic1Minprec)
   TEST_METHOD(CodeGenIntrinsic2)
@@ -3664,6 +3665,11 @@ TEST_F(CompilerTest, CodeGenInt16Op) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\int16Op.hlsl");
 }
 
+TEST_F(CompilerTest, CodeGenInt16OpBits) {
+  if (m_ver.SkipDxilVersion(1, 2)) return;
+  CodeGenTestCheck(L"..\\CodeGenHLSL\\int16OpBits.hlsl");
+}
+
 TEST_F(CompilerTest, CodeGenIntrinsic1) {
   CodeGenTestCheck(L"..\\CodeGenHLSL\\intrinsic1.hlsl");
 }

+ 4 - 4
utils/hct/gen_intrin_main.txt

@@ -34,7 +34,7 @@
 //
 // Basic types are bool, int, uint, u64, float, sampler1d, sampler2d,
 // sampler3d, sampler_cube, sampler_cmp, sampler, wave and void.
-// There are meta-types too: any_int, u16_32_64, uint_only, numeric and any.
+// There are meta-types too: any_int, uint_only, numeric and any.
 //
 // Along with a type and layout you can also give relations
 // between types in an intrinsic.  The types of an intrinsic
@@ -105,7 +105,7 @@ $type1 [[rn,unsigned_op=uclamp]] clamp(in numeric<> x, in $type1 min, in $type1
 void [[]] clip(in float<> x);
 $type1 [[rn]] cos(in float_like<> x);
 $type1 [[rn]] cosh(in float_like<> x);
-$match<1, 0> uint<> [[rn]] countbits(in u16_32_64<> x);
+$match<1, 0> uint<> [[rn]] countbits(in any_int<> x);
 $type1 [[rn]] cross(in float_like<3> a, in $type1 b);
 $type1 [[rn]] ddx(in float_like<> x);
 $type1 [[rn]] ddx_coarse(in float_like<> x);
@@ -132,7 +132,7 @@ float<> [[rn]] f16tof32(in uint<> x);
 uint<> [[rn]] f32tof16(in float<> x);
 $type1 [[rn]] faceforward(in float_like<c> N, in $type1 I, in $type1 Ng);
 $match<1, 0> uint<> [[rn,unsigned_op=ufirstbithigh,overload=0]] firstbithigh(in any_int<> x);
-$match<1, 0> uint<> [[rn]] firstbitlow(in u16_32_64<> x);
+$match<1, 0> uint<> [[rn]] firstbitlow(in any_int<> x);
 $type1 [[rn]] floor(in float_like<> x);
 $type1 [[rn]] fma(in double_only<> a, in $type1 b, in $type1 c);
 $type1 [[rn]] fmod(in float_like<> a, in $type1 b);
@@ -197,7 +197,7 @@ $type1 [[rn]] radians(in float_like<> x);
 $type1 [[rn]] rcp(in any_float<> x) : rcp_approx;
 $type1 [[rn]] reflect(in float_like<c> i, in $type1 n);
 $type1 [[rn]] refract(in float_like<c> i, in $type1 n, in float_like ri);
-$type1 [[rn]] reversebits(in u16_32_64<> x);
+$type1 [[rn]] reversebits(in any_int<> x);
 $type1 [[rn]] round(in float_like<> x);
 $type1 [[rn]] rsqrt(in float_like<> x);
 $type1 [[rn]] saturate(in any_float<> x);

+ 0 - 1
utils/hct/hctdb.py

@@ -1938,7 +1938,6 @@ class db_hlsl(object):
             "uint": "LICOMPTYPE_UINT",
             "uint16_t": "LICOMPTYPE_UINT16",
             "u64": "LICOMPTYPE_UINT64",
-            "u16_32_64": "LICOMPTYPE_UINT16_32_64",
             "any_int": "LICOMPTYPE_ANY_INT",
             "any_int32": "LICOMPTYPE_ANY_INT32",
             "uint_only": "LICOMPTYPE_UINT_ONLY",