[Mesa-dev] [PATCH 4/6] Bitwise conversion operator support in ir_constant_expression.
Olivier Galibert
galibert at pobox.com
Sat May 19 23:28:18 PDT 2012
On Sat, May 19, 2012 at 11:59:24AM -0700, Jose Fonseca wrote:
>
>
> ----- Original Message -----
> > +/* This method is the only one supported by gcc. Unions in
> > particular
> > + * are iffy, and read-through-converted-pointer is killed by strict
> > + * aliasing. OTOH, the compiler sees through the memcpy, so the
> > + * resulting asm is reasonable.
> > + */
> > +static float
> > +bitcast_u2f(unsigned int u)
> > +{
> > + assert(sizeof(float) == sizeof(unsigned int));
> > + float f;
> > + memcpy(&f, &u, sizeof(f));
> > + return f;
> > +}
> > +
> > +static unsigned int
> > +bitcast_f2u(float f)
> > +{
> > + assert(sizeof(float) == sizeof(unsigned int));
> > + unsigned int u;
> > + memcpy(&u, &f, sizeof(f));
> > + return u;
> > +}
> > +
[...]
> > ir_constant *
> > ir_rvalue::constant_expression_value(struct hash_table
> > *variable_context)
> > {
> > @@ -207,6 +230,30 @@ ir_expression::constant_expression_value(struct
> > hash_table *variable_context)
> > data.u[c] = op[0]->value.i[c];
> > }
> > break;
> > + case ir_unop_bitcast_i2f:
> > + assert(op[0]->type->base_type == GLSL_TYPE_INT);
> > + for (unsigned c = 0; c < op[0]->type->components(); c++) {
> > + data.f[c] = bitcast_u2f(op[0]->value.i[c]);
>
> Shouldn't it be bitcast_i2f ?
No, these are the immediate execution paths, which call the C
functions up there. Doing a signed version would be redundant and
would result in strictly identical asm, the implicit (bit-identical)
conversion there is perfectly appropriate.
Best,
OG.
More information about the mesa-dev
mailing list