swr/rast: EXTRACT2 changed from vextract/vinsert to vshuffle

Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
This commit is contained in:
Tim Rowley 2017-12-14 13:39:29 -06:00
parent 12adf2c815
commit 11a9d4f9b5
3 changed files with 32 additions and 61 deletions

View File

@ -653,16 +653,14 @@ namespace SwrJit
}
else
{
Value *src0 = EXTRACT2_F(vSrc, 0);
Value *src1 = EXTRACT2_F(vSrc, 1);
Value *src0 = EXTRACT2(vSrc, 0);
Value *src1 = EXTRACT2(vSrc, 1);
Value *indices0 = EXTRACT2_I(vIndices, 0);
Value *indices1 = EXTRACT2_I(vIndices, 1);
Value *indices0 = EXTRACT2(vIndices, 0);
Value *indices1 = EXTRACT2(vIndices, 1);
Value *vmask16 = VMASK2(vMask);
Value *mask0 = MASK(EXTRACT2_I(vmask16, 0)); // TODO: do this better..
Value *mask1 = MASK(EXTRACT2_I(vmask16, 1));
Value *mask0 = EXTRACT2(vMask, 0);
Value *mask1 = EXTRACT2(vMask, 1);
Value *gather0 = GATHERPS(src0, pBase, indices0, mask0, scale);
Value *gather1 = GATHERPS(src1, pBase, indices1, mask1, scale);
@ -738,16 +736,14 @@ namespace SwrJit
}
else
{
Value *src0 = EXTRACT2_F(vSrc, 0);
Value *src1 = EXTRACT2_F(vSrc, 1);
Value *src0 = EXTRACT2(vSrc, 0);
Value *src1 = EXTRACT2(vSrc, 1);
Value *indices0 = EXTRACT2_I(vIndices, 0);
Value *indices1 = EXTRACT2_I(vIndices, 1);
Value *indices0 = EXTRACT2(vIndices, 0);
Value *indices1 = EXTRACT2(vIndices, 1);
Value *vmask16 = VMASK2(vMask);
Value *mask0 = MASK(EXTRACT2_I(vmask16, 0)); // TODO: do this better..
Value *mask1 = MASK(EXTRACT2_I(vmask16, 1));
Value *mask0 = EXTRACT2(vMask, 0);
Value *mask1 = EXTRACT2(vMask, 1);
Value *gather0 = GATHERDD(src0, pBase, indices0, mask0, scale);
Value *gather1 = GATHERDD(src1, pBase, indices1, mask1, scale);
@ -809,34 +805,12 @@ namespace SwrJit
}
#if USE_SIMD16_BUILDER
//////////////////////////////////////////////////////////////////////////
/// @brief
Value *Builder::EXTRACT2_F(Value *a2, uint32_t imm)
Value *Builder::EXTRACT2(Value *x, uint32_t imm)
{
const uint32_t i0 = (imm > 0) ? mVWidth : 0;
Value *result = VUNDEF_F();
for (uint32_t i = 0; i < mVWidth; i += 1)
{
#if 1
if (!a2->getType()->getScalarType()->isFloatTy())
{
a2 = BITCAST(a2, mSimd2FP32Ty);
}
#endif
Value *temp = VEXTRACT(a2, C(i0 + i));
result = VINSERT(result, temp, C(i));
}
return result;
}
Value *Builder::EXTRACT2_I(Value *a2, uint32_t imm)
{
return BITCAST(EXTRACT2_F(a2, imm), mSimdInt32Ty);
if (imm == 0)
return VSHUFFLE(x, UndefValue::get(x->getType()), {0, 1, 2, 3, 4, 5, 6, 7});
else
return VSHUFFLE(x, UndefValue::get(x->getType()), {8, 9, 10, 11, 12, 13, 14, 15});
}
Value *Builder::JOIN2(Value *a, Value *b)

View File

@ -117,8 +117,7 @@ Value *VMASK2(Value *mask);
//////////////////////////////////////////////////////////////////////////
#if USE_SIMD16_BUILDER
Value *EXTRACT2_F(Value *a2, uint32_t imm);
Value *EXTRACT2_I(Value *a2, uint32_t imm);
Value *EXTRACT2(Value *x, uint32_t imm);
Value *JOIN2(Value *a, Value *b);
#endif

View File

@ -1078,14 +1078,12 @@ void FetchJit::JitGatherVertices(const FETCH_COMPILE_STATE &fetchState,
vOffsets16 = ADD(vOffsets16, vInstanceStride16);
// TODO: remove the following simd8 interop stuff once all code paths are fully widened to SIMD16..
Value *vmask16 = VMASK2(vGatherMask16);
Value *vGatherMask = MASK(EXTRACT2_I(vmask16, 0));
Value *vGatherMask2 = MASK(EXTRACT2_I(vmask16, 1));
Value *vOffsets = EXTRACT2_I(vOffsets16, 0);
Value *vOffsets2 = EXTRACT2_I(vOffsets16, 1);
Value *vGatherMask = EXTRACT2(vGatherMask16, 0);
Value *vGatherMask2 = EXTRACT2(vGatherMask16, 1);
Value *vOffsets = EXTRACT2(vOffsets16, 0);
Value *vOffsets2 = EXTRACT2(vOffsets16, 1);
#else
// override cur indices with 0 if pitch is 0
Value* pZeroPitchMask = ICMP_EQ(vStride, VIMMED1(0));
@ -2322,8 +2320,8 @@ void FetchJit::Shuffle8bpcGatherd2(Shuffle8bpcArgs &args)
// SIMD16 PSHUFB isnt part of AVX-512F, so split into SIMD8 for the sake of KNL, for now..
Value *vGatherResult_lo = EXTRACT2_I(vGatherResult, 0);
Value *vGatherResult_hi = EXTRACT2_I(vGatherResult, 1);
Value *vGatherResult_lo = EXTRACT2(vGatherResult, 0);
Value *vGatherResult_hi = EXTRACT2(vGatherResult, 1);
Value *vShufResult_lo = BITCAST(PSHUFB(BITCAST(vGatherResult_lo, v32x8Ty), vConstMask), vGatherTy);
Value *vShufResult_hi = BITCAST(PSHUFB(BITCAST(vGatherResult_hi, v32x8Ty), vConstMask), vGatherTy);
@ -2482,8 +2480,8 @@ void FetchJit::Shuffle8bpcGatherd2(Shuffle8bpcArgs &args)
break;
}
Value *vGatherResult_lo = EXTRACT2_I(vGatherResult, 0);
Value *vGatherResult_hi = EXTRACT2_I(vGatherResult, 1);
Value *vGatherResult_lo = EXTRACT2(vGatherResult, 0);
Value *vGatherResult_hi = EXTRACT2(vGatherResult, 1);
Value *temp_lo = BITCAST(PSHUFB(BITCAST(vGatherResult_lo, v32x8Ty), vConstMask), vGatherTy);
Value *temp_hi = BITCAST(PSHUFB(BITCAST(vGatherResult_hi, v32x8Ty), vConstMask), vGatherTy);
@ -2787,8 +2785,8 @@ void FetchJit::Shuffle16bpcGather2(Shuffle16bpcArgs &args)
{
// SIMD16 PSHUFB isnt part of AVX-512F, so split into SIMD8 for the sake of KNL, for now..
Value *vGatherResult_lo = EXTRACT2_I(vGatherResult[0], 0);
Value *vGatherResult_hi = EXTRACT2_I(vGatherResult[0], 1);
Value *vGatherResult_lo = EXTRACT2(vGatherResult[0], 0);
Value *vGatherResult_hi = EXTRACT2(vGatherResult[0], 1);
Value *vShufResult_lo = BITCAST(PSHUFB(BITCAST(vGatherResult_lo, v32x8Ty), vConstMask), vGatherTy);
Value *vShufResult_hi = BITCAST(PSHUFB(BITCAST(vGatherResult_hi, v32x8Ty), vConstMask), vGatherTy);
@ -2814,8 +2812,8 @@ void FetchJit::Shuffle16bpcGather2(Shuffle16bpcArgs &args)
Value *vi128ZW_hi = nullptr;
if (isComponentEnabled(compMask, 2) || isComponentEnabled(compMask, 3))
{
Value *vGatherResult_lo = EXTRACT2_I(vGatherResult[1], 0);
Value *vGatherResult_hi = EXTRACT2_I(vGatherResult[1], 1);
Value *vGatherResult_lo = EXTRACT2(vGatherResult[1], 0);
Value *vGatherResult_hi = EXTRACT2(vGatherResult[1], 1);
Value *vShufResult_lo = BITCAST(PSHUFB(BITCAST(vGatherResult_lo, v32x8Ty), vConstMask), vGatherTy);
Value *vShufResult_hi = BITCAST(PSHUFB(BITCAST(vGatherResult_hi, v32x8Ty), vConstMask), vGatherTy);
@ -2962,8 +2960,8 @@ void FetchJit::Shuffle16bpcGather2(Shuffle16bpcArgs &args)
// SIMD16 PSHUFB isnt part of AVX-512F, so split into SIMD8 for the sake of KNL, for now..
Value *vGatherResult_lo = EXTRACT2_I(vGatherResult[selectedGather], 0);
Value *vGatherResult_hi = EXTRACT2_I(vGatherResult[selectedGather], 1);
Value *vGatherResult_lo = EXTRACT2(vGatherResult[selectedGather], 0);
Value *vGatherResult_hi = EXTRACT2(vGatherResult[selectedGather], 1);
Value *temp_lo = BITCAST(PSHUFB(BITCAST(vGatherResult_lo, v32x8Ty), vConstMask[selectedMask]), vGatherTy);
Value *temp_hi = BITCAST(PSHUFB(BITCAST(vGatherResult_hi, v32x8Ty), vConstMask[selectedMask]), vGatherTy);