More constant folding
Added constant folding for:
rad, deg, sin, cos, tan, asin, acos, atan, sinh, cosh, tanh,
asinh, acosh, atanh, log, log2, exp, exp2, sqrt, inverstsqrt
Change-Id: Ifc6b089e5981da9a3739d4ed7636953a682ce220
Reviewed-on: https://swiftshader-review.googlesource.com/5200
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/compiler/Intermediate.cpp b/src/OpenGL/compiler/Intermediate.cpp
index 688f84a..00d3e24 100644
--- a/src/OpenGL/compiler/Intermediate.cpp
+++ b/src/OpenGL/compiler/Intermediate.cpp
@@ -1666,7 +1666,167 @@
return 0;
}
break;
- default:
+ case EOpRadians:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(unionArray[i].getFConst() * 1.74532925e-2f); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpDegrees:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(unionArray[i].getFConst() * 5.72957795e+1f); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpSin:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(sinf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpCos:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(cosf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpTan:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(tanf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpAsin:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(asinf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpAcos:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(acosf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpAtan:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(atanf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpSinh:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(sinhf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpCosh:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(coshf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpTanh:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(tanhf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpAsinh:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(asinhf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpAcosh:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(acoshf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpAtanh:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(atanhf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpLog:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(logf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpLog2:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(log2f(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpExp:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(expf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpExp2:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(exp2f(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpSqrt:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(sqrtf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ case EOpInverseSqrt:
+ switch(getType().getBasicType()) {
+ case EbtFloat: tempConstArray[i].setFConst(1.0f / sqrtf(unionArray[i].getFConst())); break;
+ default:
+ infoSink.info.message(EPrefixInternalError, "Unary operation not folded into constant", getLine());
+ return 0;
+ }
+ break;
+ default:
return 0;
}
}