> On Apr 14, 2016, at 4:42 PM, Roland Scheidegger <srol...@vmware.com> wrote:
> 
> Am 14.04.2016 um 21:53 schrieb Tim Rowley:
>> 
>> diff --git a/src/gallium/drivers/swr/rasterizer/core/frontend.h 
>> b/src/gallium/drivers/swr/rasterizer/core/frontend.h
>> index 8307c0b..12e7ae4 100644
>> --- a/src/gallium/drivers/swr/rasterizer/core/frontend.h
>> +++ b/src/gallium/drivers/swr/rasterizer/core/frontend.h
>> @@ -307,6 +307,18 @@ bool CanUseSimplePoints(DRAW_CONTEXT *pDC)
>>             !state.rastState.pointSpriteEnable);
>> }
>> 
>> +INLINE
>> +bool vIsNaN(const __m128& vec)
>> +{
>> +    const __m128i& veci = _mm_castps_si128(vec);
>> +    const __m128i fraction = _mm_and_si128(veci, 
>> _mm_set1_epi32(0x007fffff));
>> +    const __m128i exponent = _mm_and_si128(veci, 
>> _mm_set1_epi32(0x7f800000));
>> +    __m128i result = _mm_cmpeq_epi32(exponent, _mm_set1_epi32(0));
>> +    result = _mm_andnot_si128(_mm_cmpeq_epi32(fraction, _mm_set1_epi32(0)), 
>> result);
>> +    int32_t mask = _mm_movemask_ps(_mm_castsi128_ps(result));
>> +    return (mask > 0);
>> +}
> You could do this simpler by just doing abs on the source (which is a and)
> followed by a single _mm_cmpgt_epi32() against max exponent (0x7f800000).
> Or do what lp_build_isnan does: just use _mm_cmp_ps with ordered/eq
> (using same source twice) and revert the bits. (Albeit I think we're not
> using the integer comparisons, which are nominally faster, in that code
> because we might have 8-wide vectors hence when avx but not avx2 isn't
> available this would be quite suboptimal.)
> That said, I'm actually wondering why not just doing a simple single
> unordered comparison, that should give the right result without having
> to invert the bits (though it's possible llvm does this on its own in
> the gallivm code).

Thanks for looking at this.  It turns out we use your suggested method in other 
areas of the code (VCMPPS_ISNAN in our jit builder, and ComputeNaNMask in the 
clipper).  An updated patch will be coming.

-Tim

_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to