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/PixelProgram.cpp b/src/Shader/PixelProgram.cpp
index 4a7cf76..415117d 100644
--- a/src/Shader/PixelProgram.cpp
+++ b/src/Shader/PixelProgram.cpp
@@ -146,12 +146,26 @@
 			case Shader::OPCODE_DCL:                                                       break;
 			case Shader::OPCODE_NOP:                                                       break;
 			case Shader::OPCODE_MOV:        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_ADD:        add(d, s0, s1);                                break;
+			case Shader::OPCODE_IADD:       iadd(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_MUL:        mul(d, s0, s1);                                break;
+			case Shader::OPCODE_IMUL:       imul(d, s0, s1);                               break;
 			case Shader::OPCODE_MAD:        mad(d, s0, s1, s2);                            break;
+			case Shader::OPCODE_IMAD:       imad(d, s0, s1, s2);                           break;
 			case Shader::OPCODE_DP1:        dp1(d, s0, s1);                                break;
 			case Shader::OPCODE_DP2:        dp2(d, s0, s1);                                break;
 			case Shader::OPCODE_DP2ADD:     dp2add(d, s0, s1, s2);                         break;
@@ -159,6 +173,7 @@
 			case Shader::OPCODE_DP4:        dp4(d, s0, s1);                                break;
 			case Shader::OPCODE_CMP0:       cmp0(d, s0, s1, s2);                           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;
@@ -176,7 +191,14 @@
 			case Shader::OPCODE_LOG:        log(d, s0, 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;
@@ -188,10 +210,18 @@
 			case Shader::OPCODE_DIST3:      dist3(d.x, s0, s1, pp);                        break;
 			case Shader::OPCODE_DIST4:      dist4(d.x, s0, s1, pp);                        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_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_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_POWX:       powx(d, s0, s1, pp);                           break;
 			case Shader::OPCODE_POW:        pow(d, s0, s1, pp);                            break;
 			case Shader::OPCODE_SGN:        sgn(d, s0);                                    break;
@@ -266,6 +296,8 @@
 			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_END:                                                       break;
 			default:
 				ASSERT(false);
diff --git a/src/Shader/Shader.cpp b/src/Shader/Shader.cpp
index 6dad7f3..11c3f20 100644
--- a/src/Shader/Shader.cpp
+++ b/src/Shader/Shader.cpp
@@ -739,6 +739,7 @@
 		case OPCODE_SUB:			return "sub";
 		case OPCODE_ISUB:			return "isub";
 		case OPCODE_MAD:			return "mad";
+		case OPCODE_IMAD:			return "imad";
 		case OPCODE_MUL:			return "mul";
 		case OPCODE_IMUL:			return "imul";
 		case OPCODE_RCPX:			return "rcpx";
@@ -913,6 +914,10 @@
 		case OPCODE_I2F:            return "i2f";
 		case OPCODE_F2U:            return "f2u";
 		case OPCODE_U2F:            return "u2f";
+		case OPCODE_B2I:            return "b2i";
+		case OPCODE_I2B:            return "i2b";
+		case OPCODE_B2U:            return "b2u";
+		case OPCODE_U2B:            return "u2b";
 		case OPCODE_ALL:            return "all";
 		case OPCODE_ANY:            return "any";
 		case OPCODE_NEG:            return "neg";
@@ -923,6 +928,8 @@
 		case OPCODE_OR:             return "or";
 		case OPCODE_XOR:            return "xor";
 		case OPCODE_AND:            return "and";
+		case OPCODE_EQ:             return "eq";
+		case OPCODE_NE:             return "neq";
 		case OPCODE_FORWARD1:       return "forward1";
 		case OPCODE_FORWARD2:       return "forward2";
 		case OPCODE_FORWARD3:       return "forward3";
diff --git a/src/Shader/Shader.hpp b/src/Shader/Shader.hpp
index 5c576a5..339279f 100644
--- a/src/Shader/Shader.hpp
+++ b/src/Shader/Shader.hpp
@@ -184,6 +184,10 @@
 			OPCODE_I2F,   // Int to float

 			OPCODE_F2U,   // Float to uint

 			OPCODE_U2F,   // Uint to float

+			OPCODE_I2B,   // Int to bool

+			OPCODE_B2I,   // Bool to int

+			OPCODE_U2B,   // Uint to bool

+			OPCODE_B2U,   // Bool to uint

 			OPCODE_ALL,

 			OPCODE_ANY,

 			OPCODE_NEG,

@@ -191,6 +195,8 @@
 			OPCODE_OR,

 			OPCODE_XOR,

 			OPCODE_AND,

+			OPCODE_EQ,

+			OPCODE_NE,

 			OPCODE_STEP,

 			OPCODE_SMOOTH,

 			OPCODE_ISNAN,

@@ -234,6 +240,7 @@
 			OPCODE_ISUB,

 			OPCODE_IMUL,

 			OPCODE_IDIV,

+			OPCODE_IMAD,

 			OPCODE_IMOD,

 			OPCODE_SHL,

 			OPCODE_ISHR,

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;