This is the mail archive of the
mailing list for the GCC project.
Re: [gfortran] Exponentiation by integral exponents
Paul Brook wrote:
On Tuesday 27 April 2004 23:07, Tobias Schlüter wrote:
Andrew Pinski wrote:
On Apr 27, 2004, at 17:14, Tobias Schlüter wrote:
FYI I have ported Andy's code for exponentiation by an integral
exponent to our tree. This is an implementation of Knuth's algorithm
You should not need it if you use __builtin_pow and you turn on
flag_unsafe_math_optimizations on. Maybe the best way is to have
to say expand __builtin_pow always.
Does the builtin recognize the case pow(x,(float)i), where i is an
integer? Then this sounds like a very good idea.
Maybe the way to indicate we always want to expand __builtin_pow would be to
pass the second parameter with an integer type. It may be easier to add
__builtin_powi to avoid needing polymorphic builtins.
Anyway, I tried to implement Andrew's suggestion as a quick'n'dirty
hack. Right now I get an ICE. What is the correct way to generate the
equivalent of a typecast in C?
What I tried was this: gfc_conv_power_op has this code:
type = TREE_TYPE (lse.expr);
kind = expr->op1->ts.kind;
/* Integer powers are expanded inline as multiplications. */
gfc_conv_integer_power (se, lse.expr, rse.expr);
Instead of calling gfc_integer_power and returning, I want to convert
rse.expr to the type of lse.expr. So I tried both of the following
(gfc_conv_expr_type has no explanatory comment, so I'm just guessing
that this might be the function I'm looking for):
gfc_conv_expr_type (&rse, expr->op2, type); // first try
rse.expr = convert (type, rse.expr); // second try
After that I select the function based on the type of lse.expr as in the
real case and continue as if rse.expr had not been int all the time.
What am I missing? I'm still within my first three hours of messing with
gcc trees, so I might well be missing the obvious.