r5xx: Dump shader constants when dumping program assembly.
[mesa.git] / src / mesa / drivers / dri / r300 / r300_vertprog.c
index d7f8a85cc2dd2391f672ab091f32152d3a398bc2..861f0427cf5dcd56cc25b34e7ae2c3a28a970eb3 100644 (file)
@@ -1,6 +1,7 @@
 /**************************************************************************
 
-Copyright (C) 2005 Aapo Tahkola.
+Copyright (C) 2005  Aapo Tahkola <aet@rasterburn.org>
+Copyright (C) 2008  Oliver McFadden <z3ro.geek@gmail.com>
 
 All Rights Reserved.
 
@@ -25,19 +26,7 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 **************************************************************************/
 
-/**
- * \file
- *
- * \author Aapo Tahkola <aet@rasterburn.org>
- *
- * \author Oliver McFadden <z3ro.geek@gmail.com>
- *
- * \todo A VE_MULTIPLY_ADD or VE_MULTIPLYX2_ADD opcode with all 3 source
- * operands using unique PVS_REG_TEMPORARY vector addresses requires special
- * handling, which is currently not implemented!
- *
- * For a description of the vertex program instruction set see r300_reg.h.
- */
+/* Radeon R5xx Acceleration, Revision 1.2 */
 
 #include "main/glheader.h"
 #include "main/macros.h"
@@ -57,35 +46,18 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
                        (t_src_class(a.File) == PVS_SRC_REG_INPUT && \
                         t_src_class(b.File) == PVS_SRC_REG_INPUT)))) \
 
-#define ZERO_SRC_0 (PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]), \
-                                   SWIZZLE_ZERO, SWIZZLE_ZERO, \
-                                   SWIZZLE_ZERO, SWIZZLE_ZERO, \
-                                   t_src_class(src[0].File), VSF_FLAG_NONE) | (src[0].RelAddr << 4))
-
-#define ZERO_SRC_1 (PVS_SOURCE_OPCODE(t_src_index(vp, &src[1]), \
-                                   SWIZZLE_ZERO, SWIZZLE_ZERO, \
-                                   SWIZZLE_ZERO, SWIZZLE_ZERO, \
-                                   t_src_class(src[1].File), VSF_FLAG_NONE) | (src[1].RelAddr << 4))
-
-#define ZERO_SRC_2 (PVS_SOURCE_OPCODE(t_src_index(vp, &src[2]), \
-                                   SWIZZLE_ZERO, SWIZZLE_ZERO, \
-                                   SWIZZLE_ZERO, SWIZZLE_ZERO, \
-                                   t_src_class(src[2].File), VSF_FLAG_NONE) | (src[2].RelAddr << 4))
-
-#define ONE_SRC_0 (PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]), \
-                                   SWIZZLE_ONE, SWIZZLE_ONE, \
-                                   SWIZZLE_ONE, SWIZZLE_ONE, \
-                                   t_src_class(src[0].File), VSF_FLAG_NONE) | (src[0].RelAddr << 4))
-
-#define ONE_SRC_1 (PVS_SOURCE_OPCODE(t_src_index(vp, &src[1]), \
-                                   SWIZZLE_ONE, SWIZZLE_ONE, \
-                                   SWIZZLE_ONE, SWIZZLE_ONE, \
-                                   t_src_class(src[1].File), VSF_FLAG_NONE) | (src[1].RelAddr << 4))
-
-#define ONE_SRC_2 (PVS_SOURCE_OPCODE(t_src_index(vp, &src[2]), \
-                                   SWIZZLE_ONE, SWIZZLE_ONE, \
-                                   SWIZZLE_ONE, SWIZZLE_ONE, \
-                                   t_src_class(src[2].File), VSF_FLAG_NONE) | (src[2].RelAddr << 4))
+/*
+ * Take an already-setup and valid source then swizzle it appropriately to
+ * obtain a constant ZERO or ONE source.
+ */
+#define __CONST(x, y)  \
+       (PVS_SRC_OPERAND(t_src_index(vp, &src[x]),      \
+                          t_swizzle(y),        \
+                          t_swizzle(y),        \
+                          t_swizzle(y),        \
+                          t_swizzle(y),        \
+                          t_src_class(src[x].File), \
+                          VSF_FLAG_NONE) | (src[x].RelAddr << 4))
 
 #define FREE_TEMPS() \
        do { \
@@ -97,7 +69,8 @@ USE OR OTHER DEALINGS IN THE SOFTWARE.
                u_temp_i=VSF_MAX_FRAGMENT_TEMPS-1; \
        } while (0)
 
-int r300VertexProgUpdateParams(GLcontext * ctx, struct r300_vertex_program_cont *vp, float *dst)
+int r300VertexProgUpdateParams(GLcontext * ctx,
+                              struct r300_vertex_program_cont *vp, float *dst)
 {
        int pi;
        struct gl_vertex_program *mesa_vp = &vp->mesa_program;
@@ -119,7 +92,8 @@ int r300VertexProgUpdateParams(GLcontext * ctx, struct r300_vertex_program_cont
        assert(mesa_vp->Base.Parameters);
        _mesa_load_state_parameters(ctx, mesa_vp->Base.Parameters);
 
-       if (mesa_vp->Base.Parameters->NumParameters * 4 > VSF_MAX_FRAGMENT_LENGTH) {
+       if (mesa_vp->Base.Parameters->NumParameters * 4 >
+           VSF_MAX_FRAGMENT_LENGTH) {
                fprintf(stderr, "%s:Params exhausted\n", __FUNCTION__);
                _mesa_exit(-1);
        }
@@ -137,7 +111,8 @@ int r300VertexProgUpdateParams(GLcontext * ctx, struct r300_vertex_program_cont
                        *dst++ = paramList->ParameterValues[pi][3];
                        break;
                default:
-                       _mesa_problem(NULL, "Bad param type in %s", __FUNCTION__);
+                       _mesa_problem(NULL, "Bad param type in %s",
+                                     __FUNCTION__);
                }
 
        }
@@ -177,7 +152,8 @@ static unsigned long t_dst_class(enum register_file file)
        }
 }
 
-static unsigned long t_dst_index(struct r300_vertex_program *vp, struct prog_dst_register *dst)
+static unsigned long t_dst_index(struct r300_vertex_program *vp,
+                                struct prog_dst_register *dst)
 {
        if (dst->File == PROGRAM_OUTPUT)
                return vp->outputs[dst->Index];
@@ -195,6 +171,7 @@ static unsigned long t_src_class(enum register_file file)
        case PROGRAM_LOCAL_PARAM:
        case PROGRAM_ENV_PARAM:
        case PROGRAM_NAMED_PARAM:
+       case PROGRAM_CONSTANT:
        case PROGRAM_STATE_VAR:
                return PVS_SRC_REG_CONSTANT;
                /*
@@ -221,7 +198,8 @@ static void vp_dump_inputs(struct r300_vertex_program *vp, char *caller)
        int i;
 
        if (vp == NULL) {
-               fprintf(stderr, "vp null in call to %s from %s\n", __FUNCTION__, caller);
+               fprintf(stderr, "vp null in call to %s from %s\n", __FUNCTION__,
+                       caller);
                return;
        }
 
@@ -233,7 +211,8 @@ static void vp_dump_inputs(struct r300_vertex_program *vp, char *caller)
 }
 #endif
 
-static unsigned long t_src_index(struct r300_vertex_program *vp, struct prog_src_register *src)
+static unsigned long t_src_index(struct r300_vertex_program *vp,
+                                struct prog_src_register *src)
 {
        int i;
        int max_reg = -1;
@@ -253,7 +232,8 @@ static unsigned long t_src_index(struct r300_vertex_program *vp, struct prog_src
                return vp->inputs[src->Index];
        } else {
                if (src->Index < 0) {
-                       fprintf(stderr, "negative offsets for indirect addressing do not work.\n");
+                       fprintf(stderr,
+                               "negative offsets for indirect addressing do not work.\n");
                        return 0;
                }
                return src->Index;
@@ -262,35 +242,40 @@ static unsigned long t_src_index(struct r300_vertex_program *vp, struct prog_src
 
 /* these two functions should probably be merged... */
 
-static unsigned long t_src(struct r300_vertex_program *vp, struct prog_src_register *src)
+static unsigned long t_src(struct r300_vertex_program *vp,
+                          struct prog_src_register *src)
 {
        /* src->NegateBase uses the NEGATE_ flags from program_instruction.h,
         * which equal our VSF_FLAGS_ values, so it's safe to just pass it here.
         */
-       return PVS_SOURCE_OPCODE(t_src_index(vp, src),
-                                t_swizzle(GET_SWZ(src->Swizzle, 0)),
-                                t_swizzle(GET_SWZ(src->Swizzle, 1)),
-                                t_swizzle(GET_SWZ(src->Swizzle, 2)),
-                                t_swizzle(GET_SWZ(src->Swizzle, 3)),
-                                t_src_class(src->File),
-                                src->NegateBase) | (src->RelAddr << 4);
+       return PVS_SRC_OPERAND(t_src_index(vp, src),
+                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 1)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 2)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 3)),
+                              t_src_class(src->File),
+                              src->NegateBase) | (src->RelAddr << 4);
 }
 
-static unsigned long t_src_scalar(struct r300_vertex_program *vp, struct prog_src_register *src)
+static unsigned long t_src_scalar(struct r300_vertex_program *vp,
+                                 struct prog_src_register *src)
 {
        /* src->NegateBase uses the NEGATE_ flags from program_instruction.h,
         * which equal our VSF_FLAGS_ values, so it's safe to just pass it here.
         */
-       return PVS_SOURCE_OPCODE(t_src_index(vp, src),
-                                t_swizzle(GET_SWZ(src->Swizzle, 0)),
-                                t_swizzle(GET_SWZ(src->Swizzle, 0)),
-                                t_swizzle(GET_SWZ(src->Swizzle, 0)),
-                                t_swizzle(GET_SWZ(src->Swizzle, 0)),
-                                t_src_class(src->File),
-                                src->NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src->RelAddr << 4);
+       return PVS_SRC_OPERAND(t_src_index(vp, src),
+                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
+                              t_swizzle(GET_SWZ(src->Swizzle, 0)),
+                              t_src_class(src->File),
+                              src->
+                              NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src->RelAddr << 4);
 }
 
-static GLboolean valid_dst(struct r300_vertex_program *vp, struct prog_dst_register *dst)
+static GLboolean valid_dst(struct r300_vertex_program *vp,
+                          struct prog_dst_register *dst)
 {
        if (dst->File == PROGRAM_OUTPUT && vp->outputs[dst->Index] == -1) {
                return GL_FALSE;
@@ -301,266 +286,364 @@ static GLboolean valid_dst(struct r300_vertex_program *vp, struct prog_dst_regis
        return GL_TRUE;
 }
 
-static GLuint *t_opcode_abs(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeABS(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
        //MAX RESULT 1.X Y Z W PARAM 0{} {X Y Z W} PARAM 0{X Y Z W } {X Y Z W} neg Xneg Yneg Zneg W
 
-       inst[0] = PVS_VECTOR_OPCODE(VE_MAXIMUM,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_MAXIMUM,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
-       inst[2] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 1)),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 2)),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 3)),
-                                   t_src_class(src[0].File),
-                                   (!src[0].NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[0].RelAddr << 4);
+       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 1)),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 2)),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),
+                                 t_src_class(src[0].File),
+                                 (!src[0].
+                                  NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[0].RelAddr << 4);
        inst[3] = 0;
 
        return inst;
 }
 
-static GLuint *t_opcode_add(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeADD(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_VECTOR_OPCODE(VE_ADD,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
        inst[2] = t_src(vp, &src[1]);
-       inst[3] = ZERO_SRC_1;
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_arl(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeARL(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_VECTOR_OPCODE(VE_FLT2FIX_DX,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_FLT2FIX_DX,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_dp3(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeDP3(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
        //DOT RESULT 1.X Y Z W PARAM 0{} {X Y Z ZERO} PARAM 0{} {X Y Z ZERO}
 
-       inst[0] = PVS_VECTOR_OPCODE(VE_DOT_PRODUCT,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
-       inst[1] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 1)),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 2)),
-                                   SWIZZLE_ZERO,
-                                   t_src_class(src[0].File),
-                                   src[0].NegateBase ? VSF_FLAG_XYZ : VSF_FLAG_NONE) | (src[0].RelAddr << 4);
-       inst[2] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[1]),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 0)),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 1)),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 2)),
-                                   SWIZZLE_ZERO,
-                                   t_src_class(src[1].File),
-                                   src[1].NegateBase ? VSF_FLAG_XYZ : VSF_FLAG_NONE) | (src[1].RelAddr << 4);
-       inst[3] = ZERO_SRC_1;
+       inst[0] = PVS_OP_DST_OPERAND(VE_DOT_PRODUCT,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
+       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 1)),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 2)),
+                                 SWIZZLE_ZERO,
+                                 t_src_class(src[0].File),
+                                 src[0].
+                                 NegateBase ? VSF_FLAG_XYZ : VSF_FLAG_NONE) |
+           (src[0].RelAddr << 4);
+       inst[2] =
+           PVS_SRC_OPERAND(t_src_index(vp, &src[1]),
+                           t_swizzle(GET_SWZ(src[1].Swizzle, 0)),
+                           t_swizzle(GET_SWZ(src[1].Swizzle, 1)),
+                           t_swizzle(GET_SWZ(src[1].Swizzle, 2)), SWIZZLE_ZERO,
+                           t_src_class(src[1].File),
+                           src[1].
+                           NegateBase ? VSF_FLAG_XYZ : VSF_FLAG_NONE) |
+           (src[1].RelAddr << 4);
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_dp4(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeDP4(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_VECTOR_OPCODE(VE_DOT_PRODUCT,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_DOT_PRODUCT,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
        inst[2] = t_src(vp, &src[1]);
-       inst[3] = ZERO_SRC_1;
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_dph(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeDPH(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
        //DOT RESULT 1.X Y Z W PARAM 0{} {X Y Z ONE} PARAM 0{} {X Y Z W}
-       inst[0] = PVS_VECTOR_OPCODE(VE_DOT_PRODUCT,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
-       inst[1] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 1)),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 2)),
-                                   PVS_SRC_SELECT_FORCE_1,
-                                   t_src_class(src[0].File),
-                                   src[0].NegateBase ? VSF_FLAG_XYZ : VSF_FLAG_NONE) | (src[0].RelAddr << 4);
+       inst[0] = PVS_OP_DST_OPERAND(VE_DOT_PRODUCT,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
+       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 1)),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 2)),
+                                 PVS_SRC_SELECT_FORCE_1,
+                                 t_src_class(src[0].File),
+                                 src[0].
+                                 NegateBase ? VSF_FLAG_XYZ : VSF_FLAG_NONE) |
+           (src[0].RelAddr << 4);
        inst[2] = t_src(vp, &src[1]);
-       inst[3] = ZERO_SRC_1;
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_dst(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeDST(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_VECTOR_OPCODE(VE_DISTANCE_VECTOR,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_DISTANCE_VECTOR,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
        inst[2] = t_src(vp, &src[1]);
-       inst[3] = ZERO_SRC_1;
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_ex2(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeEX2(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_MATH_OPCODE(ME_EXP_BASE2_FULL_DX, t_dst_index(vp, &vpi->DstReg), t_dst_mask(vpi->DstReg.WriteMask), t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(ME_EXP_BASE2_FULL_DX,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_exp(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeEXP(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_MATH_OPCODE(ME_EXP_BASE2_DX, t_dst_index(vp, &vpi->DstReg), t_dst_mask(vpi->DstReg.WriteMask), t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(ME_EXP_BASE2_DX,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_flr(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3], int *u_temp_i)
+static GLuint *r300TranslateOpcodeFLR(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3],
+                                     int *u_temp_i)
 {
        /* FRC TMP 0.X Y Z W PARAM 0{} {X Y Z W}
           ADD RESULT 1.X Y Z W PARAM 0{} {X Y Z W} TMP 0{X Y Z W } {X Y Z W} neg Xneg Yneg Zneg W */
 
-       inst[0] = PVS_VECTOR_OPCODE(VE_FRACTION,
-                                   *u_temp_i,
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   PVS_DST_REG_TEMPORARY);
+       inst[0] = PVS_OP_DST_OPERAND(VE_FRACTION,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    *u_temp_i,
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    PVS_DST_REG_TEMPORARY);
        inst[1] = t_src(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
        inst += 4;
 
-       inst[0] = PVS_VECTOR_OPCODE(VE_ADD,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
-       inst[2] = PVS_SOURCE_OPCODE(*u_temp_i,
-                                   PVS_SRC_SELECT_X,
-                                   PVS_SRC_SELECT_Y,
-                                   PVS_SRC_SELECT_Z,
-                                   PVS_SRC_SELECT_W,
-                                   PVS_SRC_REG_TEMPORARY,
-                                   /* Not 100% sure about this */
-                                   (!src[0].NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE
-                                   /*VSF_FLAG_ALL */ );
-       inst[3] = ZERO_SRC_0;
+       inst[2] = PVS_SRC_OPERAND(*u_temp_i,
+                                 PVS_SRC_SELECT_X,
+                                 PVS_SRC_SELECT_Y,
+                                 PVS_SRC_SELECT_Z,
+                                 PVS_SRC_SELECT_W, PVS_SRC_REG_TEMPORARY,
+                                 /* Not 100% sure about this */
+                                 (!src[0].
+                                  NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE
+                                 /*VSF_FLAG_ALL */ );
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
        (*u_temp_i)--;
 
        return inst;
 }
 
-static GLuint *t_opcode_frc(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeFRC(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_VECTOR_OPCODE(VE_FRACTION,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_FRACTION,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_lg2(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeLG2(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
        // LG2 RESULT 1.X Y Z W PARAM 0{} {X X X X}
 
-       inst[0] = PVS_MATH_OPCODE(ME_LOG_BASE2_FULL_DX,
-                                 t_dst_index(vp, &vpi->DstReg),
-                                 t_dst_mask(vpi->DstReg.WriteMask),
-                                 t_dst_class(vpi->DstReg.File));
-       inst[1] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
-                                   t_src_class(src[0].File),
-                                   src[0].NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[0].RelAddr << 4);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[0] = PVS_OP_DST_OPERAND(ME_LOG_BASE2_FULL_DX,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
+       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),
+                                 t_src_class(src[0].File),
+                                 src[0].
+                                 NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[0].RelAddr << 4);
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_lit(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeLIT(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
        //LIT TMP 1.Y Z TMP 1{} {X W Z Y} TMP 1{} {Y W Z X} TMP 1{} {Y X Z W}
 
-       inst[0] = PVS_MATH_OPCODE(ME_LIGHT_COEFF_DX, t_dst_index(vp, &vpi->DstReg), t_dst_mask(vpi->DstReg.WriteMask), t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(ME_LIGHT_COEFF_DX,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        /* NOTE: Users swizzling might not work. */
-       inst[1] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),      // X
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 3)),      // W
-                                   PVS_SRC_SELECT_FORCE_0,                     // Z
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
-                                   t_src_class(src[0].File),
-                                   src[0].NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[0].RelAddr << 4);
-       inst[2] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 3)),      // W
-                                   PVS_SRC_SELECT_FORCE_0,                     // Z
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),      // X
-                                   t_src_class(src[0].File),
-                                   src[0].NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[0].RelAddr << 4);
-       inst[3] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),      // X
-                                   PVS_SRC_SELECT_FORCE_0,                     // Z
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 3)),      // W
-                                   t_src_class(src[0].File),
-                                   src[0].NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[0].RelAddr << 4);
+       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 0)),      // X
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),        // W
+                                 PVS_SRC_SELECT_FORCE_0,       // Z
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 1)),        // Y
+                                 t_src_class(src[0].File),
+                                 src[0].
+                                 NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[0].RelAddr << 4);
+       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),        // W
+                                 PVS_SRC_SELECT_FORCE_0,       // Z
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),        // X
+                                 t_src_class(src[0].File),
+                                 src[0].
+                                 NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[0].RelAddr << 4);
+       inst[3] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),        // X
+                                 PVS_SRC_SELECT_FORCE_0,       // Z
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),        // W
+                                 t_src_class(src[0].File),
+                                 src[0].
+                                 NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[0].RelAddr << 4);
 
        return inst;
 }
 
-static GLuint *t_opcode_log(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeLOG(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_MATH_OPCODE(ME_LOG_BASE2_DX,
-                                 t_dst_index(vp, &vpi->DstReg),
-                                 t_dst_mask(vpi->DstReg.WriteMask),
-                                 t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(ME_LOG_BASE2_DX,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_mad(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeMAD(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       /* FIXME */
-       inst[0] = (((PVS_MACRO_OP_2CLK_MADD & PVS_DST_OPCODE_MASK) << PVS_DST_OPCODE_SHIFT) |
-                  ((1 & PVS_DST_MACRO_INST_MASK) << PVS_DST_MACRO_INST_SHIFT) |
-                  ((t_dst_index(vp, &vpi->DstReg) & PVS_DST_OFFSET_MASK) << PVS_DST_OFFSET_SHIFT) |
-                  ((t_dst_mask(vpi->DstReg.WriteMask) & 0xf) << PVS_DST_WE_X_SHIFT) |
-                  ((t_dst_class(vpi->DstReg.File) & PVS_DST_REG_TYPE_MASK) << PVS_DST_REG_TYPE_SHIFT));
+       inst[0] = PVS_OP_DST_OPERAND(PVS_MACRO_OP_2CLK_MADD,
+                                    GL_FALSE,
+                                    GL_TRUE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
        inst[2] = t_src(vp, &src[1]);
        inst[3] = t_src(vp, &src[2]);
@@ -568,229 +651,300 @@ static GLuint *t_opcode_mad(struct r300_vertex_program *vp, struct prog_instruct
        return inst;
 }
 
-static GLuint *t_opcode_max(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeMAX(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_VECTOR_OPCODE(VE_MAXIMUM,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_MAXIMUM,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
        inst[2] = t_src(vp, &src[1]);
-       inst[3] = ZERO_SRC_1;
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_min(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeMIN(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_VECTOR_OPCODE(VE_MINIMUM,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_MINIMUM,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
        inst[2] = t_src(vp, &src[1]);
-       inst[3] = ZERO_SRC_1;
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_mov(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeMOV(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
        //ADD RESULT 1.X Y Z W PARAM 0{} {X Y Z W} PARAM 0{} {ZERO ZERO ZERO ZERO}
 
-       inst[0] = PVS_VECTOR_OPCODE(VE_ADD,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_mul(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeMUL(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_VECTOR_OPCODE(VE_MULTIPLY,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_MULTIPLY,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
        inst[2] = t_src(vp, &src[1]);
-       inst[3] = ZERO_SRC_1;
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_pow(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodePOW(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_MATH_OPCODE(ME_POWER_FUNC_FF,
-                                 t_dst_index(vp, &vpi->DstReg),
-                                 t_dst_mask(vpi->DstReg.WriteMask),
-                                 t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(ME_POWER_FUNC_FF,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
        inst[3] = t_src_scalar(vp, &src[1]);
 
        return inst;
 }
 
-static GLuint *t_opcode_rcp(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeRCP(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_MATH_OPCODE(ME_RECIP_DX,
-                                 t_dst_index(vp, &vpi->DstReg),
-                                 t_dst_mask(vpi->DstReg.WriteMask),
-                                 t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(ME_RECIP_DX,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_rsq(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeRSQ(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_MATH_OPCODE(ME_RECIP_SQRT_DX,
-                                 t_dst_index(vp, &vpi->DstReg),
-                                 t_dst_mask(vpi->DstReg.WriteMask),
-                                 t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(ME_RECIP_SQRT_DX,
+                                    GL_TRUE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src_scalar(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_sge(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeSGE(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_VECTOR_OPCODE(VE_SET_GREATER_THAN_EQUAL,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_SET_GREATER_THAN_EQUAL,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
        inst[2] = t_src(vp, &src[1]);
-       inst[3] = ZERO_SRC_1;
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_slt(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeSLT(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
-       inst[0] = PVS_VECTOR_OPCODE(VE_SET_LESS_THAN,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_SET_LESS_THAN,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
        inst[2] = t_src(vp, &src[1]);
-       inst[3] = ZERO_SRC_1;
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_sub(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeSUB(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
        //ADD RESULT 1.X Y Z W TMP 0{} {X Y Z W} PARAM 1{X Y Z W } {X Y Z W} neg Xneg Yneg Zneg W
 
 #if 0
-       inst[0] = PVS_VECTOR_OPCODE(VE_ADD,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
-       inst[2] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[1]),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 0)),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 1)),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 2)),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 3)),
-                                   t_src_class(src[1].File),
-                                   (!src[1].NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[1].RelAddr << 4);
+       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]),
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 0)),
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 1)),
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 2)),
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 3)),
+                                 t_src_class(src[1].File),
+                                 (!src[1].
+                                  NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[1].RelAddr << 4);
        inst[3] = 0;
 #else
        inst[0] =
-           PVS_VECTOR_OPCODE(VE_MULTIPLY_ADD, t_dst_index(vp, &vpi->DstReg),
-                             t_dst_mask(vpi->DstReg.WriteMask),
-                             t_dst_class(vpi->DstReg.File));
+           PVS_OP_DST_OPERAND(VE_MULTIPLY_ADD,
+                              GL_FALSE,
+                              GL_FALSE,
+                              t_dst_index(vp, &vpi->DstReg),
+                              t_dst_mask(vpi->DstReg.WriteMask),
+                              t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
-       inst[2] = ONE_SRC_0;
-       inst[3] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[1]),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 0)),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 1)),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 2)),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 3)),
-                                   t_src_class(src[1].File),
-                                   (!src[1].  NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[1].RelAddr << 4);
+       inst[2] = __CONST(0, SWIZZLE_ONE);
+       inst[3] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]),
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 0)),
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 1)),
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 2)),
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 3)),
+                                 t_src_class(src[1].File),
+                                 (!src[1].
+                                  NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[1].RelAddr << 4);
 #endif
 
        return inst;
 }
 
-static GLuint *t_opcode_swz(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3])
+static GLuint *r300TranslateOpcodeSWZ(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3])
 {
        //ADD RESULT 1.X Y Z W PARAM 0{} {X Y Z W} PARAM 0{} {ZERO ZERO ZERO ZERO}
 
-       inst[0] = PVS_VECTOR_OPCODE(VE_ADD,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
+       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &src[0]);
-       inst[2] = ZERO_SRC_0;
-       inst[3] = ZERO_SRC_0;
+       inst[2] = __CONST(0, SWIZZLE_ZERO);
+       inst[3] = __CONST(0, SWIZZLE_ZERO);
 
        return inst;
 }
 
-static GLuint *t_opcode_xpd(struct r300_vertex_program *vp, struct prog_instruction *vpi, GLuint * inst, struct prog_src_register src[3], int *u_temp_i)
+static GLuint *r300TranslateOpcodeXPD(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi,
+                                     GLuint * inst,
+                                     struct prog_src_register src[3],
+                                     int *u_temp_i)
 {
        /* mul r0, r1.yzxw, r2.zxyw
           mad r0, -r2.yzxw, r1.zxyw, r0
         */
 
-       inst[0] = PVS_VECTOR_OPCODE(VE_MULTIPLY_ADD,
-                                   *u_temp_i,
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   PVS_DST_REG_TEMPORARY);
-       inst[1] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 2)),      // Z
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),      // X
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 3)),      // W
-                                   t_src_class(src[0].File),
-                                   src[0].NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[0].RelAddr << 4);
-       inst[2] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[1]),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 2)),      // Z
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 0)),      // X
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 1)),      // Y
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 3)),      // W
-                                   t_src_class(src[1].File),
-                                   src[1].NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[1].RelAddr << 4);
-       inst[3] = ZERO_SRC_1;
+       inst[0] = PVS_OP_DST_OPERAND(VE_MULTIPLY_ADD,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    *u_temp_i,
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    PVS_DST_REG_TEMPORARY);
+       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 2)),        // Z
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),        // X
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),        // W
+                                 t_src_class(src[0].File),
+                                 src[0].
+                                 NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[0].RelAddr << 4);
+       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]), t_swizzle(GET_SWZ(src[1].Swizzle, 2)),      // Z
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 0)),        // X
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 1)),        // Y
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 3)),        // W
+                                 t_src_class(src[1].File),
+                                 src[1].
+                                 NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[1].RelAddr << 4);
+       inst[3] = __CONST(1, SWIZZLE_ZERO);
        inst += 4;
 
-       inst[0] = PVS_VECTOR_OPCODE(VE_MULTIPLY_ADD,
-                                   t_dst_index(vp, &vpi->DstReg),
-                                   t_dst_mask(vpi->DstReg.WriteMask),
-                                   t_dst_class(vpi->DstReg.File));
-       inst[1] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[1]),
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 1)),      // Y
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 2)),      // Z
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 0)),      // X
-                                   t_swizzle(GET_SWZ(src[1].Swizzle, 3)),      // W
-                                   t_src_class(src[1].File),
-                                   (!src[1].NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[1].RelAddr << 4);
-       inst[2] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]),
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 2)),      // Z
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 0)),      // X
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 1)),      // Y
-                                   t_swizzle(GET_SWZ(src[0].Swizzle, 3)),      // W
-                                   t_src_class(src[0].File),
-                                   src[0].NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) | (src[0].RelAddr << 4);
-       inst[3] = PVS_SOURCE_OPCODE(*u_temp_i,
-                                   PVS_SRC_SELECT_X,
-                                   PVS_SRC_SELECT_Y,
-                                   PVS_SRC_SELECT_Z,
-                                   PVS_SRC_SELECT_W,
-                                   PVS_SRC_REG_TEMPORARY,
-                                   VSF_FLAG_NONE);
+       inst[0] = PVS_OP_DST_OPERAND(VE_MULTIPLY_ADD,
+                                    GL_FALSE,
+                                    GL_FALSE,
+                                    t_dst_index(vp, &vpi->DstReg),
+                                    t_dst_mask(vpi->DstReg.WriteMask),
+                                    t_dst_class(vpi->DstReg.File));
+       inst[1] = PVS_SRC_OPERAND(t_src_index(vp, &src[1]), t_swizzle(GET_SWZ(src[1].Swizzle, 1)),      // Y
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 2)),        // Z
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 0)),        // X
+                                 t_swizzle(GET_SWZ(src[1].Swizzle, 3)),        // W
+                                 t_src_class(src[1].File),
+                                 (!src[1].
+                                  NegateBase) ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[1].RelAddr << 4);
+       inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &src[0]), t_swizzle(GET_SWZ(src[0].Swizzle, 2)),      // Z
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 0)),        // X
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 1)),        // Y
+                                 t_swizzle(GET_SWZ(src[0].Swizzle, 3)),        // W
+                                 t_src_class(src[0].File),
+                                 src[0].
+                                 NegateBase ? VSF_FLAG_ALL : VSF_FLAG_NONE) |
+           (src[0].RelAddr << 4);
+       inst[3] =
+           PVS_SRC_OPERAND(*u_temp_i, PVS_SRC_SELECT_X, PVS_SRC_SELECT_Y,
+                           PVS_SRC_SELECT_Z, PVS_SRC_SELECT_W,
+                           PVS_SRC_REG_TEMPORARY, VSF_FLAG_NONE);
 
        (*u_temp_i)--;
 
@@ -823,17 +977,20 @@ static void t_inputs_outputs(struct r300_vertex_program *vp)
        }
 
        if (vp->key.OutputsWritten & (1 << VERT_RESULT_COL1)) {
-               vp->outputs[VERT_RESULT_COL1] = vp->outputs[VERT_RESULT_COL0] + 1;
+               vp->outputs[VERT_RESULT_COL1] =
+                   vp->outputs[VERT_RESULT_COL0] + 1;
                cur_reg = vp->outputs[VERT_RESULT_COL1] + 1;
        }
 
        if (vp->key.OutputsWritten & (1 << VERT_RESULT_BFC0)) {
-               vp->outputs[VERT_RESULT_BFC0] = vp->outputs[VERT_RESULT_COL0] + 2;
+               vp->outputs[VERT_RESULT_BFC0] =
+                   vp->outputs[VERT_RESULT_COL0] + 2;
                cur_reg = vp->outputs[VERT_RESULT_BFC0] + 2;
        }
 
        if (vp->key.OutputsWritten & (1 << VERT_RESULT_BFC1)) {
-               vp->outputs[VERT_RESULT_BFC1] = vp->outputs[VERT_RESULT_COL0] + 3;
+               vp->outputs[VERT_RESULT_BFC1] =
+                   vp->outputs[VERT_RESULT_COL0] + 3;
                cur_reg = vp->outputs[VERT_RESULT_BFC1] + 1;
        }
 #if 0
@@ -849,7 +1006,8 @@ static void t_inputs_outputs(struct r300_vertex_program *vp)
        }
 }
 
-static void r300TranslateVertexShader(struct r300_vertex_program *vp, struct prog_instruction *vpi)
+static void r300TranslateVertexShader(struct r300_vertex_program *vp,
+                                     struct prog_instruction *vpi)
 {
        int i;
        GLuint *inst;
@@ -868,7 +1026,8 @@ static void r300TranslateVertexShader(struct r300_vertex_program *vp, struct pro
 
        t_inputs_outputs(vp);
 
-       for (inst = vp->program.body.i; vpi->Opcode != OPCODE_END; vpi++, inst += 4) {
+       for (inst = vp->program.body.i; vpi->Opcode != OPCODE_END;
+            vpi++, inst += 4) {
 
                FREE_TEMPS();
 
@@ -888,19 +1047,24 @@ static void r300TranslateVertexShader(struct r300_vertex_program *vp, struct pro
                if (num_operands == 3) {        /* TODO: scalars */
                        if (CMP_SRCS(src[1], src[2])
                            || CMP_SRCS(src[0], src[2])) {
-                               inst[0] = PVS_VECTOR_OPCODE(VE_ADD,
-                                                           u_temp_i,
-                                                           VSF_FLAG_ALL,
-                                                           PVS_DST_REG_TEMPORARY);
-                               inst[1] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[2]),
-                                                           SWIZZLE_X,
-                                                           SWIZZLE_Y,
-                                                           SWIZZLE_Z,
-                                                           SWIZZLE_W,
-                                                           t_src_class(src[2].File),
-                                                           VSF_FLAG_NONE) | (src[2].RelAddr << 4);
-                               inst[2] = ZERO_SRC_2;
-                               inst[3] = ZERO_SRC_2;
+                               inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
+                                                            GL_FALSE,
+                                                            GL_FALSE,
+                                                            u_temp_i,
+                                                            VSF_FLAG_ALL,
+                                                            PVS_DST_REG_TEMPORARY);
+                               inst[1] =
+                                   PVS_SRC_OPERAND(t_src_index(vp, &src[2]),
+                                                   SWIZZLE_X,
+                                                   SWIZZLE_Y,
+                                                   SWIZZLE_Z,
+                                                   SWIZZLE_W,
+                                                   t_src_class(src[2].File),
+                                                   VSF_FLAG_NONE) | (src[2].
+                                                                     RelAddr <<
+                                                                     4);
+                               inst[2] = __CONST(2, SWIZZLE_ZERO);
+                               inst[3] = __CONST(2, SWIZZLE_ZERO);
                                inst += 4;
 
                                src[2].File = PROGRAM_TEMPORARY;
@@ -912,19 +1076,24 @@ static void r300TranslateVertexShader(struct r300_vertex_program *vp, struct pro
 
                if (num_operands >= 2) {
                        if (CMP_SRCS(src[1], src[0])) {
-                               inst[0] = PVS_VECTOR_OPCODE(VE_ADD,
-                                                           u_temp_i,
-                                                           VSF_FLAG_ALL,
-                                                           PVS_DST_REG_TEMPORARY);
-                               inst[1] = PVS_SOURCE_OPCODE(t_src_index(vp, &src[0]),
-                                                           SWIZZLE_X,
-                                                           SWIZZLE_Y,
-                                                           SWIZZLE_Z,
-                                                           SWIZZLE_W,
-                                                           t_src_class(src[0].File),
-                                                           VSF_FLAG_NONE) | (src[0].RelAddr << 4);
-                               inst[2] = ZERO_SRC_0;
-                               inst[3] = ZERO_SRC_0;
+                               inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
+                                                            GL_FALSE,
+                                                            GL_FALSE,
+                                                            u_temp_i,
+                                                            VSF_FLAG_ALL,
+                                                            PVS_DST_REG_TEMPORARY);
+                               inst[1] =
+                                   PVS_SRC_OPERAND(t_src_index(vp, &src[0]),
+                                                   SWIZZLE_X,
+                                                   SWIZZLE_Y,
+                                                   SWIZZLE_Z,
+                                                   SWIZZLE_W,
+                                                   t_src_class(src[0].File),
+                                                   VSF_FLAG_NONE) | (src[0].
+                                                                     RelAddr <<
+                                                                     4);
+                               inst[2] = __CONST(0, SWIZZLE_ZERO);
+                               inst[3] = __CONST(0, SWIZZLE_ZERO);
                                inst += 4;
 
                                src[0].File = PROGRAM_TEMPORARY;
@@ -936,87 +1105,87 @@ static void r300TranslateVertexShader(struct r300_vertex_program *vp, struct pro
 
                switch (vpi->Opcode) {
                case OPCODE_ABS:
-                       inst = t_opcode_abs(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeABS(vp, vpi, inst, src);
                        break;
                case OPCODE_ADD:
-                       inst = t_opcode_add(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeADD(vp, vpi, inst, src);
                        break;
                case OPCODE_ARL:
-                       inst = t_opcode_arl(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeARL(vp, vpi, inst, src);
                        break;
                case OPCODE_DP3:
-                       inst = t_opcode_dp3(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeDP3(vp, vpi, inst, src);
                        break;
                case OPCODE_DP4:
-                       inst = t_opcode_dp4(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeDP4(vp, vpi, inst, src);
                        break;
                case OPCODE_DPH:
-                       inst = t_opcode_dph(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeDPH(vp, vpi, inst, src);
                        break;
                case OPCODE_DST:
-                       inst = t_opcode_dst(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeDST(vp, vpi, inst, src);
                        break;
                case OPCODE_EX2:
-                       inst = t_opcode_ex2(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeEX2(vp, vpi, inst, src);
                        break;
                case OPCODE_EXP:
-                       inst = t_opcode_exp(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeEXP(vp, vpi, inst, src);
                        break;
                case OPCODE_FLR:
-                       inst = t_opcode_flr(vp, vpi, inst, src, /* FIXME */
-                                           &u_temp_i);
+                       inst = r300TranslateOpcodeFLR(vp, vpi, inst, src,       /* FIXME */
+                                                     &u_temp_i);
                        break;
                case OPCODE_FRC:
-                       inst = t_opcode_frc(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeFRC(vp, vpi, inst, src);
                        break;
                case OPCODE_LG2:
-                       inst = t_opcode_lg2(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeLG2(vp, vpi, inst, src);
                        break;
                case OPCODE_LIT:
-                       inst = t_opcode_lit(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeLIT(vp, vpi, inst, src);
                        break;
                case OPCODE_LOG:
-                       inst = t_opcode_log(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeLOG(vp, vpi, inst, src);
                        break;
                case OPCODE_MAD:
-                       inst = t_opcode_mad(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeMAD(vp, vpi, inst, src);
                        break;
                case OPCODE_MAX:
-                       inst = t_opcode_max(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeMAX(vp, vpi, inst, src);
                        break;
                case OPCODE_MIN:
-                       inst = t_opcode_min(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeMIN(vp, vpi, inst, src);
                        break;
                case OPCODE_MOV:
-                       inst = t_opcode_mov(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeMOV(vp, vpi, inst, src);
                        break;
                case OPCODE_MUL:
-                       inst = t_opcode_mul(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeMUL(vp, vpi, inst, src);
                        break;
                case OPCODE_POW:
-                       inst = t_opcode_pow(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodePOW(vp, vpi, inst, src);
                        break;
                case OPCODE_RCP:
-                       inst = t_opcode_rcp(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeRCP(vp, vpi, inst, src);
                        break;
                case OPCODE_RSQ:
-                       inst = t_opcode_rsq(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeRSQ(vp, vpi, inst, src);
                        break;
                case OPCODE_SGE:
-                       inst = t_opcode_sge(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeSGE(vp, vpi, inst, src);
                        break;
                case OPCODE_SLT:
-                       inst = t_opcode_slt(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeSLT(vp, vpi, inst, src);
                        break;
                case OPCODE_SUB:
-                       inst = t_opcode_sub(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeSUB(vp, vpi, inst, src);
                        break;
                case OPCODE_SWZ:
-                       inst = t_opcode_swz(vp, vpi, inst, src);
+                       inst = r300TranslateOpcodeSWZ(vp, vpi, inst, src);
                        break;
                case OPCODE_XPD:
-                       inst = t_opcode_xpd(vp, vpi, inst, src, /* FIXME */
-                                           &u_temp_i);
+                       inst = r300TranslateOpcodeXPD(vp, vpi, inst, src,       /* FIXME */
+                                                     &u_temp_i);
                        break;
                default:
                        assert(0);
@@ -1028,13 +1197,15 @@ static void r300TranslateVertexShader(struct r300_vertex_program *vp, struct pro
           of the fragment program. Blank the outputs here. */
        for (i = 0; i < VERT_RESULT_MAX; i++) {
                if (vp->key.OutputsAdded & (1 << i)) {
-                       inst[0] = PVS_VECTOR_OPCODE(VE_ADD,
-                                                   vp->outputs[i],
-                                                   VSF_FLAG_ALL,
-                                                   PVS_DST_REG_OUT);
-                       inst[1] = ZERO_SRC_0;
-                       inst[2] = ZERO_SRC_0;
-                       inst[3] = ZERO_SRC_0;
+                       inst[0] = PVS_OP_DST_OPERAND(VE_ADD,
+                                                    GL_FALSE,
+                                                    GL_FALSE,
+                                                    vp->outputs[i],
+                                                    VSF_FLAG_ALL,
+                                                    PVS_DST_REG_OUT);
+                       inst[1] = __CONST(0, SWIZZLE_ZERO);
+                       inst[2] = __CONST(0, SWIZZLE_ZERO);
+                       inst[3] = __CONST(0, SWIZZLE_ZERO);
                        inst += 4;
                }
        }
@@ -1127,7 +1298,8 @@ static void position_invariant(struct gl_program *prog)
 #endif
        }
 
-       _mesa_copy_instructions(&vpi[i], prog->Instructions, prog->NumInstructions);
+       _mesa_copy_instructions(&vpi[i], prog->Instructions,
+                               prog->NumInstructions);
 
        free(prog->Instructions);
 
@@ -1139,7 +1311,8 @@ static void position_invariant(struct gl_program *prog)
        assert(vpi->Opcode == OPCODE_END);
 }
 
-static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog, GLuint temp_index)
+static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog,
+                       GLuint temp_index)
 {
        struct prog_instruction *vpi;
        struct prog_instruction *vpi_insert;
@@ -1148,9 +1321,12 @@ static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog,
        vpi = _mesa_alloc_instructions(prog->NumInstructions + 2);
        _mesa_init_instructions(vpi, prog->NumInstructions + 2);
        /* all but END */
-       _mesa_copy_instructions(vpi, prog->Instructions, prog->NumInstructions - 1);
+       _mesa_copy_instructions(vpi, prog->Instructions,
+                               prog->NumInstructions - 1);
        /* END */
-       _mesa_copy_instructions(&vpi[prog->NumInstructions + 1], &prog->Instructions[prog->NumInstructions - 1], 1);
+       _mesa_copy_instructions(&vpi[prog->NumInstructions + 1],
+                               &prog->Instructions[prog->NumInstructions - 1],
+                               1);
        vpi_insert = &vpi[prog->NumInstructions - 1];
 
        vpi_insert[i].Opcode = OPCODE_MOV;
@@ -1187,7 +1363,8 @@ static void insert_wpos(struct r300_vertex_program *vp, struct gl_program *prog,
        assert(vpi->Opcode == OPCODE_END);
 }
 
-static void pos_as_texcoord(struct r300_vertex_program *vp, struct gl_program *prog)
+static void pos_as_texcoord(struct r300_vertex_program *vp,
+                           struct gl_program *prog)
 {
        struct prog_instruction *vpi;
        GLuint tempregi = prog->NumTemporaries;
@@ -1195,7 +1372,8 @@ static void pos_as_texcoord(struct r300_vertex_program *vp, struct gl_program *p
        prog->NumTemporaries++;
 
        for (vpi = prog->Instructions; vpi->Opcode != OPCODE_END; vpi++) {
-               if (vpi->DstReg.File == PROGRAM_OUTPUT && vpi->DstReg.Index == VERT_RESULT_HPOS) {
+               if (vpi->DstReg.File == PROGRAM_OUTPUT
+                   && vpi->DstReg.Index == VERT_RESULT_HPOS) {
                        vpi->DstReg.File = PROGRAM_TEMPORARY;
                        vpi->DstReg.Index = tempregi;
                }
@@ -1248,6 +1426,8 @@ void r300SelectVertexShader(r300ContextPtr r300)
        GLint wpos_idx;
 
        vpc = (struct r300_vertex_program_cont *)ctx->VertexProgram._Current;
+       wanted_key.InputsRead = vpc->mesa_program.Base.InputsRead;
+       wanted_key.OutputsWritten = vpc->mesa_program.Base.OutputsWritten;
        InputsRead = ctx->FragmentProgram._Current->Base.InputsRead;
 
        wpos_idx = -1;
@@ -1261,11 +1441,9 @@ void r300SelectVertexShader(r300ContextPtr r300)
                        _mesa_exit(-1);
                }
 
-               InputsRead |= (FRAG_BIT_TEX0 << i);
+               wanted_key.OutputsWritten |= 1 << (VERT_RESULT_TEX0 + i);
                wpos_idx = i;
        }
-       wanted_key.InputsRead = vpc->mesa_program.Base.InputsRead;
-       wanted_key.OutputsWritten = vpc->mesa_program.Base.OutputsWritten;
 
        add_outputs(&wanted_key, VERT_RESULT_HPOS);