瀏覽代碼

Change normalize implementation. (#1641)

* Change normalize implementation.
  From  a / length(a) to a * (rsqrt(dot(a))).
Xiang Li 6 年之前
父節點
當前提交
0be0bcbda5

+ 24 - 17
lib/HLSL/HLOperationLower.cpp

@@ -1905,23 +1905,6 @@ Value *TranslateFWidth(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
   return Builder.CreateFAdd(absDdx, absDdy);
 }
 
-Value *TranslateNormalize(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
-                          HLOperationLowerHelper &helper,  HLObjectOperationLowerHelper *pObjHelper, bool &Translated) {
-  hlsl::OP *hlslOP = &helper.hlslOP;
-  Type *Ty = CI->getType();
-  Value *op = CI->getArgOperand(HLOperandIndex::kUnaryOpSrc0Idx);
-  IRBuilder<> Builder(CI);
-  Value *length = TranslateLength(CI, op, hlslOP);
-  if (Ty != length->getType()) {
-    VectorType *VT = cast<VectorType>(Ty);
-    Value *vecLength = UndefValue::get(VT);
-    for (unsigned i = 0; i < VT->getNumElements(); i++)
-      vecLength = Builder.CreateInsertElement(vecLength, length, i);
-    length = vecLength;
-  }
-  return Builder.CreateFDiv(op, length);
-}
-
 Value *TranslateLerp(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
                      HLOperationLowerHelper &helper,  HLObjectOperationLowerHelper *pObjHelper, bool &Translated) {
   // x + s(y-x)
@@ -2019,6 +2002,30 @@ Value *TranslateDot(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
   }
 }
 
+Value *TranslateNormalize(CallInst *CI, IntrinsicOp IOP, OP::OpCode opcode,
+                          HLOperationLowerHelper &helper,
+                          HLObjectOperationLowerHelper *pObjHelper,
+                          bool &Translated) {
+  hlsl::OP *hlslOP = &helper.hlslOP;
+  Type *Ty = CI->getType();
+  Value *op = CI->getArgOperand(HLOperandIndex::kUnaryOpSrc0Idx);
+  VectorType *VT = cast<VectorType>(Ty);
+  unsigned vecSize = VT->getNumElements();
+
+  IRBuilder<> Builder(CI);
+  Value *dot = TranslateFDot(op, op, vecSize, hlslOP, Builder);
+  DXIL::OpCode rsqrtOp = DXIL::OpCode::Rsqrt;
+  Function *dxilRsqrt = hlslOP->GetOpFunc(rsqrtOp, VT->getElementType());
+  Value *rsqrt = Builder.CreateCall(
+      dxilRsqrt, {hlslOP->GetI32Const((unsigned)rsqrtOp), dot},
+      hlslOP->GetOpCodeName(rsqrtOp));
+  Value *vecRsqrt = UndefValue::get(VT);
+  for (unsigned i = 0; i < VT->getNumElements(); i++)
+    vecRsqrt = Builder.CreateInsertElement(vecRsqrt, rsqrt, i);
+
+  return Builder.CreateFMul(op, vecRsqrt);
+}
+
 Value *TranslateReflect(CallInst *CI, IntrinsicOp IOP, OP::OpCode op,
                         HLOperationLowerHelper &helper,  HLObjectOperationLowerHelper *pObjHelper, bool &Translated) {
   hlsl::OP *hlslOP = &helper.hlslOP;

+ 2 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/ContactHardeningShadows11_VS.hlsl

@@ -1,6 +1,7 @@
 // RUN: %dxc -E main -T vs_6_0 %s | FileCheck %s
 
-// CHECK: Sqrt
+// CHECK: dot3
+// CHECK: Rsqrt
 // CHECK: dot3
 // CHECK: storeOutput
 

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/DecalTessellation11_HS.hlsl

@@ -1,6 +1,6 @@
 // RUN: %dxc -E main -T hs_6_0 %s | FileCheck %s
 
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: dot3
 // CHECK: Saturate
 // CHECK: FMax

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/DecalTessellation11_PS.hlsl

@@ -1,6 +1,6 @@
 // RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
 
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: sample
 // CHECK: sample
 // CHECK: dot3

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/DetailTessellation11_PS.hlsl

@@ -1,7 +1,7 @@
 // RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
 
 // CHECK: sample
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: sample
 // CHECK: dot3
 // CHECK: Saturate

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/DetailTessellation11_TessVS.hlsl

@@ -1,6 +1,6 @@
 // RUN: %dxc -E main -T vs_6_0 %s | FileCheck %s
 
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: storeOutput
 
 //--------------------------------------------------------------------------------------

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/DetailTessellation11_VS.hlsl

@@ -1,6 +1,6 @@
 // RUN: %dxc -E main -T vs_6_0 %s | FileCheck %s
 
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: storeOutput
 
 //--------------------------------------------------------------------------------------

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/PNTriangles11_DS.hlsl

@@ -4,7 +4,7 @@
 // CHECK: domainLocation
 // CHECK: domainLocation
 // CHECK: domainLocation
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: dot3
 // CHECK: FMax
 // CHECK: storeOutput

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/PNTriangles11_HS.hlsl

@@ -1,7 +1,7 @@
 // RUN: %dxc -E main -T hs_6_0 %s | FileCheck %s
 
 // CHECK: dot3
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: dot3
 // CHECK: storePatchConstant
 // CHECK: main

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/PNTriangles11_TessVS.hlsl

@@ -1,6 +1,6 @@
 // RUN: %dxc -E main -T vs_6_0 %s | FileCheck %s
 
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: storeOutput
 
 //--------------------------------------------------------------------------------------

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/PNTriangles11_VS.hlsl

@@ -1,6 +1,6 @@
 // RUN: %dxc -E main -T vs_6_0 %s | FileCheck %s
 
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: FMax
 // CHECK: storeOutput
 

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/SimpleBezier11DS.hlsl

@@ -2,7 +2,7 @@
 
 // CHECK: domainLocation
 // CHECK: domainLocation
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: storeOutput
 
 //--------------------------------------------------------------------------------------

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/SimpleBezier11PS.hlsl

@@ -1,6 +1,6 @@
 // RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
 
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: dot3
 // CHECK: storeOutput
 

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/SubD11_BezierEvalDS.hlsl

@@ -3,7 +3,7 @@
 // CHECK: domainLocation
 // CHECK: domainLocation
 // CHECK: loadPatchConstant
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: sampleLevel
 // CHECK: storeOutput
 

+ 1 - 1
tools/clang/test/CodeGenHLSL/Samples/DX11/SubD11_SmoothPS.hlsl

@@ -9,7 +9,7 @@
 // CHECK: sample
 // CHECK: Log
 // CHECK: Exp
-// CHECK: Sqrt
+// CHECK: Rsqrt
 // CHECK: dot3
 // CHECK: Saturate
 // CHECK: storeOutput

+ 9 - 0
tools/clang/test/CodeGenHLSL/quick-test/normalize.hlsl

@@ -0,0 +1,9 @@
+// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+
+// CHECK: Dot4
+// CHECK: Rsqrt
+
+float4 main(float4 a: A) : SV_TARGET
+{
+  return normalize(a);
+}

+ 9 - 0
tools/clang/test/CodeGenHLSL/quick-test/normalize_scalar.hlsl

@@ -0,0 +1,9 @@
+// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
+
+// CHECK: fmul
+// CHECK: Rsqrt
+
+float main(float a: A) : SV_TARGET
+{
+  return normalize(a);
+}