Ver Fonte

[spirv] Support for 'umad' intrinsic function. (#2512)

Ehsan há 6 anos atrás
pai
commit
e1a22a2c88

+ 1 - 0
tools/clang/lib/SPIRV/SpirvEmitter.cpp

@@ -6945,6 +6945,7 @@ SpirvEmitter::processIntrinsicCallExpr(const CallExpr *callExpr) {
     retVal = processIntrinsicLit(callExpr);
     retVal = processIntrinsicLit(callExpr);
     break;
     break;
   case hlsl::IntrinsicOp::IOP_mad:
   case hlsl::IntrinsicOp::IOP_mad:
+  case hlsl::IntrinsicOp::IOP_umad:
     retVal = processIntrinsicMad(callExpr);
     retVal = processIntrinsicMad(callExpr);
     break;
     break;
   case hlsl::IntrinsicOp::IOP_modf:
   case hlsl::IntrinsicOp::IOP_modf:

+ 58 - 0
tools/clang/test/CodeGenSPIRV/intrinsics.umad.hlsl

@@ -0,0 +1,58 @@
+// Run: %dxc -T vs_6_0 -E main
+
+// CHECK: OpDecorate [[mul1:%\d+]] NoContraction
+// CHECK: OpDecorate [[add1:%\d+]] NoContraction
+// CHECK: OpDecorate [[mul2:%\d+]] NoContraction
+// CHECK: OpDecorate [[add2:%\d+]] NoContraction
+// CHECK: OpDecorate [[mul3:%\d+]] NoContraction
+// CHECK: OpDecorate [[add3:%\d+]] NoContraction
+// CHECK: OpDecorate [[mul4:%\d+]] NoContraction
+// CHECK: OpDecorate [[add4:%\d+]] NoContraction
+
+void main() {
+  uint    d1, d2, d3;
+  uint4   e1, e2, e3;
+  uint2x3 f1, f2, f3;
+  int fma_d;
+  int4 fma_e;
+  int2x3 fma_f;
+
+// CHECK:       [[d1:%\d+]] = OpLoad %uint %d1
+// CHECK-NEXT:  [[d2:%\d+]] = OpLoad %uint %d2
+// CHECK-NEXT:  [[d3:%\d+]] = OpLoad %uint %d3
+// CHECK-NEXT:     [[mul1]] = OpIMul %uint [[d1]] [[d2]]
+// CHECK-NEXT:     [[add1]] = OpIAdd %uint [[mul1]] [[d3]]
+// CHECK-NEXT:     {{%\d+}} = OpBitcast %int [[add1]]
+  fma_d = mad(d1, d2, d3);
+
+// CHECK:       [[e1:%\d+]] = OpLoad %v4uint %e1
+// CHECK-NEXT:  [[e2:%\d+]] = OpLoad %v4uint %e2
+// CHECK-NEXT:  [[e3:%\d+]] = OpLoad %v4uint %e3
+// CHECK-NEXT:     [[mul2]] = OpIMul %v4uint [[e1]] [[e2]]
+// CHECK-NEXT:     [[add2]] = OpIAdd %v4uint [[mul2]] [[e3]]
+// CHECK-NEXT:     {{%\d+}} = OpBitcast %v4int [[add2]]
+  fma_e = mad(e1, e2, e3);
+
+// CHECK:           [[f1:%\d+]] = OpLoad %_arr_v3uint_uint_2 %f1
+// CHECK-NEXT:      [[f2:%\d+]] = OpLoad %_arr_v3uint_uint_2 %f2
+// CHECK-NEXT:      [[f3:%\d+]] = OpLoad %_arr_v3uint_uint_2 %f3
+// CHECK-NEXT:  [[f1row0:%\d+]] = OpCompositeExtract %v3uint [[f1]] 0
+// CHECK-NEXT:  [[f2row0:%\d+]] = OpCompositeExtract %v3uint [[f2]] 0
+// CHECK-NEXT:  [[f3row0:%\d+]] = OpCompositeExtract %v3uint [[f3]] 0
+// CHECK-NEXT:         [[mul3]] = OpIMul %v3uint [[f1row0]] [[f2row0]]
+// CHECK-NEXT:         [[add3]] = OpIAdd %v3uint [[mul3]] [[f3row0]]
+// CHECK-NEXT:  [[f1row1:%\d+]] = OpCompositeExtract %v3uint [[f1]] 1
+// CHECK-NEXT:  [[f2row1:%\d+]] = OpCompositeExtract %v3uint [[f2]] 1
+// CHECK-NEXT:  [[f3row1:%\d+]] = OpCompositeExtract %v3uint [[f3]] 1
+// CHECK-NEXT:         [[mul4]] = OpIMul %v3uint [[f1row1]] [[f2row1]]
+// CHECK-NEXT:         [[add4]] = OpIAdd %v3uint [[mul4]] [[f3row1]]
+// CHECK-NEXT:     [[mat:%\d+]] = OpCompositeConstruct %_arr_v3uint_uint_2 [[add3]] [[add4]]
+// CHECK-NEXT: [[matrow0:%\d+]] = OpCompositeExtract %v3uint [[mat]] 0
+// CHECK-NEXT:[[umatrow0:%\d+]] = OpBitcast %v3int [[matrow0]]
+// CHECK-NEXT: [[matrow1:%\d+]] = OpCompositeExtract %v3uint [[mat]] 1
+// CHECK-NEXT:[[umatrow1:%\d+]] = OpBitcast %v3int [[matrow1]]
+// CHECK-NEXT:         {{%\d+}} = OpCompositeConstruct %_arr_v3int_uint_2 [[umatrow0]] [[umatrow1]]
+
+  fma_f = mad(f1, f2, f3);
+}
+

+ 1 - 0
tools/clang/unittests/SPIRV/CodeGenSpirvTest.cpp

@@ -1072,6 +1072,7 @@ TEST_F(FileTest, IntrinsicsModfWithSwizzling) {
   runFileTest("intrinsics.modf.swizzle.hlsl");
   runFileTest("intrinsics.modf.swizzle.hlsl");
 }
 }
 TEST_F(FileTest, IntrinsicsMad) { runFileTest("intrinsics.mad.hlsl"); }
 TEST_F(FileTest, IntrinsicsMad) { runFileTest("intrinsics.mad.hlsl"); }
+TEST_F(FileTest, IntrinsicsUMad) { runFileTest("intrinsics.umad.hlsl"); }
 TEST_F(FileTest, IntrinsicsMax) { runFileTest("intrinsics.max.hlsl"); }
 TEST_F(FileTest, IntrinsicsMax) { runFileTest("intrinsics.max.hlsl"); }
 TEST_F(FileTest, IntrinsicsMsad4) { runFileTest("intrinsics.msad4.hlsl"); }
 TEST_F(FileTest, IntrinsicsMsad4) { runFileTest("intrinsics.msad4.hlsl"); }
 TEST_F(FileTest, IntrinsicsNormalize) {
 TEST_F(FileTest, IntrinsicsNormalize) {