Handling new opcodes in PixelProgram and VertexProgram

The new opcodes related to true int and uint support in
glsl shader are now handled properly in PixelProgram and
VertexProgram.

Change-Id: I62565844f24708b4bd89dd99bbf971b55495c5da
Reviewed-on: https://swiftshader-review.googlesource.com/3932
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index b3971e7..eaa5b12 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -133,6 +133,7 @@
 			case Shader::OPCODE_NOP:										break;
 			case Shader::OPCODE_ABS:		abs(d, s0);						break;
 			case Shader::OPCODE_ADD:		add(d, s0, s1);					break;
+			case Shader::OPCODE_IADD:       iadd(d, s0, s1);                break;
 			case Shader::OPCODE_CRS:		crs(d, s0, s1);					break;
 			case Shader::OPCODE_FORWARD1:	forward1(d, s0, s1, s2);		break;
 			case Shader::OPCODE_FORWARD2:	forward2(d, s0, s1, s2);		break;
@@ -169,19 +170,39 @@
 			case Shader::OPCODE_LRP:		lrp(d, s0, s1, s2);				break;
 			case Shader::OPCODE_STEP:		step(d, s0, s1);				break;
 			case Shader::OPCODE_SMOOTH:		smooth(d, s0, s1, s2);			break;
+			case Shader::OPCODE_FLOATBITSTOINT:
+			case Shader::OPCODE_FLOATBITSTOUINT:
+			case Shader::OPCODE_INTBITSTOFLOAT:
+			case Shader::OPCODE_UINTBITSTOFLOAT: d = s0;                    break;
 			case Shader::OPCODE_M3X2:		M3X2(r, d, s0, src1);			break;
 			case Shader::OPCODE_M3X3:		M3X3(r, d, s0, src1);			break;
 			case Shader::OPCODE_M3X4:		M3X4(r, d, s0, src1);			break;
 			case Shader::OPCODE_M4X3:		M4X3(r, d, s0, src1);			break;
 			case Shader::OPCODE_M4X4:		M4X4(r, d, s0, src1);			break;
 			case Shader::OPCODE_MAD:		mad(d, s0, s1, s2);				break;
+			case Shader::OPCODE_IMAD:		imad(d, s0, s1, s2);			break;
 			case Shader::OPCODE_MAX:		max(d, s0, s1);					break;
+			case Shader::OPCODE_IMAX:       imax(d, s0, s1);                break;
+			case Shader::OPCODE_UMAX:       umax(d, s0, s1);                break;
 			case Shader::OPCODE_MIN:		min(d, s0, s1);					break;
+			case Shader::OPCODE_IMIN:       imin(d, s0, s1);                break;
+			case Shader::OPCODE_UMIN:       umin(d, s0, s1);                break;
 			case Shader::OPCODE_MOV:		mov(d, s0, integer);			break;
 			case Shader::OPCODE_MOVA:		mov(d, s0);						break;
+			case Shader::OPCODE_NEG:        neg(d, s0);                     break;
+			case Shader::OPCODE_INEG:       ineg(d, s0);                    break;
 			case Shader::OPCODE_F2B:		f2b(d, s0);						break;
 			case Shader::OPCODE_B2F:		b2f(d, s0);						break;
+			case Shader::OPCODE_F2I:        f2i(d, s0);                     break;
+			case Shader::OPCODE_I2F:        i2f(d, s0);                     break;
+			case Shader::OPCODE_F2U:        f2u(d, s0);                     break;
+			case Shader::OPCODE_U2F:        u2f(d, s0);                     break;
+			case Shader::OPCODE_I2B:        i2b(d, s0);                     break;
+			case Shader::OPCODE_B2I:        b2i(d, s0);                     break;
+			case Shader::OPCODE_U2B:        u2b(d, s0);                     break;
+			case Shader::OPCODE_B2U:        b2u(d, s0);                     break;
 			case Shader::OPCODE_MUL:		mul(d, s0, s1);					break;
+			case Shader::OPCODE_IMUL:       imul(d, s0, s1);                break;
 			case Shader::OPCODE_NRM2:		nrm2(d, s0, pp);				break;
 			case Shader::OPCODE_NRM3:		nrm3(d, s0, pp);				break;
 			case Shader::OPCODE_NRM4:		nrm4(d, s0, pp);				break;
@@ -189,7 +210,14 @@
 			case Shader::OPCODE_POW:		pow(d, s0, s1, pp);				break;
 			case Shader::OPCODE_RCPX:		rcpx(d, s0, pp);				break;
 			case Shader::OPCODE_DIV:		div(d, s0, s1);					break;
+			case Shader::OPCODE_IDIV:       idiv(d, s0, s1);                break;
+			case Shader::OPCODE_UDIV:       udiv(d, s0, s1);                break;
 			case Shader::OPCODE_MOD:		mod(d, s0, s1);					break;
+			case Shader::OPCODE_IMOD:       imod(d, s0, s1);                break;
+			case Shader::OPCODE_UMOD:       umod(d, s0, s1);                break;
+			case Shader::OPCODE_SHL:        shl(d, s0, s1);                 break;
+			case Shader::OPCODE_ISHR:       ishr(d, s0, s1);                 break;
+			case Shader::OPCODE_USHR:       ushr(d, s0, s1);                 break;
 			case Shader::OPCODE_RSQX:		rsqx(d, s0, pp);				break;
 			case Shader::OPCODE_SQRT:		sqrt(d, s0, pp);				break;
 			case Shader::OPCODE_RSQ:		rsq(d, s0, pp);					break;
@@ -218,6 +246,7 @@
 			case Shader::OPCODE_ATANH:		atanh(d, s0, pp);				break;
 			case Shader::OPCODE_SLT:		slt(d, s0, s1);					break;
 			case Shader::OPCODE_SUB:		sub(d, s0, s1);					break;
+			case Shader::OPCODE_ISUB:       isub(d, s0, s1);                break;
 			case Shader::OPCODE_BREAK:		BREAK(r);						break;
 			case Shader::OPCODE_BREAKC:		BREAKC(r, s0, s1, control);		break;
 			case Shader::OPCODE_BREAKP:		BREAKP(r, src0);				break;
@@ -240,15 +269,18 @@
 			case Shader::OPCODE_LEAVE:		LEAVE(r);						break;
 			case Shader::OPCODE_CMP:		cmp(d, s0, s1, control);		break;
 			case Shader::OPCODE_ICMP:		icmp(d, s0, s1, control);		break;
+			case Shader::OPCODE_UCMP:       ucmp(d, s0, s1, control);       break;
 			case Shader::OPCODE_SELECT:		select(d, s0, s1, s2);			break;
 			case Shader::OPCODE_EXTRACT:	extract(d.x, s0, s1.x);			break;
 			case Shader::OPCODE_INSERT:		insert(d, s0, s1.x, s2.x);		break;
 			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, s0, s1);					break;
-			case Shader::OPCODE_XOR:		xor(d, s0, s1);					break;
-			case Shader::OPCODE_AND:		and(d, s0, s1);					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_EQ:         equal(d, s0, s1);               break;
+			case Shader::OPCODE_NE:         notEqual(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;