Browse Source

Fix Shader Model 6.2 tests (#1036)

Fixing a bunch of SM 6.2 Tests
- BinaryHalfOp tests reading input2 instead of input1
- Fixed converting signed zero from float to float16
- Fixed compiler options for float16 min,max test
- Fixed expected results for following float16 operations
- cos(0), sin(314), sin(-314)
- frc(-7.39)
- rsqrt(65504)
- int16 subtraction
- int16 unsigned multiplication
- sqrt, rsqrt, round_pi, round_ni, fmad treat denorm as it is
Young Kim 7 years ago
parent
commit
d5d3d8d49a

+ 25 - 8
tools/clang/unittests/HLSL/ExecutionTest.cpp

@@ -2838,6 +2838,17 @@ static TableParameter DenormTertiaryFPOpParameters[] = {
     { L"Validation.Tolerance", TableParameter::DOUBLE, true },
     { L"Validation.Tolerance", TableParameter::DOUBLE, true },
 };
 };
 
 
+static bool IsHexString(PCWSTR str, uint16_t *value) {
+  std::wstring wString(str);
+  wString.erase(std::remove(wString.begin(), wString.end(), L' '), wString.end());
+  LPCWSTR wstr = wString.c_str();
+  if (wcsncmp(wstr, L"0x", 2) == 0 || wcsncmp(wstr, L"0b", 2) == 0) {
+    *value = (uint16_t)wcstol(wstr, NULL, 0);
+    return true;
+  }
+  return false;
+}
+
 static HRESULT ParseDataToFloat(PCWSTR str, float &value) {
 static HRESULT ParseDataToFloat(PCWSTR str, float &value) {
   std::wstring wString(str);
   std::wstring wString(str);
   wString.erase(std::remove(wString.begin(), wString.end(), L' '), wString.end());
   wString.erase(std::remove(wString.begin(), wString.end(), L' '), wString.end());
@@ -3109,13 +3120,19 @@ HRESULT TableParameterHandler::ParseTableRow() {
       }
       }
       table[i].m_halfTable.resize(tempTable.GetSize());
       table[i].m_halfTable.resize(tempTable.GetSize());
       for (size_t j = 0, end = tempTable.GetSize(); j != end; ++j) {
       for (size_t j = 0, end = tempTable.GetSize(); j != end; ++j) {
-        float val;
-        ParseDataToFloat(tempTable[j], val);
-        if (isdenorm(val))
-          table[i].m_halfTable[j] = signbit(val) ? Float16NegDenorm : Float16PosDenorm;
-        else
-          table[i].m_halfTable[j] = ConvertFloat32ToFloat16(val);
-      }
+        uint16_t value = 0;
+        if (IsHexString(tempTable[j], &value)) {
+          table[i].m_halfTable[j] = value;
+        }
+        else {
+          float val;
+          ParseDataToFloat(tempTable[j], val);
+          if (isdenorm(val))
+            table[i].m_halfTable[j] = signbit(val) ? Float16NegDenorm : Float16PosDenorm;
+          else
+            table[i].m_halfTable[j] = ConvertFloat32ToFloat16(val);
+        }
+     }
       break;
       break;
     }
     }
     case TableParameter::DOUBLE_TABLE: {
     case TableParameter::DOUBLE_TABLE: {
@@ -3543,7 +3560,7 @@ TEST_F(ExecutionTest, BinaryHalfOpTest) {
         for (size_t i = 0; i < count; ++i) {
         for (size_t i = 0; i < count; ++i) {
             SBinaryHalfOp *p = &pPrimitives[i];
             SBinaryHalfOp *p = &pPrimitives[i];
             p->input1 = (*Validation_Input1)[i % Validation_Input1->size()];
             p->input1 = (*Validation_Input1)[i % Validation_Input1->size()];
-            p->input2 = (*Validation_Input1)[i % Validation_Input1->size()];
+            p->input2 = (*Validation_Input2)[i % Validation_Input2->size()];
         }
         }
 
 
         // use shader from data table
         // use shader from data table

+ 1 - 1
tools/clang/unittests/HLSL/HlslTestUtils.h

@@ -272,7 +272,7 @@ inline uint16_t ConvertFloat32ToFloat16(float val) {
 
 
   if (isLessThanNormal) {
   if (isLessThanNormal) {
     // Compute Denormal result
     // Compute Denormal result
-    return (uint16_t)(Abs.f_bits * *(float*)(&DenormalRatio)) | sign;
+    return (uint16_t)(Abs.f_bits * *(float*)(&DenormalRatio)) | (sign >> 16);
   }
   }
   else if (isInfOrNaN) {
   else if (isInfOrNaN) {
     // Compute Inf or Nan result
     // Compute Inf or Nan result

+ 27 - 30
tools/clang/unittests/HLSL/ShaderOpArithTable.xml

@@ -514,7 +514,7 @@
             <Parameter Name="Validation.Expected1">
             <Parameter Name="Validation.Expected1">
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
-                <Value>-0</Value>
+                <Value>NaN</Value>
                 <Value>-0</Value>
                 <Value>-0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
@@ -1449,7 +1449,7 @@
                 <Value>-0</Value>
                 <Value>-0</Value>
                 <Value>-0</Value>
                 <Value>-0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
-                <Value>0</Value>
+                <Value>1</Value>
                 <Value>Inf</Value>
                 <Value>Inf</Value>
                 <Value>10.0</Value>
                 <Value>10.0</Value>
                 <Value>11.0</Value>
                 <Value>11.0</Value>
@@ -1665,7 +1665,7 @@
             <Parameter Name="Validation.Expected1">
             <Parameter Name="Validation.Expected1">
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>-Inf</Value>
                 <Value>-Inf</Value>
-                <Value>-0</Value>
+                <Value>-1</Value>
                 <Value>-0</Value>
                 <Value>-0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
@@ -1715,8 +1715,8 @@
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
-                <Value>-0.1585929</Value>
                 <Value>0.1585929</Value>
                 <Value>0.1585929</Value>
+                <Value>-0.1585929</Value>
             </Parameter>
             </Parameter>
             <Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
             <Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
         </Row>
         </Row>
@@ -1875,7 +1875,7 @@
                 <Value>-1</Value>
                 <Value>-1</Value>
                 <Value>2.719</Value>
                 <Value>2.719</Value>
                 <Value>1000.5</Value>
                 <Value>1000.5</Value>
-                <Value>-7.39</Value>
+                <Value>0xC764</Value>
             </Parameter>
             </Parameter>
             <Parameter Name="Validation.Expected1">
             <Parameter Name="Validation.Expected1">
                 <Value>NaN</Value>
                 <Value>NaN</Value>
@@ -1888,7 +1888,7 @@
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0.719</Value>
                 <Value>0.719</Value>
                 <Value>0.5</Value>
                 <Value>0.5</Value>
-                <Value>0.61</Value>
+                <Value>0x38E1</Value>
             </Parameter>
             </Parameter>
             <Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
             <Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
         </Row>
         </Row>
@@ -2003,10 +2003,10 @@
             <Parameter Name="Validation.Expected1">
             <Parameter Name="Validation.Expected1">
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
-                <Value>-0</Value>
-                <Value>-0</Value>
-                <Value>0</Value>
-                <Value>0</Value>
+                <Value>1.0</Value>
+                <Value>1.0</Value>
+                <Value>1.0</Value>
+                <Value>1.0</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>0.987344</Value>
                 <Value>0.987344</Value>
                 <Value>0.987344</Value>
                 <Value>0.987344</Value>
@@ -2074,25 +2074,25 @@
                 <Value>-denorm</Value>
                 <Value>-denorm</Value>
                 <Value>-0</Value>
                 <Value>-0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
-                <Value>denorm</Value>
+                <Value>0x03FF</Value>
                 <Value>Inf</Value>
                 <Value>Inf</Value>
                 <Value>-1</Value>
                 <Value>-1</Value>
                 <Value>16.0</Value>
                 <Value>16.0</Value>
                 <Value>256.0</Value>
                 <Value>256.0</Value>
-                <Value>65500</Value>
+                <Value>0x7bff</Value>
             </Parameter>
             </Parameter>
             <Parameter Name="Validation.Expected1">
             <Parameter Name="Validation.Expected1">
+                <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>-Inf</Value>
                 <Value>-Inf</Value>
-                <Value>-Inf</Value>
-                <Value>Inf</Value>
                 <Value>Inf</Value>
                 <Value>Inf</Value>
+                <Value>0x5800</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>0.25</Value>
                 <Value>0.25</Value>
                 <Value>0.0625</Value>
                 <Value>0.0625</Value>
-                <Value>0.00001526</Value>
+                <Value>0x1C00</Value>
             </Parameter>
             </Parameter>
             <Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
             <Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
         </Row>
         </Row>
@@ -2117,7 +2117,7 @@
                 <Value>-denorm</Value>
                 <Value>-denorm</Value>
                 <Value>-0</Value>
                 <Value>-0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
-                <Value>denorm</Value>
+                <Value>0x03FF</Value>
                 <Value>Inf</Value>
                 <Value>Inf</Value>
                 <Value>-1</Value>
                 <Value>-1</Value>
                 <Value>2</Value>
                 <Value>2</Value>
@@ -2127,13 +2127,13 @@
             <Parameter Name="Validation.Expected1">
             <Parameter Name="Validation.Expected1">
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
-                <Value>-0</Value>
-                <Value>-0</Value>
+                <Value>NaN</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
+                <Value>0x1FFF</Value>
                 <Value>Inf</Value>
                 <Value>Inf</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
-                <Value>1.41421356237</Value>
+                <Value>1.41421</Value>
                 <Value>4.0</Value>
                 <Value>4.0</Value>
                 <Value>16.0</Value>
                 <Value>16.0</Value>
             </Parameter>
             </Parameter>
@@ -2203,7 +2203,7 @@
                 l.output2 = max(l.input1, l.input2);
                 l.output2 = max(l.input1, l.input2);
                 g_buf[GI] = l;
                 g_buf[GI] = l;
             };</Parameter>
             };</Parameter>
-            <Parameter Name="ShaderOp.Target">cs_6_0</Parameter>
+            <Parameter Name="ShaderOp.Target">cs_6_2</Parameter>
             <Parameter Name="Validation.Input1">
             <Parameter Name="Validation.Input1">
                 <Value>-inf</Value>
                 <Value>-inf</Value>
                 <Value>-inf</Value>
                 <Value>-inf</Value>
@@ -2280,6 +2280,7 @@
                 <Value>-1.0</Value>
                 <Value>-1.0</Value>
                 <Value>1.0</Value>
                 <Value>1.0</Value>
             </Parameter>
             </Parameter>
+            <Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
         </Row>
         </Row>
         <Row Name="FMulHalf">
         <Row Name="FMulHalf">
             <Parameter Name="Validation.Type">ulp</Parameter>
             <Parameter Name="Validation.Type">ulp</Parameter>
@@ -2422,10 +2423,9 @@
             <Parameter Name="Validation.Input1">
             <Parameter Name="Validation.Input1">
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>-Inf</Value>
                 <Value>-Inf</Value>
-                <Value>-denorm</Value>
+                <Value>0x03FF</Value>
                 <Value>-0</Value>
                 <Value>-0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
-                <Value>denorm</Value>
                 <Value>Inf</Value>
                 <Value>Inf</Value>
                 <Value>1.0</Value>
                 <Value>1.0</Value>
                 <Value>-1.0</Value>
                 <Value>-1.0</Value>
@@ -2436,10 +2436,9 @@
             <Parameter Name="Validation.Input2">
             <Parameter Name="Validation.Input2">
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>-Inf</Value>
                 <Value>-Inf</Value>
-                <Value>-denorm</Value>
+                <Value>1</Value>
                 <Value>-0</Value>
                 <Value>-0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
-                <Value>denorm</Value>
                 <Value>Inf</Value>
                 <Value>Inf</Value>
                 <Value>1.0</Value>
                 <Value>1.0</Value>
                 <Value>-1.0</Value>
                 <Value>-1.0</Value>
@@ -2450,10 +2449,9 @@
             <Parameter Name="Validation.Input3">
             <Parameter Name="Validation.Input3">
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>-Inf</Value>
                 <Value>-Inf</Value>
-                <Value>-denorm</Value>
+                <Value>0x03FF</Value>
                 <Value>-0</Value>
                 <Value>-0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
-                <Value>denorm</Value>
                 <Value>Inf</Value>
                 <Value>Inf</Value>
                 <Value>1.0</Value>
                 <Value>1.0</Value>
                 <Value>-1.0</Value>
                 <Value>-1.0</Value>
@@ -2464,8 +2462,7 @@
             <Parameter Name="Validation.Expected1">
             <Parameter Name="Validation.Expected1">
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
                 <Value>NaN</Value>
-                <Value>0</Value>
-                <Value>0</Value>
+                <Value>0x07FE</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>Inf</Value>
                 <Value>Inf</Value>
@@ -3537,7 +3534,7 @@
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>0</Value>
                 <Value>40</Value>
                 <Value>40</Value>
-                <Value>10001</Value>
+                <Value>10100</Value>
                 <Value>0</Value>
                 <Value>0</Value>
             </Parameter>
             </Parameter>
             <Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
             <Parameter Name="ShaderOp.Arguments">-enable-16bit-types</Parameter>
@@ -3839,7 +3836,7 @@
             <Parameter Name="Validation.Expected1">
             <Parameter Name="Validation.Expected1">
                 <Value>-32768</Value>
                 <Value>-32768</Value>
                 <Value>-20</Value>
                 <Value>-20</Value>
-                <Value>-3114</Value>
+                <Value>3114</Value>
                 <Value>-272</Value>
                 <Value>-272</Value>
                 <Value>-5</Value>
                 <Value>-5</Value>
                 <Value>32767</Value>
                 <Value>32767</Value>

+ 45 - 19
utils/hct/hctdb_test.py

@@ -546,9 +546,11 @@ g_denorm_tests = ["FAddDenormAny", "FAddDenormFTZ", "FAddDenormPreserve",
                 "FMinDenormAny", "FMinDenormFTZ", "FMinDenormPreserve",
                 "FMinDenormAny", "FMinDenormFTZ", "FMinDenormPreserve",
                 "FMaxDenormAny", "FMaxDenormFTZ", "FMaxDenormPreserve"]
                 "FMaxDenormAny", "FMaxDenormFTZ", "FMaxDenormPreserve"]
 # This is a collection of test case for driver tests per instruction
 # This is a collection of test case for driver tests per instruction
-# Warning: For test cases, when you want to pass in signed integer,
+# Warning: For test cases, when you want to pass in signed 32-bit integer,
 # make sure to pass in negative numbers with decimal values instead of hexadecimal representation.
 # make sure to pass in negative numbers with decimal values instead of hexadecimal representation.
 # For some reason, TAEF is not handling them properly.
 # For some reason, TAEF is not handling them properly.
+# For half values, hex is preferable since the test framework will read string as float values
+# and convert them to float16, possibly losing precision. The test will read hex values as it is.
 def add_test_cases():
 def add_test_cases():
     nan = float('nan')
     nan = float('nan')
     p_inf = float('inf')
     p_inf = float('inf')
@@ -566,8 +568,8 @@ def add_test_cases():
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-314',
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-314',
         '314'
         '314'
     ]], half_outputs=[[
     ]], half_outputs=[[
-        'NaN', 'NaN', '-0', '-0', '0', '0', 'NaN', '-0.1585929',
-        '0.1585929'
+        'NaN', 'NaN', '-0', '-0', '0', '0', 'NaN', '0.1585929',
+        '-0.1585929'
     ]])
     ]])
     add_test_case_float_half('Cos', ['Cos'], 'Epsilon', 0.0008, [[
     add_test_case_float_half('Cos', ['Cos'], 'Epsilon', 0.0008, [[
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-314.16',
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-314.16',
@@ -579,7 +581,7 @@ def add_test_cases():
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-314',
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-314',
         '314'
         '314'
     ]], half_outputs=[[
     ]], half_outputs=[[
-        'NaN', 'NaN', '-0', '-0', '0', '0', 'NaN', '0.987344',
+        'NaN', 'NaN', '1.0', '1.0', '1.0', '1.0', 'NaN', '0.987344',
         '0.987344'
         '0.987344'
     ]])
     ]])
     add_test_case_float_half('Tan', ['Tan'], 'Epsilon', 0.0008, [[
     add_test_case_float_half('Tan', ['Tan'], 'Epsilon', 0.0008, [[
@@ -641,10 +643,10 @@ def add_test_cases():
         '0.611'
         '0.611'
     ]], "unary float", "frac",
     ]], "unary float", "frac",
         half_inputs=[['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '2.719',
         half_inputs=[['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '2.719',
-        '1000.5', '-7.39']],
+        '1000.5', '0xC764']],
         half_outputs=[[
         half_outputs=[[
          'NaN', 'NaN', '0', '0', '0', '0', 'NaN', '0', '0.719', '0.5',
          'NaN', 'NaN', '0', '0', '0', '0', 'NaN', '0', '0.719', '0.5',
-        '0.61']])
+        '0x38E1']])
     add_test_case_float_half('Log', ['Log'], 'Relative', 21, [[
     add_test_case_float_half('Log', ['Log'], 'Relative', 21, [[
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1',
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1',
         '2.718281828', '7.389056', '100'
         '2.718281828', '7.389056', '100'
@@ -662,9 +664,11 @@ def add_test_cases():
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '2',
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '2',
         '16.0', '256.0'
         '16.0', '256.0'
     ]], [[
     ]], [[
-        'NaN', 'NaN', '-0', '-0', '0', '0', 'Inf', 'NaN', '1.41421356237',
+        'NaN', 'NaN', 'NaN', '-0', '0', '0', 'Inf', 'NaN', '1.41421356237',
         '4.0', '16.0'
         '4.0', '16.0'
-    ]], "unary float", "sqrt")
+    ]], "unary float", "sqrt",
+    half_inputs=[['NaN', '-Inf', '-denorm', '-0', '0', '0x03FF', 'Inf', '-1', '2', '16.0', '256.0']],
+    half_outputs=[['NaN', 'NaN', 'NaN', '0', '0', '0x1FFF', 'Inf', 'NaN', '1.41421', '4.0', '16.0']])
     add_test_case_float_half('Rsqrt', ['Rsqrt'], 'ulp', 1, [[
     add_test_case_float_half('Rsqrt', ['Rsqrt'], 'ulp', 1, [[
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '16.0',
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '16.0',
         '256.0', '65536.0'
         '256.0', '65536.0'
@@ -672,11 +676,11 @@ def add_test_cases():
         'NaN', 'NaN', '-Inf', '-Inf', 'Inf', 'Inf', '0', 'NaN', '0.25',
         'NaN', 'NaN', '-Inf', '-Inf', 'Inf', 'Inf', '0', 'NaN', '0.25',
         '0.0625', '0.00390625'
         '0.0625', '0.00390625'
     ]], "unary float", "rsqrt", half_inputs=[[
     ]], "unary float", "rsqrt", half_inputs=[[
-        'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '-1', '16.0',
-        '256.0', '65500'
+        'NaN', '-Inf', '-denorm', '-0', '0', '0x03FF', 'Inf', '-1', '16.0',
+        '256.0', '0x7bff'
     ]], half_outputs=[[
     ]], half_outputs=[[
-        'NaN', 'NaN', '-Inf', '-Inf', 'Inf', 'Inf', '0', 'NaN', '0.25',
-        '0.0625', '0.00001526'
+        'NaN', 'NaN', 'NaN', '-Inf', 'Inf', '0x5800', '0', 'NaN', '0.25',
+        '0.0625', '0x1C00'
     ]])
     ]])
     add_test_case_float_half('Round_ne', ['Round_ne'], 'Epsilon', 0, [[
     add_test_case_float_half('Round_ne', ['Round_ne'], 'Epsilon', 0, [[
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
@@ -691,12 +695,22 @@ def add_test_cases():
     ]], [[
     ]], [[
         'NaN', '-Inf', '-0', '-0', '0', '0', 'Inf', '10.0', '10.0', '10.0',
         'NaN', '-Inf', '-0', '-0', '0', '0', 'Inf', '10.0', '10.0', '10.0',
         '10.0', '-10.0', '-11.0', '-11.0', '-11.0'
         '10.0', '-10.0', '-11.0', '-11.0', '-11.0'
-    ]], "unary float", "floor")
+    ]], "unary float", "floor", half_inputs=[[
+        'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
+        '10.5', '10.6', '-10.0', '-10.4', '-10.5', '-10.6'
+    ]], half_outputs=[[
+        'NaN', '-Inf', '-1', '-0', '0', '0', 'Inf', '10.0', '10.0', '10.0',
+        '10.0', '-10.0', '-11.0', '-11.0', '-11.0'
+    ]])
     add_test_case_float_half('Round_pi', ['Round_pi'], 'Epsilon', 0,
     add_test_case_float_half('Round_pi', ['Round_pi'], 'Epsilon', 0,
         [['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
         [['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
         '10.5', '10.6', '-10.0', '-10.4', '-10.5', '-10.6']],
         '10.5', '10.6', '-10.0', '-10.4', '-10.5', '-10.6']],
         [['NaN', '-Inf', '-0', '-0', '0', '0', 'Inf', '10.0', '11.0', '11.0',
         [['NaN', '-Inf', '-0', '-0', '0', '0', 'Inf', '10.0', '11.0', '11.0',
-        '11.0', '-10.0', '-10.0', '-10.0', '-10.0']], "unary float", "ceil")
+        '11.0', '-10.0', '-10.0', '-10.0', '-10.0']], "unary float", "ceil",
+        half_inputs=[['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
+        '10.5', '10.6', '-10.0', '-10.4', '-10.5', '-10.6']],
+        half_outputs=[['NaN', '-Inf', '-0', '-0', '0', '1', 'Inf', '10.0', '11.0', '11.0',
+        '11.0', '-10.0', '-10.0', '-10.0', '-10.0']])
     add_test_case_float_half('Round_z', ['Round_z'], 'Epsilon', 0,
     add_test_case_float_half('Round_z', ['Round_z'], 'Epsilon', 0,
         [['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
         [['NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '10.0', '10.4',
         '10.5', '10.6', '-10.0', '-10.4', '-10.5', '-10.6']],
         '10.5', '10.6', '-10.0', '-10.4', '-10.5', '-10.6']],
@@ -753,7 +767,7 @@ def add_test_cases():
     ], [
     ], [
         '-inf', 'inf', '1.0', '-inf', 'inf', 'inf', 'inf', 'inf', '-inf',
         '-inf', 'inf', '1.0', '-inf', 'inf', 'inf', 'inf', 'inf', '-inf',
         'inf', '1.0', 'NaN', '1.0', 'inf', '1.0', '-1.0', '1.0'
         'inf', '1.0', 'NaN', '1.0', 'inf', '1.0', '-1.0', '1.0'
-    ]], 'cs_6_0', ''' struct SBinaryHalfOp {
+    ]], 'cs_6_2', ''' struct SBinaryHalfOp {
                 half input1;
                 half input1;
                 half input2;
                 half input2;
                 half output1;
                 half output1;
@@ -766,7 +780,7 @@ def add_test_cases():
                 l.output1 = min(l.input1, l.input2);
                 l.output1 = min(l.input1, l.input2);
                 l.output2 = max(l.input1, l.input2);
                 l.output2 = max(l.input1, l.input2);
                 g_buf[GI] = l;
                 g_buf[GI] = l;
-            };''')
+            };''', shader_arguments="-enable-16bit-types")
     add_test_case_float_half('FAdd', ['FAdd'], 'ulp', 1, [['-1.0', '1.0', '32.5', '1.0000001000'],['4', '5.5', '334.7', '0.5000001000']], [['3.0', '6.5', '367.2', '1.5000002000']],
     add_test_case_float_half('FAdd', ['FAdd'], 'ulp', 1, [['-1.0', '1.0', '32.5', '1.0000001000'],['4', '5.5', '334.7', '0.5000001000']], [['3.0', '6.5', '367.2', '1.5000002000']],
     "binary float", "+")
     "binary float", "+")
     add_test_case_float_half('FSub', ['FSub'], 'ulp', 1, [['-1.0', '5.5', '32.5', '1.0000001000'],['4', '1.25', '334.7', '0.5000001000']], [['-5', '4.25', '-302.2', '0.5000']],
     add_test_case_float_half('FSub', ['FSub'], 'ulp', 1, [['-1.0', '5.5', '32.5', '1.0000001000'],['4', '1.25', '334.7', '0.5000001000']], [['-5', '4.25', '-302.2', '0.5000']],
@@ -808,7 +822,18 @@ def add_test_cases():
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '1.0', '-1.0',
         'NaN', '-Inf', '-denorm', '-0', '0', 'denorm', 'Inf', '1.0', '-1.0',
         '1', '0', '-5.5'
         '1', '0', '-5.5'
     ]], [['NaN', 'NaN', '0', '0', '0', '0', 'Inf', '2', '0', '1', '1', '9.5']],
     ]], [['NaN', 'NaN', '0', '0', '0', '0', 'Inf', '2', '0', '1', '1', '9.5']],
-                  "tertiary float", "mad")
+                 "tertiary float", "mad",
+    half_inputs=[[
+        'NaN', '-Inf', '0x03FF', '-0', '0', 'Inf', '1.0', '-1.0',
+        '0', '1', '1.5'
+    ], [
+        'NaN', '-Inf', '1', '-0', '0', 'Inf', '1.0', '-1.0',
+        '0', '1', '10'
+    ], [
+        'NaN', '-Inf', '0x03FF', '-0', '0', 'Inf', '1.0', '-1.0',
+        '1', '0', '-5.5'
+    ]],
+    half_outputs=[['NaN', 'NaN', '0x07FE', '0', '0', 'Inf', '2', '0', '1', '1', '9.5']])
 
 
     # Denorm Tertiary Float
     # Denorm Tertiary Float
     add_test_case_denorm('FMadDenorm', ['FMad'], 'ulp', 1,
     add_test_case_denorm('FMadDenorm', ['FMad'], 'ulp', 1,
@@ -882,7 +907,7 @@ def add_test_cases():
             "binary int", "-",
             "binary int", "-",
             input_16=[[int16_min, '-10', '0', '0', '10', int16_max],
             input_16=[[int16_min, '-10', '0', '0', '10', int16_max],
                       ['0', '10', '-3114', '272', '15', '0']],
                       ['0', '10', '-3114', '272', '15', '0']],
-            output_16=[[int16_min, '-20', '-3114', '-272', '-5', int16_max]])
+            output_16=[[int16_min, '-20', '3114', '-272', '-5', int16_max]])
     add_test_case_int('IMax', ['IMax'], 'Epsilon', 0,
     add_test_case_int('IMax', ['IMax'], 'Epsilon', 0,
                   [[int32_min, '-10', '0', '0', '10', int32_max],
                   [[int32_min, '-10', '0', '0', '10', int32_max],
                    ['0', '10', '-10', '10', '10', '0']],
                    ['0', '10', '-10', '10', '10', '0']],
@@ -1011,7 +1036,7 @@ def add_test_cases():
                   "binary uint", "*",
                   "binary uint", "*",
                   input_16=[['0', '0', '10', '100', int16_max],
                   input_16=[['0', '0', '10', '100', int16_max],
                             ['0', '256', '4', '101', '0']],
                             ['0', '256', '4', '101', '0']],
-                  output_16=[['0', '0', '40', '10001', '0']])
+                  output_16=[['0', '0', '40', '10100', '0']])
     add_test_case('UDiv', ['UDiv', 'URem'], 'Epsilon', 0,
     add_test_case('UDiv', ['UDiv', 'URem'], 'Epsilon', 0,
         [['1', '1', '10', '10000', int32_max, int32_max, '0xffffffff'],
         [['1', '1', '10', '10000', int32_max, int32_max, '0xffffffff'],
          ['0', '256', '4', '10001', '0', int32_max, '1']],
          ['0', '256', '4', '10001', '0', int32_max, '1']],
@@ -1669,6 +1694,7 @@ def generate_table_for_taef():
                 print(cur_inst.dxil_class)
                 print(cur_inst.dxil_class)
         tree._setroot(root)
         tree._setroot(root)
         tree.write(f)
         tree.write(f)
+        print("Saved file at: " + f.name)
         f.close()
         f.close()
 
 
 def print_untested_inst():
 def print_untested_inst():