Skip to content

Commit

Permalink
Vectorisation.m: Allow Powers to accumulate during vector optimisatio…
Browse files Browse the repository at this point in the history
…n and convert them to pow afterwards
  • Loading branch information
ianhinder committed Mar 19, 2014
1 parent 7a366eb commit eb79ae1
Showing 1 changed file with 8 additions and 2 deletions.
10 changes: 8 additions & 2 deletions Tools/CodeGen/Vectorisation.m
Expand Up @@ -156,7 +156,7 @@
kdiv[ToReal[0.0],x_] -> ToReal[0],
(* kdiv[x_,ToReal[0]] -> ToReal[nan], *)
(* kdiv[x_,ToReal[0.0]] -> ToReal[nan], *)
kdiv[x_,ToReal[y_]] -> kmul[x,ToReal[pow[y,-1]]],
kdiv[x_,ToReal[y_]] -> kmul[x,ToReal[1/y]],
kdiv[x_,kdiv[y_,z_]] -> kdiv[kmul[x,z],y],
kdiv[kdiv[x_,y_],z_] -> kdiv[x,kmul[y,z]],
kmul[x_,kdiv[y_,z_]] -> kdiv[kmul[x,y],z],
Expand All @@ -169,7 +169,7 @@
kmul[ToReal[a_],ToReal[b_]] -> ToReal[a b],
(* kdiv[ToReal[a_],ToReal[b_]] -> ToReal[a/b], *)
kmul[x:Except[_ToReal],ToReal[a_]] -> kmul[ToReal[a],x],
kdiv[x:Except[_ToReal],ToReal[y_]] -> kmul[ToReal[pow[y,-1]],x],
kdiv[x:Except[_ToReal],ToReal[y_]] -> kmul[ToReal[1/y],x],
kmul[kmul[ToReal[a_],x_],y_] -> kmul[ToReal[a],kmul[x,y]],
kmul[kmul[ToReal[a_],x_],
kmul[ToReal[b_],y_]] -> kmul[ToReal[a*b],kmul[x,y]],
Expand All @@ -193,6 +193,12 @@
kneg[kfabs[xx_]] -> kfnabs[xx],
kneg[kfnabs[xx_]] -> kfabs[xx]};


(* The above optimisations introduce divisions and multiplications
of unvectorised quantities which Mathematica sometimes converts
into Power. Hence, we need to convert these back to pow. *)
expr = expr //. {x:ToReal[_] :> (x /. {Power[y_, power_] :> pow[y,power]})};

(* FMA (fused multiply-add) *)
(* kmadd (x,y,z) = xy+z
kmsub (x,y,z) = xy-z
Expand Down

0 comments on commit eb79ae1

Please sign in to comment.