[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