Replace Concatenate with vector constructors.
Change-Id: Ic397b07800c423cfa2648b082ad8606c09223398
Reviewed-on: https://swiftshader-review.googlesource.com/4514
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Reactor/Nucleus.cpp b/src/Reactor/Nucleus.cpp
index 179afb7..712dc7b 100644
--- a/src/Reactor/Nucleus.cpp
+++ b/src/Reactor/Nucleus.cpp
@@ -3540,6 +3540,19 @@
storeValue(rhs.value);
}
+ Short8::Short8(RValue<Short4> lo, RValue<Short4> hi)
+ {
+ Value *loLong = Nucleus::createBitCast(lo.value, Long::getType());
+ Value *hiLong = Nucleus::createBitCast(hi.value, Long::getType());
+
+ Value *long2 = UndefValue::get(Long2::getType());
+ long2 = Nucleus::createInsertElement(long2, loLong, 0);
+ long2 = Nucleus::createInsertElement(long2, hiLong, 1);
+ Value *short8 = Nucleus::createBitCast(long2, Short8::getType());
+
+ storeValue(short8);
+ }
+
RValue<Short8> operator+(RValue<Short8> lhs, RValue<Short8> rhs)
{
return RValue<Short8>(Nucleus::createAdd(lhs.value, rhs.value));
@@ -3560,19 +3573,6 @@
return x86::psraw(lhs, rhs); // FIXME: Fallback required
}
- RValue<Short8> Concatenate(RValue<Short4> lo, RValue<Short4> hi)
- {
- Value *loLong = Nucleus::createBitCast(lo.value, Long::getType());
- Value *hiLong = Nucleus::createBitCast(hi.value, Long::getType());
-
- Value *long2 = UndefValue::get(Long2::getType());
- long2 = Nucleus::createInsertElement(long2, loLong, 0);
- long2 = Nucleus::createInsertElement(long2, hiLong, 1);
- Value *short8 = Nucleus::createBitCast(long2, Short8::getType());
-
- return RValue<Short8>(short8);
- }
-
RValue<Int4> MulAdd(RValue<Short8> x, RValue<Short8> y)
{
return x86::pmaddwd(x, y); // FIXME: Fallback required
@@ -3612,6 +3612,19 @@
storeValue(rhs.value);
}
+ UShort8::UShort8(RValue<UShort4> lo, RValue<UShort4> hi)
+ {
+ Value *loLong = Nucleus::createBitCast(lo.value, Long::getType());
+ Value *hiLong = Nucleus::createBitCast(hi.value, Long::getType());
+
+ Value *long2 = UndefValue::get(Long2::getType());
+ long2 = Nucleus::createInsertElement(long2, loLong, 0);
+ long2 = Nucleus::createInsertElement(long2, hiLong, 1);
+ Value *short8 = Nucleus::createBitCast(long2, Short8::getType());
+
+ storeValue(short8);
+ }
+
RValue<UShort8> UShort8::operator=(RValue<UShort8> rhs) const
{
storeValue(rhs.value);
@@ -3697,19 +3710,6 @@
return RValue<UShort8>(short8);
}
- RValue<UShort8> Concatenate(RValue<UShort4> lo, RValue<UShort4> hi)
- {
- Value *loLong = Nucleus::createBitCast(lo.value, Long::getType());
- Value *hiLong = Nucleus::createBitCast(hi.value, Long::getType());
-
- Value *long2 = UndefValue::get(Long2::getType());
- long2 = Nucleus::createInsertElement(long2, loLong, 0);
- long2 = Nucleus::createInsertElement(long2, hiLong, 1);
- Value *short8 = Nucleus::createBitCast(long2, Short8::getType());
-
- return RValue<UShort8>(short8);
- }
-
RValue<UShort8> MulHigh(RValue<UShort8> x, RValue<UShort8> y)
{
return x86::pmulhuw(x, y); // FIXME: Fallback required
@@ -4621,6 +4621,17 @@
storeValue(value);
}
+ Int2::Int2(RValue<Int> lo, RValue<Int> hi)
+ {
+ Constant *shuffle[2];
+ shuffle[0] = Nucleus::createConstantInt(0);
+ shuffle[1] = Nucleus::createConstantInt(1);
+
+ Value *packed = Nucleus::createShuffleVector(Nucleus::createBitCast(lo.value, VectorType::get(Int::getType(), 1)), Nucleus::createBitCast(hi.value, VectorType::get(Int::getType(), 1)), Nucleus::createConstantVector(shuffle, 2));
+
+ storeValue(Nucleus::createBitCast(packed, Int2::getType()));
+ }
+
RValue<Int2> Int2::operator=(RValue<Int2> rhs) const
{
storeValue(rhs.value);
@@ -4865,17 +4876,6 @@
}
}
- RValue<Int2> Concatenate(RValue<Int> lo, RValue<Int> hi)
- {
- Constant *shuffle[2];
- shuffle[0] = Nucleus::createConstantInt(0);
- shuffle[1] = Nucleus::createConstantInt(1);
-
- Value *packed = Nucleus::createShuffleVector(Nucleus::createBitCast(lo.value, VectorType::get(Int::getType(), 1)), Nucleus::createBitCast(hi.value, VectorType::get(Int::getType(), 1)), Nucleus::createConstantVector(shuffle, 2));
-
- return RValue<Int2>(Nucleus::createBitCast(packed, Int2::getType()));
- }
-
RValue<Int> Extract(RValue<Int2> val, int i)
{
if(false) // FIXME: LLVM does not generate optimal code
@@ -5335,6 +5335,19 @@
storeValue(value);
}
+ Int4::Int4(RValue<Int2> lo, RValue<Int2> hi)
+ {
+ Value *loLong = Nucleus::createBitCast(lo.value, Long::getType());
+ Value *hiLong = Nucleus::createBitCast(hi.value, Long::getType());
+
+ Value *long2 = UndefValue::get(Long2::getType());
+ long2 = Nucleus::createInsertElement(long2, loLong, 0);
+ long2 = Nucleus::createInsertElement(long2, hiLong, 1);
+ Value *int4 = Nucleus::createBitCast(long2, Int4::getType());
+
+ storeValue(int4);
+ }
+
RValue<Int4> Int4::operator=(RValue<Int4> rhs) const
{
storeValue(rhs.value);
@@ -5549,19 +5562,6 @@
return x86::packssdw(x, y);
}
- RValue<Int4> Concatenate(RValue<Int2> lo, RValue<Int2> hi)
- {
- Value *loLong = Nucleus::createBitCast(lo.value, Long::getType());
- Value *hiLong = Nucleus::createBitCast(hi.value, Long::getType());
-
- Value *long2 = UndefValue::get(Long2::getType());
- long2 = Nucleus::createInsertElement(long2, loLong, 0);
- long2 = Nucleus::createInsertElement(long2, hiLong, 1);
- Value *int4 = Nucleus::createBitCast(long2, Int4::getType());
-
- return RValue<Int4>(int4);
- }
-
RValue<Int> Extract(RValue<Int4> x, int i)
{
return RValue<Int>(Nucleus::createExtractElement(x.value, i));
@@ -5680,6 +5680,19 @@
storeValue(value);
}
+ UInt4::UInt4(RValue<UInt2> lo, RValue<UInt2> hi)
+ {
+ Value *loLong = Nucleus::createBitCast(lo.value, Long::getType());
+ Value *hiLong = Nucleus::createBitCast(hi.value, Long::getType());
+
+ Value *long2 = UndefValue::get(Long2::getType());
+ long2 = Nucleus::createInsertElement(long2, loLong, 0);
+ long2 = Nucleus::createInsertElement(long2, hiLong, 1);
+ Value *uint4 = Nucleus::createBitCast(long2, Int4::getType());
+
+ storeValue(uint4);
+ }
+
RValue<UInt4> UInt4::operator=(RValue<UInt4> rhs) const
{
storeValue(rhs.value);
@@ -5889,19 +5902,6 @@
return x86::packusdw(x, y); // FIXME: Fallback required
}
- RValue<UInt4> Concatenate(RValue<UInt2> lo, RValue<UInt2> hi)
- {
- Value *loLong = Nucleus::createBitCast(lo.value, Long::getType());
- Value *hiLong = Nucleus::createBitCast(hi.value, Long::getType());
-
- Value *long2 = UndefValue::get(Long2::getType());
- long2 = Nucleus::createInsertElement(long2, loLong, 0);
- long2 = Nucleus::createInsertElement(long2, hiLong, 1);
- Value *uint4 = Nucleus::createBitCast(long2, Int4::getType());
-
- return RValue<UInt4>(uint4);
- }
-
Type *UInt4::getType()
{
return VectorType::get(UInt::getType(), 4);
@@ -6916,7 +6916,7 @@
Int2 lo = x86::cvtps2pi(val);
Int2 hi = x86::cvtps2pi(Swizzle(val, 0xEE));
- return Concatenate(lo, hi);
+ return Int4(lo, hi);
}
}
@@ -7436,7 +7436,7 @@
Short4 lo = x86::packssdw(loX, hiX);
Short4 hi = x86::packssdw(loY, hiY);
- return Concatenate(lo, hi);
+ return Short8(lo, hi);
}
}
@@ -7545,7 +7545,7 @@
lo = x86::pslld(lo, y);
hi = x86::pslld(hi, y);
- return Concatenate(lo, hi);
+ return Int4(lo, hi);
}
}
@@ -7574,7 +7574,7 @@
lo = x86::psrad(lo, y);
hi = x86::psrad(hi, y);
- return Concatenate(lo, hi);
+ return Int4(lo, hi);
}
}
@@ -7603,7 +7603,7 @@
lo = x86::psrld(lo, y);
hi = x86::psrld(hi, y);
- return Concatenate(lo, hi);
+ return UInt4(lo, hi);
}
}
diff --git a/src/Reactor/Nucleus.hpp b/src/Reactor/Nucleus.hpp
index a7aaf79..b134149 100644
--- a/src/Reactor/Nucleus.hpp
+++ b/src/Reactor/Nucleus.hpp
@@ -1058,6 +1058,7 @@
Short8(RValue<Short8> rhs);
// Short8(const Short8 &rhs);
// Short8(const Reference<Short8> &rhs);
+ Short8(RValue<Short4> lo, RValue<Short4> hi);
// RValue<Short8> operator=(RValue<Short8> rhs) const;
// RValue<Short8> operator=(const Short8 &rhs) const;
@@ -1102,7 +1103,6 @@
// RValue<Bool> operator!=(RValue<Short8> lhs, RValue<Short8> rhs);
// RValue<Bool> operator==(RValue<Short8> lhs, RValue<Short8> rhs);
- RValue<Short8> Concatenate(RValue<Short4> lo, RValue<Short4> hi);
RValue<Short8> MulHigh(RValue<Short8> x, RValue<Short8> y);
RValue<Int4> MulAdd(RValue<Short8> x, RValue<Short8> y);
@@ -1114,6 +1114,7 @@
UShort8(RValue<UShort8> rhs);
// UShort8(const UShort8 &rhs);
// UShort8(const Reference<UShort8> &rhs);
+ UShort8(RValue<UShort4> lo, RValue<UShort4> hi);
RValue<UShort8> operator=(RValue<UShort8> rhs) const;
RValue<UShort8> operator=(const UShort8 &rhs) const;
@@ -1159,7 +1160,6 @@
// RValue<Bool> operator==(RValue<UShort8> lhs, RValue<UShort8> rhs);
RValue<UShort8> Swizzle(RValue<UShort8> x, char select0, char select1, char select2, char select3, char select4, char select5, char select6, char select7);
- RValue<UShort8> Concatenate(RValue<UShort4> lo, RValue<UShort4> hi);
RValue<UShort8> MulHigh(RValue<UShort8> x, RValue<UShort8> y);
class Int : public Variable<Int>
@@ -1512,6 +1512,7 @@
Int2(RValue<Int2> rhs);
Int2(const Int2 &rhs);
Int2(const Reference<Int2> &rhs);
+ Int2(RValue<Int> lo, RValue<Int> hi);
RValue<Int2> operator=(RValue<Int2> rhs) const;
RValue<Int2> operator=(const Int2 &rhs) const;
@@ -1561,7 +1562,6 @@
// RValue<Int2> RoundInt(RValue<Float4> cast);
RValue<Long1> UnpackLow(RValue<Int2> x, RValue<Int2> y);
RValue<Long1> UnpackHigh(RValue<Int2> x, RValue<Int2> y);
- RValue<Int2> Concatenate(RValue<Int> lo, RValue<Int> hi);
RValue<Int> Extract(RValue<Int2> val, int i);
RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i);
@@ -1639,6 +1639,7 @@
Int4(RValue<UInt4> rhs);
Int4(const UInt4 &rhs);
Int4(const Reference<UInt4> &rhs);
+ Int4(RValue<Int2> lo, RValue<Int2> hi);
RValue<Int4> operator=(RValue<Int4> rhs) const;
RValue<Int4> operator=(const Int4 &rhs) const;
@@ -1696,7 +1697,6 @@
RValue<Int4> Min(RValue<Int4> x, RValue<Int4> y);
RValue<Int4> RoundInt(RValue<Float4> cast);
RValue<Short8> Pack(RValue<Int4> x, RValue<Int4> y);
- RValue<Int4> Concatenate(RValue<Int2> lo, RValue<Int2> hi);
RValue<Int> Extract(RValue<Int4> x, int i);
RValue<Int4> Insert(RValue<Int4> val, RValue<Int> element, int i);
RValue<Int> SignMask(RValue<Int4> x);
@@ -1719,6 +1719,7 @@
UInt4(RValue<Int4> rhs);
UInt4(const Int4 &rhs);
UInt4(const Reference<Int4> &rhs);
+ UInt4(RValue<UInt2> lo, RValue<UInt2> hi);
RValue<UInt4> operator=(RValue<UInt4> rhs) const;
RValue<UInt4> operator=(const UInt4 &rhs) const;
@@ -1776,7 +1777,6 @@
RValue<UInt4> Min(RValue<UInt4> x, RValue<UInt4> y);
// RValue<UInt4> RoundInt(RValue<Float4> cast);
RValue<UShort8> Pack(RValue<UInt4> x, RValue<UInt4> y);
- RValue<UInt4> Concatenate(RValue<UInt2> lo, RValue<UInt2> hi);
template<int T>
class Swizzle2Float4