[Mesa-dev] [PATCH] tgsi: Add a conditional move inststruction
Jose Fonseca
jfonseca at vmware.com
Thu Apr 4 08:01:41 PDT 2013
----- Original Message -----
> > On 04.04.2013 03:45, Zack Rusin wrote:
> > > It's part of SM4 (http://goo.gl/4IpeK). It's also fairly
> > > painful to emulate without branching. Most hardware
> > > supports it natively and even llvm has a 'select' opcode
> > > which can handle it without too much hassle.
> > >
> > > diff --git a/src/gallium/docs/source/tgsi.rst
> > > b/src/gallium/docs/source/tgsi.rst
> > > index 28308cb..6c5a02b 100644
> > > --- a/src/gallium/docs/source/tgsi.rst
> > > +++ b/src/gallium/docs/source/tgsi.rst
> > > @@ -72,6 +72,17 @@ used.
> > >
> > > dst.w = src.w
> > >
> > > +.. opcode:: MOVC - Conditional move
> > > +
> > > +.. math::
> > > +
> > > + dst.x = src0.x ? src1.x : src2.x
> > > +
> > > + dst.y = src0.y ? src1.y : src2.y
> > > +
> > > + dst.z = src0.z ? src1.z : src2.z
> > > +
> > > + dst.w = src0.w ? src1.w : src2.w
> > >
> >
> > I think we already have that:
> >
> > .. opcode:: UCMP - Integer Conditional Move
> >
> > .. math::
> >
> > dst.x = src0.x ? src1.x : src2.x
> >
> > dst.y = src0.y ? src1.y : src2.y
> >
> > dst.z = src0.z ? src1.z : src2.z
> >
> > dst.w = src0.w ? src1.w : src2.w
> >
> >
> > No difference apart from the source ordering (the "integer" just implies
> > that any non-zero value counts as true, i.e. also inf, nan and -0).
>
> That's really broken. UCMP needs to be a an unsigned version of the CMP
> instruction which does
> dst.chan = (src0.chan < 0) ? src1.chan : src2.chan
> not a whole new instruction. It's what everyone implements anyway. So if
> st_glsl_to_tgsi needs
> a conditional move we need to add the above patch and change it to use it.
Yes, it doesn't seem that any of the TGSI_OPCODE_UCMP implementation does that the spec says it supposedly does -- it seems everybody implements it as an unsigned version of CMP. That is, it seems UCMP's description needs to be fixed.
Jose
More information about the mesa-dev
mailing list