GS: Add srav and blend backwards compat to GSVector4i

This commit is contained in:
TellowKrinkle 2021-02-21 04:30:39 -06:00 committed by refractionpcsx2
parent 24850823a2
commit b0f9662811
1 changed files with 37 additions and 15 deletions

View File

@ -234,13 +234,9 @@ public:
return sat_i32(a);
}
template <int mode>
__forceinline GSVector4i ralign(const GSVector2i& a) const
template <Align_Mode mode>
GSVector4i _ralign_helper(const GSVector4i& mask) const
{
// a must be 1 << n
GSVector4i mask = GSVector4i(a) - GSVector4i(1, 1);
GSVector4i v;
switch (mode)
@ -248,13 +244,28 @@ public:
case Align_Inside: v = *this + mask; break;
case Align_Outside: v = *this + mask.zwxy(); break;
case Align_NegInf: v = *this; break;
case Align_PosInf: v = *this + mask.zwzw(); break;
case Align_PosInf: v = *this + mask.xyxy(); break;
default: pxAssert(0); break;
}
return v.andnot(mask.xyxy());
}
/// Align the rect using mask values that already have one subtracted (1 << n - 1 aligns to 1 << n)
template <Align_Mode mode>
GSVector4i ralign_presub(const GSVector2i& a) const
{
return _ralign_helper<mode>(GSVector4i(a));
}
template <Align_Mode mode>
GSVector4i ralign(const GSVector2i& a) const
{
// a must be 1 << n
return _ralign_helper<mode>(GSVector4i(a) - GSVector4i(1, 1));
}
GSVector4i fit(int arx, int ary) const;
GSVector4i fit(int preset) const;
@ -426,15 +437,19 @@ public:
return GSVector4i(_mm_blend_epi16(m, a, mask));
}
#if _M_SSE >= 0x501
template <int mask>
__forceinline GSVector4i blend32(const GSVector4i& v) const
{
#if _M_SSE >= 0x501
return GSVector4i(_mm_blend_epi32(m, v.m, mask));
}
#else
constexpr int bit3 = ((mask & 8) * 3) << 3;
constexpr int bit2 = ((mask & 4) * 3) << 2;
constexpr int bit1 = ((mask & 2) * 3) << 1;
constexpr int bit0 = (mask & 1) * 3;
return blend16<bit3 | bit2 | bit1 | bit0>(v);
#endif
}
__forceinline GSVector4i blend(const GSVector4i& a, const GSVector4i& mask) const
{
@ -698,6 +713,13 @@ public:
return GSVector4i(_mm_sra_epi32(m, i));
}
#if _M_SSE >= 0x501
__forceinline GSVector4i srav32(const GSVector4i& v) const
{
return GSVector4i(_mm_srav_epi32(m, v.m));
}
#endif
__forceinline GSVector4i sll16(int i) const
{
return GSVector4i(_mm_slli_epi16(m, i));
@ -719,9 +741,9 @@ public:
}
#if _M_SSE >= 0x501
__forceinline GSVector4i sllv32(__m128i i) const
__forceinline GSVector4i sllv32(const GSVector4i& v) const
{
return GSVector4i(_mm_sllv_epi32(m, i));
return GSVector4i(_mm_sllv_epi32(m, v.m));
}
#endif
@ -756,9 +778,9 @@ public:
}
#if _M_SSE >= 0x501
__forceinline GSVector4i srlv32(__m128i i) const
__forceinline GSVector4i srlv32(const GSVector4i& v) const
{
return GSVector4i(_mm_srlv_epi32(m, i));
return GSVector4i(_mm_srlv_epi32(m, v.m));
}
#endif