aboutsummaryrefslogtreecommitdiff
path: root/Tools/CodeGen/CodeGenCactus.m
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@gmail.com>2012-06-13 15:23:39 -0400
committerErik Schnetter <schnetter@gmail.com>2012-06-13 15:23:39 -0400
commitf04167252e1c5da3bd846aa52a4e8fa393fc4dbf (patch)
treecf7e6bd552bfbe99b034f1515f6df22df7429f86 /Tools/CodeGen/CodeGenCactus.m
parent2cc55d1554b3b322d6197ad67871f1d633e760a7 (diff)
Correct expanding Scalar[]
Handle kmadd and friends. Do not produce / operator; use ScalarINV instead to prevent problems with integer operands.
Diffstat (limited to 'Tools/CodeGen/CodeGenCactus.m')
-rw-r--r--Tools/CodeGen/CodeGenCactus.m25
1 files changed, 16 insertions, 9 deletions
diff --git a/Tools/CodeGen/CodeGenCactus.m b/Tools/CodeGen/CodeGenCactus.m
index e847ae5..d56be11 100644
--- a/Tools/CodeGen/CodeGenCactus.m
+++ b/Tools/CodeGen/CodeGenCactus.m
@@ -668,14 +668,20 @@ DefFn[
kadd[x_,y_] -> x+y,
ksub[x_,y_] -> x-y,
kmul[x_,y_] -> x*y,
- kdiv[x_,y_] -> x/y,
+ kdiv[x_,y_] -> x*ScalarINV[y],
+
+ kmadd[x_,y_,z_] -> x*y+z,
+ kmsub[x_,y_,z_] -> x*y-z,
+ knmadd[x_,y_,z_] -> -(x*y+z),
+ knmsub[x_,y_,z_] -> -(x*y-z),
x_^2 -> ScalarSQR[x],
x_^3 -> ScalarCUB[x],
x_^4 -> ScalarQAD[x],
- x_^-2 -> 1/ScalarSQR[x],
- x_^-3 -> 1/ScalarCUB[x],
- x_^-4 -> 1/ScalarQAD[x]};
+ x_^-1 -> ScalarINV[x],
+ x_^-2 -> ScalarINV[ScalarSQR[x]],
+ x_^-3 -> ScalarINV[ScalarCUB[x]],
+ x_^-4 -> ScalarINV[ScalarQAD[x]]};
undoSomeVect[expr_] := (
expr
@@ -831,8 +837,7 @@ DefFn[
CalculationMacros[vectorise_:False] :=
CommentedBlock["Define macros used in calculations",
Map[{"#define ", #, "\n"} &,
- {"INITVALUE (42)",
- "QAD(x) (SQR(SQR(x)))"} ~Join~
+ {"INITVALUE (42)"} ~Join~
If[vectorise,
{"ScalarINV(x) ((CCTK_REAL)1.0 / (x))",
"ScalarSQR(x) ((x) * (x))",
@@ -840,10 +845,12 @@ CalculationMacros[vectorise_:False] :=
"ScalarQAD(x) (ScalarSQR(ScalarSQR(x)))",
"INV(x) (kdiv(ToReal(1.0),x))",
"SQR(x) (kmul(x,x))",
- "CUB(x) (kmul(x,SQR(x)))"},
- {"INV(x) ((1.0) / (x))",
+ "CUB(x) (kmul(x,SQR(x)))",
+ "QAD(x) (SQR(SQR(x)))"},
+ {"INV(x) ((CCTK_REAL)1.0 / (x))",
"SQR(x) ((x) * (x))",
- "CUB(x) ((x) * (x) * (x))"}]
+ "CUB(x) ((x) * SQR(x))",
+ "QAD(x) (SQR(SQR(x)))"}]
]];
End[];