prog_instruction.c revision 65cb74ecc0287d766493fd3649295e2e1b20099b
100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/* 200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Mesa 3-D graphics library 300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Version: 6.5.3 400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Copyright (C) 1999-2005 Brian Paul All Rights Reserved. 600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Permission is hereby granted, free of charge, to any person obtaining a 800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * copy of this software and associated documentation files (the "Software"), 900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * to deal in the Software without restriction, including without limitation 1000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * and/or sell copies of the Software, and to permit persons to whom the 1200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Software is furnished to do so, subject to the following conditions: 1300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 1400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * The above copyright notice and this permission notice shall be included 1500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * in all copies or substantial portions of the Software. 1600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * 1700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 2400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 2500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 26bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h" 27bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h" 28bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/mtypes.h" 2900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian#include "prog_instruction.h" 3000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 3200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 3300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Initialize program instruction fields to defaults. 3400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \param inst first instruction to initialize 3500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \param count number of instructions to initialize 3600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 3700cdc0a472c55330cbc58317f01b07f8f90be5a5Brianvoid 3800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_init_instructions(struct prog_instruction *inst, GLuint count) 3900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 4000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint i; 4100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_bzero(inst, count * sizeof(struct prog_instruction)); 4300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 4400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian for (i = 0; i < count; i++) { 4500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].SrcReg[0].File = PROGRAM_UNDEFINED; 4600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].SrcReg[0].Swizzle = SWIZZLE_NOOP; 4700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].SrcReg[1].File = PROGRAM_UNDEFINED; 4800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].SrcReg[1].Swizzle = SWIZZLE_NOOP; 4900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].SrcReg[2].File = PROGRAM_UNDEFINED; 5000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].SrcReg[2].Swizzle = SWIZZLE_NOOP; 5100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 5200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].DstReg.File = PROGRAM_UNDEFINED; 5300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].DstReg.WriteMask = WRITEMASK_XYZW; 5400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].DstReg.CondMask = COND_TR; 5500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].DstReg.CondSwizzle = SWIZZLE_NOOP; 5600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 5700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].SaturateMode = SATURATE_OFF; 5800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian inst[i].Precision = FLOAT32; 5900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian } 6000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 6100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 6200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 6300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 6400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Allocate an array of program instructions. 6500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \param numInst number of instructions 6600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \return pointer to instruction memory 6700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 6800cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstruct prog_instruction * 6900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_alloc_instructions(GLuint numInst) 7000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 7100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return (struct prog_instruction *) 7200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_calloc(numInst * sizeof(struct prog_instruction)); 7300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 7400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 7500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 7600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian/** 7700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * Reallocate memory storing an array of program instructions. 7800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * This is used when we need to append additional instructions onto an 7900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * program. 8000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \param oldInst pointer to first of old/src instructions 8100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \param numOldInst number of instructions at <oldInst> 8200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \param numNewInst desired size of new instruction array. 8300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian * \return pointer to start of new instruction array. 8400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian */ 8500cdc0a472c55330cbc58317f01b07f8f90be5a5Brianstruct prog_instruction * 8600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian_mesa_realloc_instructions(struct prog_instruction *oldInst, 8700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian GLuint numOldInst, GLuint numNewInst) 8800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian{ 8900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian struct prog_instruction *newInst; 9000cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 9100cdc0a472c55330cbc58317f01b07f8f90be5a5Brian newInst = (struct prog_instruction *) 9200cdc0a472c55330cbc58317f01b07f8f90be5a5Brian _mesa_realloc(oldInst, 9300cdc0a472c55330cbc58317f01b07f8f90be5a5Brian numOldInst * sizeof(struct prog_instruction), 9400cdc0a472c55330cbc58317f01b07f8f90be5a5Brian numNewInst * sizeof(struct prog_instruction)); 9500cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 9600cdc0a472c55330cbc58317f01b07f8f90be5a5Brian return newInst; 9700cdc0a472c55330cbc58317f01b07f8f90be5a5Brian} 9800cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 9900cdc0a472c55330cbc58317f01b07f8f90be5a5Brian 10023d31efc167f09d47635352f697ffcb087d3ebbdBrian/** 10123d31efc167f09d47635352f697ffcb087d3ebbdBrian * Copy an array of program instructions. 10223d31efc167f09d47635352f697ffcb087d3ebbdBrian * \param dest pointer to destination. 10323d31efc167f09d47635352f697ffcb087d3ebbdBrian * \param src pointer to source. 10423d31efc167f09d47635352f697ffcb087d3ebbdBrian * \param n number of instructions to copy. 10523d31efc167f09d47635352f697ffcb087d3ebbdBrian * \return pointer to destination. 10623d31efc167f09d47635352f697ffcb087d3ebbdBrian */ 10723d31efc167f09d47635352f697ffcb087d3ebbdBrianstruct prog_instruction * 10823d31efc167f09d47635352f697ffcb087d3ebbdBrian_mesa_copy_instructions(struct prog_instruction *dest, 10923d31efc167f09d47635352f697ffcb087d3ebbdBrian const struct prog_instruction *src, GLuint n) 11023d31efc167f09d47635352f697ffcb087d3ebbdBrian{ 1114cc2674aee98a4c2972f4f097a89b7b4a30df4abBrian GLuint i; 1124cc2674aee98a4c2972f4f097a89b7b4a30df4abBrian _mesa_memcpy(dest, src, n * sizeof(struct prog_instruction)); 1134cc2674aee98a4c2972f4f097a89b7b4a30df4abBrian for (i = 0; i < n; i++) { 1144cc2674aee98a4c2972f4f097a89b7b4a30df4abBrian if (src[i].Comment) 1154cc2674aee98a4c2972f4f097a89b7b4a30df4abBrian dest[i].Comment = _mesa_strdup(src[i].Comment); 1164cc2674aee98a4c2972f4f097a89b7b4a30df4abBrian } 1174cc2674aee98a4c2972f4f097a89b7b4a30df4abBrian return dest; 11823d31efc167f09d47635352f697ffcb087d3ebbdBrian} 11923d31efc167f09d47635352f697ffcb087d3ebbdBrian 120464b82b1e690b5ab690bd1673251e5b4edf69a62Brian 121464b82b1e690b5ab690bd1673251e5b4edf69a62Brian/** 122450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul * Free an array of instructions 123450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul */ 124450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paulvoid 125450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul_mesa_free_instructions(struct prog_instruction *inst, GLuint count) 126450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul{ 127450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul GLuint i; 128450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul for (i = 0; i < count; i++) { 129450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul if (inst[i].Data) 130450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul _mesa_free(inst[i].Data); 131450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul if (inst[i].Comment) 132450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul _mesa_free((char *) inst[i].Comment); 133450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul } 134450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul _mesa_free(inst); 135450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul} 136450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul 137450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul 138450136d368ce7a08cf25992c79b51f51f8a9bb7cBrian Paul/** 139464b82b1e690b5ab690bd1673251e5b4edf69a62Brian * Basic info about each instruction 140464b82b1e690b5ab690bd1673251e5b4edf69a62Brian */ 141464b82b1e690b5ab690bd1673251e5b4edf69a62Brianstruct instruction_info 142464b82b1e690b5ab690bd1673251e5b4edf69a62Brian{ 143464b82b1e690b5ab690bd1673251e5b4edf69a62Brian gl_inst_opcode Opcode; 144464b82b1e690b5ab690bd1673251e5b4edf69a62Brian const char *Name; 145464b82b1e690b5ab690bd1673251e5b4edf69a62Brian GLuint NumSrcRegs; 146bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul GLuint NumDstRegs; 147464b82b1e690b5ab690bd1673251e5b4edf69a62Brian}; 148464b82b1e690b5ab690bd1673251e5b4edf69a62Brian 149464b82b1e690b5ab690bd1673251e5b4edf69a62Brian/** 150464b82b1e690b5ab690bd1673251e5b4edf69a62Brian * Instruction info 151464b82b1e690b5ab690bd1673251e5b4edf69a62Brian * \note Opcode should equal array index! 152464b82b1e690b5ab690bd1673251e5b4edf69a62Brian */ 153464b82b1e690b5ab690bd1673251e5b4edf69a62Brianstatic const struct instruction_info InstInfo[MAX_OPCODE] = { 154bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_NOP, "NOP", 0, 0 }, 155bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_ABS, "ABS", 1, 1 }, 156bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_ADD, "ADD", 2, 1 }, 15737eef7b474c5d9a7c566f9edf35c797c5a98d065Brian Paul { OPCODE_AND, "AND", 2, 1 }, 158bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_ARA, "ARA", 1, 1 }, 159bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_ARL, "ARL", 1, 1 }, 160bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_ARL_NV, "ARL", 1, 1 }, 161bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_ARR, "ARL", 1, 1 }, 162bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_BGNLOOP,"BGNLOOP", 0, 0 }, 163bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_BGNSUB, "BGNSUB", 0, 0 }, 164bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_BRA, "BRA", 0, 0 }, 165bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_BRK, "BRK", 0, 0 }, 166bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_CAL, "CAL", 0, 0 }, 167bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_CMP, "CMP", 3, 1 }, 168bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_CONT, "CONT", 0, 0 }, 169bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_COS, "COS", 1, 1 }, 170bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_DDX, "DDX", 1, 1 }, 171bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_DDY, "DDY", 1, 1 }, 17265cb74ecc0287d766493fd3649295e2e1b20099bBrian Paul { OPCODE_DP2, "DP2", 2, 1 }, 17365cb74ecc0287d766493fd3649295e2e1b20099bBrian Paul { OPCODE_DP2A, "DP2A", 3, 1 }, 174bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_DP3, "DP3", 2, 1 }, 175bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_DP4, "DP4", 2, 1 }, 176bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_DPH, "DPH", 2, 1 }, 177bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_DST, "DST", 2, 1 }, 178bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_ELSE, "ELSE", 0, 0 }, 179bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_END, "END", 0, 0 }, 180bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_ENDIF, "ENDIF", 0, 0 }, 181bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_ENDLOOP,"ENDLOOP", 0, 0 }, 182bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_ENDSUB, "ENDSUB", 0, 0 }, 183bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_EX2, "EX2", 1, 1 }, 184bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_EXP, "EXP", 1, 1 }, 185bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_FLR, "FLR", 1, 1 }, 186bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_FRC, "FRC", 1, 1 }, 187bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_IF, "IF", 1, 0 }, 188bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_KIL, "KIL", 1, 0 }, 189bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_KIL_NV, "KIL", 0, 0 }, 190bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_LG2, "LG2", 1, 1 }, 191bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_LIT, "LIT", 1, 1 }, 192bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_LOG, "LOG", 1, 1 }, 193bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_LRP, "LRP", 3, 1 }, 194bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_MAD, "MAD", 3, 1 }, 195bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_MAX, "MAX", 2, 1 }, 196bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_MIN, "MIN", 2, 1 }, 197bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_MOV, "MOV", 1, 1 }, 198bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_MUL, "MUL", 2, 1 }, 19937eef7b474c5d9a7c566f9edf35c797c5a98d065Brian Paul { OPCODE_NOT, "NOT", 1, 1 }, 200bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_NOISE1, "NOISE1", 1, 1 }, 201bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_NOISE2, "NOISE2", 1, 1 }, 202bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_NOISE3, "NOISE3", 1, 1 }, 203bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_NOISE4, "NOISE4", 1, 1 }, 20437eef7b474c5d9a7c566f9edf35c797c5a98d065Brian Paul { OPCODE_OR, "OR", 2, 1 }, 205f6ead50827c03017e6b730313c361b39190da92fBrian Paul { OPCODE_NRM3, "NRM3", 1, 1 }, 206f6ead50827c03017e6b730313c361b39190da92fBrian Paul { OPCODE_NRM4, "NRM4", 1, 1 }, 207bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_PK2H, "PK2H", 1, 1 }, 208bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_PK2US, "PK2US", 1, 1 }, 209bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_PK4B, "PK4B", 1, 1 }, 210bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_PK4UB, "PK4UB", 1, 1 }, 211bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_POW, "POW", 2, 1 }, 212bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_POPA, "POPA", 0, 0 }, 213bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_PRINT, "PRINT", 1, 0 }, 214bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_PUSHA, "PUSHA", 0, 0 }, 215bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_RCC, "RCC", 1, 1 }, 216bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_RCP, "RCP", 1, 1 }, 217bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_RET, "RET", 0, 0 }, 218bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_RFL, "RFL", 1, 1 }, 219bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_RSQ, "RSQ", 1, 1 }, 220bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SCS, "SCS", 1, 1 }, 221bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SEQ, "SEQ", 2, 1 }, 222bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SFL, "SFL", 0, 1 }, 223bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SGE, "SGE", 2, 1 }, 224bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SGT, "SGT", 2, 1 }, 225bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SIN, "SIN", 1, 1 }, 226bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SLE, "SLE", 2, 1 }, 227bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SLT, "SLT", 2, 1 }, 228bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SNE, "SNE", 2, 1 }, 229bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SSG, "SSG", 1, 1 }, 230bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_STR, "STR", 0, 1 }, 231bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SUB, "SUB", 2, 1 }, 232bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_SWZ, "SWZ", 1, 1 }, 233bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_TEX, "TEX", 1, 1 }, 234bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_TXB, "TXB", 1, 1 }, 235bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_TXD, "TXD", 3, 1 }, 236bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_TXL, "TXL", 1, 1 }, 237bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_TXP, "TXP", 1, 1 }, 238bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_TXP_NV, "TXP", 1, 1 }, 239035c0cf71a5fe3beee55654e1f7148adfe626cc0Brian Paul { OPCODE_TRUNC, "TRUNC", 1, 1 }, 240bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_UP2H, "UP2H", 1, 1 }, 241bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_UP2US, "UP2US", 1, 1 }, 242bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_UP4B, "UP4B", 1, 1 }, 243bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_UP4UB, "UP4UB", 1, 1 }, 244bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_X2D, "X2D", 3, 1 }, 24537eef7b474c5d9a7c566f9edf35c797c5a98d065Brian Paul { OPCODE_XOR, "XOR", 2, 1 }, 246bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul { OPCODE_XPD, "XPD", 2, 1 } 247464b82b1e690b5ab690bd1673251e5b4edf69a62Brian}; 248464b82b1e690b5ab690bd1673251e5b4edf69a62Brian 249464b82b1e690b5ab690bd1673251e5b4edf69a62Brian 250464b82b1e690b5ab690bd1673251e5b4edf69a62Brian/** 251464b82b1e690b5ab690bd1673251e5b4edf69a62Brian * Return the number of src registers for the given instruction/opcode. 252464b82b1e690b5ab690bd1673251e5b4edf69a62Brian */ 253464b82b1e690b5ab690bd1673251e5b4edf69a62BrianGLuint 254464b82b1e690b5ab690bd1673251e5b4edf69a62Brian_mesa_num_inst_src_regs(gl_inst_opcode opcode) 255464b82b1e690b5ab690bd1673251e5b4edf69a62Brian{ 256464b82b1e690b5ab690bd1673251e5b4edf69a62Brian ASSERT(opcode == InstInfo[opcode].Opcode); 257464b82b1e690b5ab690bd1673251e5b4edf69a62Brian ASSERT(OPCODE_XPD == InstInfo[OPCODE_XPD].Opcode); 258464b82b1e690b5ab690bd1673251e5b4edf69a62Brian return InstInfo[opcode].NumSrcRegs; 259464b82b1e690b5ab690bd1673251e5b4edf69a62Brian} 260464b82b1e690b5ab690bd1673251e5b4edf69a62Brian 261464b82b1e690b5ab690bd1673251e5b4edf69a62Brian 262464b82b1e690b5ab690bd1673251e5b4edf69a62Brian/** 263bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul * Return the number of dst registers for the given instruction/opcode. 264bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul */ 265bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian PaulGLuint 266bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul_mesa_num_inst_dst_regs(gl_inst_opcode opcode) 267bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul{ 268bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul ASSERT(opcode == InstInfo[opcode].Opcode); 269bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul ASSERT(OPCODE_XPD == InstInfo[OPCODE_XPD].Opcode); 270bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul return InstInfo[opcode].NumDstRegs; 271bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul} 272bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul 273bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul 274bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian PaulGLboolean 275bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul_mesa_is_tex_instruction(gl_inst_opcode opcode) 276bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul{ 277bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul return (opcode == OPCODE_TEX || 278bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul opcode == OPCODE_TXB || 279bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul opcode == OPCODE_TXD || 280bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul opcode == OPCODE_TXL || 281bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul opcode == OPCODE_TXP); 282bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul} 283bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul 284bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul 285bff695b926249ead1944eef2aa05b2e0eaf9ba7fBrian Paul/** 286464b82b1e690b5ab690bd1673251e5b4edf69a62Brian * Return string name for given program opcode. 287464b82b1e690b5ab690bd1673251e5b4edf69a62Brian */ 288464b82b1e690b5ab690bd1673251e5b4edf69a62Brianconst char * 289464b82b1e690b5ab690bd1673251e5b4edf69a62Brian_mesa_opcode_string(gl_inst_opcode opcode) 290464b82b1e690b5ab690bd1673251e5b4edf69a62Brian{ 291464b82b1e690b5ab690bd1673251e5b4edf69a62Brian ASSERT(opcode < MAX_OPCODE); 292464b82b1e690b5ab690bd1673251e5b4edf69a62Brian return InstInfo[opcode].Name; 293464b82b1e690b5ab690bd1673251e5b4edf69a62Brian} 294464b82b1e690b5ab690bd1673251e5b4edf69a62Brian 295