Commit c4f2c297 by Alexis Hetu Committed by Alexis Hétu

New integer related core functions

- Removed float <-> int bit conversion functions, as these will not be needed if everything is stored as float. - Added ineg for the minus (-) sign in from of a value. - Added f2i/i2f/f2u/u2f for float <-> int conversions - Added b2i/i2b/b2u/u2b for bool <-> int conversions - Added iadd, isub, imul, imad, [iu]div, [iu]mod, [iu]min, [iu]max for these basic operations as integer operations. - Added left and right shifts - Added ucmp to compare unsigned values - Modified or/xor/and to support vectors instead of only scalars. - Added vector equality comparison functions Change-Id: I0f138e3707242ec0fffc1c12b95064ddc98f0087 Reviewed-on: https://swiftshader-review.googlesource.com/3888Tested-by: 's avatarAlexis Hétu <sugoi@google.com> Reviewed-by: 's avatarNicolas Capens <capn@google.com>
parent c4b57f53
......@@ -263,9 +263,9 @@ namespace sw
case Shader::OPCODE_ALL: all(d.x, s0); break;
case Shader::OPCODE_ANY: any(d.x, s0); break;
case Shader::OPCODE_NOT: not(d, s0); break;
case Shader::OPCODE_OR: or(d.x, s0.x, s1.x); break;
case Shader::OPCODE_XOR: xor(d.x, s0.x, s1.x); break;
case Shader::OPCODE_AND: and(d.x, s0.x, s1.x); break;
case Shader::OPCODE_OR: or(d, s0, s1); break;
case Shader::OPCODE_XOR: xor(d, s0, s1); break;
case Shader::OPCODE_AND: and(d, s0, s1); break;
case Shader::OPCODE_END: break;
default:
ASSERT(false);
......
......@@ -105,10 +105,6 @@ namespace sw
Float4 arccosh(RValue<Float4> x, bool pp = false); // Limited to x >= 1
Float4 arcsinh(RValue<Float4> x, bool pp = false);
Float4 arctanh(RValue<Float4> x, bool pp = false); // Limited to ]-1, 1[ range
Int4 floatBitsToInt(RValue<Float4> x);
UInt4 floatBitsToUInt(RValue<Float4> x);
Float4 intBitsToFloat(RValue<Int4> x);
Float4 uintBitsToFloat(RValue<UInt4> x);
Float4 dot2(const Vector4f &v0, const Vector4f &v1);
Float4 dot3(const Vector4f &v0, const Vector4f &v1);
......@@ -243,15 +239,36 @@ namespace sw
public:
void mov(Vector4f &dst, const Vector4f &src, bool floorToInteger = false);
void neg(Vector4f &dst, const Vector4f &src);
void ineg(Vector4f &dst, const Vector4f &src);
void f2b(Vector4f &dst, const Vector4f &src);
void b2f(Vector4f &dst, const Vector4f &src);
void f2i(Vector4f &dst, const Vector4f &src);
void i2f(Vector4f &dst, const Vector4f &src);
void f2u(Vector4f &dst, const Vector4f &src);
void u2f(Vector4f &dst, const Vector4f &src);
void i2b(Vector4f &dst, const Vector4f &src);
void b2i(Vector4f &dst, const Vector4f &src);
void u2b(Vector4f &dst, const Vector4f &src);
void b2u(Vector4f &dst, const Vector4f &src);
void add(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void iadd(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void sub(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void isub(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void mad(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
void imad(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
void mul(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void imul(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void rcpx(Vector4f &dst, const Vector4f &src, bool pp = false);
void div(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void idiv(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void udiv(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void mod(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void imod(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void umod(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void shl(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void ishr(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void ushr(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void rsqx(Vector4f &dst, const Vector4f &src, bool pp = false);
void sqrt(Vector4f &dst, const Vector4f &src, bool pp = false);
void rsq(Vector4f &dst, const Vector4f &src, bool pp = false);
......@@ -268,7 +285,11 @@ namespace sw
void dp3(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void dp4(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void min(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void imin(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void umin(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void max(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void imax(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void umax(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void slt(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void step(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void exp2x(Vector4f &dst, const Vector4f &src, bool pp = false);
......@@ -281,10 +302,6 @@ namespace sw
void att(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void lrp(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
void smooth(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
void floatBitsToInt(Vector4i &dst, const Vector4f &src);
void floatBitsToUInt(Vector4u &dst, const Vector4f &src);
void intBitsToFloat(Vector4f &dst, const Vector4i &src);
void uintBitsToFloat(Vector4f &dst, const Vector4u &src);
void frc(Vector4f &dst, const Vector4f &src);
void trunc(Vector4f &dst, const Vector4f &src);
void floor(Vector4f &dst, const Vector4f &src);
......@@ -330,19 +347,23 @@ namespace sw
void cmp0(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
void cmp(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, Control control);
void icmp(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, Control control);
void ucmp(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, Control control);
void select(Vector4f &dst, const Vector4f &src0, const Vector4f &src1, const Vector4f &src2);
void extract(Float4 &dst, const Vector4f &src0, const Float4 &src1);
void insert(Vector4f &dst, const Vector4f &src, const Float4 &element, const Float4 &index);
void all(Float4 &dst, const Vector4f &src);
void any(Float4 &dst, const Vector4f &src);
void not(Vector4f &dst, const Vector4f &src);
void or(Float4 &dst, const Float4 &src0, const Float4 &src1);
void xor(Float4 &dst, const Float4 &src0, const Float4 &src1);
void and(Float4 &dst, const Float4 &src0, const Float4 &src1);
void or(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void xor(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void and(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void equal(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
void notEqual(Vector4f &dst, const Vector4f &src0, const Vector4f &src1);
private:
void sgn(Float4 &dst, const Float4 &src);
void cmp0(Float4 &dst, const Float4 &src0, const Float4 &src1, const Float4 &src2);
void cmp0i(Float4 &dst, const Float4 &src0, const Float4 &src1, const Float4 &src2);
void select(Float4 &dst, RValue<Int4> src0, const Float4 &src1, const Float4 &src2);
};
}
......
......@@ -246,9 +246,9 @@ namespace sw
case Shader::OPCODE_ALL: all(d.x, s0); break;
case Shader::OPCODE_ANY: any(d.x, s0); break;
case Shader::OPCODE_NOT: not(d, s0); break;
case Shader::OPCODE_OR: or(d.x, s0.x, s1.x); break;
case Shader::OPCODE_XOR: xor(d.x, s0.x, s1.x); break;
case Shader::OPCODE_AND: and(d.x, s0.x, s1.x); break;
case Shader::OPCODE_OR: or(d, s0, s1); break;
case Shader::OPCODE_XOR: xor(d, s0, s1); break;
case Shader::OPCODE_AND: and(d, s0, s1); break;
case Shader::OPCODE_TEXLDL: TEXLDL(r, d, s0, src1); break;
case Shader::OPCODE_TEX: TEX(r, d, s0, src1); break;
case Shader::OPCODE_END: break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment