summaryrefslogtreecommitdiffstats
path: root/src/glsl/nir
diff options
context:
space:
mode:
authorKenneth Graunke <[email protected]>2016-01-27 15:31:53 -0800
committerKenneth Graunke <[email protected]>2016-01-27 15:34:50 -0800
commit32e4c5ae30240c6759257ef68e80055f4cf8d612 (patch)
tree64734113e009dc48bd857ae42902b60fb6a2e61f /src/glsl/nir
parent8f0ef9bbeb2932209f4bdc408f79c2313bd6ba51 (diff)
vtn: Make tanh implementation even stupider
The dEQP "precision" test tries to verify that the reference functions float sinh(float a) { return ((exp(a) - exp(-a)) / 2); } float cosh(float a) { return ((exp(a) + exp(-a)) / 2); } float tanh(float a) { return (sinh(a) / cosh(a)); } produce the same values as the built-ins. We simplified away the multiplication by 0.5 in the numerator and denominator, and apparently this causes them not to match for exactly 1 out of 13,632 values. So, put it back in, fixing the test, but making our code generation (and precision?) worse.
Diffstat (limited to 'src/glsl/nir')
-rw-r--r--src/glsl/nir/spirv/vtn_glsl450.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/src/glsl/nir/spirv/vtn_glsl450.c b/src/glsl/nir/spirv/vtn_glsl450.c
index 8d730168c08..219a9c7dc5f 100644
--- a/src/glsl/nir/spirv/vtn_glsl450.c
+++ b/src/glsl/nir/spirv/vtn_glsl450.c
@@ -545,12 +545,14 @@ handle_glsl450_alu(struct vtn_builder *b, enum GLSLstd450 entrypoint,
return;
case GLSLstd450Tanh:
- /* (e^x - e^(-x)) / (e^x + e^(-x)) */
+ /* (0.5 * (e^x - e^(-x))) / (0.5 * (e^x + e^(-x))) */
val->ssa->def =
- nir_fdiv(nb, nir_fsub(nb, build_exp(nb, src[0]),
- build_exp(nb, nir_fneg(nb, src[0]))),
- nir_fadd(nb, build_exp(nb, src[0]),
- build_exp(nb, nir_fneg(nb, src[0]))));
+ nir_fdiv(nb, nir_fmul(nb, nir_imm_float(nb, 0.5f),
+ nir_fsub(nb, build_exp(nb, src[0]),
+ build_exp(nb, nir_fneg(nb, src[0])))),
+ nir_fmul(nb, nir_imm_float(nb, 0.5f),
+ nir_fadd(nb, build_exp(nb, src[0]),
+ build_exp(nb, nir_fneg(nb, src[0])))));
return;
case GLSLstd450Asinh: