> > I don't know if the structure of Beignet allows it (I see that the > > implementation is in OpenCL C rather than hardware instructions), but > > Mesa implements sign() for GLSL in three instructions: > > > > cmp.nz.f0 null x:f 0.0:f > > and ret:ud x:ud 0x80000000:ud > > (+f0) or ret:ud ret:ud 0x3f800000:ud > > > > The AND instruction extracts the sign bit, and the predicated OR > > instruction ORs in the hex value of 1.0 if x is not zero. > > > > This gives +1.0 if x > 0.0 > > +0.0 if x == +0.0 > > -0.0 if x == -0.0 > > -1.0 if x < 0.0 > > > > And since the CMP.NZ's src1 is zero, you can move the conditional mod > > back into the instruction that generated x. > > > > The CL spec says you also have to handle NaN, which this > > implementation doesn't do, but that should just be an additional two > instructions, I think: > > > > <CMP for NaN> (I don't remember precisely... CMPN.U maybe?) > > (+f0) mov ret:f 0.0f > > > > I think this should be a few instructions shorter than what your code > > will compile to.
I tried to implement this logic in Beignet, I find that we don't support predicated Gen IR now. So I would keep my version, and put an TODO comment. My version will generate 7 instructions, while mesa version would take 5 instructions. > _______________________________________________ > Beignet mailing list > Beignet@lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/beignet _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/beignet