Merge branch 'master' into r300-compiler
authorNicolai Hähnle <nhaehnle@gmail.com>
Mon, 21 Sep 2009 11:26:50 +0000 (13:26 +0200)
committerNicolai Hähnle <nhaehnle@gmail.com>
Mon, 21 Sep 2009 11:26:50 +0000 (13:26 +0200)
There were additional non-textual conflicts.

Conflicts:
src/gallium/drivers/r300/r300_tgsi_to_rc.c
src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c
src/mesa/drivers/dri/r300/compiler/radeon_program.c
src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c

1  2 
src/gallium/drivers/r300/Makefile
src/gallium/drivers/r300/r300_tgsi_to_rc.c
src/mesa/drivers/dri/r300/Makefile
src/mesa/drivers/dri/r300/compiler/r300_fragprog_emit.c
src/mesa/drivers/dri/r300/compiler/r3xx_vertprog.c
src/mesa/drivers/dri/r300/compiler/radeon_program_alu.c
src/mesa/drivers/dri/r300/r300_vertprog.c
src/mesa/drivers/dri/r300/radeon_mesa_to_rc.c

@@@ -9,6 -9,7 +9,7 @@@ C_SOURCES = 
        r300_chipset.c \
        r300_clear.c \
        r300_context.c \
+       r300_debug.c \
        r300_emit.c \
        r300_flush.c \
        r300_fs.c \
@@@ -24,7 -25,9 +25,7 @@@
        r300_tgsi_to_rc.c
  
  LIBRARY_INCLUDES = \
 -      -I$(TOP)/src/mesa/drivers/dri/r300/compiler \
 -      -I$(TOP)/src/mesa \
 -      -I$(TOP)/include
 +      -I$(TOP)/src/mesa/drivers/dri/r300/compiler
  
  COMPILER_ARCHIVE = $(TOP)/src/mesa/drivers/dri/r300/compiler/libr300compiler.a
  
  static unsigned translate_opcode(unsigned opcode)
  {
      switch(opcode) {
 -        case TGSI_OPCODE_ARL: return OPCODE_ARL;
 -        case TGSI_OPCODE_MOV: return OPCODE_MOV;
 -        case TGSI_OPCODE_LIT: return OPCODE_LIT;
 -        case TGSI_OPCODE_RCP: return OPCODE_RCP;
 -        case TGSI_OPCODE_RSQ: return OPCODE_RSQ;
 -        case TGSI_OPCODE_EXP: return OPCODE_EXP;
 -        case TGSI_OPCODE_LOG: return OPCODE_LOG;
 -        case TGSI_OPCODE_MUL: return OPCODE_MUL;
 -        case TGSI_OPCODE_ADD: return OPCODE_ADD;
 -        case TGSI_OPCODE_DP3: return OPCODE_DP3;
 -        case TGSI_OPCODE_DP4: return OPCODE_DP4;
 -        case TGSI_OPCODE_DST: return OPCODE_DST;
 -        case TGSI_OPCODE_MIN: return OPCODE_MIN;
 -        case TGSI_OPCODE_MAX: return OPCODE_MAX;
 -        case TGSI_OPCODE_SLT: return OPCODE_SLT;
 -        case TGSI_OPCODE_SGE: return OPCODE_SGE;
 -        case TGSI_OPCODE_MAD: return OPCODE_MAD;
 -        case TGSI_OPCODE_SUB: return OPCODE_SUB;
 -        case TGSI_OPCODE_LRP: return OPCODE_LRP;
 -     /* case TGSI_OPCODE_CND: return OPCODE_CND; */
 -        case TGSI_OPCODE_DP2A: return OPCODE_DP2A;
 +        case TGSI_OPCODE_ARL: return RC_OPCODE_ARL;
 +        case TGSI_OPCODE_MOV: return RC_OPCODE_MOV;
 +        case TGSI_OPCODE_LIT: return RC_OPCODE_LIT;
 +        case TGSI_OPCODE_RCP: return RC_OPCODE_RCP;
 +        case TGSI_OPCODE_RSQ: return RC_OPCODE_RSQ;
 +        case TGSI_OPCODE_EXP: return RC_OPCODE_EXP;
 +        case TGSI_OPCODE_LOG: return RC_OPCODE_LOG;
 +        case TGSI_OPCODE_MUL: return RC_OPCODE_MUL;
 +        case TGSI_OPCODE_ADD: return RC_OPCODE_ADD;
 +        case TGSI_OPCODE_DP3: return RC_OPCODE_DP3;
 +        case TGSI_OPCODE_DP4: return RC_OPCODE_DP4;
 +        case TGSI_OPCODE_DST: return RC_OPCODE_DST;
 +        case TGSI_OPCODE_MIN: return RC_OPCODE_MIN;
 +        case TGSI_OPCODE_MAX: return RC_OPCODE_MAX;
 +        case TGSI_OPCODE_SLT: return RC_OPCODE_SLT;
 +        case TGSI_OPCODE_SGE: return RC_OPCODE_SGE;
 +        case TGSI_OPCODE_MAD: return RC_OPCODE_MAD;
 +        case TGSI_OPCODE_SUB: return RC_OPCODE_SUB;
 +        case TGSI_OPCODE_LRP: return RC_OPCODE_LRP;
 +     /* case TGSI_OPCODE_CND: return RC_OPCODE_CND; */
 +     /* case TGSI_OPCODE_CND0: return RC_OPCODE_CND0; */
 +     /* case TGSI_OPCODE_DP2A: return RC_OPCODE_DP2A; */
                                          /* gap */
 -        case TGSI_OPCODE_FRC: return OPCODE_FRC;
 -     /* case TGSI_OPCODE_CLAMP: return OPCODE_CLAMP; */
 -        case TGSI_OPCODE_FLR: return OPCODE_FLR;
 -     /* case TGSI_OPCODE_ROUND: return OPCODE_ROUND; */
 -        case TGSI_OPCODE_EX2: return OPCODE_EX2;
 -        case TGSI_OPCODE_LG2: return OPCODE_LG2;
 -        case TGSI_OPCODE_POW: return OPCODE_POW;
 -        case TGSI_OPCODE_XPD: return OPCODE_XPD;
 +        case TGSI_OPCODE_FRC: return RC_OPCODE_FRC;
 +     /* case TGSI_OPCODE_CLAMP: return RC_OPCODE_CLAMP; */
 +        case TGSI_OPCODE_FLR: return RC_OPCODE_FLR;
 +     /* case TGSI_OPCODE_ROUND: return RC_OPCODE_ROUND; */
 +        case TGSI_OPCODE_EX2: return RC_OPCODE_EX2;
 +        case TGSI_OPCODE_LG2: return RC_OPCODE_LG2;
 +        case TGSI_OPCODE_POW: return RC_OPCODE_POW;
 +        case TGSI_OPCODE_XPD: return RC_OPCODE_XPD;
                                          /* gap */
 -        case TGSI_OPCODE_ABS: return OPCODE_ABS;
 -        case TGSI_OPCODE_RCC: return OPCODE_RCC;
 -        case TGSI_OPCODE_DPH: return OPCODE_DPH;
 -        case TGSI_OPCODE_COS: return OPCODE_COS;
 -        case TGSI_OPCODE_DDX: return OPCODE_DDX;
 -        case TGSI_OPCODE_DDY: return OPCODE_DDY;
 -     /* case TGSI_OPCODE_KILP: return OPCODE_KILP; */
 -        case TGSI_OPCODE_PK2H: return OPCODE_PK2H;
 -        case TGSI_OPCODE_PK2US: return OPCODE_PK2US;
 -        case TGSI_OPCODE_PK4B: return OPCODE_PK4B;
 -        case TGSI_OPCODE_PK4UB: return OPCODE_PK4UB;
 -        case TGSI_OPCODE_RFL: return OPCODE_RFL;
 -        case TGSI_OPCODE_SEQ: return OPCODE_SEQ;
 -        case TGSI_OPCODE_SFL: return OPCODE_SFL;
 -        case TGSI_OPCODE_SGT: return OPCODE_SGT;
 -        case TGSI_OPCODE_SIN: return OPCODE_SIN;
 -        case TGSI_OPCODE_SLE: return OPCODE_SLE;
 -        case TGSI_OPCODE_SNE: return OPCODE_SNE;
 -        case TGSI_OPCODE_STR: return OPCODE_STR;
 -        case TGSI_OPCODE_TEX: return OPCODE_TEX;
 -        case TGSI_OPCODE_TXD: return OPCODE_TXD;
 -        case TGSI_OPCODE_TXP: return OPCODE_TXP;
 -        case TGSI_OPCODE_UP2H: return OPCODE_UP2H;
 -        case TGSI_OPCODE_UP2US: return OPCODE_UP2US;
 -        case TGSI_OPCODE_UP4B: return OPCODE_UP4B;
 -        case TGSI_OPCODE_UP4UB: return OPCODE_UP4UB;
 -        case TGSI_OPCODE_X2D: return OPCODE_X2D;
 -        case TGSI_OPCODE_ARA: return OPCODE_ARA;
 -        case TGSI_OPCODE_ARR: return OPCODE_ARR;
 -        case TGSI_OPCODE_BRA: return OPCODE_BRA;
 -        case TGSI_OPCODE_CAL: return OPCODE_CAL;
 -        case TGSI_OPCODE_RET: return OPCODE_RET;
 -        case TGSI_OPCODE_SSG: return OPCODE_SSG;
 -        case TGSI_OPCODE_CMP: return OPCODE_CMP;
 -        case TGSI_OPCODE_SCS: return OPCODE_SCS;
 -        case TGSI_OPCODE_TXB: return OPCODE_TXB;
 -     /* case TGSI_OPCODE_NRM: return OPCODE_NRM; */
 -     /* case TGSI_OPCODE_DIV: return OPCODE_DIV; */
 -        case TGSI_OPCODE_DP2: return OPCODE_DP2;
 -        case TGSI_OPCODE_TXL: return OPCODE_TXL;
 -        case TGSI_OPCODE_BRK: return OPCODE_BRK;
 -        case TGSI_OPCODE_IF: return OPCODE_IF;
 -     /* case TGSI_OPCODE_LOOP: return OPCODE_LOOP; */
 -     /* case TGSI_OPCODE_REP: return OPCODE_REP; */
 -        case TGSI_OPCODE_ELSE: return OPCODE_ELSE;
 -        case TGSI_OPCODE_ENDIF: return OPCODE_ENDIF;
 -        case TGSI_OPCODE_ENDLOOP: return OPCODE_ENDLOOP;
 -     /* case TGSI_OPCODE_ENDREP: return OPCODE_ENDREP; */
 -        case TGSI_OPCODE_PUSHA: return OPCODE_PUSHA;
 -        case TGSI_OPCODE_POPA: return OPCODE_POPA;
 -     /* case TGSI_OPCODE_CEIL: return OPCODE_CEIL; */
 -     /* case TGSI_OPCODE_I2F: return OPCODE_I2F; */
 -        case TGSI_OPCODE_NOT: return OPCODE_NOT;
 -        case TGSI_OPCODE_TRUNC: return OPCODE_TRUNC;
 -     /* case TGSI_OPCODE_SHL: return OPCODE_SHL; */
 -     /* case TGSI_OPCODE_SHR: return OPCODE_SHR; */
 -        case TGSI_OPCODE_AND: return OPCODE_AND;
 -        case TGSI_OPCODE_OR: return OPCODE_OR;
 -     /* case TGSI_OPCODE_MOD: return OPCODE_MOD; */
 -        case TGSI_OPCODE_XOR: return OPCODE_XOR;
 -     /* case TGSI_OPCODE_SAD: return OPCODE_SAD; */
 -     /* case TGSI_OPCODE_TXF: return OPCODE_TXF; */
 -     /* case TGSI_OPCODE_TXQ: return OPCODE_TXQ; */
 -        case TGSI_OPCODE_CONT: return OPCODE_CONT;
 -     /* case TGSI_OPCODE_EMIT: return OPCODE_EMIT; */
 -     /* case TGSI_OPCODE_ENDPRIM: return OPCODE_ENDPRIM; */
 -     /* case TGSI_OPCODE_BGNLOOP2: return OPCODE_BGNLOOP2; */
 -        case TGSI_OPCODE_BGNSUB: return OPCODE_BGNSUB;
 -     /* case TGSI_OPCODE_ENDLOOP2: return OPCODE_ENDLOOP2; */
 -        case TGSI_OPCODE_ENDSUB: return OPCODE_ENDSUB;
 -        case TGSI_OPCODE_NOISE1: return OPCODE_NOISE1;
 -        case TGSI_OPCODE_NOISE2: return OPCODE_NOISE2;
 -        case TGSI_OPCODE_NOISE3: return OPCODE_NOISE3;
 -        case TGSI_OPCODE_NOISE4: return OPCODE_NOISE4;
 -        case TGSI_OPCODE_NOP: return OPCODE_NOP;
 +        case TGSI_OPCODE_ABS: return RC_OPCODE_ABS;
 +     /* case TGSI_OPCODE_RCC: return RC_OPCODE_RCC; */
 +        case TGSI_OPCODE_DPH: return RC_OPCODE_DPH;
 +        case TGSI_OPCODE_COS: return RC_OPCODE_COS;
 +        case TGSI_OPCODE_DDX: return RC_OPCODE_DDX;
 +        case TGSI_OPCODE_DDY: return RC_OPCODE_DDY;
 +     /* case TGSI_OPCODE_KILP: return RC_OPCODE_KILP; */
 +     /* case TGSI_OPCODE_PK2H: return RC_OPCODE_PK2H; */
 +     /* case TGSI_OPCODE_PK2US: return RC_OPCODE_PK2US; */
 +     /* case TGSI_OPCODE_PK4B: return RC_OPCODE_PK4B; */
 +     /* case TGSI_OPCODE_PK4UB: return RC_OPCODE_PK4UB; */
 +     /* case TGSI_OPCODE_RFL: return RC_OPCODE_RFL; */
 +        case TGSI_OPCODE_SEQ: return RC_OPCODE_SEQ;
 +        case TGSI_OPCODE_SFL: return RC_OPCODE_SFL;
 +        case TGSI_OPCODE_SGT: return RC_OPCODE_SGT;
 +        case TGSI_OPCODE_SIN: return RC_OPCODE_SIN;
 +        case TGSI_OPCODE_SLE: return RC_OPCODE_SLE;
 +        case TGSI_OPCODE_SNE: return RC_OPCODE_SNE;
 +     /* case TGSI_OPCODE_STR: return RC_OPCODE_STR; */
 +        case TGSI_OPCODE_TEX: return RC_OPCODE_TEX;
 +        case TGSI_OPCODE_TXD: return RC_OPCODE_TXD;
 +        case TGSI_OPCODE_TXP: return RC_OPCODE_TXP;
 +     /* case TGSI_OPCODE_UP2H: return RC_OPCODE_UP2H; */
 +     /* case TGSI_OPCODE_UP2US: return RC_OPCODE_UP2US; */
 +     /* case TGSI_OPCODE_UP4B: return RC_OPCODE_UP4B; */
 +     /* case TGSI_OPCODE_UP4UB: return RC_OPCODE_UP4UB; */
 +     /* case TGSI_OPCODE_X2D: return RC_OPCODE_X2D; */
 +     /* case TGSI_OPCODE_ARA: return RC_OPCODE_ARA; */
 +     /* case TGSI_OPCODE_ARR: return RC_OPCODE_ARR; */
 +     /* case TGSI_OPCODE_BRA: return RC_OPCODE_BRA; */
 +     /* case TGSI_OPCODE_CAL: return RC_OPCODE_CAL; */
 +     /* case TGSI_OPCODE_RET: return RC_OPCODE_RET; */
 +     /* case TGSI_OPCODE_SSG: return RC_OPCODE_SSG; */
 +        case TGSI_OPCODE_CMP: return RC_OPCODE_CMP;
 +        case TGSI_OPCODE_SCS: return RC_OPCODE_SCS;
 +        case TGSI_OPCODE_TXB: return RC_OPCODE_TXB;
 +     /* case TGSI_OPCODE_NRM: return RC_OPCODE_NRM; */
 +     /* case TGSI_OPCODE_DIV: return RC_OPCODE_DIV; */
 +     /* case TGSI_OPCODE_DP2: return RC_OPCODE_DP2; */
 +        case TGSI_OPCODE_TXL: return RC_OPCODE_TXL;
 +     /* case TGSI_OPCODE_BRK: return RC_OPCODE_BRK; */
 +     /* case TGSI_OPCODE_IF: return RC_OPCODE_IF; */
 +     /* case TGSI_OPCODE_LOOP: return RC_OPCODE_LOOP; */
 +     /* case TGSI_OPCODE_REP: return RC_OPCODE_REP; */
 +     /* case TGSI_OPCODE_ELSE: return RC_OPCODE_ELSE; */
 +     /* case TGSI_OPCODE_ENDIF: return RC_OPCODE_ENDIF; */
 +     /* case TGSI_OPCODE_ENDLOOP: return RC_OPCODE_ENDLOOP; */
 +     /* case TGSI_OPCODE_ENDREP: return RC_OPCODE_ENDREP; */
 +     /* case TGSI_OPCODE_PUSHA: return RC_OPCODE_PUSHA; */
 +     /* case TGSI_OPCODE_POPA: return RC_OPCODE_POPA; */
 +     /* case TGSI_OPCODE_CEIL: return RC_OPCODE_CEIL; */
 +     /* case TGSI_OPCODE_I2F: return RC_OPCODE_I2F; */
 +     /* case TGSI_OPCODE_NOT: return RC_OPCODE_NOT; */
 +     /* case TGSI_OPCODE_TRUNC: return RC_OPCODE_TRUNC; */
 +     /* case TGSI_OPCODE_SHL: return RC_OPCODE_SHL; */
 +     /* case TGSI_OPCODE_SHR: return RC_OPCODE_SHR; */
 +     /* case TGSI_OPCODE_AND: return RC_OPCODE_AND; */
 +     /* case TGSI_OPCODE_OR: return RC_OPCODE_OR; */
 +     /* case TGSI_OPCODE_MOD: return RC_OPCODE_MOD; */
 +     /* case TGSI_OPCODE_XOR: return RC_OPCODE_XOR; */
 +     /* case TGSI_OPCODE_SAD: return RC_OPCODE_SAD; */
 +     /* case TGSI_OPCODE_TXF: return RC_OPCODE_TXF; */
 +     /* case TGSI_OPCODE_TXQ: return RC_OPCODE_TXQ; */
 +     /* case TGSI_OPCODE_CONT: return RC_OPCODE_CONT; */
 +     /* case TGSI_OPCODE_EMIT: return RC_OPCODE_EMIT; */
 +     /* case TGSI_OPCODE_ENDPRIM: return RC_OPCODE_ENDPRIM; */
 +     /* case TGSI_OPCODE_BGNLOOP2: return RC_OPCODE_BGNLOOP2; */
 +     /* case TGSI_OPCODE_BGNSUB: return RC_OPCODE_BGNSUB; */
 +     /* case TGSI_OPCODE_ENDLOOP2: return RC_OPCODE_ENDLOOP2; */
 +     /* case TGSI_OPCODE_ENDSUB: return RC_OPCODE_ENDSUB; */
 +     /* case TGSI_OPCODE_NOISE1: return RC_OPCODE_NOISE1; */
 +     /* case TGSI_OPCODE_NOISE2: return RC_OPCODE_NOISE2; */
 +     /* case TGSI_OPCODE_NOISE3: return RC_OPCODE_NOISE3; */
 +     /* case TGSI_OPCODE_NOISE4: return RC_OPCODE_NOISE4; */
 +        case TGSI_OPCODE_NOP: return RC_OPCODE_NOP;
                                          /* gap */
 -        case TGSI_OPCODE_NRM4: return OPCODE_NRM4;
 -     /* case TGSI_OPCODE_CALLNZ: return OPCODE_CALLNZ; */
 -     /* case TGSI_OPCODE_IFC: return OPCODE_IFC; */
 -     /* case TGSI_OPCODE_BREAKC: return OPCODE_BREAKC; */
 -        case TGSI_OPCODE_KIL: return OPCODE_KIL;
 -        case TGSI_OPCODE_END: return OPCODE_END;
 -        case TGSI_OPCODE_SWZ: return OPCODE_SWZ;
 +     /* case TGSI_OPCODE_NRM4: return RC_OPCODE_NRM4; */
 +     /* case TGSI_OPCODE_CALLNZ: return RC_OPCODE_CALLNZ; */
 +     /* case TGSI_OPCODE_IFC: return RC_OPCODE_IFC; */
 +     /* case TGSI_OPCODE_BREAKC: return RC_OPCODE_BREAKC; */
 +        case TGSI_OPCODE_KIL: return RC_OPCODE_KIL;
 +        case TGSI_OPCODE_SWZ: return RC_OPCODE_SWZ;
      }
  
      fprintf(stderr, "Unknown opcode: %i\n", opcode);
 -    abort();
 +    return RC_OPCODE_ILLEGAL_OPCODE;
  }
  
  static unsigned translate_saturate(unsigned saturate)
  {
      switch(saturate) {
 -        case TGSI_SAT_NONE: return SATURATE_OFF;
 -        case TGSI_SAT_ZERO_ONE: return SATURATE_ZERO_ONE;
 +        default:
 +            fprintf(stderr, "Unknown saturate mode: %i\n", saturate);
 +            /* fall-through */
 +        case TGSI_SAT_NONE: return RC_SATURATE_NONE;
 +        case TGSI_SAT_ZERO_ONE: return RC_SATURATE_ZERO_ONE;
-         case TGSI_SAT_MINUS_PLUS_ONE: return RC_SATURATE_MINUS_PLUS_ONE;
      }
 -
 -    fprintf(stderr, "Unknown saturate mode: %i\n", saturate);
 -    abort();
  }
  
  static unsigned translate_register_file(unsigned file)
  {
      switch(file) {
 -        case TGSI_FILE_CONSTANT: return PROGRAM_CONSTANT;
 -        case TGSI_FILE_IMMEDIATE: return PROGRAM_CONSTANT;
 -        case TGSI_FILE_INPUT: return PROGRAM_INPUT;
 -        case TGSI_FILE_OUTPUT: return PROGRAM_OUTPUT;
 -        case TGSI_FILE_TEMPORARY: return PROGRAM_TEMPORARY;
 -        case TGSI_FILE_ADDRESS: return PROGRAM_ADDRESS;
 +        case TGSI_FILE_CONSTANT: return RC_FILE_CONSTANT;
 +        case TGSI_FILE_IMMEDIATE: return RC_FILE_CONSTANT;
 +        case TGSI_FILE_INPUT: return RC_FILE_INPUT;
 +        case TGSI_FILE_OUTPUT: return RC_FILE_OUTPUT;
 +        default:
 +            fprintf(stderr, "Unhandled register file: %i\n", file);
 +            /* fall-through */
 +        case TGSI_FILE_TEMPORARY: return RC_FILE_TEMPORARY;
 +        case TGSI_FILE_ADDRESS: return RC_FILE_ADDRESS;
      }
 -
 -    fprintf(stderr, "Unhandled register file: %i\n", file);
 -    abort();
  }
  
  static int translate_register_index(
  
  static void transform_dstreg(
      struct tgsi_to_rc * ttr,
 -    struct prog_dst_register * dst,
 +    struct rc_dst_register * dst,
      struct tgsi_full_dst_register * src)
  {
      dst->File = translate_register_file(src->DstRegister.File);
  
  static void transform_srcreg(
      struct tgsi_to_rc * ttr,
 -    struct prog_src_register * dst,
 +    struct rc_src_register * dst,
      struct tgsi_full_src_register * src)
  {
      dst->File = translate_register_file(src->SrcRegister.File);
          (src->SrcRegisterExtSwz.NegateY << 1) |
          (src->SrcRegisterExtSwz.NegateZ << 2) |
          (src->SrcRegisterExtSwz.NegateW << 3);
 -    dst->Negate ^= src->SrcRegister.Negate ? NEGATE_XYZW : 0;
 +    dst->Negate ^= src->SrcRegister.Negate ? RC_MASK_XYZW : 0;
  }
  
  static void transform_texture(struct rc_instruction * dst, struct tgsi_instruction_ext_texture src)
  {
      switch(src.Texture) {
          case TGSI_TEXTURE_1D:
 -            dst->I.TexSrcTarget = TEXTURE_1D_INDEX;
 +            dst->I.TexSrcTarget = RC_TEXTURE_1D;
              break;
          case TGSI_TEXTURE_2D:
 -            dst->I.TexSrcTarget = TEXTURE_2D_INDEX;
 +            dst->I.TexSrcTarget = RC_TEXTURE_2D;
              break;
          case TGSI_TEXTURE_3D:
 -            dst->I.TexSrcTarget = TEXTURE_3D_INDEX;
 +            dst->I.TexSrcTarget = RC_TEXTURE_3D;
              break;
          case TGSI_TEXTURE_CUBE:
 -            dst->I.TexSrcTarget = TEXTURE_CUBE_INDEX;
 +            dst->I.TexSrcTarget = RC_TEXTURE_CUBE;
              break;
          case TGSI_TEXTURE_RECT:
 -            dst->I.TexSrcTarget = TEXTURE_RECT_INDEX;
 +            dst->I.TexSrcTarget = RC_TEXTURE_RECT;
              break;
          case TGSI_TEXTURE_SHADOW1D:
 -            dst->I.TexSrcTarget = TEXTURE_1D_INDEX;
 +            dst->I.TexSrcTarget = RC_TEXTURE_1D;
              dst->I.TexShadow = 1;
              break;
          case TGSI_TEXTURE_SHADOW2D:
 -            dst->I.TexSrcTarget = TEXTURE_2D_INDEX;
 +            dst->I.TexSrcTarget = RC_TEXTURE_2D;
              dst->I.TexShadow = 1;
              break;
          case TGSI_TEXTURE_SHADOWRECT:
 -            dst->I.TexSrcTarget = TEXTURE_RECT_INDEX;
 +            dst->I.TexSrcTarget = RC_TEXTURE_RECT;
              dst->I.TexShadow = 1;
              break;
      }
@@@ -54,7 -54,6 +54,7 @@@ DRIVER_SOURCES = 
                 r300_vertprog.c \
                 r300_fragprog_common.c \
                 r300_shader.c \
 +               radeon_mesa_to_rc.c \
                 r300_emit.c \
                 r300_swtcl.c \
                 $(RADEON_COMMON_SOURCES) \
@@@ -63,8 -62,7 +63,7 @@@
  
  C_SOURCES = $(COMMON_SOURCES) $(DRIVER_SOURCES)
  
- DRIVER_DEFINES = -DCOMPILE_R300 -DR200_MERGED=0 \
-       -DRADEON_COMMON=1 -DRADEON_COMMON_FOR_R300 \
+ DRIVER_DEFINES = -DRADEON_R300
  #     -DRADEON_BO_TRACK \
        -Wall
  
@@@ -69,64 -69,64 +69,64 @@@ struct r300_emit_state 
  /**
   * Mark a temporary register as used.
   */
 -static void use_temporary(struct r300_fragment_program_code *code, GLuint index)
 +static void use_temporary(struct r300_fragment_program_code *code, unsigned int index)
  {
        if (index > code->pixsize)
                code->pixsize = index;
  }
  
  
 -static GLuint translate_rgb_opcode(struct r300_fragment_program_compiler * c, GLuint opcode)
 +static unsigned int translate_rgb_opcode(struct r300_fragment_program_compiler * c, rc_opcode opcode)
  {
        switch(opcode) {
 -      case OPCODE_CMP: return R300_ALU_OUTC_CMP;
 -      case OPCODE_DP3: return R300_ALU_OUTC_DP3;
 -      case OPCODE_DP4: return R300_ALU_OUTC_DP4;
 -      case OPCODE_FRC: return R300_ALU_OUTC_FRC;
 +      case RC_OPCODE_CMP: return R300_ALU_OUTC_CMP;
 +      case RC_OPCODE_DP3: return R300_ALU_OUTC_DP3;
 +      case RC_OPCODE_DP4: return R300_ALU_OUTC_DP4;
 +      case RC_OPCODE_FRC: return R300_ALU_OUTC_FRC;
        default:
                error("translate_rgb_opcode(%i): Unknown opcode", opcode);
                /* fall through */
 -      case OPCODE_NOP:
 +      case RC_OPCODE_NOP:
                /* fall through */
 -      case OPCODE_MAD: return R300_ALU_OUTC_MAD;
 -      case OPCODE_MAX: return R300_ALU_OUTC_MAX;
 -      case OPCODE_MIN: return R300_ALU_OUTC_MIN;
 -      case OPCODE_REPL_ALPHA: return R300_ALU_OUTC_REPL_ALPHA;
 +      case RC_OPCODE_MAD: return R300_ALU_OUTC_MAD;
 +      case RC_OPCODE_MAX: return R300_ALU_OUTC_MAX;
 +      case RC_OPCODE_MIN: return R300_ALU_OUTC_MIN;
 +      case RC_OPCODE_REPL_ALPHA: return R300_ALU_OUTC_REPL_ALPHA;
        }
  }
  
 -static GLuint translate_alpha_opcode(struct r300_fragment_program_compiler * c, GLuint opcode)
 +static unsigned int translate_alpha_opcode(struct r300_fragment_program_compiler * c, rc_opcode opcode)
  {
        switch(opcode) {
 -      case OPCODE_CMP: return R300_ALU_OUTA_CMP;
 -      case OPCODE_DP3: return R300_ALU_OUTA_DP4;
 -      case OPCODE_DP4: return R300_ALU_OUTA_DP4;
 -      case OPCODE_EX2: return R300_ALU_OUTA_EX2;
 -      case OPCODE_FRC: return R300_ALU_OUTA_FRC;
 -      case OPCODE_LG2: return R300_ALU_OUTA_LG2;
 +      case RC_OPCODE_CMP: return R300_ALU_OUTA_CMP;
 +      case RC_OPCODE_DP3: return R300_ALU_OUTA_DP4;
 +      case RC_OPCODE_DP4: return R300_ALU_OUTA_DP4;
 +      case RC_OPCODE_EX2: return R300_ALU_OUTA_EX2;
 +      case RC_OPCODE_FRC: return R300_ALU_OUTA_FRC;
 +      case RC_OPCODE_LG2: return R300_ALU_OUTA_LG2;
        default:
                error("translate_rgb_opcode(%i): Unknown opcode", opcode);
                /* fall through */
 -      case OPCODE_NOP:
 +      case RC_OPCODE_NOP:
                /* fall through */
 -      case OPCODE_MAD: return R300_ALU_OUTA_MAD;
 -      case OPCODE_MAX: return R300_ALU_OUTA_MAX;
 -      case OPCODE_MIN: return R300_ALU_OUTA_MIN;
 -      case OPCODE_RCP: return R300_ALU_OUTA_RCP;
 -      case OPCODE_RSQ: return R300_ALU_OUTA_RSQ;
 +      case RC_OPCODE_MAD: return R300_ALU_OUTA_MAD;
 +      case RC_OPCODE_MAX: return R300_ALU_OUTA_MAX;
 +      case RC_OPCODE_MIN: return R300_ALU_OUTA_MIN;
 +      case RC_OPCODE_RCP: return R300_ALU_OUTA_RCP;
 +      case RC_OPCODE_RSQ: return R300_ALU_OUTA_RSQ;
        }
  }
  
  /**
   * Emit one paired ALU instruction.
   */
 -static GLboolean emit_alu(void* data, struct radeon_pair_instruction* inst)
 +static int emit_alu(void* data, struct radeon_pair_instruction* inst)
  {
        PROG_CODE;
  
        if (code->alu.length >= R300_PFS_MAX_ALU_INST) {
                error("Too many ALU instructions");
 -              return GL_FALSE;
 +              return 0;
        }
  
        int ip = code->alu.length++;
        code->alu.inst[ip].alpha_inst = translate_alpha_opcode(c, inst->Alpha.Opcode);
  
        for(j = 0; j < 3; ++j) {
 -              GLuint src = inst->RGB.Src[j].Index | (inst->RGB.Src[j].Constant << 5);
 +              unsigned int src = inst->RGB.Src[j].Index | (inst->RGB.Src[j].Constant << 5);
                if (!inst->RGB.Src[j].Constant)
                        use_temporary(code, inst->RGB.Src[j].Index);
                code->alu.inst[ip].rgb_addr |= src << (6*j);
                        use_temporary(code, inst->Alpha.Src[j].Index);
                code->alu.inst[ip].alpha_addr |= src << (6*j);
  
 -              GLuint arg = r300FPTranslateRGBSwizzle(inst->RGB.Arg[j].Source, inst->RGB.Arg[j].Swizzle);
 +              unsigned int arg = r300FPTranslateRGBSwizzle(inst->RGB.Arg[j].Source, inst->RGB.Arg[j].Swizzle);
                arg |= inst->RGB.Arg[j].Abs << 6;
                arg |= inst->RGB.Arg[j].Negate << 5;
                code->alu.inst[ip].rgb_inst |= arg << (7*j);
        if (inst->Alpha.DepthWriteMask) {
                code->alu.inst[ip].alpha_addr |= R300_ALU_DSTA_DEPTH;
                emit->node_flags |= R300_W_OUT;
 -              c->code->writes_depth = GL_TRUE;
 +              c->code->writes_depth = 1;
        }
  
 -      return GL_TRUE;
 +      return 1;
  }
  
  
  /**
   * Finish the current node without advancing to the next one.
   */
 -static GLboolean finish_node(struct r300_emit_state * emit)
 +static int finish_node(struct r300_emit_state * emit)
  {
        struct r300_fragment_program_compiler * c = emit->compiler;
        struct r300_fragment_program_code *code = &emit->compiler->code->code.r300;
        if (code->alu.length == emit->node_first_alu) {
                /* Generate a single NOP for this node */
                struct radeon_pair_instruction inst;
 -              _mesa_bzero(&inst, sizeof(inst));
 +              memset(&inst, 0, sizeof(inst));
                if (!emit_alu(emit, &inst))
 -                      return GL_FALSE;
 +                      return 0;
        }
  
        unsigned alu_offset = emit->node_first_alu;
        if (code->tex.length == emit->node_first_tex) {
                if (emit->current_node > 0) {
                        error("Node %i has no TEX instructions", emit->current_node);
 -                      return GL_FALSE;
 +                      return 0;
                }
  
                tex_end = 0;
                        (tex_end << R300_TEX_SIZE_SHIFT) |
                        emit->node_flags;
  
 -      return GL_TRUE;
 +      return 1;
  }
  
  
   * Begin a block of texture instructions.
   * Create the necessary indirection.
   */
 -static GLboolean begin_tex(void* data)
 +static int begin_tex(void* data)
  {
        PROG_CODE;
  
        if (code->alu.length == emit->node_first_alu &&
            code->tex.length == emit->node_first_tex) {
 -              return GL_TRUE;
 +              return 1;
        }
  
        if (emit->current_node == 3) {
                error("Too many texture indirections");
 -              return GL_FALSE;
 +              return 0;
        }
  
        if (!finish_node(emit))
 -              return GL_FALSE;
 +              return 0;
  
        emit->current_node++;
        emit->node_first_tex = code->tex.length;
        emit->node_first_alu = code->alu.length;
        emit->node_flags = 0;
 -      return GL_TRUE;
 +      return 1;
  }
  
  
 -static GLboolean emit_tex(void* data, struct radeon_pair_texture_instruction* inst)
 +static int emit_tex(void* data, struct radeon_pair_texture_instruction* inst)
  {
        PROG_CODE;
  
        if (code->tex.length >= R300_PFS_MAX_TEX_INST) {
                error("Too many TEX instructions");
 -              return GL_FALSE;
 +              return 0;
        }
  
 -      GLuint unit = inst->TexSrcUnit;
 -      GLuint dest = inst->DestIndex;
 -      GLuint opcode;
 +      unsigned int unit = inst->TexSrcUnit;
 +      unsigned int dest = inst->DestIndex;
 +      unsigned int opcode;
  
        switch(inst->Opcode) {
        case RADEON_OPCODE_KIL: opcode = R300_TEX_OP_KIL; break;
        case RADEON_OPCODE_TXP: opcode = R300_TEX_OP_TXP; break;
        default:
                error("Unknown texture opcode %i", inst->Opcode);
 -              return GL_FALSE;
 +              return 0;
        }
  
        if (inst->Opcode == RADEON_OPCODE_KIL) {
                (dest << R300_DST_ADDR_SHIFT) |
                (unit << R300_TEX_ID_SHIFT) |
                (opcode << R300_TEX_INST_SHIFT);
 -      return GL_TRUE;
 +      return 1;
  }
  
  
@@@ -333,7 -333,7 +333,7 @@@ void r300BuildFragmentProgramHwCode(str
        memset(&emit, 0, sizeof(emit));
        emit.compiler = compiler;
  
 -      _mesa_bzero(code, sizeof(struct r300_fragment_program_code));
 +      memset(code, 0, sizeof(struct r300_fragment_program_code));
  
        radeonPairProgram(compiler, &pair_handler, &emit);
        if (compiler->Base.Error)
        if (emit.current_node < 3) {
                int shift = 3 - emit.current_node;
                int i;
-               for(i = 0; i <= emit.current_node; ++i)
+               for(i = emit.current_node; i >= 0; --i)
                        code->code_addr[shift + i] = code->code_addr[i];
                for(i = 0; i < shift; ++i)
                        code->code_addr[i] = 0;
  
  #include "radeon_compiler.h"
  
 +#include <stdio.h>
 +
  #include "../r300_reg.h"
  
 -#include "radeon_nqssadce.h"
 -#include "radeon_program.h"
 +#include "radeon_dataflow.h"
  #include "radeon_program_alu.h"
 -
 -#include "shader/prog_print.h"
 +#include "radeon_swizzle.h"
  
  
  /*
                           t_swizzle(y),        \
                           t_swizzle(y),        \
                           t_src_class(vpi->SrcReg[x].File), \
 -                         NEGATE_NONE) | (vpi->SrcReg[x].RelAddr << 4))
 +                         RC_MASK_NONE) | (vpi->SrcReg[x].RelAddr << 4))
  
  
 -static unsigned long t_dst_mask(GLuint mask)
 +static unsigned long t_dst_mask(unsigned int mask)
  {
 -      /* WRITEMASK_* is equivalent to VSF_FLAG_* */
 -      return mask & WRITEMASK_XYZW;
 +      /* RC_MASK_* is equivalent to VSF_FLAG_* */
 +      return mask & RC_MASK_XYZW;
  }
  
 -static unsigned long t_dst_class(gl_register_file file)
 +static unsigned long t_dst_class(rc_register_file file)
  {
 -
        switch (file) {
 -      case PROGRAM_TEMPORARY:
 +      default:
 +              fprintf(stderr, "%s: Bad register file %i\n", __FUNCTION__, file);
 +              /* fall-through */
 +      case RC_FILE_TEMPORARY:
                return PVS_DST_REG_TEMPORARY;
 -      case PROGRAM_OUTPUT:
 +      case RC_FILE_OUTPUT:
                return PVS_DST_REG_OUT;
 -      case PROGRAM_ADDRESS:
 +      case RC_FILE_ADDRESS:
                return PVS_DST_REG_A0;
 -              /*
 -                 case PROGRAM_INPUT:
 -                 case PROGRAM_LOCAL_PARAM:
 -                 case PROGRAM_ENV_PARAM:
 -                 case PROGRAM_NAMED_PARAM:
 -                 case PROGRAM_STATE_VAR:
 -                 case PROGRAM_WRITE_ONLY:
 -                 case PROGRAM_ADDRESS:
 -               */
 -      default:
 -              fprintf(stderr, "problem in %s", __FUNCTION__);
 -              _mesa_exit(-1);
 -              return -1;
        }
  }
  
  static unsigned long t_dst_index(struct r300_vertex_program_code *vp,
 -                               struct prog_dst_register *dst)
 +                               struct rc_dst_register *dst)
  {
 -      if (dst->File == PROGRAM_OUTPUT)
 +      if (dst->File == RC_FILE_OUTPUT)
                return vp->outputs[dst->Index];
  
        return dst->Index;
  }
  
 -static unsigned long t_src_class(gl_register_file file)
 +static unsigned long t_src_class(rc_register_file file)
  {
        switch (file) {
 -      case PROGRAM_BUILTIN:
 -      case PROGRAM_TEMPORARY:
 +      default:
 +              fprintf(stderr, "%s: Bad register file %i\n", __FUNCTION__, file);
 +              /* fall-through */
++      case RC_FILE_NONE:
 +      case RC_FILE_TEMPORARY:
                return PVS_SRC_REG_TEMPORARY;
 -      case PROGRAM_INPUT:
 +      case RC_FILE_INPUT:
                return PVS_SRC_REG_INPUT;
 -      case PROGRAM_LOCAL_PARAM:
 -      case PROGRAM_ENV_PARAM:
 -      case PROGRAM_NAMED_PARAM:
 -      case PROGRAM_CONSTANT:
 -      case PROGRAM_STATE_VAR:
 +      case RC_FILE_CONSTANT:
                return PVS_SRC_REG_CONSTANT;
 -              /*
 -                 case PROGRAM_OUTPUT:
 -                 case PROGRAM_WRITE_ONLY:
 -                 case PROGRAM_ADDRESS:
 -               */
 -      default:
 -              fprintf(stderr, "problem in %s", __FUNCTION__);
 -              _mesa_exit(-1);
 -              return -1;
        }
  }
  
 -static GLboolean t_src_conflict(struct prog_src_register a, struct prog_src_register b)
 +static int t_src_conflict(struct rc_src_register a, struct rc_src_register b)
  {
        unsigned long aclass = t_src_class(a.File);
        unsigned long bclass = t_src_class(b.File);
  
        if (aclass != bclass)
 -              return GL_FALSE;
 +              return 0;
        if (aclass == PVS_SRC_REG_TEMPORARY)
 -              return GL_FALSE;
 +              return 0;
  
        if (a.RelAddr || b.RelAddr)
 -              return GL_TRUE;
 +              return 1;
        if (a.Index != b.Index)
 -              return GL_TRUE;
 +              return 1;
  
 -      return GL_FALSE;
 +      return 0;
  }
  
 -static INLINE unsigned long t_swizzle(GLubyte swizzle)
 +static inline unsigned long t_swizzle(unsigned int swizzle)
  {
 -      /* this is in fact a NOP as the Mesa SWIZZLE_* are all identical to VSF_IN_COMPONENT_* */
 +      /* this is in fact a NOP as the Mesa RC_SWIZZLE_* are all identical to VSF_IN_COMPONENT_* */
        return swizzle;
  }
  
  static unsigned long t_src_index(struct r300_vertex_program_code *vp,
 -                               struct prog_src_register *src)
 +                               struct rc_src_register *src)
  {
 -      if (src->File == PROGRAM_INPUT) {
 +      if (src->File == RC_FILE_INPUT) {
                assert(vp->inputs[src->Index] != -1);
                return vp->inputs[src->Index];
        } else {
  /* these two functions should probably be merged... */
  
  static unsigned long t_src(struct r300_vertex_program_code *vp,
 -                         struct prog_src_register *src)
 +                         struct rc_src_register *src)
  {
 -      /* src->Negate uses the NEGATE_ flags from program_instruction.h,
 +      /* src->Negate uses the RC_MASK_ flags from program_instruction.h,
         * which equal our VSF_FLAGS_ values, so it's safe to just pass it here.
         */
        return PVS_SRC_OPERAND(t_src_index(vp, src),
  }
  
  static unsigned long t_src_scalar(struct r300_vertex_program_code *vp,
 -                                struct prog_src_register *src)
 +                                struct rc_src_register *src)
  {
 -      /* src->Negate uses the NEGATE_ flags from program_instruction.h,
 +      /* src->Negate uses the RC_MASK_ flags from program_instruction.h,
         * which equal our VSF_FLAGS_ values, so it's safe to just pass it here.
         */
        return PVS_SRC_OPERAND(t_src_index(vp, src),
                               t_swizzle(GET_SWZ(src->Swizzle, 0)),
                               t_swizzle(GET_SWZ(src->Swizzle, 0)),
                               t_src_class(src->File),
 -                             src->Negate ? NEGATE_XYZW : NEGATE_NONE) |
 +                             src->Negate ? RC_MASK_XYZW : RC_MASK_NONE) |
            (src->RelAddr << 4);
  }
  
 -static GLboolean valid_dst(struct r300_vertex_program_code *vp,
 -                         struct prog_dst_register *dst)
 +static int valid_dst(struct r300_vertex_program_code *vp,
 +                         struct rc_dst_register *dst)
  {
 -      if (dst->File == PROGRAM_OUTPUT && vp->outputs[dst->Index] == -1) {
 -              return GL_FALSE;
 -      } else if (dst->File == PROGRAM_ADDRESS) {
 +      if (dst->File == RC_FILE_OUTPUT && vp->outputs[dst->Index] == -1) {
 +              return 0;
 +      } else if (dst->File == RC_FILE_ADDRESS) {
                assert(dst->Index == 0);
        }
  
 -      return GL_TRUE;
 +      return 1;
  }
  
  static void ei_vector1(struct r300_vertex_program_code *vp,
 -                              GLuint hw_opcode,
 -                              struct prog_instruction *vpi,
 -                              GLuint * inst)
 +                              unsigned int hw_opcode,
 +                              struct rc_sub_instruction *vpi,
 +                              unsigned int * inst)
  {
        inst[0] = PVS_OP_DST_OPERAND(hw_opcode,
 -                                   GL_FALSE,
 -                                   GL_FALSE,
 +                                   0,
 +                                   0,
                                     t_dst_index(vp, &vpi->DstReg),
                                     t_dst_mask(vpi->DstReg.WriteMask),
                                     t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &vpi->SrcReg[0]);
 -      inst[2] = __CONST(0, SWIZZLE_ZERO);
 -      inst[3] = __CONST(0, SWIZZLE_ZERO);
 +      inst[2] = __CONST(0, RC_SWIZZLE_ZERO);
 +      inst[3] = __CONST(0, RC_SWIZZLE_ZERO);
  }
  
  static void ei_vector2(struct r300_vertex_program_code *vp,
 -                              GLuint hw_opcode,
 -                              struct prog_instruction *vpi,
 -                              GLuint * inst)
 +                              unsigned int hw_opcode,
 +                              struct rc_sub_instruction *vpi,
 +                              unsigned int * inst)
  {
        inst[0] = PVS_OP_DST_OPERAND(hw_opcode,
 -                                   GL_FALSE,
 -                                   GL_FALSE,
 +                                   0,
 +                                   0,
                                     t_dst_index(vp, &vpi->DstReg),
                                     t_dst_mask(vpi->DstReg.WriteMask),
                                     t_dst_class(vpi->DstReg.File));
        inst[1] = t_src(vp, &vpi->SrcReg[0]);
        inst[2] = t_src(vp, &vpi->SrcReg[1]);
 -      inst[3] = __CONST(1, SWIZZLE_ZERO);
 +      inst[3] = __CONST(1, RC_SWIZZLE_ZERO);
  }
  
  static void ei_math1(struct r300_vertex_program_code *vp,
 -                              GLuint hw_opcode,
 -                              struct prog_instruction *vpi,
 -                              GLuint * inst)
 +                              unsigned int hw_opcode,
 +                              struct rc_sub_instruction *vpi,
 +                              unsigned int * inst)
  {
        inst[0] = PVS_OP_DST_OPERAND(hw_opcode,
 -                                   GL_TRUE,
 -                                   GL_FALSE,
 +                                   1,
 +                                   0,
                                     t_dst_index(vp, &vpi->DstReg),
                                     t_dst_mask(vpi->DstReg.WriteMask),
                                     t_dst_class(vpi->DstReg.File));
        inst[1] = t_src_scalar(vp, &vpi->SrcReg[0]);
 -      inst[2] = __CONST(0, SWIZZLE_ZERO);
 -      inst[3] = __CONST(0, SWIZZLE_ZERO);
 +      inst[2] = __CONST(0, RC_SWIZZLE_ZERO);
 +      inst[3] = __CONST(0, RC_SWIZZLE_ZERO);
  }
  
  static void ei_lit(struct r300_vertex_program_code *vp,
 -                                    struct prog_instruction *vpi,
 -                                    GLuint * inst)
 +                                    struct rc_sub_instruction *vpi,
 +                                    unsigned int * inst)
  {
        //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_OP_DST_OPERAND(ME_LIGHT_COEFF_DX,
 -                                   GL_TRUE,
 -                                   GL_FALSE,
 +                                   1,
 +                                   0,
                                     t_dst_index(vp, &vpi->DstReg),
                                     t_dst_mask(vpi->DstReg.WriteMask),
                                     t_dst_class(vpi->DstReg.File));
                                  PVS_SRC_SELECT_FORCE_0,       // Z
                                  t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 1)),        // Y
                                  t_src_class(vpi->SrcReg[0].File),
 -                                vpi->SrcReg[0].Negate ? NEGATE_XYZW : NEGATE_NONE) |
 +                                vpi->SrcReg[0].Negate ? RC_MASK_XYZW : RC_MASK_NONE) |
            (vpi->SrcReg[0].RelAddr << 4);
        inst[2] = PVS_SRC_OPERAND(t_src_index(vp, &vpi->SrcReg[0]), t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 1)),      // Y
                                  t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 3)),        // W
                                  PVS_SRC_SELECT_FORCE_0,       // Z
                                  t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 0)),        // X
                                  t_src_class(vpi->SrcReg[0].File),
 -                                vpi->SrcReg[0].Negate ? NEGATE_XYZW : NEGATE_NONE) |
 +                                vpi->SrcReg[0].Negate ? RC_MASK_XYZW : RC_MASK_NONE) |
            (vpi->SrcReg[0].RelAddr << 4);
        inst[3] = PVS_SRC_OPERAND(t_src_index(vp, &vpi->SrcReg[0]), t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 1)),      // Y
                                  t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 0)),        // X
                                  PVS_SRC_SELECT_FORCE_0,       // Z
                                  t_swizzle(GET_SWZ(vpi->SrcReg[0].Swizzle, 3)),        // W
                                  t_src_class(vpi->SrcReg[0].File),
 -                                vpi->SrcReg[0].Negate ? NEGATE_XYZW : NEGATE_NONE) |
 +                                vpi->SrcReg[0].Negate ? RC_MASK_XYZW : RC_MASK_NONE) |
            (vpi->SrcReg[0].RelAddr << 4);
  }
  
  static void ei_mad(struct r300_vertex_program_code *vp,
 -                                    struct prog_instruction *vpi,
 -                                    GLuint * inst)
 +                                    struct rc_sub_instruction *vpi,
 +                                    unsigned int * inst)
  {
        /* Remarks about hardware limitations of MAD
         * (please preserve this comment, as this information is _NOT_
         * according to AMD docs, this should improve performance by one clock
         * as a nice side bonus.
         */
 -      if (vpi->SrcReg[0].File == PROGRAM_TEMPORARY &&
 -          vpi->SrcReg[1].File == PROGRAM_TEMPORARY &&
 -          vpi->SrcReg[2].File == PROGRAM_TEMPORARY &&
 +      if (vpi->SrcReg[0].File == RC_FILE_TEMPORARY &&
 +          vpi->SrcReg[1].File == RC_FILE_TEMPORARY &&
 +          vpi->SrcReg[2].File == RC_FILE_TEMPORARY &&
            vpi->SrcReg[0].Index != vpi->SrcReg[1].Index &&
            vpi->SrcReg[0].Index != vpi->SrcReg[2].Index &&
            vpi->SrcReg[1].Index != vpi->SrcReg[2].Index) {
                inst[0] = PVS_OP_DST_OPERAND(PVS_MACRO_OP_2CLK_MADD,
 -                              GL_FALSE,
 -                              GL_TRUE,
 +                              0,
 +                              1,
                                t_dst_index(vp, &vpi->DstReg),
                                t_dst_mask(vpi->DstReg.WriteMask),
                                t_dst_class(vpi->DstReg.File));
        } else {
                inst[0] = PVS_OP_DST_OPERAND(VE_MULTIPLY_ADD,
 -                              GL_FALSE,
 -                              GL_FALSE,
 +                              0,
 +                              0,
                                t_dst_index(vp, &vpi->DstReg),
                                t_dst_mask(vpi->DstReg.WriteMask),
                                t_dst_class(vpi->DstReg.File));
  }
  
  static void ei_pow(struct r300_vertex_program_code *vp,
 -                                    struct prog_instruction *vpi,
 -                                    GLuint * inst)
 +                                    struct rc_sub_instruction *vpi,
 +                                    unsigned int * inst)
  {
        inst[0] = PVS_OP_DST_OPERAND(ME_POWER_FUNC_FF,
 -                                   GL_TRUE,
 -                                   GL_FALSE,
 +                                   1,
 +                                   0,
                                     t_dst_index(vp, &vpi->DstReg),
                                     t_dst_mask(vpi->DstReg.WriteMask),
                                     t_dst_class(vpi->DstReg.File));
        inst[1] = t_src_scalar(vp, &vpi->SrcReg[0]);
 -      inst[2] = __CONST(0, SWIZZLE_ZERO);
 +      inst[2] = __CONST(0, RC_SWIZZLE_ZERO);
        inst[3] = t_src_scalar(vp, &vpi->SrcReg[1]);
  }
  
@@@ -340,8 -362,8 +341,8 @@@ static void translate_vertex_program(st
        compiler->SetHwInputOutput(compiler);
  
        for(rci = compiler->Base.Program.Instructions.Next; rci != &compiler->Base.Program.Instructions; rci = rci->Next) {
 -              struct prog_instruction *vpi = &rci->I;
 -              GLuint *inst = compiler->code->body.d + compiler->code->length;
 +              struct rc_sub_instruction *vpi = &rci->I;
 +              unsigned int *inst = compiler->code->body.d + compiler->code->length;
  
                /* Skip instructions writing to non-existing destination */
                if (!valid_dst(compiler->code, &vpi->DstReg))
                }
  
                switch (vpi->Opcode) {
 -              case OPCODE_ADD: ei_vector2(compiler->code, VE_ADD, vpi, inst); break;
 -              case OPCODE_ARL: ei_vector1(compiler->code, VE_FLT2FIX_DX, vpi, inst); break;
 -              case OPCODE_DP4: ei_vector2(compiler->code, VE_DOT_PRODUCT, vpi, inst); break;
 -              case OPCODE_DST: ei_vector2(compiler->code, VE_DISTANCE_VECTOR, vpi, inst); break;
 -              case OPCODE_EX2: ei_math1(compiler->code, ME_EXP_BASE2_FULL_DX, vpi, inst); break;
 -              case OPCODE_EXP: ei_math1(compiler->code, ME_EXP_BASE2_DX, vpi, inst); break;
 -              case OPCODE_FRC: ei_vector1(compiler->code, VE_FRACTION, vpi, inst); break;
 -              case OPCODE_LG2: ei_math1(compiler->code, ME_LOG_BASE2_FULL_DX, vpi, inst); break;
 -              case OPCODE_LIT: ei_lit(compiler->code, vpi, inst); break;
 -              case OPCODE_LOG: ei_math1(compiler->code, ME_LOG_BASE2_DX, vpi, inst); break;
 -              case OPCODE_MAD: ei_mad(compiler->code, vpi, inst); break;
 -              case OPCODE_MAX: ei_vector2(compiler->code, VE_MAXIMUM, vpi, inst); break;
 -              case OPCODE_MIN: ei_vector2(compiler->code, VE_MINIMUM, vpi, inst); break;
 -              case OPCODE_MOV: ei_vector1(compiler->code, VE_ADD, vpi, inst); break;
 -              case OPCODE_MUL: ei_vector2(compiler->code, VE_MULTIPLY, vpi, inst); break;
 -              case OPCODE_POW: ei_pow(compiler->code, vpi, inst); break;
 -              case OPCODE_RCP: ei_math1(compiler->code, ME_RECIP_DX, vpi, inst); break;
 -              case OPCODE_RSQ: ei_math1(compiler->code, ME_RECIP_SQRT_DX, vpi, inst); break;
 -              case OPCODE_SGE: ei_vector2(compiler->code, VE_SET_GREATER_THAN_EQUAL, vpi, inst); break;
 -              case OPCODE_SLT: ei_vector2(compiler->code, VE_SET_LESS_THAN, vpi, inst); break;
 +              case RC_OPCODE_ADD: ei_vector2(compiler->code, VE_ADD, vpi, inst); break;
 +              case RC_OPCODE_ARL: ei_vector1(compiler->code, VE_FLT2FIX_DX, vpi, inst); break;
 +              case RC_OPCODE_DP4: ei_vector2(compiler->code, VE_DOT_PRODUCT, vpi, inst); break;
 +              case RC_OPCODE_DST: ei_vector2(compiler->code, VE_DISTANCE_VECTOR, vpi, inst); break;
 +              case RC_OPCODE_EX2: ei_math1(compiler->code, ME_EXP_BASE2_FULL_DX, vpi, inst); break;
 +              case RC_OPCODE_EXP: ei_math1(compiler->code, ME_EXP_BASE2_DX, vpi, inst); break;
 +              case RC_OPCODE_FRC: ei_vector1(compiler->code, VE_FRACTION, vpi, inst); break;
 +              case RC_OPCODE_LG2: ei_math1(compiler->code, ME_LOG_BASE2_FULL_DX, vpi, inst); break;
 +              case RC_OPCODE_LIT: ei_lit(compiler->code, vpi, inst); break;
 +              case RC_OPCODE_LOG: ei_math1(compiler->code, ME_LOG_BASE2_DX, vpi, inst); break;
 +              case RC_OPCODE_MAD: ei_mad(compiler->code, vpi, inst); break;
 +              case RC_OPCODE_MAX: ei_vector2(compiler->code, VE_MAXIMUM, vpi, inst); break;
 +              case RC_OPCODE_MIN: ei_vector2(compiler->code, VE_MINIMUM, vpi, inst); break;
 +              case RC_OPCODE_MOV: ei_vector1(compiler->code, VE_ADD, vpi, inst); break;
 +              case RC_OPCODE_MUL: ei_vector2(compiler->code, VE_MULTIPLY, vpi, inst); break;
 +              case RC_OPCODE_POW: ei_pow(compiler->code, vpi, inst); break;
 +              case RC_OPCODE_RCP: ei_math1(compiler->code, ME_RECIP_DX, vpi, inst); break;
 +              case RC_OPCODE_RSQ: ei_math1(compiler->code, ME_RECIP_SQRT_DX, vpi, inst); break;
 +              case RC_OPCODE_SGE: ei_vector2(compiler->code, VE_SET_GREATER_THAN_EQUAL, vpi, inst); break;
 +              case RC_OPCODE_SLT: ei_vector2(compiler->code, VE_SET_LESS_THAN, vpi, inst); break;
                default:
                        rc_error(&compiler->Base, "Unknown opcode %i\n", vpi->Opcode);
                        return;
  }
  
  struct temporary_allocation {
 -      GLuint Allocated:1;
 -      GLuint HwTemp:15;
 +      unsigned int Allocated:1;
 +      unsigned int HwTemp:15;
        struct rc_instruction * LastRead;
  };
  
  static void allocate_temporary_registers(struct r300_vertex_program_compiler * compiler)
  {
        struct rc_instruction *inst;
 -      GLuint num_orig_temps = 0;
 -      GLboolean hwtemps[VSF_MAX_FRAGMENT_TEMPS];
 +      unsigned int num_orig_temps = 0;
 +      char hwtemps[VSF_MAX_FRAGMENT_TEMPS];
        struct temporary_allocation * ta;
 -      GLuint i, j;
 +      unsigned int i, j;
  
        compiler->code->num_temporaries = 0;
        memset(hwtemps, 0, sizeof(hwtemps));
  
        /* Pass 1: Count original temporaries and allocate structures */
        for(inst = compiler->Base.Program.Instructions.Next; inst != &compiler->Base.Program.Instructions; inst = inst->Next) {
 -              GLuint numsrcs = _mesa_num_inst_src_regs(inst->I.Opcode);
 -              GLuint numdsts = _mesa_num_inst_dst_regs(inst->I.Opcode);
 +              const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->I.Opcode);
  
 -              for (i = 0; i < numsrcs; ++i) {
 -                      if (inst->I.SrcReg[i].File == PROGRAM_TEMPORARY) {
 +              for (i = 0; i < opcode->NumSrcRegs; ++i) {
 +                      if (inst->I.SrcReg[i].File == RC_FILE_TEMPORARY) {
                                if (inst->I.SrcReg[i].Index >= num_orig_temps)
                                        num_orig_temps = inst->I.SrcReg[i].Index + 1;
                        }
                }
  
 -              if (numdsts) {
 -                      if (inst->I.DstReg.File == PROGRAM_TEMPORARY) {
 +              if (opcode->HasDstReg) {
 +                      if (inst->I.DstReg.File == RC_FILE_TEMPORARY) {
                                if (inst->I.DstReg.Index >= num_orig_temps)
                                        num_orig_temps = inst->I.DstReg.Index + 1;
                        }
  
        /* Pass 2: Determine original temporary lifetimes */
        for(inst = compiler->Base.Program.Instructions.Next; inst != &compiler->Base.Program.Instructions; inst = inst->Next) {
 -              GLuint numsrcs = _mesa_num_inst_src_regs(inst->I.Opcode);
 +              const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->I.Opcode);
  
 -              for (i = 0; i < numsrcs; ++i) {
 -                      if (inst->I.SrcReg[i].File == PROGRAM_TEMPORARY)
 +              for (i = 0; i < opcode->NumSrcRegs; ++i) {
 +                      if (inst->I.SrcReg[i].File == RC_FILE_TEMPORARY)
                                ta[inst->I.SrcReg[i].Index].LastRead = inst;
                }
        }
  
        /* Pass 3: Register allocation */
        for(inst = compiler->Base.Program.Instructions.Next; inst != &compiler->Base.Program.Instructions; inst = inst->Next) {
 -              GLuint numsrcs = _mesa_num_inst_src_regs(inst->I.Opcode);
 -              GLuint numdsts = _mesa_num_inst_dst_regs(inst->I.Opcode);
 +              const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->I.Opcode);
  
 -              for (i = 0; i < numsrcs; ++i) {
 -                      if (inst->I.SrcReg[i].File == PROGRAM_TEMPORARY) {
 -                              GLuint orig = inst->I.SrcReg[i].Index;
 +              for (i = 0; i < opcode->NumSrcRegs; ++i) {
 +                      if (inst->I.SrcReg[i].File == RC_FILE_TEMPORARY) {
 +                              unsigned int orig = inst->I.SrcReg[i].Index;
                                inst->I.SrcReg[i].Index = ta[orig].HwTemp;
  
                                if (ta[orig].Allocated && inst == ta[orig].LastRead)
 -                                      hwtemps[ta[orig].HwTemp] = GL_FALSE;
 +                                      hwtemps[ta[orig].HwTemp] = 0;
                        }
                }
  
 -              if (numdsts) {
 -                      if (inst->I.DstReg.File == PROGRAM_TEMPORARY) {
 -                              GLuint orig = inst->I.DstReg.Index;
 +              if (opcode->HasDstReg) {
 +                      if (inst->I.DstReg.File == RC_FILE_TEMPORARY) {
 +                              unsigned int orig = inst->I.DstReg.Index;
  
                                if (!ta[orig].Allocated) {
                                        for(j = 0; j < VSF_MAX_FRAGMENT_TEMPS; ++j) {
                                        if (j >= VSF_MAX_FRAGMENT_TEMPS) {
                                                fprintf(stderr, "Out of hw temporaries\n");
                                        } else {
 -                                              ta[orig].Allocated = GL_TRUE;
 +                                              ta[orig].Allocated = 1;
                                                ta[orig].HwTemp = j;
 -                                              hwtemps[j] = GL_TRUE;
 +                                              hwtemps[j] = 1;
  
                                                if (j >= compiler->code->num_temporaries)
                                                        compiler->code->num_temporaries = j + 1;
   * Vertex engine cannot read two inputs or two constants at the same time.
   * Introduce intermediate MOVs to temporary registers to account for this.
   */
 -static GLboolean transform_source_conflicts(
 +static int transform_source_conflicts(
        struct radeon_compiler *c,
        struct rc_instruction* inst,
        void* unused)
  {
 -      GLuint num_operands = _mesa_num_inst_src_regs(inst->I.Opcode);
 +      const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->I.Opcode);
  
 -      if (num_operands == 3) {
 +      if (opcode->NumSrcRegs == 3) {
                if (t_src_conflict(inst->I.SrcReg[1], inst->I.SrcReg[2])
                    || t_src_conflict(inst->I.SrcReg[0], inst->I.SrcReg[2])) {
                        int tmpreg = rc_find_free_temporary(c);
                        struct rc_instruction * inst_mov = rc_insert_new_instruction(c, inst->Prev);
 -                      inst_mov->I.Opcode = OPCODE_MOV;
 -                      inst_mov->I.DstReg.File = PROGRAM_TEMPORARY;
 +                      inst_mov->I.Opcode = RC_OPCODE_MOV;
 +                      inst_mov->I.DstReg.File = RC_FILE_TEMPORARY;
                        inst_mov->I.DstReg.Index = tmpreg;
                        inst_mov->I.SrcReg[0] = inst->I.SrcReg[2];
  
                        reset_srcreg(&inst->I.SrcReg[2]);
 -                      inst->I.SrcReg[2].File = PROGRAM_TEMPORARY;
 +                      inst->I.SrcReg[2].File = RC_FILE_TEMPORARY;
                        inst->I.SrcReg[2].Index = tmpreg;
                }
        }
  
 -      if (num_operands >= 2) {
 +      if (opcode->NumSrcRegs >= 2) {
                if (t_src_conflict(inst->I.SrcReg[1], inst->I.SrcReg[0])) {
                        int tmpreg = rc_find_free_temporary(c);
                        struct rc_instruction * inst_mov = rc_insert_new_instruction(c, inst->Prev);
 -                      inst_mov->I.Opcode = OPCODE_MOV;
 -                      inst_mov->I.DstReg.File = PROGRAM_TEMPORARY;
 +                      inst_mov->I.Opcode = RC_OPCODE_MOV;
 +                      inst_mov->I.DstReg.File = RC_FILE_TEMPORARY;
                        inst_mov->I.DstReg.Index = tmpreg;
                        inst_mov->I.SrcReg[0] = inst->I.SrcReg[1];
  
                        reset_srcreg(&inst->I.SrcReg[1]);
 -                      inst->I.SrcReg[1].File = PROGRAM_TEMPORARY;
 +                      inst->I.SrcReg[1].File = RC_FILE_TEMPORARY;
                        inst->I.SrcReg[1].Index = tmpreg;
                }
        }
  
 -      return GL_TRUE;
 +      return 1;
  }
  
  static void addArtificialOutputs(struct r300_vertex_program_compiler * compiler)
                if ((compiler->RequiredOutputs & (1 << i)) &&
                    !(compiler->Base.Program.OutputsWritten & (1 << i))) {
                        struct rc_instruction * inst = rc_insert_new_instruction(&compiler->Base, compiler->Base.Program.Instructions.Prev);
 -                      inst->I.Opcode = OPCODE_MOV;
 +                      inst->I.Opcode = RC_OPCODE_MOV;
  
 -                      inst->I.DstReg.File = PROGRAM_OUTPUT;
 +                      inst->I.DstReg.File = RC_FILE_OUTPUT;
                        inst->I.DstReg.Index = i;
 -                      inst->I.DstReg.WriteMask = WRITEMASK_XYZW;
 +                      inst->I.DstReg.WriteMask = RC_MASK_XYZW;
  
 -                      inst->I.SrcReg[0].File = PROGRAM_CONSTANT;
 +                      inst->I.SrcReg[0].File = RC_FILE_CONSTANT;
                        inst->I.SrcReg[0].Index = 0;
 -                      inst->I.SrcReg[0].Swizzle = SWIZZLE_XYZW;
 +                      inst->I.SrcReg[0].Swizzle = RC_SWIZZLE_XYZW;
  
                        compiler->Base.Program.OutputsWritten |= 1 << i;
                }
        }
  }
  
 -static void nqssadceInit(struct nqssadce_state* s)
 +static void dataflow_outputs_mark_used(void * userdata, void * data,
 +              void (*callback)(void *, unsigned int, unsigned int))
  {
 -      struct r300_vertex_program_compiler * compiler = s->UserData;
 +      struct r300_vertex_program_compiler * c = userdata;
        int i;
  
 -      for(i = 0; i < VERT_RESULT_MAX; ++i) {
 -              if (compiler->RequiredOutputs & (1 << i))
 -                      s->Outputs[i].Sourced = WRITEMASK_XYZW;
 +      for(i = 0; i < 32; ++i) {
 +              if (c->RequiredOutputs & (1 << i))
 +                      callback(data, i, RC_MASK_XYZW);
        }
  }
  
 -static GLboolean swizzleIsNative(GLuint opcode, struct prog_src_register reg)
 +static int swizzle_is_native(rc_opcode opcode, struct rc_src_register reg)
  {
        (void) opcode;
        (void) reg;
  
 -      return GL_TRUE;
 +      return 1;
  }
  
  
 +static struct rc_swizzle_caps r300_vertprog_swizzle_caps = {
 +      .IsNative = &swizzle_is_native,
 +      .Split = 0 /* should never be called */
 +};
 +
  
  void r3xx_compile_vertex_program(struct r300_vertex_program_compiler* compiler)
  {
 +      compiler->Base.SwizzleCaps = &r300_vertprog_swizzle_caps;
 +
        addArtificialOutputs(compiler);
  
        {
  
        if (compiler->Base.Debug) {
                fprintf(stderr, "Vertex program after native rewrite:\n");
 -              rc_print_program(&compiler->Base.Program);
 +              rc_print_program(&compiler->Base.Program, 0);
                fflush(stderr);
        }
  
  
        if (compiler->Base.Debug) {
                fprintf(stderr, "Vertex program after source conflict resolve:\n");
 -              rc_print_program(&compiler->Base.Program);
 +              rc_print_program(&compiler->Base.Program, 0);
                fflush(stderr);
        }
  
 -      {
 -              struct radeon_nqssadce_descr nqssadce = {
 -                      .Init = &nqssadceInit,
 -                      .IsNativeSwizzle = &swizzleIsNative,
 -                      .BuildSwizzle = NULL
 -              };
 -              radeonNqssaDce(&compiler->Base, &nqssadce, compiler);
 +      rc_dataflow_annotate(&compiler->Base, &dataflow_outputs_mark_used, compiler);
 +      rc_dataflow_dealias(&compiler->Base);
 +      rc_dataflow_swizzles(&compiler->Base);
  
 -              /* We need this step for reusing temporary registers */
 -              allocate_temporary_registers(compiler);
 +      /* This invalidates dataflow annotations and should be replaced
 +       * by a future generic register allocation pass. */
 +      allocate_temporary_registers(compiler);
  
 -              if (compiler->Base.Debug) {
 -                      fprintf(stderr, "Vertex program after NQSSADCE:\n");
 -                      rc_print_program(&compiler->Base.Program);
 -                      fflush(stderr);
 -              }
 +      if (compiler->Base.Debug) {
 +              fprintf(stderr, "Vertex program after dataflow:\n");
 +              rc_print_program(&compiler->Base.Program, 0);
 +              fflush(stderr);
        }
  
        translate_vertex_program(compiler);
@@@ -40,8 -40,8 +40,8 @@@
  
  static struct rc_instruction *emit1(
        struct radeon_compiler * c, struct rc_instruction * after,
 -      gl_inst_opcode Opcode, GLuint Saturate, struct prog_dst_register DstReg,
 -      struct prog_src_register SrcReg)
 +      rc_opcode Opcode, rc_saturate_mode Saturate, struct rc_dst_register DstReg,
 +      struct rc_src_register SrcReg)
  {
        struct rc_instruction *fpi = rc_insert_new_instruction(c, after);
  
@@@ -54,8 -54,8 +54,8 @@@
  
  static struct rc_instruction *emit2(
        struct radeon_compiler * c, struct rc_instruction * after,
 -      gl_inst_opcode Opcode, GLuint Saturate, struct prog_dst_register DstReg,
 -      struct prog_src_register SrcReg0, struct prog_src_register SrcReg1)
 +      rc_opcode Opcode, rc_saturate_mode Saturate, struct rc_dst_register DstReg,
 +      struct rc_src_register SrcReg0, struct rc_src_register SrcReg1)
  {
        struct rc_instruction *fpi = rc_insert_new_instruction(c, after);
  
@@@ -69,9 -69,9 +69,9 @@@
  
  static struct rc_instruction *emit3(
        struct radeon_compiler * c, struct rc_instruction * after,
 -      gl_inst_opcode Opcode, GLuint Saturate, struct prog_dst_register DstReg,
 -      struct prog_src_register SrcReg0, struct prog_src_register SrcReg1,
 -      struct prog_src_register SrcReg2)
 +      rc_opcode Opcode, rc_saturate_mode Saturate, struct rc_dst_register DstReg,
 +      struct rc_src_register SrcReg0, struct rc_src_register SrcReg1,
 +      struct rc_src_register SrcReg2)
  {
        struct rc_instruction *fpi = rc_insert_new_instruction(c, after);
  
        return fpi;
  }
  
 -static struct prog_dst_register dstreg(int file, int index)
 +static struct rc_dst_register dstreg(int file, int index)
  {
 -      struct prog_dst_register dst;
 +      struct rc_dst_register dst;
        dst.File = file;
        dst.Index = index;
 -      dst.WriteMask = WRITEMASK_XYZW;
 -      dst.CondMask = COND_TR;
 +      dst.WriteMask = RC_MASK_XYZW;
        dst.RelAddr = 0;
 -      dst.CondSwizzle = SWIZZLE_NOOP;
 -      dst.CondSrc = 0;
 -      dst.pad = 0;
        return dst;
  }
  
 -static struct prog_dst_register dstregtmpmask(int index, int mask)
 +static struct rc_dst_register dstregtmpmask(int index, int mask)
  {
 -      struct prog_dst_register dst = {0};
 -      dst.File = PROGRAM_TEMPORARY;
 +      struct rc_dst_register dst = {0};
 +      dst.File = RC_FILE_TEMPORARY;
        dst.Index = index;
        dst.WriteMask = mask;
        dst.RelAddr = 0;
 -      dst.CondMask = COND_TR;
 -      dst.CondSwizzle = SWIZZLE_NOOP;
 -      dst.CondSrc = 0;
 -      dst.pad = 0;
        return dst;
  }
  
 -static const struct prog_src_register builtin_zero = {
 -      .File = PROGRAM_BUILTIN,
 +static const struct rc_src_register builtin_zero = {
 +      .File = RC_FILE_NONE,
        .Index = 0,
 -      .Swizzle = SWIZZLE_0000
 +      .Swizzle = RC_SWIZZLE_0000
  };
 -static const struct prog_src_register builtin_one = {
 -      .File = PROGRAM_BUILTIN,
 +static const struct rc_src_register builtin_one = {
 +      .File = RC_FILE_NONE,
        .Index = 0,
 -      .Swizzle = SWIZZLE_1111
 +      .Swizzle = RC_SWIZZLE_1111
  };
 -static const struct prog_src_register srcreg_undefined = {
 -      .File = PROGRAM_UNDEFINED,
 +static const struct rc_src_register srcreg_undefined = {
 +      .File = RC_FILE_NONE,
        .Index = 0,
 -      .Swizzle = SWIZZLE_NOOP
 +      .Swizzle = RC_SWIZZLE_XYZW
  };
  
 -static struct prog_src_register srcreg(int file, int index)
 +static struct rc_src_register srcreg(int file, int index)
  {
 -      struct prog_src_register src = srcreg_undefined;
 +      struct rc_src_register src = srcreg_undefined;
        src.File = file;
        src.Index = index;
        return src;
  }
  
 -static struct prog_src_register srcregswz(int file, int index, int swz)
 +static struct rc_src_register srcregswz(int file, int index, int swz)
  {
 -      struct prog_src_register src = srcreg_undefined;
 +      struct rc_src_register src = srcreg_undefined;
        src.File = file;
        src.Index = index;
        src.Swizzle = swz;
        return src;
  }
  
 -static struct prog_src_register absolute(struct prog_src_register reg)
 +static struct rc_src_register absolute(struct rc_src_register reg)
  {
 -      struct prog_src_register newreg = reg;
 +      struct rc_src_register newreg = reg;
        newreg.Abs = 1;
 -      newreg.Negate = NEGATE_NONE;
 +      newreg.Negate = RC_MASK_NONE;
        return newreg;
  }
  
 -static struct prog_src_register negate(struct prog_src_register reg)
 +static struct rc_src_register negate(struct rc_src_register reg)
  {
 -      struct prog_src_register newreg = reg;
 -      newreg.Negate = newreg.Negate ^ NEGATE_XYZW;
 +      struct rc_src_register newreg = reg;
 +      newreg.Negate = newreg.Negate ^ RC_MASK_XYZW;
        return newreg;
  }
  
 -static struct prog_src_register swizzle(struct prog_src_register reg, GLuint x, GLuint y, GLuint z, GLuint w)
 +static struct rc_src_register swizzle(struct rc_src_register reg,
 +              rc_swizzle x, rc_swizzle y, rc_swizzle z, rc_swizzle w)
  {
 -      struct prog_src_register swizzled = reg;
 -      swizzled.Swizzle = MAKE_SWIZZLE4(
 -              x >= 4 ? x : GET_SWZ(reg.Swizzle, x),
 -              y >= 4 ? y : GET_SWZ(reg.Swizzle, y),
 -              z >= 4 ? z : GET_SWZ(reg.Swizzle, z),
 -              w >= 4 ? w : GET_SWZ(reg.Swizzle, w));
 +      struct rc_src_register swizzled = reg;
 +      swizzled.Swizzle = combine_swizzles4(reg.Swizzle, x, y, z, w);
        return swizzled;
  }
  
 -static struct prog_src_register scalar(struct prog_src_register reg)
 +static struct rc_src_register scalar(struct rc_src_register reg)
  {
 -      return swizzle(reg, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X);
 +      return swizzle(reg, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X);
  }
  
  static void transform_ABS(struct radeon_compiler* c,
        struct rc_instruction* inst)
  {
 -      struct prog_src_register src = inst->I.SrcReg[0];
 +      struct rc_src_register src = inst->I.SrcReg[0];
        src.Abs = 1;
 -      src.Negate = NEGATE_NONE;
 -      emit1(c, inst->Prev, OPCODE_MOV, inst->I.SaturateMode, inst->I.DstReg, src);
 +      src.Negate = RC_MASK_NONE;
 +      emit1(c, inst->Prev, RC_OPCODE_MOV, inst->I.SaturateMode, inst->I.DstReg, src);
        rc_remove_instruction(inst);
  }
  
  static void transform_DP3(struct radeon_compiler* c,
        struct rc_instruction* inst)
  {
 -      struct prog_src_register src0 = inst->I.SrcReg[0];
 -      struct prog_src_register src1 = inst->I.SrcReg[1];
 -      src0.Negate &= ~NEGATE_W;
 +      struct rc_src_register src0 = inst->I.SrcReg[0];
 +      struct rc_src_register src1 = inst->I.SrcReg[1];
 +      src0.Negate &= ~RC_MASK_W;
        src0.Swizzle &= ~(7 << (3 * 3));
 -      src0.Swizzle |= SWIZZLE_ZERO << (3 * 3);
 -      src1.Negate &= ~NEGATE_W;
 +      src0.Swizzle |= RC_SWIZZLE_ZERO << (3 * 3);
 +      src1.Negate &= ~RC_MASK_W;
        src1.Swizzle &= ~(7 << (3 * 3));
 -      src1.Swizzle |= SWIZZLE_ZERO << (3 * 3);
 -      emit2(c, inst->Prev, OPCODE_DP4, inst->I.SaturateMode, inst->I.DstReg, src0, src1);
 +      src1.Swizzle |= RC_SWIZZLE_ZERO << (3 * 3);
 +      emit2(c, inst->Prev, RC_OPCODE_DP4, inst->I.SaturateMode, inst->I.DstReg, src0, src1);
        rc_remove_instruction(inst);
  }
  
  static void transform_DPH(struct radeon_compiler* c,
        struct rc_instruction* inst)
  {
 -      struct prog_src_register src0 = inst->I.SrcReg[0];
 -      src0.Negate &= ~NEGATE_W;
 +      struct rc_src_register src0 = inst->I.SrcReg[0];
 +      src0.Negate &= ~RC_MASK_W;
        src0.Swizzle &= ~(7 << (3 * 3));
 -      src0.Swizzle |= SWIZZLE_ONE << (3 * 3);
 -      emit2(c, inst->Prev, OPCODE_DP4, inst->I.SaturateMode, inst->I.DstReg, src0, inst->I.SrcReg[1]);
 +      src0.Swizzle |= RC_SWIZZLE_ONE << (3 * 3);
 +      emit2(c, inst->Prev, RC_OPCODE_DP4, inst->I.SaturateMode, inst->I.DstReg, src0, inst->I.SrcReg[1]);
        rc_remove_instruction(inst);
  }
  
  static void transform_DST(struct radeon_compiler* c,
        struct rc_instruction* inst)
  {
 -      emit2(c, inst->Prev, OPCODE_MUL, inst->I.SaturateMode, inst->I.DstReg,
 -              swizzle(inst->I.SrcReg[0], SWIZZLE_ONE, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_ONE),
 -              swizzle(inst->I.SrcReg[1], SWIZZLE_ONE, SWIZZLE_Y, SWIZZLE_ONE, SWIZZLE_W));
 +      emit2(c, inst->Prev, RC_OPCODE_MUL, inst->I.SaturateMode, inst->I.DstReg,
 +              swizzle(inst->I.SrcReg[0], RC_SWIZZLE_ONE, RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_ONE),
 +              swizzle(inst->I.SrcReg[1], RC_SWIZZLE_ONE, RC_SWIZZLE_Y, RC_SWIZZLE_ONE, RC_SWIZZLE_W));
        rc_remove_instruction(inst);
  }
  
@@@ -218,9 -229,9 +218,9 @@@ static void transform_FLR(struct radeon
        struct rc_instruction* inst)
  {
        int tempreg = rc_find_free_temporary(c);
 -      emit1(c, inst->Prev, OPCODE_FRC, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->I.SrcReg[0]);
 -      emit2(c, inst->Prev, OPCODE_ADD, inst->I.SaturateMode, inst->I.DstReg,
 -              inst->I.SrcReg[0], negate(srcreg(PROGRAM_TEMPORARY, tempreg)));
 +      emit1(c, inst->Prev, RC_OPCODE_FRC, 0, dstreg(RC_FILE_TEMPORARY, tempreg), inst->I.SrcReg[0]);
 +      emit2(c, inst->Prev, RC_OPCODE_ADD, inst->I.SaturateMode, inst->I.DstReg,
 +              inst->I.SrcReg[0], negate(srcreg(RC_FILE_TEMPORARY, tempreg)));
        rc_remove_instruction(inst);
  }
  
  static void transform_LIT(struct radeon_compiler* c,
        struct rc_instruction* inst)
  {
 -      GLuint constant;
 -      GLuint constant_swizzle;
 -      GLuint temp;
 -      struct prog_src_register srctemp;
 +      unsigned int constant;
 +      unsigned int constant_swizzle;
 +      unsigned int temp;
 +      struct rc_src_register srctemp;
  
        constant = rc_constants_add_immediate_scalar(&c->Program.Constants, -127.999999, &constant_swizzle);
  
 -      if (inst->I.DstReg.WriteMask != WRITEMASK_XYZW || inst->I.DstReg.File != PROGRAM_TEMPORARY) {
 +      if (inst->I.DstReg.WriteMask != RC_MASK_XYZW || inst->I.DstReg.File != RC_FILE_TEMPORARY) {
                struct rc_instruction * inst_mov;
  
                inst_mov = emit1(c, inst,
 -                      OPCODE_MOV, 0, inst->I.DstReg,
 -                      srcreg(PROGRAM_TEMPORARY, rc_find_free_temporary(c)));
 +                      RC_OPCODE_MOV, 0, inst->I.DstReg,
 +                      srcreg(RC_FILE_TEMPORARY, rc_find_free_temporary(c)));
  
 -              inst->I.DstReg.File = PROGRAM_TEMPORARY;
 +              inst->I.DstReg.File = RC_FILE_TEMPORARY;
                inst->I.DstReg.Index = inst_mov->I.SrcReg[0].Index;
 -              inst->I.DstReg.WriteMask = WRITEMASK_XYZW;
 +              inst->I.DstReg.WriteMask = RC_MASK_XYZW;
        }
  
        temp = inst->I.DstReg.Index;
 -      srctemp = srcreg(PROGRAM_TEMPORARY, temp);
 +      srctemp = srcreg(RC_FILE_TEMPORARY, temp);
  
        // tmp.x = max(0.0, Src.x);
        // tmp.y = max(0.0, Src.y);
        // tmp.w = clamp(Src.z, -128+eps, 128-eps);
 -      emit2(c, inst->Prev, OPCODE_MAX, 0,
 -              dstregtmpmask(temp, WRITEMASK_XYW),
 +      emit2(c, inst->Prev, RC_OPCODE_MAX, 0,
 +              dstregtmpmask(temp, RC_MASK_XYW),
                inst->I.SrcReg[0],
 -              swizzle(srcreg(PROGRAM_CONSTANT, constant),
 -                      SWIZZLE_ZERO, SWIZZLE_ZERO, SWIZZLE_ZERO, constant_swizzle&3));
 -      emit2(c, inst->Prev, OPCODE_MIN, 0,
 -              dstregtmpmask(temp, WRITEMASK_Z),
 -              swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 -              negate(srcregswz(PROGRAM_CONSTANT, constant, constant_swizzle)));
 +              swizzle(srcreg(RC_FILE_CONSTANT, constant),
 +                      RC_SWIZZLE_ZERO, RC_SWIZZLE_ZERO, RC_SWIZZLE_ZERO, constant_swizzle&3));
 +      emit2(c, inst->Prev, RC_OPCODE_MIN, 0,
 +              dstregtmpmask(temp, RC_MASK_Z),
 +              swizzle(srctemp, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
 +              negate(srcregswz(RC_FILE_CONSTANT, constant, constant_swizzle)));
  
        // tmp.w = Pow(tmp.y, tmp.w)
 -      emit1(c, inst->Prev, OPCODE_LG2, 0,
 -              dstregtmpmask(temp, WRITEMASK_W),
 -              swizzle(srctemp, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y));
 -      emit2(c, inst->Prev, OPCODE_MUL, 0,
 -              dstregtmpmask(temp, WRITEMASK_W),
 -              swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 -              swizzle(srctemp, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z));
 -      emit1(c, inst->Prev, OPCODE_EX2, 0,
 -              dstregtmpmask(temp, WRITEMASK_W),
 -              swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W));
 +      emit1(c, inst->Prev, RC_OPCODE_LG2, 0,
 +              dstregtmpmask(temp, RC_MASK_W),
 +              swizzle(srctemp, RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y));
 +      emit2(c, inst->Prev, RC_OPCODE_MUL, 0,
 +              dstregtmpmask(temp, RC_MASK_W),
 +              swizzle(srctemp, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
 +              swizzle(srctemp, RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z));
 +      emit1(c, inst->Prev, RC_OPCODE_EX2, 0,
 +              dstregtmpmask(temp, RC_MASK_W),
 +              swizzle(srctemp, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W));
  
        // tmp.z = (tmp.x > 0) ? tmp.w : 0.0
 -      emit3(c, inst->Prev, OPCODE_CMP, inst->I.SaturateMode,
 -              dstregtmpmask(temp, WRITEMASK_Z),
 -              negate(swizzle(srctemp, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)),
 -              swizzle(srctemp, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 +      emit3(c, inst->Prev, RC_OPCODE_CMP, inst->I.SaturateMode,
 +              dstregtmpmask(temp, RC_MASK_Z),
 +              negate(swizzle(srctemp, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X)),
 +              swizzle(srctemp, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
                builtin_zero);
  
        // tmp.x, tmp.y, tmp.w = 1.0, tmp.x, 1.0
 -      emit1(c, inst->Prev, OPCODE_MOV, inst->I.SaturateMode,
 -              dstregtmpmask(temp, WRITEMASK_XYW),
 -              swizzle(srctemp, SWIZZLE_ONE, SWIZZLE_X, SWIZZLE_ONE, SWIZZLE_ONE));
 +      emit1(c, inst->Prev, RC_OPCODE_MOV, inst->I.SaturateMode,
 +              dstregtmpmask(temp, RC_MASK_XYW),
 +              swizzle(srctemp, RC_SWIZZLE_ONE, RC_SWIZZLE_X, RC_SWIZZLE_ONE, RC_SWIZZLE_ONE));
  
        rc_remove_instruction(inst);
  }
@@@ -312,12 -323,12 +312,12 @@@ static void transform_LRP(struct radeon
  {
        int tempreg = rc_find_free_temporary(c);
  
 -      emit2(c, inst->Prev, OPCODE_ADD, 0,
 -              dstreg(PROGRAM_TEMPORARY, tempreg),
 +      emit2(c, inst->Prev, RC_OPCODE_ADD, 0,
 +              dstreg(RC_FILE_TEMPORARY, tempreg),
                inst->I.SrcReg[1], negate(inst->I.SrcReg[2]));
 -      emit3(c, inst->Prev, OPCODE_MAD, inst->I.SaturateMode,
 +      emit3(c, inst->Prev, RC_OPCODE_MAD, inst->I.SaturateMode,
                inst->I.DstReg,
 -              inst->I.SrcReg[0], srcreg(PROGRAM_TEMPORARY, tempreg), inst->I.SrcReg[2]);
 +              inst->I.SrcReg[0], srcreg(RC_FILE_TEMPORARY, tempreg), inst->I.SrcReg[2]);
  
        rc_remove_instruction(inst);
  }
@@@ -326,14 -337,14 +326,14 @@@ static void transform_POW(struct radeon
        struct rc_instruction* inst)
  {
        int tempreg = rc_find_free_temporary(c);
 -      struct prog_dst_register tempdst = dstreg(PROGRAM_TEMPORARY, tempreg);
 -      struct prog_src_register tempsrc = srcreg(PROGRAM_TEMPORARY, tempreg);
 -      tempdst.WriteMask = WRITEMASK_W;
 -      tempsrc.Swizzle = SWIZZLE_WWWW;
 +      struct rc_dst_register tempdst = dstreg(RC_FILE_TEMPORARY, tempreg);
 +      struct rc_src_register tempsrc = srcreg(RC_FILE_TEMPORARY, tempreg);
 +      tempdst.WriteMask = RC_MASK_W;
 +      tempsrc.Swizzle = RC_SWIZZLE_WWWW;
  
 -      emit1(c, inst->Prev, OPCODE_LG2, 0, tempdst, scalar(inst->I.SrcReg[0]));
 -      emit2(c, inst->Prev, OPCODE_MUL, 0, tempdst, tempsrc, scalar(inst->I.SrcReg[1]));
 -      emit1(c, inst->Prev, OPCODE_EX2, inst->I.SaturateMode, inst->I.DstReg, tempsrc);
 +      emit1(c, inst->Prev, RC_OPCODE_LG2, 0, tempdst, scalar(inst->I.SrcReg[0]));
 +      emit2(c, inst->Prev, RC_OPCODE_MUL, 0, tempdst, tempsrc, scalar(inst->I.SrcReg[1]));
 +      emit1(c, inst->Prev, RC_OPCODE_EX2, inst->I.SaturateMode, inst->I.DstReg, tempsrc);
  
        rc_remove_instruction(inst);
  }
@@@ -349,9 -360,9 +349,9 @@@ static void transform_SGE(struct radeon
  {
        int tempreg = rc_find_free_temporary(c);
  
 -      emit2(c, inst->Prev, OPCODE_ADD, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->I.SrcReg[0], negate(inst->I.SrcReg[1]));
 -      emit3(c, inst->Prev, OPCODE_CMP, inst->I.SaturateMode, inst->I.DstReg,
 -              srcreg(PROGRAM_TEMPORARY, tempreg), builtin_zero, builtin_one);
 +      emit2(c, inst->Prev, RC_OPCODE_ADD, 0, dstreg(RC_FILE_TEMPORARY, tempreg), inst->I.SrcReg[0], negate(inst->I.SrcReg[1]));
 +      emit3(c, inst->Prev, RC_OPCODE_CMP, inst->I.SaturateMode, inst->I.DstReg,
 +              srcreg(RC_FILE_TEMPORARY, tempreg), builtin_zero, builtin_one);
  
        rc_remove_instruction(inst);
  }
@@@ -361,9 -372,9 +361,9 @@@ static void transform_SLT(struct radeon
  {
        int tempreg = rc_find_free_temporary(c);
  
 -      emit2(c, inst->Prev, OPCODE_ADD, 0, dstreg(PROGRAM_TEMPORARY, tempreg), inst->I.SrcReg[0], negate(inst->I.SrcReg[1]));
 -      emit3(c, inst->Prev, OPCODE_CMP, inst->I.SaturateMode, inst->I.DstReg,
 -              srcreg(PROGRAM_TEMPORARY, tempreg), builtin_one, builtin_zero);
 +      emit2(c, inst->Prev, RC_OPCODE_ADD, 0, dstreg(RC_FILE_TEMPORARY, tempreg), inst->I.SrcReg[0], negate(inst->I.SrcReg[1]));
 +      emit3(c, inst->Prev, RC_OPCODE_CMP, inst->I.SaturateMode, inst->I.DstReg,
 +              srcreg(RC_FILE_TEMPORARY, tempreg), builtin_one, builtin_zero);
  
        rc_remove_instruction(inst);
  }
  static void transform_SUB(struct radeon_compiler* c,
        struct rc_instruction* inst)
  {
 -      inst->I.Opcode = OPCODE_ADD;
 +      inst->I.Opcode = RC_OPCODE_ADD;
        inst->I.SrcReg[1] = negate(inst->I.SrcReg[1]);
  }
  
  static void transform_SWZ(struct radeon_compiler* c,
        struct rc_instruction* inst)
  {
 -      inst->I.Opcode = OPCODE_MOV;
 +      inst->I.Opcode = RC_OPCODE_MOV;
  }
  
  static void transform_XPD(struct radeon_compiler* c,
  {
        int tempreg = rc_find_free_temporary(c);
  
 -      emit2(c, inst->Prev, OPCODE_MUL, 0, dstreg(PROGRAM_TEMPORARY, tempreg),
 -              swizzle(inst->I.SrcReg[0], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W),
 -              swizzle(inst->I.SrcReg[1], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W));
 -      emit3(c, inst->Prev, OPCODE_MAD, inst->I.SaturateMode, inst->I.DstReg,
 -              swizzle(inst->I.SrcReg[0], SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, SWIZZLE_W),
 -              swizzle(inst->I.SrcReg[1], SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, SWIZZLE_W),
 -              negate(srcreg(PROGRAM_TEMPORARY, tempreg)));
 +      emit2(c, inst->Prev, RC_OPCODE_MUL, 0, dstreg(RC_FILE_TEMPORARY, tempreg),
 +              swizzle(inst->I.SrcReg[0], RC_SWIZZLE_Z, RC_SWIZZLE_X, RC_SWIZZLE_Y, RC_SWIZZLE_W),
 +              swizzle(inst->I.SrcReg[1], RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_X, RC_SWIZZLE_W));
 +      emit3(c, inst->Prev, RC_OPCODE_MAD, inst->I.SaturateMode, inst->I.DstReg,
 +              swizzle(inst->I.SrcReg[0], RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_X, RC_SWIZZLE_W),
 +              swizzle(inst->I.SrcReg[1], RC_SWIZZLE_Z, RC_SWIZZLE_X, RC_SWIZZLE_Y, RC_SWIZZLE_W),
 +              negate(srcreg(RC_FILE_TEMPORARY, tempreg)));
  
        rc_remove_instruction(inst);
  }
   *
   * @note should be applicable to R300 and R500 fragment programs.
   */
 -GLboolean radeonTransformALU(
 +int radeonTransformALU(
        struct radeon_compiler * c,
        struct rc_instruction* inst,
        void* unused)
  {
        switch(inst->I.Opcode) {
 -      case OPCODE_ABS: transform_ABS(c, inst); return GL_TRUE;
 -      case OPCODE_DPH: transform_DPH(c, inst); return GL_TRUE;
 -      case OPCODE_DST: transform_DST(c, inst); return GL_TRUE;
 -      case OPCODE_FLR: transform_FLR(c, inst); return GL_TRUE;
 -      case OPCODE_LIT: transform_LIT(c, inst); return GL_TRUE;
 -      case OPCODE_LRP: transform_LRP(c, inst); return GL_TRUE;
 -      case OPCODE_POW: transform_POW(c, inst); return GL_TRUE;
 -      case OPCODE_RSQ: transform_RSQ(c, inst); return GL_TRUE;
 -      case OPCODE_SGE: transform_SGE(c, inst); return GL_TRUE;
 -      case OPCODE_SLT: transform_SLT(c, inst); return GL_TRUE;
 -      case OPCODE_SUB: transform_SUB(c, inst); return GL_TRUE;
 -      case OPCODE_SWZ: transform_SWZ(c, inst); return GL_TRUE;
 -      case OPCODE_XPD: transform_XPD(c, inst); return GL_TRUE;
 +      case RC_OPCODE_ABS: transform_ABS(c, inst); return 1;
 +      case RC_OPCODE_DPH: transform_DPH(c, inst); return 1;
 +      case RC_OPCODE_DST: transform_DST(c, inst); return 1;
 +      case RC_OPCODE_FLR: transform_FLR(c, inst); return 1;
 +      case RC_OPCODE_LIT: transform_LIT(c, inst); return 1;
 +      case RC_OPCODE_LRP: transform_LRP(c, inst); return 1;
 +      case RC_OPCODE_POW: transform_POW(c, inst); return 1;
 +      case RC_OPCODE_RSQ: transform_RSQ(c, inst); return 1;
 +      case RC_OPCODE_SGE: transform_SGE(c, inst); return 1;
 +      case RC_OPCODE_SLT: transform_SLT(c, inst); return 1;
 +      case RC_OPCODE_SUB: transform_SUB(c, inst); return 1;
 +      case RC_OPCODE_SWZ: transform_SWZ(c, inst); return 1;
 +      case RC_OPCODE_XPD: transform_XPD(c, inst); return 1;
        default:
 -              return GL_FALSE;
 +              return 0;
        }
  }
  
@@@ -441,37 -452,37 +441,37 @@@ static void transform_r300_vertex_ABS(s
        struct rc_instruction* inst)
  {
        /* Note: r500 can take absolute values, but r300 cannot. */
 -      inst->I.Opcode = OPCODE_MAX;
 +      inst->I.Opcode = RC_OPCODE_MAX;
        inst->I.SrcReg[1] = inst->I.SrcReg[0];
 -      inst->I.SrcReg[1].Negate ^= NEGATE_XYZW;
 +      inst->I.SrcReg[1].Negate ^= RC_MASK_XYZW;
  }
  
  /**
   * For use with radeonLocalTransform, this transforms non-native ALU
   * instructions of the r300 up to r500 vertex engine.
   */
 -GLboolean r300_transform_vertex_alu(
 +int r300_transform_vertex_alu(
        struct radeon_compiler * c,
        struct rc_instruction* inst,
        void* unused)
  {
        switch(inst->I.Opcode) {
 -      case OPCODE_ABS: transform_r300_vertex_ABS(c, inst); return GL_TRUE;
 -      case OPCODE_DP3: transform_DP3(c, inst); return GL_TRUE;
 -      case OPCODE_DPH: transform_DPH(c, inst); return GL_TRUE;
 -      case OPCODE_FLR: transform_FLR(c, inst); return GL_TRUE;
 -      case OPCODE_LRP: transform_LRP(c, inst); return GL_TRUE;
 -      case OPCODE_SUB: transform_SUB(c, inst); return GL_TRUE;
 -      case OPCODE_SWZ: transform_SWZ(c, inst); return GL_TRUE;
 -      case OPCODE_XPD: transform_XPD(c, inst); return GL_TRUE;
 +      case RC_OPCODE_ABS: transform_r300_vertex_ABS(c, inst); return 1;
 +      case RC_OPCODE_DP3: transform_DP3(c, inst); return 1;
 +      case RC_OPCODE_DPH: transform_DPH(c, inst); return 1;
 +      case RC_OPCODE_FLR: transform_FLR(c, inst); return 1;
 +      case RC_OPCODE_LRP: transform_LRP(c, inst); return 1;
 +      case RC_OPCODE_SUB: transform_SUB(c, inst); return 1;
 +      case RC_OPCODE_SWZ: transform_SWZ(c, inst); return 1;
 +      case RC_OPCODE_XPD: transform_XPD(c, inst); return 1;
        default:
 -              return GL_FALSE;
 +              return 0;
        }
  }
  
 -static void sincos_constants(struct radeon_compiler* c, GLuint *constants)
 +static void sincos_constants(struct radeon_compiler* c, unsigned int *constants)
  {
 -      static const GLfloat SinCosConsts[2][4] = {
 +      static const float SinCosConsts[2][4] = {
                {
                        1.273239545,            // 4/PI
                        -0.405284735,           // -4/(PI*PI)
   * MAD dest, tmp.y, weight, tmp.x
   */
  static void sin_approx(
-       struct radeon_compiler* c, struct rc_instruction * after,
+       struct radeon_compiler* c, struct rc_instruction * before,
 -      struct prog_dst_register dst, struct prog_src_register src, const GLuint* constants)
 -{
 -      GLuint tempreg = rc_find_free_temporary(c);
 -
 -      emit2(c, before->Prev, OPCODE_MUL, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
 -              swizzle(src, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
 -              srcreg(PROGRAM_CONSTANT, constants[0]));
 -      emit3(c, before->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_X),
 -              swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y),
 -              absolute(swizzle(src, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)),
 -              swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X));
 -      emit3(c, before->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_Y),
 -              swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
 -              absolute(swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)),
 -              negate(swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X)));
 -      emit3(c, before->Prev, OPCODE_MAD, 0, dst,
 -              swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y),
 -              swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 -              swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X));
 +      struct rc_dst_register dst, struct rc_src_register src, const unsigned int* constants)
 +{
 +      unsigned int tempreg = rc_find_free_temporary(c);
 +
-       emit2(c, after->Prev, RC_OPCODE_MUL, 0, dstregtmpmask(tempreg, RC_MASK_XY),
++      emit2(c, before, RC_OPCODE_MUL, 0, dstregtmpmask(tempreg, RC_MASK_XY),
 +              swizzle(src, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X),
 +              srcreg(RC_FILE_CONSTANT, constants[0]));
-       emit3(c, after->Prev, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_X),
++      emit3(c, before, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_X),
 +              swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y),
 +              absolute(swizzle(src, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X)),
 +              swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X));
-       emit3(c, after->Prev, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_Y),
++      emit3(c, before, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_Y),
 +              swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X),
 +              absolute(swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X)),
 +              negate(swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X)));
-       emit3(c, after->Prev, RC_OPCODE_MAD, 0, dst,
++      emit3(c, before, RC_OPCODE_MAD, 0, dst,
 +              swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y),
 +              swizzle(srcreg(RC_FILE_CONSTANT, constants[0]), RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
 +              swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X));
  }
  
  /**
   * using only the basic instructions
   *  MOV, ADD, MUL, MAD, FRC
   */
 -GLboolean radeonTransformTrigSimple(struct radeon_compiler* c,
 +int radeonTransformTrigSimple(struct radeon_compiler* c,
        struct rc_instruction* inst,
        void* unused)
  {
 -      if (inst->I.Opcode != OPCODE_COS &&
 -          inst->I.Opcode != OPCODE_SIN &&
 -          inst->I.Opcode != OPCODE_SCS)
 -              return GL_FALSE;
 +      if (inst->I.Opcode != RC_OPCODE_COS &&
 +          inst->I.Opcode != RC_OPCODE_SIN &&
 +          inst->I.Opcode != RC_OPCODE_SCS)
 +              return 0;
  
 -      GLuint constants[2];
 -      GLuint tempreg = rc_find_free_temporary(c);
 +      unsigned int constants[2];
 +      unsigned int tempreg = rc_find_free_temporary(c);
  
        sincos_constants(c, constants);
  
 -      if (inst->I.Opcode == OPCODE_COS) {
 +      if (inst->I.Opcode == RC_OPCODE_COS) {
                // MAD tmp.x, src, 1/(2*PI), 0.75
                // FRC tmp.x, tmp.x
                // MAD tmp.z, tmp.x, 2*PI, -PI
 -              emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
 -                      swizzle(inst->I.SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
 -                      swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z),
 -                      swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X));
 -              emit1(c, inst->Prev, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_W),
 -                      swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W));
 -              emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
 -                      swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 -                      swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 -                      negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z)));
 +              emit3(c, inst->Prev, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_W),
 +                      swizzle(inst->I.SrcReg[0], RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X),
 +                      swizzle(srcreg(RC_FILE_CONSTANT, constants[1]), RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z),
 +                      swizzle(srcreg(RC_FILE_CONSTANT, constants[1]), RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X));
 +              emit1(c, inst->Prev, RC_OPCODE_FRC, 0, dstregtmpmask(tempreg, RC_MASK_W),
 +                      swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W));
 +              emit3(c, inst->Prev, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_W),
 +                      swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
 +                      swizzle(srcreg(RC_FILE_CONSTANT, constants[1]), RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
 +                      negate(swizzle(srcreg(RC_FILE_CONSTANT, constants[0]), RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z)));
  
-               sin_approx(c, inst->Prev, inst->I.DstReg,
+               sin_approx(c, inst, inst->I.DstReg,
 -                      swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 +                      swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
                        constants);
 -      } else if (inst->I.Opcode == OPCODE_SIN) {
 -              emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
 -                      swizzle(inst->I.SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
 -                      swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z),
 -                      swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y));
 -              emit1(c, inst->Prev, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_W),
 -                      swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W));
 -              emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_W),
 -                      swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 -                      swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 -                      negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z)));
 +      } else if (inst->I.Opcode == RC_OPCODE_SIN) {
 +              emit3(c, inst->Prev, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_W),
 +                      swizzle(inst->I.SrcReg[0], RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X),
 +                      swizzle(srcreg(RC_FILE_CONSTANT, constants[1]), RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z),
 +                      swizzle(srcreg(RC_FILE_CONSTANT, constants[1]), RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y));
 +              emit1(c, inst->Prev, RC_OPCODE_FRC, 0, dstregtmpmask(tempreg, RC_MASK_W),
 +                      swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W));
 +              emit3(c, inst->Prev, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_W),
 +                      swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
 +                      swizzle(srcreg(RC_FILE_CONSTANT, constants[1]), RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
 +                      negate(swizzle(srcreg(RC_FILE_CONSTANT, constants[0]), RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z)));
  
-               sin_approx(c, inst->Prev, inst->I.DstReg,
+               sin_approx(c, inst, inst->I.DstReg,
 -                      swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 +                      swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
                        constants);
        } else {
 -              emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
 -                      swizzle(inst->I.SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
 -                      swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z),
 -                      swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W));
 -              emit1(c, inst->Prev, OPCODE_FRC, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
 -                      srcreg(PROGRAM_TEMPORARY, tempreg));
 -              emit3(c, inst->Prev, OPCODE_MAD, 0, dstregtmpmask(tempreg, WRITEMASK_XY),
 -                      srcreg(PROGRAM_TEMPORARY, tempreg),
 -                      swizzle(srcreg(PROGRAM_CONSTANT, constants[1]), SWIZZLE_W, SWIZZLE_W, SWIZZLE_W, SWIZZLE_W),
 -                      negate(swizzle(srcreg(PROGRAM_CONSTANT, constants[0]), SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z, SWIZZLE_Z)));
 -
 -              struct prog_dst_register dst = inst->I.DstReg;
 -
 -              dst.WriteMask = inst->I.DstReg.WriteMask & WRITEMASK_X;
 +              emit3(c, inst->Prev, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_XY),
 +                      swizzle(inst->I.SrcReg[0], RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X),
 +                      swizzle(srcreg(RC_FILE_CONSTANT, constants[1]), RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z),
 +                      swizzle(srcreg(RC_FILE_CONSTANT, constants[1]), RC_SWIZZLE_X, RC_SWIZZLE_Y, RC_SWIZZLE_Z, RC_SWIZZLE_W));
 +              emit1(c, inst->Prev, RC_OPCODE_FRC, 0, dstregtmpmask(tempreg, RC_MASK_XY),
 +                      srcreg(RC_FILE_TEMPORARY, tempreg));
 +              emit3(c, inst->Prev, RC_OPCODE_MAD, 0, dstregtmpmask(tempreg, RC_MASK_XY),
 +                      srcreg(RC_FILE_TEMPORARY, tempreg),
 +                      swizzle(srcreg(RC_FILE_CONSTANT, constants[1]), RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W, RC_SWIZZLE_W),
 +                      negate(swizzle(srcreg(RC_FILE_CONSTANT, constants[0]), RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z, RC_SWIZZLE_Z)));
 +
 +              struct rc_dst_register dst = inst->I.DstReg;
 +
 +              dst.WriteMask = inst->I.DstReg.WriteMask & RC_MASK_X;
-               sin_approx(c, inst->Prev, dst,
+               sin_approx(c, inst, dst,
 -                      swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
 +                      swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X),
                        constants);
  
 -              dst.WriteMask = inst->I.DstReg.WriteMask & WRITEMASK_Y;
 +              dst.WriteMask = inst->I.DstReg.WriteMask & RC_MASK_Y;
-               sin_approx(c, inst->Prev, dst,
+               sin_approx(c, inst, dst,
 -                      swizzle(srcreg(PROGRAM_TEMPORARY, tempreg), SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y),
 +                      swizzle(srcreg(RC_FILE_TEMPORARY, tempreg), RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y, RC_SWIZZLE_Y),
                        constants);
        }
  
        rc_remove_instruction(inst);
  
 -      return GL_TRUE;
 +      return 1;
  }
  
  
   *
   * @warning This transformation implicitly changes the semantics of SIN and COS!
   */
 -GLboolean radeonTransformTrigScale(struct radeon_compiler* c,
 +int radeonTransformTrigScale(struct radeon_compiler* c,
        struct rc_instruction* inst,
        void* unused)
  {
 -      if (inst->I.Opcode != OPCODE_COS &&
 -          inst->I.Opcode != OPCODE_SIN &&
 -          inst->I.Opcode != OPCODE_SCS)
 -              return GL_FALSE;
 +      if (inst->I.Opcode != RC_OPCODE_COS &&
 +          inst->I.Opcode != RC_OPCODE_SIN &&
 +          inst->I.Opcode != RC_OPCODE_SCS)
 +              return 0;
  
 -      static const GLfloat RCP_2PI = 0.15915494309189535;
 -      GLuint temp;
 -      GLuint constant;
 -      GLuint constant_swizzle;
 +      static const float RCP_2PI = 0.15915494309189535;
 +      unsigned int temp;
 +      unsigned int constant;
 +      unsigned int constant_swizzle;
  
        temp = rc_find_free_temporary(c);
        constant = rc_constants_add_immediate_scalar(&c->Program.Constants, RCP_2PI, &constant_swizzle);
  
 -      emit2(c, inst->Prev, OPCODE_MUL, 0, dstregtmpmask(temp, WRITEMASK_W),
 -              swizzle(inst->I.SrcReg[0], SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
 -              srcregswz(PROGRAM_CONSTANT, constant, constant_swizzle));
 -      emit1(c, inst->Prev, OPCODE_FRC, 0, dstregtmpmask(temp, WRITEMASK_W),
 -              srcreg(PROGRAM_TEMPORARY, temp));
 -
 -      if (inst->I.Opcode == OPCODE_COS) {
 -              emit1(c, inst->Prev, OPCODE_COS, inst->I.SaturateMode, inst->I.DstReg,
 -                      srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW));
 -      } else if (inst->I.Opcode == OPCODE_SIN) {
 -              emit1(c, inst->Prev, OPCODE_SIN, inst->I.SaturateMode,
 -                      inst->I.DstReg, srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW));
 -      } else if (inst->I.Opcode == OPCODE_SCS) {
 -              struct prog_dst_register moddst = inst->I.DstReg;
 -
 -              if (inst->I.DstReg.WriteMask & WRITEMASK_X) {
 -                      moddst.WriteMask = WRITEMASK_X;
 -                      emit1(c, inst->Prev, OPCODE_COS, inst->I.SaturateMode, moddst,
 -                              srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW));
 +      emit2(c, inst->Prev, RC_OPCODE_MUL, 0, dstregtmpmask(temp, RC_MASK_W),
 +              swizzle(inst->I.SrcReg[0], RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X, RC_SWIZZLE_X),
 +              srcregswz(RC_FILE_CONSTANT, constant, constant_swizzle));
 +      emit1(c, inst->Prev, RC_OPCODE_FRC, 0, dstregtmpmask(temp, RC_MASK_W),
 +              srcreg(RC_FILE_TEMPORARY, temp));
 +
 +      if (inst->I.Opcode == RC_OPCODE_COS) {
 +              emit1(c, inst->Prev, RC_OPCODE_COS, inst->I.SaturateMode, inst->I.DstReg,
 +                      srcregswz(RC_FILE_TEMPORARY, temp, RC_SWIZZLE_WWWW));
 +      } else if (inst->I.Opcode == RC_OPCODE_SIN) {
 +              emit1(c, inst->Prev, RC_OPCODE_SIN, inst->I.SaturateMode,
 +                      inst->I.DstReg, srcregswz(RC_FILE_TEMPORARY, temp, RC_SWIZZLE_WWWW));
 +      } else if (inst->I.Opcode == RC_OPCODE_SCS) {
 +              struct rc_dst_register moddst = inst->I.DstReg;
 +
 +              if (inst->I.DstReg.WriteMask & RC_MASK_X) {
 +                      moddst.WriteMask = RC_MASK_X;
 +                      emit1(c, inst->Prev, RC_OPCODE_COS, inst->I.SaturateMode, moddst,
 +                              srcregswz(RC_FILE_TEMPORARY, temp, RC_SWIZZLE_WWWW));
                }
 -              if (inst->I.DstReg.WriteMask & WRITEMASK_Y) {
 -                      moddst.WriteMask = WRITEMASK_Y;
 -                      emit1(c, inst->Prev, OPCODE_SIN, inst->I.SaturateMode, moddst,
 -                              srcregswz(PROGRAM_TEMPORARY, temp, SWIZZLE_WWWW));
 +              if (inst->I.DstReg.WriteMask & RC_MASK_Y) {
 +                      moddst.WriteMask = RC_MASK_Y;
 +                      emit1(c, inst->Prev, RC_OPCODE_SIN, inst->I.SaturateMode, moddst,
 +                              srcregswz(RC_FILE_TEMPORARY, temp, RC_SWIZZLE_WWWW));
                }
        }
  
        rc_remove_instruction(inst);
  
 -      return GL_TRUE;
 +      return 1;
  }
  
  /**
   * @warning This explicitly changes the form of DDX and DDY!
   */
  
 -GLboolean radeonTransformDeriv(struct radeon_compiler* c,
 +int radeonTransformDeriv(struct radeon_compiler* c,
        struct rc_instruction* inst,
        void* unused)
  {
 -      if (inst->I.Opcode != OPCODE_DDX && inst->I.Opcode != OPCODE_DDY)
 -              return GL_FALSE;
 +      if (inst->I.Opcode != RC_OPCODE_DDX && inst->I.Opcode != RC_OPCODE_DDY)
 +              return 0;
  
 -      inst->I.SrcReg[1].Swizzle = MAKE_SWIZZLE4(SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE, SWIZZLE_ONE);
 -      inst->I.SrcReg[1].Negate = NEGATE_XYZW;
 +      inst->I.SrcReg[1].Swizzle = RC_MAKE_SWIZZLE(RC_SWIZZLE_ONE, RC_SWIZZLE_ONE, RC_SWIZZLE_ONE, RC_SWIZZLE_ONE);
 +      inst->I.SrcReg[1].Negate = RC_MASK_XYZW;
  
 -      return GL_TRUE;
 +      return 1;
  }
@@@ -41,7 -41,7 +41,7 @@@ USE OR OTHER DEALINGS IN THE SOFTWARE
  #include "tnl/tnl.h"
  
  #include "compiler/radeon_compiler.h"
 -#include "compiler/radeon_nqssadce.h"
 +#include "radeon_mesa_to_rc.h"
  #include "r300_context.h"
  #include "r300_state.h"
  
@@@ -203,6 -203,34 +203,34 @@@ static void t_inputs_outputs(struct r30
        }
  }
  
 -              inst->I.Opcode = OPCODE_MOV;
 -              inst->I.DstReg.File = PROGRAM_TEMPORARY;
+ /**
+  * The NV_vertex_program spec mandates that all registers be
+  * initialized to zero. We do this here unconditionally.
+  *
+  * \note We rely on dead-code elimination in the compiler.
+  */
+ static void initialize_NV_registers(struct radeon_compiler * compiler)
+ {
+       unsigned int reg;
+       struct rc_instruction * inst;
+       for(reg = 0; reg < 12; ++reg) {
+               inst = rc_insert_new_instruction(compiler, &compiler->Program.Instructions);
 -              inst->I.SrcReg[0].File = PROGRAM_BUILTIN;
 -              inst->I.SrcReg[0].Swizzle = SWIZZLE_0000;
++              inst->I.Opcode = RC_OPCODE_MOV;
++              inst->I.DstReg.File = RC_FILE_TEMPORARY;
+               inst->I.DstReg.Index = reg;
 -      inst->I.Opcode = OPCODE_ARL;
 -      inst->I.DstReg.File = PROGRAM_ADDRESS;
++              inst->I.SrcReg[0].File = RC_FILE_NONE;
++              inst->I.SrcReg[0].Swizzle = RC_SWIZZLE_0000;
+       }
+       inst = rc_insert_new_instruction(compiler, &compiler->Program.Instructions);
 -      inst->I.SrcReg[0].File = PROGRAM_BUILTIN;
 -      inst->I.SrcReg[0].Swizzle = SWIZZLE_0000;
++      inst->I.Opcode = RC_OPCODE_ARL;
++      inst->I.DstReg.File = RC_FILE_ADDRESS;
+       inst->I.DstReg.Index = 0;
+       inst->I.DstReg.WriteMask = WRITEMASK_X;
++      inst->I.SrcReg[0].File = RC_FILE_NONE;
++      inst->I.SrcReg[0].Swizzle = RC_SWIZZLE_0000;
+ }
  
  static struct r300_vertex_program *build_program(GLcontext *ctx,
                                                 struct r300_vertex_program_key *wanted_key,
                _mesa_insert_mvp_code(ctx, vp->Base);
        }
  
 -      rc_mesa_to_rc_program(&compiler.Base, &vp->Base->Base);
 +      radeon_mesa_to_rc_program(&compiler.Base, &vp->Base->Base);
  
+       if (mesa_vp->IsNVProgram)
+               initialize_NV_registers(&compiler.Base);
        rc_move_output(&compiler.Base, VERT_RESULT_PSIZ, VERT_RESULT_PSIZ, WRITEMASK_X);
  
        if (vp->key.WPosAttr != FRAG_ATTRIB_MAX) {
index 1e8fc3d,0000000..fb9bb9c
mode 100644,000000..100644
--- /dev/null
@@@ -1,201 -1,0 +1,223 @@@
-       case SATURATE_PLUS_MINUS_ONE: return RC_SATURATE_MINUS_PLUS_ONE;
 +/*
 + * Copyright (C) 2009 Nicolai Haehnle.
 + *
 + * All Rights Reserved.
 + *
 + * Permission is hereby granted, free of charge, to any person obtaining
 + * a copy of this software and associated documentation files (the
 + * "Software"), to deal in the Software without restriction, including
 + * without limitation the rights to use, copy, modify, merge, publish,
 + * distribute, sublicense, and/or sell copies of the Software, and to
 + * permit persons to whom the Software is furnished to do so, subject to
 + * the following conditions:
 + *
 + * The above copyright notice and this permission notice (including the
 + * next paragraph) shall be included in all copies or substantial
 + * portions of the Software.
 + *
 + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 + * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
 + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
 + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 + *
 + */
 +
 +#include "radeon_mesa_to_rc.h"
 +
 +#include "main/mtypes.h"
 +#include "shader/prog_instruction.h"
 +#include "shader/prog_parameter.h"
 +
 +#include "compiler/radeon_compiler.h"
 +#include "compiler/radeon_program.h"
 +
 +
 +static rc_opcode translate_opcode(gl_inst_opcode opcode)
 +{
 +      switch(opcode) {
 +      case OPCODE_NOP: return RC_OPCODE_NOP;
 +      case OPCODE_ABS: return RC_OPCODE_ABS;
 +      case OPCODE_ADD: return RC_OPCODE_ADD;
 +      case OPCODE_ARL: return RC_OPCODE_ARL;
 +      case OPCODE_CMP: return RC_OPCODE_CMP;
 +      case OPCODE_COS: return RC_OPCODE_COS;
 +      case OPCODE_DDX: return RC_OPCODE_DDX;
 +      case OPCODE_DDY: return RC_OPCODE_DDY;
 +      case OPCODE_DP3: return RC_OPCODE_DP3;
 +      case OPCODE_DP4: return RC_OPCODE_DP4;
 +      case OPCODE_DPH: return RC_OPCODE_DPH;
 +      case OPCODE_DST: return RC_OPCODE_DST;
 +      case OPCODE_EX2: return RC_OPCODE_EX2;
 +      case OPCODE_EXP: return RC_OPCODE_EXP;
 +      case OPCODE_FLR: return RC_OPCODE_FLR;
 +      case OPCODE_FRC: return RC_OPCODE_FRC;
 +      case OPCODE_KIL: return RC_OPCODE_KIL;
 +      case OPCODE_LG2: return RC_OPCODE_LG2;
 +      case OPCODE_LIT: return RC_OPCODE_LIT;
 +      case OPCODE_LOG: return RC_OPCODE_LOG;
 +      case OPCODE_LRP: return RC_OPCODE_LRP;
 +      case OPCODE_MAD: return RC_OPCODE_MAD;
 +      case OPCODE_MAX: return RC_OPCODE_MAX;
 +      case OPCODE_MIN: return RC_OPCODE_MIN;
 +      case OPCODE_MOV: return RC_OPCODE_MOV;
 +      case OPCODE_MUL: return RC_OPCODE_MUL;
 +      case OPCODE_POW: return RC_OPCODE_POW;
 +      case OPCODE_RCP: return RC_OPCODE_RCP;
 +      case OPCODE_RSQ: return RC_OPCODE_RSQ;
 +      case OPCODE_SCS: return RC_OPCODE_SCS;
 +      case OPCODE_SEQ: return RC_OPCODE_SEQ;
 +      case OPCODE_SFL: return RC_OPCODE_SFL;
 +      case OPCODE_SGE: return RC_OPCODE_SGE;
 +      case OPCODE_SGT: return RC_OPCODE_SGT;
 +      case OPCODE_SIN: return RC_OPCODE_SIN;
 +      case OPCODE_SLE: return RC_OPCODE_SLE;
 +      case OPCODE_SLT: return RC_OPCODE_SLT;
 +      case OPCODE_SNE: return RC_OPCODE_SNE;
 +      case OPCODE_SUB: return RC_OPCODE_SUB;
 +      case OPCODE_SWZ: return RC_OPCODE_SWZ;
 +      case OPCODE_TEX: return RC_OPCODE_TEX;
 +      case OPCODE_TXB: return RC_OPCODE_TXB;
 +      case OPCODE_TXD: return RC_OPCODE_TXD;
 +      case OPCODE_TXL: return RC_OPCODE_TXL;
 +      case OPCODE_TXP: return RC_OPCODE_TXP;
 +      case OPCODE_XPD: return RC_OPCODE_XPD;
 +      default: return RC_OPCODE_ILLEGAL_OPCODE;
 +      }
 +}
 +
 +static rc_saturate_mode translate_saturate(unsigned int saturate)
 +{
 +      switch(saturate) {
 +      default:
 +      case SATURATE_OFF: return RC_SATURATE_NONE;
 +      case SATURATE_ZERO_ONE: return RC_SATURATE_ZERO_ONE;
-       for(i = 0; i < program->Parameters->NumParameters; ++i) {
-               struct rc_constant constant;
 +      }
 +}
 +
 +static rc_register_file translate_register_file(unsigned int file)
 +{
 +      switch(file) {
 +      case PROGRAM_TEMPORARY: return RC_FILE_TEMPORARY;
 +      case PROGRAM_INPUT: return RC_FILE_INPUT;
 +      case PROGRAM_OUTPUT: return RC_FILE_OUTPUT;
 +      case PROGRAM_LOCAL_PARAM:
 +      case PROGRAM_ENV_PARAM:
 +      case PROGRAM_STATE_VAR:
 +      case PROGRAM_NAMED_PARAM:
 +      case PROGRAM_CONSTANT:
 +      case PROGRAM_UNIFORM: return RC_FILE_CONSTANT;
 +      case PROGRAM_ADDRESS: return RC_FILE_ADDRESS;
 +      default: return RC_FILE_NONE;
 +      }
 +}
 +
 +static void translate_srcreg(struct rc_src_register * dest, struct prog_src_register * src)
 +{
 +      dest->File = translate_register_file(src->File);
 +      dest->Index = src->Index;
 +      dest->RelAddr = src->RelAddr;
 +      dest->Swizzle = src->Swizzle;
 +      dest->Abs = src->Abs;
 +      dest->Negate = src->Negate;
 +}
 +
 +static void translate_dstreg(struct rc_dst_register * dest, struct prog_dst_register * src)
 +{
 +      dest->File = translate_register_file(src->File);
 +      dest->Index = src->Index;
 +      dest->RelAddr = src->RelAddr;
 +      dest->WriteMask = src->WriteMask;
 +}
 +
 +static rc_texture_target translate_tex_target(gl_texture_index target)
 +{
 +      switch(target) {
 +      case TEXTURE_2D_ARRAY_INDEX: return RC_TEXTURE_2D_ARRAY;
 +      case TEXTURE_1D_ARRAY_INDEX: return RC_TEXTURE_1D_ARRAY;
 +      case TEXTURE_CUBE_INDEX: return RC_TEXTURE_CUBE;
 +      case TEXTURE_3D_INDEX: return RC_TEXTURE_3D;
 +      case TEXTURE_RECT_INDEX: return RC_TEXTURE_RECT;
 +      default:
 +      case TEXTURE_2D_INDEX: return RC_TEXTURE_2D;
 +      case TEXTURE_1D_INDEX: return RC_TEXTURE_1D;
 +      }
 +}
 +
 +static void translate_instruction(struct radeon_compiler * c,
 +              struct rc_instruction * dest, struct prog_instruction * src)
 +{
 +      const struct rc_opcode_info * opcode;
 +      unsigned int i;
 +
 +      dest->I.Opcode = translate_opcode(src->Opcode);
 +      if (dest->I.Opcode == RC_OPCODE_ILLEGAL_OPCODE) {
 +              rc_error(c, "Unsupported opcode %i\n", src->Opcode);
 +              return;
 +      }
 +      dest->I.SaturateMode = translate_saturate(src->SaturateMode);
 +
 +      opcode = rc_get_opcode_info(dest->I.Opcode);
 +
 +      for(i = 0; i < opcode->NumSrcRegs; ++i)
 +              translate_srcreg(&dest->I.SrcReg[i], &src->SrcReg[i]);
 +
 +      if (opcode->HasDstReg)
 +              translate_dstreg(&dest->I.DstReg, &src->DstReg);
 +
 +      if (opcode->HasTexture) {
 +              dest->I.TexSrcUnit = src->TexSrcUnit;
 +              dest->I.TexSrcTarget = translate_tex_target(src->TexSrcTarget);
 +              dest->I.TexShadow = src->TexShadow;
 +      }
 +}
 +
 +void radeon_mesa_to_rc_program(struct radeon_compiler * c, struct gl_program * program)
 +{
 +      struct prog_instruction *source;
 +      unsigned int i;
 +
 +      for(source = program->Instructions; source->Opcode != OPCODE_END; ++source) {
 +              struct rc_instruction * dest = rc_insert_new_instruction(c, c->Program.Instructions.Prev);
 +              translate_instruction(c, dest, source);
 +      }
 +
 +      c->Program.ShadowSamplers = program->ShadowSamplers;
 +      c->Program.InputsRead = program->InputsRead;
 +      c->Program.OutputsWritten = program->OutputsWritten;
 +
-               constant.Type = RC_CONSTANT_EXTERNAL;
-               constant.Size = 4;
-               constant.u.External = i;
++      int isNVProgram = 0;
 +
-               rc_constants_add(&c->Program.Constants, &constant);
++      if (program->Target == GL_VERTEX_PROGRAM_ARB) {
++              struct gl_vertex_program * vp = (struct gl_vertex_program *) program;
++              isNVProgram = vp->IsNVProgram;
++      }
 +
++      if (isNVProgram) {
++              /* NV_vertex_program has a fixed-sized constant environment.
++               * This could be handled more efficiently for programs that
++               * do not use relative addressing.
++               */
++              for(i = 0; i < 96; ++i) {
++                      struct rc_constant constant;
++
++                      constant.Type = RC_CONSTANT_EXTERNAL;
++                      constant.Size = 4;
++                      constant.u.External = i;
++
++                      rc_constants_add(&c->Program.Constants, &constant);
++              }
++      } else {
++              for(i = 0; i < program->Parameters->NumParameters; ++i) {
++                      struct rc_constant constant;
++
++                      constant.Type = RC_CONSTANT_EXTERNAL;
++                      constant.Size = 4;
++                      constant.u.External = i;
++
++                      rc_constants_add(&c->Program.Constants, &constant);
++              }
 +      }
 +}