Connecting the dots for some built-in functions

- Completed implementation of round
  and hyperbolic trigonometry operations
- Added a few more cases in op to string
  functions

Change-Id: Ic09d228de8e4446a66152b70edc6a6bba511288a
Reviewed-on: https://swiftshader-review.googlesource.com/2891
Tested-by: Alexis Hétu <sugoi@google.com>
Reviewed-by: Nicolas Capens <capn@google.com>
diff --git a/src/OpenGL/compiler/Intermediate.cpp b/src/OpenGL/compiler/Intermediate.cpp
index 37de4ae..0ebab3a 100644
--- a/src/OpenGL/compiler/Intermediate.cpp
+++ b/src/OpenGL/compiler/Intermediate.cpp
@@ -80,6 +80,12 @@
       case EOpAsin: return "asin";
       case EOpAcos: return "acos";
       case EOpAtan: return "atan";
+      case EOpSinh: return "sinh";
+      case EOpCosh: return "cosh";
+      case EOpTanh: return "tanh";
+      case EOpAsinh: return "asinh";
+      case EOpAcosh: return "acosh";
+      case EOpAtanh: return "atanh";
       case EOpExp: return "exp";
       case EOpLog: return "log";
       case EOpExp2: return "exp2";
@@ -89,6 +95,9 @@
       case EOpAbs: return "abs";
       case EOpSign: return "sign";
       case EOpFloor: return "floor";
+      case EOpTrunc: return "trunc";
+      case EOpRound: return "round";
+      case EOpRoundEven: return "roundEven";
       case EOpCeil: return "ceil";
       case EOpFract: return "fract";
       case EOpLength: return "length";
@@ -98,6 +107,8 @@
       case EOpFwidth: return "fwidth";
       case EOpAny: return "any";
       case EOpAll: return "all";
+      case EOpIsNan: return "isnan";
+      case EOpIsInf: return "isinf";
 
       default: break;
     }
diff --git a/src/OpenGL/compiler/OutputASM.cpp b/src/OpenGL/compiler/OutputASM.cpp
index aae86fe..c8bb014 100644
--- a/src/OpenGL/compiler/OutputASM.cpp
+++ b/src/OpenGL/compiler/OutputASM.cpp
@@ -624,6 +624,12 @@
 		case EOpAsin:             if(visit == PostVisit) emit(sw::Shader::OPCODE_ASIN, result, arg); break;

 		case EOpAcos:             if(visit == PostVisit) emit(sw::Shader::OPCODE_ACOS, result, arg); break;

 		case EOpAtan:             if(visit == PostVisit) emit(sw::Shader::OPCODE_ATAN, result, arg); break;

+		case EOpSinh:             if(visit == PostVisit) emit(sw::Shader::OPCODE_SINH, result, arg); break;

+		case EOpCosh:             if(visit == PostVisit) emit(sw::Shader::OPCODE_COSH, result, arg); break;

+		case EOpTanh:             if(visit == PostVisit) emit(sw::Shader::OPCODE_TANH, result, arg); break;

+		case EOpAsinh:            if(visit == PostVisit) emit(sw::Shader::OPCODE_ASINH, result, arg); break;

+		case EOpAcosh:            if(visit == PostVisit) emit(sw::Shader::OPCODE_ACOSH, result, arg); break;

+		case EOpAtanh:            if(visit == PostVisit) emit(sw::Shader::OPCODE_ATANH, result, arg); break;

 		case EOpExp:              if(visit == PostVisit) emit(sw::Shader::OPCODE_EXP, result, arg); break;

 		case EOpLog:              if(visit == PostVisit) emit(sw::Shader::OPCODE_LOG, result, arg); break;

 		case EOpExp2:             if(visit == PostVisit) emit(sw::Shader::OPCODE_EXP2, result, arg); break;

@@ -633,8 +639,13 @@
 		case EOpAbs:              if(visit == PostVisit) emit(sw::Shader::OPCODE_ABS, result, arg); break;

 		case EOpSign:             if(visit == PostVisit) emit(sw::Shader::OPCODE_SGN, result, arg); break;

 		case EOpFloor:            if(visit == PostVisit) emit(sw::Shader::OPCODE_FLOOR, result, arg); break;

+		case EOpTrunc:            if(visit == PostVisit) emit(sw::Shader::OPCODE_TRUNC, result, arg); break;

+		case EOpRound:            if(visit == PostVisit) emit(sw::Shader::OPCODE_ROUND, result, arg); break;

+		case EOpRoundEven:        if(visit == PostVisit) emit(sw::Shader::OPCODE_ROUNDEVEN, result, arg); break;

 		case EOpCeil:             if(visit == PostVisit) emit(sw::Shader::OPCODE_CEIL, result, arg, result); break;

 		case EOpFract:            if(visit == PostVisit) emit(sw::Shader::OPCODE_FRC, result, arg); break;

+		case EOpIsNan:            if(visit == PostVisit) emit(sw::Shader::OPCODE_ISNAN, result, arg); break;

+		case EOpIsInf:            if(visit == PostVisit) emit(sw::Shader::OPCODE_ISINF, result, arg); break;

 		case EOpLength:           if(visit == PostVisit) emit(sw::Shader::OPCODE_LEN(dim(arg)), result, arg); break;

 		case EOpNormalize:        if(visit == PostVisit) emit(sw::Shader::OPCODE_NRM(dim(arg)), result, arg); break;

 		case EOpDFdx:             if(visit == PostVisit) emit(sw::Shader::OPCODE_DFDX, result, arg); break;

@@ -1024,6 +1035,16 @@
 		case EOpMix:         if(visit == PostVisit) emit(sw::Shader::OPCODE_LRP, result, arg[2], arg[1], arg[0]); break;

 		case EOpStep:        if(visit == PostVisit) emit(sw::Shader::OPCODE_STEP, result, arg[0], arg[1]); break;

 		case EOpSmoothStep:  if(visit == PostVisit) emit(sw::Shader::OPCODE_SMOOTH, result, arg[0], arg[1], arg[2]); break;

+		case EOpFloatBitsToInt:  if(visit == PostVisit) emit(sw::Shader::OPCODE_FLOATBITSTOINT, result, arg[0]); break;

+		case EOpFloatBitsToUint: if(visit == PostVisit) emit(sw::Shader::OPCODE_FLOATBITSTOUINT, result, arg[0]); break;

+		case EOpIntBitsToFloat:  if(visit == PostVisit) emit(sw::Shader::OPCODE_INTBITSTOFLOAT, result, arg[0]); break;

+		case EOpUintBitsToFloat: if(visit == PostVisit) emit(sw::Shader::OPCODE_UINTBITSTOFLOAT, result, arg[0]); break;

+		case EOpPackSnorm2x16:   if(visit == PostVisit) emit(sw::Shader::OPCODE_PACKSNORM2x16, result, arg[0]); break;

+		case EOpPackUnorm2x16:   if(visit == PostVisit) emit(sw::Shader::OPCODE_PACKUNORM2x16, result, arg[0]); break;

+		case EOpPackHalf2x16:    if(visit == PostVisit) emit(sw::Shader::OPCODE_PACKHALF2x16, result, arg[0]); break;

+		case EOpUnpackSnorm2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_UNPACKSNORM2x16, result, arg[0]); break;

+		case EOpUnpackUnorm2x16: if(visit == PostVisit) emit(sw::Shader::OPCODE_UNPACKUNORM2x16, result, arg[0]); break;

+		case EOpUnpackHalf2x16:  if(visit == PostVisit) emit(sw::Shader::OPCODE_UNPACKHALF2x16, result, arg[0]); break;

 		case EOpDistance:    if(visit == PostVisit) emit(sw::Shader::OPCODE_DIST(dim(arg[0])), result, arg[0], arg[1]); break;

 		case EOpDot:         if(visit == PostVisit) emit(sw::Shader::OPCODE_DP(dim(arg[0])), result, arg[0], arg[1]); break;

 		case EOpCross:       if(visit == PostVisit) emit(sw::Shader::OPCODE_CRS, result, arg[0], arg[1]); break;

diff --git a/src/OpenGL/compiler/intermOut.cpp b/src/OpenGL/compiler/intermOut.cpp
index f71eea4..81b088d 100644
--- a/src/OpenGL/compiler/intermOut.cpp
+++ b/src/OpenGL/compiler/intermOut.cpp
@@ -160,6 +160,12 @@
         case EOpAsin:           out << "arc sine";             break;
         case EOpAcos:           out << "arc cosine";           break;
         case EOpAtan:           out << "arc tangent";          break;
+        case EOpSinh:           out << "hyperbolic sine";        break;
+        case EOpCosh:           out << "hyperbolic cosine";      break;
+        case EOpTanh:           out << "hyperbolic tangent";     break;
+        case EOpAsinh:          out << "arc hyperbolic sine";    break;
+        case EOpAcosh:          out << "arc hyperbolic cosine";  break;
+        case EOpAtanh:          out << "arc hyperbolic tangent"; break;
 
         case EOpExp:            out << "exp";                  break;
         case EOpLog:            out << "log";                  break;
@@ -171,8 +177,26 @@
         case EOpAbs:            out << "Absolute value";       break;
         case EOpSign:           out << "Sign";                 break;
         case EOpFloor:          out << "Floor";                break;
+        case EOpTrunc:          out << "Trunc";                break;
+        case EOpRound:          out << "Round";                break;
+        case EOpRoundEven:      out << "RoundEven";            break;
         case EOpCeil:           out << "Ceiling";              break;
         case EOpFract:          out << "Fraction";             break;
+        case EOpIsNan:          out << "Is not a number";      break;
+        case EOpIsInf:          out << "Is infinity";          break;
+
+        case EOpFloatBitsToInt: out << "float bits to int";    break;
+        case EOpFloatBitsToUint: out << "float bits to uint";  break;
+        case EOpIntBitsToFloat: out << "int bits to float";    break;
+        case EOpUintBitsToFloat: out << "uint bits to float";  break;
+
+        case EOpPackSnorm2x16:  out << "pack Snorm 2x16";      break;
+        case EOpPackUnorm2x16:  out << "pack Unorm 2x16";      break;
+        case EOpPackHalf2x16:   out << "pack half 2x16";       break;
+
+        case EOpUnpackSnorm2x16: out << "unpack Snorm 2x16";   break;
+        case EOpUnpackUnorm2x16: out << "unpack Unorm 2x16";   break;
+        case EOpUnpackHalf2x16:  out << "unpack half 2x16";    break;
 
         case EOpLength:         out << "length";               break;
         case EOpNormalize:      out << "normalize";            break;
@@ -180,6 +204,10 @@
             //	case EOpDPdy:           out << "dPdy";                 break;   
             //	case EOpFwidth:         out << "fwidth";               break;                   
 
+        case EOpDeterminant:    out << "determinant";          break;
+        case EOpTranspose:      out << "transpose";            break;
+        case EOpInverse:        out << "inverse";              break;
+
         case EOpAny:            out << "any";                  break;
         case EOpAll:            out << "all";                  break;
 
@@ -258,6 +286,7 @@
         case EOpReflect:       out << "reflect";                 break;
         case EOpRefract:       out << "refract";                 break;
         case EOpMul:           out << "component-wise multiply"; break;
+        case EOpOuterProduct:  out << "outer product";           break;
 
         default: out.message(EPrefixError, "Bad aggregation op");
     }
diff --git a/src/Shader/PixelRoutine.cpp b/src/Shader/PixelRoutine.cpp
index e6a83c6..b9f3ab9 100644
--- a/src/Shader/PixelRoutine.cpp
+++ b/src/Shader/PixelRoutine.cpp
@@ -4042,6 +4042,7 @@
 			case Shader::OPCODE_FRC:		frc(d, s0);										break;
 			case Shader::OPCODE_TRUNC:      trunc(d, s0);                                   break;
 			case Shader::OPCODE_FLOOR:      floor(d, s0);                                   break;
+			case Shader::OPCODE_ROUND:		round(d, s0);                                   break;
 			case Shader::OPCODE_CEIL:       ceil(d, s0);                                    break;
 			case Shader::OPCODE_EXP2X:		exp2x(d, s0, pp);								break;
 			case Shader::OPCODE_EXP2:		exp2(d, s0, pp);								break;
@@ -4095,6 +4096,12 @@
 			case Shader::OPCODE_ASIN:		asin(d, s0, pp);								break;
 			case Shader::OPCODE_ATAN:		atan(d, s0, pp);								break;
 			case Shader::OPCODE_ATAN2:		atan2(d, s0, s1, pp);							break;
+			case Shader::OPCODE_COSH:		cosh(d, s0, pp);								break;
+			case Shader::OPCODE_SINH:		sinh(d, s0, pp);								break;
+			case Shader::OPCODE_TANH:		tanh(d, s0, pp);								break;
+			case Shader::OPCODE_ACOSH:		acosh(d, s0, pp);								break;
+			case Shader::OPCODE_ASINH:		asinh(d, s0, pp);								break;
+			case Shader::OPCODE_ATANH:		atanh(d, s0, pp);								break;
 			case Shader::OPCODE_M4X4:		M4X4(r, d, s0, src1);							break;
 			case Shader::OPCODE_M4X3:		M4X3(r, d, s0, src1);							break;
 			case Shader::OPCODE_M3X4:		M3X4(r, d, s0, src1);							break;
diff --git a/src/Shader/Shader.cpp b/src/Shader/Shader.cpp
index 88bb4b0..f00a6a8 100644
--- a/src/Shader/Shader.cpp
+++ b/src/Shader/Shader.cpp
@@ -764,6 +764,16 @@
 		case OPCODE_LRP:			return "lrp";
 		case OPCODE_STEP:			return "step";
 		case OPCODE_SMOOTH:			return "smooth";
+		case OPCODE_FLOATBITSTOINT:	 return "floatBitsToInt";
+		case OPCODE_FLOATBITSTOUINT: return "floatBitsToUInt";
+		case OPCODE_INTBITSTOFLOAT:	 return "intBitsToFloat";
+		case OPCODE_UINTBITSTOFLOAT: return "uintBitsToFloat";
+		case OPCODE_PACKSNORM2x16:	 return "packSnorm2x16";
+		case OPCODE_PACKUNORM2x16:	 return "packUnorm2x16";
+		case OPCODE_PACKHALF2x16:	 return "packHalf2x16";
+		case OPCODE_UNPACKSNORM2x16: return "unpackSnorm2x16";
+		case OPCODE_UNPACKUNORM2x16: return "unpackUnorm2x16";
+		case OPCODE_UNPACKHALF2x16:	 return "unpackHalf2x16";
 		case OPCODE_FRC:			return "frc";
 		case OPCODE_M4X4:			return "m4x4";
 		case OPCODE_M4X3:			return "m4x3";
@@ -864,10 +874,18 @@
 		case OPCODE_ASIN:           return "asin";
 		case OPCODE_ATAN:           return "atan";
 		case OPCODE_ATAN2:          return "atan2";
+		case OPCODE_COSH:           return "cosh";
+		case OPCODE_SINH:           return "sinh";
+		case OPCODE_TANH:           return "tanh";
+		case OPCODE_ACOSH:          return "acosh";
+		case OPCODE_ASINH:          return "asinh";
+		case OPCODE_ATANH:          return "atanh";
 		case OPCODE_DP1:            return "dp1";
 		case OPCODE_DP2:            return "dp2";
 		case OPCODE_TRUNC:          return "trunc";
 		case OPCODE_FLOOR:          return "floor";
+		case OPCODE_ROUND:          return "round";
+		case OPCODE_ROUNDEVEN:      return "roundEven";
 		case OPCODE_CEIL:           return "ceil";
 		case OPCODE_EXP2:           return "exp2";
 		case OPCODE_LOG2:           return "log2";
@@ -878,6 +896,8 @@
 		case OPCODE_B2F:            return "b2f";
 		case OPCODE_ALL:            return "all";
 		case OPCODE_ANY:            return "any";
+		case OPCODE_ISNAN:          return "isnan";
+		case OPCODE_ISINF:          return "isinf";
 		case OPCODE_NOT:            return "not";
 		case OPCODE_OR:             return "or";
 		case OPCODE_XOR:            return "xor";
diff --git a/src/Shader/Shader.hpp b/src/Shader/Shader.hpp
index 898e96e..8c4fe3d 100644
--- a/src/Shader/Shader.hpp
+++ b/src/Shader/Shader.hpp
@@ -52,6 +52,8 @@
 			OPCODE_ATT,   // D3DSIO_DST

 			OPCODE_LRP,

 			OPCODE_FRC,

+			OPCODE_ISNAN,

+			OPCODE_ISINF,

 			OPCODE_M4X4,

 			OPCODE_M4X3,

 			OPCODE_M3X4,

@@ -147,10 +149,18 @@
 			OPCODE_ASIN,

 			OPCODE_ATAN,

 			OPCODE_ATAN2,

+			OPCODE_COSH,

+			OPCODE_SINH,

+			OPCODE_TANH,

+			OPCODE_ACOSH,

+			OPCODE_ASINH,

+			OPCODE_ATANH,

 			OPCODE_DP1,

 			OPCODE_DP2,

 			OPCODE_TRUNC,

 			OPCODE_FLOOR,

+			OPCODE_ROUND,

+			OPCODE_ROUNDEVEN,

 			OPCODE_CEIL,

 			OPCODE_SQRT,

 			OPCODE_RSQ,

@@ -180,6 +190,16 @@
 			OPCODE_AND,

 			OPCODE_STEP,

 			OPCODE_SMOOTH,

+			OPCODE_FLOATBITSTOINT,

+			OPCODE_FLOATBITSTOUINT,

+			OPCODE_INTBITSTOFLOAT,

+			OPCODE_UINTBITSTOFLOAT,

+			OPCODE_PACKSNORM2x16,

+			OPCODE_PACKUNORM2x16,

+			OPCODE_PACKHALF2x16,

+			OPCODE_UNPACKSNORM2x16,

+			OPCODE_UNPACKUNORM2x16,

+			OPCODE_UNPACKHALF2x16,

 			OPCODE_FORWARD1,

 			OPCODE_FORWARD2,

 			OPCODE_FORWARD3,

diff --git a/src/Shader/VertexProgram.cpp b/src/Shader/VertexProgram.cpp
index 7cd1daa..a2b4537 100644
--- a/src/Shader/VertexProgram.cpp
+++ b/src/Shader/VertexProgram.cpp
@@ -118,9 +118,9 @@
 			Vector4f s1;
 			Vector4f s2;
 
-			if(src0.type != Shader::PARAMETER_VOID) s0 = reg(r, src0);
-			if(src1.type != Shader::PARAMETER_VOID) s1 = reg(r, src1);
-			if(src2.type != Shader::PARAMETER_VOID) s2 = reg(r, src2);
+			if(src0.type != Shader::PARAMETER_VOID) s0 = fetchRegisterF(r, src0);
+			if(src1.type != Shader::PARAMETER_VOID) s1 = fetchRegisterF(r, src1);
+			if(src2.type != Shader::PARAMETER_VOID) s2 = fetchRegisterF(r, src2);
 
 			switch(opcode)
 			{
@@ -163,6 +163,7 @@
 			case Shader::OPCODE_FRC:		frc(d, s0);						break;
 			case Shader::OPCODE_TRUNC:      trunc(d, s0);                   break;
 			case Shader::OPCODE_FLOOR:      floor(d, s0);                   break;
+			case Shader::OPCODE_ROUND:      round(d, s0);                   break;
 			case Shader::OPCODE_CEIL:       ceil(d, s0);                    break;
 			case Shader::OPCODE_LIT:		lit(d, s0);						break;
 			case Shader::OPCODE_LOG2X:		log2x(d, s0, pp);				break;
@@ -213,6 +214,12 @@
 			case Shader::OPCODE_ASIN:		asin(d, s0);					break;
 			case Shader::OPCODE_ATAN:		atan(d, s0);					break;
 			case Shader::OPCODE_ATAN2:		atan2(d, s0, s1);				break;
+			case Shader::OPCODE_COSH:		cosh(d, s0, pp);				break;
+			case Shader::OPCODE_SINH:		sinh(d, s0, pp);				break;
+			case Shader::OPCODE_TANH:		tanh(d, s0, pp);				break;
+			case Shader::OPCODE_ACOSH:		acosh(d, s0, pp);				break;
+			case Shader::OPCODE_ASINH:		asinh(d, s0, pp);				break;
+			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_BREAK:		BREAK(r);						break;
@@ -596,7 +603,7 @@
 		}
 	}
 
-	Vector4f VertexProgram::reg(Registers &r, const Src &src, int offset)
+	Vector4f VertexProgram::fetchRegisterF(Registers &r, const Src &src, int offset)
 	{
 		int i = src.index + offset;
 
@@ -859,8 +866,8 @@
 
 	void VertexProgram::M3X2(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1)
 	{
-		Vector4f row0 = reg(r, src1, 0);
-		Vector4f row1 = reg(r, src1, 1);
+		Vector4f row0 = fetchRegisterF(r, src1, 0);
+		Vector4f row1 = fetchRegisterF(r, src1, 1);
 
 		dst.x = dot3(src0, row0);
 		dst.y = dot3(src0, row1);
@@ -868,9 +875,9 @@
 
 	void VertexProgram::M3X3(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1)
 	{
-		Vector4f row0 = reg(r, src1, 0);
-		Vector4f row1 = reg(r, src1, 1);
-		Vector4f row2 = reg(r, src1, 2);
+		Vector4f row0 = fetchRegisterF(r, src1, 0);
+		Vector4f row1 = fetchRegisterF(r, src1, 1);
+		Vector4f row2 = fetchRegisterF(r, src1, 2);
 
 		dst.x = dot3(src0, row0);
 		dst.y = dot3(src0, row1);
@@ -879,10 +886,10 @@
 
 	void VertexProgram::M3X4(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1)
 	{
-		Vector4f row0 = reg(r, src1, 0);
-		Vector4f row1 = reg(r, src1, 1);
-		Vector4f row2 = reg(r, src1, 2);
-		Vector4f row3 = reg(r, src1, 3);
+		Vector4f row0 = fetchRegisterF(r, src1, 0);
+		Vector4f row1 = fetchRegisterF(r, src1, 1);
+		Vector4f row2 = fetchRegisterF(r, src1, 2);
+		Vector4f row3 = fetchRegisterF(r, src1, 3);
 
 		dst.x = dot3(src0, row0);
 		dst.y = dot3(src0, row1);
@@ -892,9 +899,9 @@
 
 	void VertexProgram::M4X3(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1)
 	{
-		Vector4f row0 = reg(r, src1, 0);
-		Vector4f row1 = reg(r, src1, 1);
-		Vector4f row2 = reg(r, src1, 2);
+		Vector4f row0 = fetchRegisterF(r, src1, 0);
+		Vector4f row1 = fetchRegisterF(r, src1, 1);
+		Vector4f row2 = fetchRegisterF(r, src1, 2);
 
 		dst.x = dot4(src0, row0);
 		dst.y = dot4(src0, row1);
@@ -903,10 +910,10 @@
 
 	void VertexProgram::M4X4(Registers &r, Vector4f &dst, Vector4f &src0, Src &src1)
 	{
-		Vector4f row0 = reg(r, src1, 0);
-		Vector4f row1 = reg(r, src1, 1);
-		Vector4f row2 = reg(r, src1, 2);
-		Vector4f row3 = reg(r, src1, 3);
+		Vector4f row0 = fetchRegisterF(r, src1, 0);
+		Vector4f row1 = fetchRegisterF(r, src1, 1);
+		Vector4f row2 = fetchRegisterF(r, src1, 2);
+		Vector4f row3 = fetchRegisterF(r, src1, 3);
 
 		dst.x = dot4(src0, row0);
 		dst.y = dot4(src0, row1);
@@ -1188,7 +1195,7 @@
 		}
 		else
 		{
-			Int4 condition = As<Int4>(reg(r, src).x);
+			Int4 condition = As<Int4>(fetchRegisterF(r, src).x);
 			IF(r, condition);
 		}
 	}
@@ -1358,7 +1365,7 @@
 		Nucleus::setInsertBlock(testBlock);
 		r.enableContinue = restoreContinue;
 
-		const Vector4f &src = reg(r, temporaryRegister);
+		const Vector4f &src = fetchRegisterF(r, temporaryRegister);
 		Int4 condition = As<Int4>(src.x);
 		condition &= r.enableStack[r.enableIndex - 1];
 		r.enableStack[r.enableIndex] = condition;
@@ -1453,7 +1460,7 @@
 		}
 		else
 		{
-			Int index = As<Int>(Float(reg(r, s).x.x));
+			Int index = As<Int>(Float(fetchRegisterF(r, s).x.x));
 
 			for(int i = 0; i < 16; i++)
 			{
diff --git a/src/Shader/VertexProgram.hpp b/src/Shader/VertexProgram.hpp
index 097f90c..dc2121b 100644
--- a/src/Shader/VertexProgram.hpp
+++ b/src/Shader/VertexProgram.hpp
@@ -41,7 +41,7 @@
 		void program(Registers &r);
 		void passThrough(Registers &r);
 
-		Vector4f reg(Registers &r, const Src &src, int offset = 0);
+		Vector4f fetchRegisterF(Registers &r, const Src &src, int offset = 0);
 		Vector4f readConstant(Registers &r, const Src &src, int offset = 0);
 		Int relativeAddress(Registers &r, const Shader::Parameter &var);
 		Int4 enableMask(Registers &r, const Shader::Instruction *instruction);