[Mesa-dev] [PATCH 2/4] gallivm: Allow indirection from TEMP registers too.

Jose Fonseca jfonseca at vmware.com
Thu Dec 6 10:12:59 PST 2012



----- Original Message -----
> On 12/06/2012 10:35 AM, jfonseca at vmware.com wrote:
> > From: José Fonseca<jfonseca at vmware.com>
> >
> > The ADDR file is cumbersome for native integer capable drivers.  We
> > should consider deprecating it eventually, but this just adds
> > support
> > for indirection from TEMP registers.
> > ---
> >   src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c |   20
> >   +++++++++++++++++---
> >   1 file changed, 17 insertions(+), 3 deletions(-)
> >
> > diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> > b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> > index 9caac21..bd783b5 100644
> > --- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> > +++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c
> > @@ -533,9 +533,23 @@ get_indirect_index(struct
> > lp_build_tgsi_soa_context *bld,
> >      base = lp_build_const_int_vec(bld->bld_base.base.gallivm,
> >      uint_bld->type, reg_index);
> >
> >      assert(swizzle<  4);
> > -   rel = LLVMBuildLoad(builder,
> > -                        bld->addr[indirect_reg->Index][swizzle],
> > -                        "load addr reg");
> > +   switch (indirect_reg->File) {
> > +   case TGSI_FILE_ADDRESS:
> > +      rel = LLVMBuildLoad(builder,
> > +                          bld->addr[indirect_reg->Index][swizzle],
> > +                          "load addr reg");
> > +      /* ADDR registers are uint */
> > +      break;
> > +   case TGSI_FILE_TEMPORARY:
> > +      rel = lp_get_temp_ptr_soa(bld, indirect_reg->Index,
> > swizzle);
> > +      rel = LLVMBuildLoad(builder, rel, "load temp reg");
> > +      /* TEMP registers are float type */
> > +      rel = LLVMBuildBitCast(builder, rel, uint_bld->vec_type,
> > "");
> 
> Is bitcasting right?  I'd expect that if the temp register has float
> values that we need to do a float->int conversion here.

The comment is not precise enough: LLVM is strongly typed, and TEMPS always have float LLVM type, but they actual value can be FLOAT/INT/UINT depending one the opcode, and for indirection, the index is expected to be an integer.

I'll update the comment with this.

> 
> > +      break;
> > +   default:
> > +      assert(0);
> > +      rel = uint_bld->zero;
> > +   }
> >
> >      index = lp_build_add(uint_bld, base, rel);
> >
> 
> Looks OK otherwise.
> 
> Reviewed-by: Brian Paul <brianp at vmware.com>
> 


More information about the mesa-dev mailing list