Hold LValue address in a non-template Variable class.
Variable<> was redundant after LValue became a template class. We can
recycle it as a container for Values.
Bug swiftshader:27
Change-Id: Ic5ed6f3f7e26579fd38f0e809f8bada1e3639d00
Reviewed-on: https://swiftshader-review.googlesource.com/8071
Reviewed-by: Nicolas Capens <capn@google.com>
Tested-by: Nicolas Capens <capn@google.com>
Reviewed-on: https://swiftshader-review.googlesource.com/8231
Reviewed-by: Alexis Hétu <sugoi@google.com>
diff --git a/src/Reactor/Reactor.hpp b/src/Reactor/Reactor.hpp
index 5dda0d2..1e99bb8 100644
--- a/src/Reactor/Reactor.hpp
+++ b/src/Reactor/Reactor.hpp
@@ -69,12 +69,20 @@
template<class T>
class Pointer;
+ class Variable
+ {
+ protected:
+ Value *address;
+ };
+
template<class T>
- class LValue
+ class LValue : public Variable
{
public:
LValue(int arraySize = 0);
+ RValue<Pointer<T>> operator&();
+
static bool isVoid()
{
return false;
@@ -83,18 +91,6 @@
Value *loadValue(unsigned int alignment = 0) const;
Value *storeValue(Value *value, unsigned int alignment = 0) const;
Value *getAddress(Value *index) const;
-
- protected:
- Value *address;
- };
-
- template<class T>
- class Variable : public LValue<T>
- {
- public:
- Variable(int arraySize = 0);
-
- RValue<Pointer<T>> operator&();
};
template<class T>
@@ -177,7 +173,7 @@
Value *value;
};
- class Bool : public Variable<Bool>
+ class Bool : public LValue<Bool>
{
public:
Bool(Argument<Bool> argument);
@@ -200,7 +196,7 @@
RValue<Bool> operator&&(RValue<Bool> lhs, RValue<Bool> rhs);
RValue<Bool> operator||(RValue<Bool> lhs, RValue<Bool> rhs);
- class Byte : public Variable<Byte>
+ class Byte : public LValue<Byte>
{
public:
Byte(Argument<Byte> argument);
@@ -258,7 +254,7 @@
RValue<Bool> operator!=(RValue<Byte> lhs, RValue<Byte> rhs);
RValue<Bool> operator==(RValue<Byte> lhs, RValue<Byte> rhs);
- class SByte : public Variable<SByte>
+ class SByte : public LValue<SByte>
{
public:
SByte(Argument<SByte> argument);
@@ -314,7 +310,7 @@
RValue<Bool> operator!=(RValue<SByte> lhs, RValue<SByte> rhs);
RValue<Bool> operator==(RValue<SByte> lhs, RValue<SByte> rhs);
- class Short : public Variable<Short>
+ class Short : public LValue<Short>
{
public:
Short(Argument<Short> argument);
@@ -369,7 +365,7 @@
RValue<Bool> operator!=(RValue<Short> lhs, RValue<Short> rhs);
RValue<Bool> operator==(RValue<Short> lhs, RValue<Short> rhs);
- class UShort : public Variable<UShort>
+ class UShort : public LValue<UShort>
{
public:
UShort(Argument<UShort> argument);
@@ -425,7 +421,7 @@
RValue<Bool> operator!=(RValue<UShort> lhs, RValue<UShort> rhs);
RValue<Bool> operator==(RValue<UShort> lhs, RValue<UShort> rhs);
- class Byte4 : public Variable<Byte4>
+ class Byte4 : public LValue<Byte4>
{
public:
explicit Byte4(RValue<Byte8> cast);
@@ -471,7 +467,7 @@
// RValue<Byte4> operator--(const Byte4 &val, int); // Post-decrement
// const Byte4 &operator--(const Byte4 &val); // Pre-decrement
- class SByte4 : public Variable<SByte4>
+ class SByte4 : public LValue<SByte4>
{
public:
// SByte4();
@@ -515,7 +511,7 @@
// RValue<SByte4> operator--(const SByte4 &val, int); // Post-decrement
// const SByte4 &operator--(const SByte4 &val); // Pre-decrement
- class Byte8 : public Variable<Byte8>
+ class Byte8 : public LValue<Byte8>
{
public:
Byte8();
@@ -568,7 +564,7 @@
// RValue<Byte8> CmpGT(RValue<Byte8> x, RValue<Byte8> y);
RValue<Byte8> CmpEQ(RValue<Byte8> x, RValue<Byte8> y);
- class SByte8 : public Variable<SByte8>
+ class SByte8 : public LValue<SByte8>
{
public:
SByte8();
@@ -620,7 +616,7 @@
RValue<Byte8> CmpGT(RValue<SByte8> x, RValue<SByte8> y);
RValue<Byte8> CmpEQ(RValue<SByte8> x, RValue<SByte8> y);
- class Byte16 : public Variable<Byte16>
+ class Byte16 : public LValue<Byte16>
{
public:
// Byte16();
@@ -664,7 +660,7 @@
// RValue<Byte16> operator--(const Byte16 &val, int); // Post-decrement
// const Byte16 &operator--(const Byte16 &val); // Pre-decrement
- class SByte16 : public Variable<SByte16>
+ class SByte16 : public LValue<SByte16>
{
public:
// SByte16();
@@ -708,7 +704,7 @@
// RValue<SByte16> operator--(const SByte16 &val, int); // Post-decrement
// const SByte16 &operator--(const SByte16 &val); // Pre-decrement
- class Short2 : public Variable<Short2>
+ class Short2 : public LValue<Short2>
{
public:
explicit Short2(RValue<Short4> cast);
@@ -716,7 +712,7 @@
static Type *getType();
};
- class UShort2 : public Variable<UShort2>
+ class UShort2 : public LValue<UShort2>
{
public:
explicit UShort2(RValue<UShort4> cast);
@@ -724,7 +720,7 @@
static Type *getType();
};
- class Short4 : public Variable<Short4>
+ class Short4 : public LValue<Short4>
{
public:
explicit Short4(RValue<Int> cast);
@@ -806,7 +802,7 @@
RValue<Short4> CmpGT(RValue<Short4> x, RValue<Short4> y);
RValue<Short4> CmpEQ(RValue<Short4> x, RValue<Short4> y);
- class UShort4 : public Variable<UShort4>
+ class UShort4 : public LValue<UShort4>
{
public:
explicit UShort4(RValue<Int4> cast);
@@ -872,7 +868,7 @@
RValue<UShort4> Average(RValue<UShort4> x, RValue<UShort4> y);
RValue<Byte8> Pack(RValue<UShort4> x, RValue<UShort4> y);
- class Short8 : public Variable<Short8>
+ class Short8 : public LValue<Short8>
{
public:
// Short8();
@@ -929,7 +925,7 @@
RValue<Int4> MulAdd(RValue<Short8> x, RValue<Short8> y);
RValue<Int4> Abs(RValue<Int4> x);
- class UShort8 : public Variable<UShort8>
+ class UShort8 : public LValue<UShort8>
{
public:
// UShort8();
@@ -985,7 +981,7 @@
RValue<UShort8> Swizzle(RValue<UShort8> x, char select0, char select1, char select2, char select3, char select4, char select5, char select6, char select7);
RValue<UShort8> MulHigh(RValue<UShort8> x, RValue<UShort8> y);
- class Int : public Variable<Int>
+ class Int : public LValue<Int>
{
public:
Int(Argument<Int> argument);
@@ -1057,7 +1053,7 @@
RValue<Int> Clamp(RValue<Int> x, RValue<Int> min, RValue<Int> max);
RValue<Int> RoundInt(RValue<Float> cast);
- class Long : public Variable<Long>
+ class Long : public LValue<Long>
{
public:
// Long(Argument<Long> argument);
@@ -1125,7 +1121,7 @@
// RValue<Long> RoundLong(RValue<Float> cast);
RValue<Long> AddAtomic( RValue<Pointer<Long>> x, RValue<Long> y);
- class Long1 : public Variable<Long1>
+ class Long1 : public LValue<Long1>
{
public:
// Long1(Argument<Long1> argument);
@@ -1192,7 +1188,7 @@
// RValue<Long1> RoundLong1(RValue<Float> cast);
- class UInt : public Variable<UInt>
+ class UInt : public LValue<UInt>
{
public:
UInt(Argument<UInt> argument);
@@ -1261,7 +1257,7 @@
RValue<UInt> Clamp(RValue<UInt> x, RValue<UInt> min, RValue<UInt> max);
// RValue<UInt> RoundUInt(RValue<Float> cast);
- class Int2 : public Variable<Int2>
+ class Int2 : public LValue<Int2>
{
public:
// explicit Int2(RValue<Int> cast);
@@ -1325,7 +1321,7 @@
RValue<Int> Extract(RValue<Int2> val, int i);
RValue<Int2> Insert(RValue<Int2> val, RValue<Int> element, int i);
- class UInt2 : public Variable<UInt2>
+ class UInt2 : public LValue<UInt2>
{
public:
UInt2();
@@ -1381,7 +1377,7 @@
// RValue<UInt2> RoundInt(RValue<Float4> cast);
- class Int4 : public Variable<Int4>
+ class Int4 : public LValue<Int4>
{
public:
explicit Int4(RValue<Byte4> cast);
@@ -1467,7 +1463,7 @@
RValue<Int> SignMask(RValue<Int4> x);
RValue<Int4> Swizzle(RValue<Int4> x, unsigned char select);
- class UInt4 : public Variable<UInt4>
+ class UInt4 : public LValue<UInt4>
{
public:
explicit UInt4(RValue<Float4> cast);
@@ -1609,7 +1605,7 @@
Float4 *parent;
};
- class Float : public Variable<Float>
+ class Float : public LValue<Float>
{
public:
explicit Float(RValue<Int> cast);
@@ -1663,7 +1659,7 @@
RValue<Float> Floor(RValue<Float> val);
RValue<Float> Ceil(RValue<Float> val);
- class Float2 : public Variable<Float2>
+ class Float2 : public LValue<Float2>
{
public:
// explicit Float2(RValue<Byte2> cast);
@@ -1718,7 +1714,7 @@
// RValue<Float2> Swizzle(RValue<Float2> x, unsigned char select);
// RValue<Float2> Mask(Float2 &lhs, RValue<Float2> rhs, unsigned char select);
- class Float4 : public Variable<Float4>
+ class Float4 : public LValue<Float4>
{
public:
explicit Float4(RValue<Byte4> cast);
@@ -2156,7 +2152,7 @@
RValue<Float4> Ceil(RValue<Float4> x);
template<class T>
- class Pointer : public Variable<Pointer<T>>
+ class Pointer : public LValue<Pointer<T>>
{
public:
template<class S>
@@ -2211,7 +2207,7 @@
RValue<Pointer<Byte>> operator-=(const Pointer<Byte> &lhs, RValue<UInt> offset);
template<class T, int S = 1>
- class Array : public Variable<T>
+ class Array : public LValue<T>
{
public:
Array(int size = S);
@@ -2320,14 +2316,9 @@
}
template<class T>
- Variable<T>::Variable(int arraySize) : LValue<T>(arraySize)
+ RValue<Pointer<T>> LValue<T>::operator&()
{
- }
-
- template<class T>
- RValue<Pointer<T>> Variable<T>::operator&()
- {
- return RValue<Pointer<T>>(LValue<T>::address);
+ return RValue<Pointer<T>>(address);
}
template<class T>
@@ -2650,7 +2641,7 @@
}
template<class T, int S>
- Array<T, S>::Array(int size) : Variable<T>(size)
+ Array<T, S>::Array(int size) : LValue<T>(size)
{
}