1770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%{
2770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/*
3770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Copyright © 2009 Intel Corporation
4770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
5770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
6770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * copy of this software and associated documentation files (the "Software"),
7770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * to deal in the Software without restriction, including without limitation
8770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
10770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software is furnished to do so, subject to the following conditions:
11770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
12770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * The above copyright notice and this permission notice (including the next
13770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * paragraph) shall be included in all copies or substantial portions of the
14770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Software.
15770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
16770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * DEALINGS IN THE SOFTWARE.
23770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
24770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include <stdio.h>
25770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include <stdlib.h>
26770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include <string.h>
27770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
28770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "main/mtypes.h"
29ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick#include "main/imports.h"
30ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/program.h"
31ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_parameter.h"
32ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_parameter_layout.h"
33ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_statevars.h"
34ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_instruction.h"
35770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
36ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/symbol_table.h"
37ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/program_parser.h"
38770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
39770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern void *yy_scan_string(char *);
40770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern void yy_delete_buffer(void *);
41770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
42770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic struct asm_symbol *declare_variable(struct asm_parser_state *state,
43770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    char *name, enum asm_type t, struct YYLTYPE *locp);
44770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
45ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanickstatic int add_state_reference(struct gl_program_parameter_list *param_list,
46ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick    const gl_state_index tokens[STATE_LENGTH]);
47ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick
48770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int initialize_symbol_from_state(struct gl_program *prog,
49770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct asm_symbol *param_var, const gl_state_index tokens[STATE_LENGTH]);
50770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
51770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int initialize_symbol_from_param(struct gl_program *prog,
52770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct asm_symbol *param_var, const gl_state_index tokens[STATE_LENGTH]);
53770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
54770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int initialize_symbol_from_const(struct gl_program *prog,
557c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul    struct asm_symbol *param_var, const struct asm_vector *vec,
567c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul    GLboolean allowSwizzle);
57770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
58770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int yyparse(struct asm_parser_state *state);
59770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
60ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanickstatic char *make_error_string(const char *fmt, ...);
61ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick
62770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void yyerror(struct YYLTYPE *locp, struct asm_parser_state *state,
63770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    const char *s);
64770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
65770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic int validate_inputs(struct YYLTYPE *locp,
66770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    struct asm_parser_state *state);
67770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
68770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void init_dst_reg(struct prog_dst_register *r);
69770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
70df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulstatic void set_dst_reg(struct prog_dst_register *r,
71df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul                        gl_register_file file, GLint index);
72df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul
73770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic void init_src_reg(struct asm_src_register *r);
74770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
75df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulstatic void set_src_reg(struct asm_src_register *r,
76df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul                        gl_register_file file, GLint index);
77df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul
78639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paulstatic void set_src_reg_swz(struct asm_src_register *r,
79639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul                            gl_register_file file, GLint index, GLuint swizzle);
80639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul
819ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickstatic void asm_instruction_set_operands(struct asm_instruction *inst,
829ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick    const struct prog_dst_register *dst, const struct asm_src_register *src0,
839ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick    const struct asm_src_register *src1, const struct asm_src_register *src2);
849ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
85770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic struct asm_instruction *asm_instruction_ctor(gl_inst_opcode op,
86770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    const struct prog_dst_register *dst, const struct asm_src_register *src0,
87770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    const struct asm_src_register *src1, const struct asm_src_register *src2);
88770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
899ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickstatic struct asm_instruction *asm_instruction_copy_ctor(
909ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick    const struct prog_instruction *base, const struct prog_dst_register *dst,
919ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick    const struct asm_src_register *src0, const struct asm_src_register *src1,
929ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick    const struct asm_src_register *src2);
939ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
94770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#ifndef FALSE
95770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define FALSE 0
96770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define TRUE (!FALSE)
97770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#endif
98770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
99770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YYLLOC_DEFAULT(Current, Rhs, N)					\
100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   do {									\
101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (YYID(N)) {							\
102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).first_line = YYRHSLOC(Rhs, 1).first_line;		\
103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).first_column = YYRHSLOC(Rhs, 1).first_column;	\
104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).position = YYRHSLOC(Rhs, 1).position;		\
105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).last_line = YYRHSLOC(Rhs, N).last_line;		\
106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).last_column = YYRHSLOC(Rhs, N).last_column;		\
107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      } else {								\
108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).first_line = YYRHSLOC(Rhs, 0).last_line;		\
109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).last_line = (Current).first_line;			\
110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).first_column = YYRHSLOC(Rhs, 0).last_column;		\
111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).last_column = (Current).first_column;		\
112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 (Current).position = YYRHSLOC(Rhs, 0).position			\
113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    + (Current).first_column;					\
114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }									\
115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   } while(YYID(0))
116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YYLEX_PARAM state->scanner
118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%}
119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%pure-parser
121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%locations
122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%parse-param { struct asm_parser_state *state }
123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%error-verbose
124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%lex-param { void *scanner }
125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%union {
127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_instruction *inst;
128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_symbol *sym;
129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_symbol temp_sym;
130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_swizzle_mask swiz_mask;
131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_src_register src_reg;
132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct prog_dst_register dst_reg;
133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct prog_instruction temp_inst;
134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   char *string;
135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   unsigned result;
136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   unsigned attrib;
137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int integer;
138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   float real;
139592a6642fc5c9f697bcc6521c99fe00b2de827c8Brian Paul   gl_state_index state[STATE_LENGTH];
140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int negate;
141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_vector vector;
142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   gl_inst_opcode opcode;
143565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
144565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   struct {
145565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      unsigned swz;
146565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      unsigned rgba_valid:1;
147565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      unsigned xyzw_valid:1;
148565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick      unsigned negate:1;
149565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick   } ext_swizzle;
150770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token ARBvp_10 ARBfp_10
153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/* Tokens for assembler pseudo-ops */
155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> ADDRESS
156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token ALIAS ATTRIB
157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token OPTION OUTPUT
158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token PARAM
159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> TEMP
160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token END
161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick /* Tokens for instructions */
163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <temp_inst> BIN_OP BINSC_OP SAMPLE_OP SCALAR_OP TRI_OP VECTOR_OP
164ede0cd4d8c8eb8c6c443c84905138091944d69afIan Romanick%token <temp_inst> ARL KIL SWZ TXD_OP
165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <integer> INTEGER
167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <real> REAL
168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token AMBIENT ATTENUATION
170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token BACK
171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token CLIP COLOR
172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DEPTH DIFFUSE DIRECTION
173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token EMISSION ENV EYE
174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token FOG FOGCOORD FRAGMENT FRONT
175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token HALF
176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token INVERSE INVTRANS
177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token LIGHT LIGHTMODEL LIGHTPROD LOCAL
178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token MATERIAL MAT_PROGRAM MATRIX MATRIXINDEX MODELVIEW MVP
179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token NORMAL
180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token OBJECT
1813fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian Paul%token PALETTE PARAMS PLANE POINT_TOK POINTSIZE POSITION PRIMARY PROGRAM PROJECTION
182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token RANGE RESULT ROW
1833fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian Paul%token SCENECOLOR SECONDARY SHININESS SIZE_TOK SPECULAR SPOT STATE
184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token TEXCOORD TEXENV TEXGEN TEXGEN_Q TEXGEN_R TEXGEN_S TEXGEN_T TEXTURE TRANSPOSE
185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token TEXTURE_UNIT TEX_1D TEX_2D TEX_3D TEX_CUBE TEX_RECT
1861edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick%token TEX_SHADOW1D TEX_SHADOW2D TEX_SHADOWRECT
187aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick%token TEX_ARRAY1D TEX_ARRAY2D TEX_ARRAYSHADOW1D TEX_ARRAYSHADOW2D
188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token VERTEX VTXATTRIB
189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token WEIGHT
190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1910e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick%token <string> IDENTIFIER USED_IDENTIFIER
1920e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick%type <string> string
193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token <swiz_mask> MASK4 MASK3 MASK2 MASK1 SWIZZLE
194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DOT_DOT
195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%token DOT
196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> instruction ALU_instruction TexInstruction
198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> ARL_instruction VECTORop_instruction
199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> SCALARop_instruction BINSCop_instruction BINop_instruction
2008ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick%type <inst> TRIop_instruction TXD_instruction SWZ_instruction SAMPLE_instruction
201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <inst> KIL_instruction
202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <dst_reg> dstReg maskedDstReg maskedAddrReg
204eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick%type <src_reg> srcReg scalarUse scalarSrcReg swizzleSrcReg
205565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick%type <swiz_mask> scalarSuffix swizzleSuffix extendedSwizzle
206565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick%type <ext_swizzle> extSwizComp extSwizSel
207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> optionalMask
208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <sym> progParamArray
210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> addrRegRelOffset addrRegPosOffset addrRegNegOffset
211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <src_reg> progParamArrayMem progParamArrayAbs progParamArrayRel
212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <sym> addrReg
213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <swiz_mask> addrComponent addrWriteMask
214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
21581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick%type <dst_reg> ccMaskRule ccTest ccMaskRule2 ccTest2 optionalCcMask
21681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <result> resultBinding resultColBinding
218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optFaceType optColorType
219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optResultFaceType optResultColorType
220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optTexImageUnitNum texImageUnitNum
222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optTexCoordUnitNum texCoordUnitNum
223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optLegacyTexUnitNum legacyTexUnitNum
224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> texImageUnit texTarget
225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> vtxAttribNum
226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <attrib> attribBinding vtxAttribItem fragAttribItem
228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramSingleInit paramSingleItemDecl
230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> optArraySize
231770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateSingleItem stateMultipleItem
233770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMaterialItem
234770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateLightItem stateLightModelItem stateLightProdItem
235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateTexGenItem stateFogItem stateClipPlaneItem statePointItem
236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMatrixItem stateMatrixRow stateMatrixRows
237333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick%type <state> stateTexEnvItem stateDepthItem
238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateLModProperty
240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> stateMatrixName optMatrixRows
241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateMatProperty
243770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateLightProperty stateSpotProperty
244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateLightNumber stateLProdProperty
245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateTexGenType stateTexGenCoord
246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateTexEnvProperty
247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateFogProperty
248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateClipPlaneNum
249770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> statePointProperty
250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateOptMatModifier stateMatModifier stateMatrixRowNum
252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateOptModMatNum stateModMatNum statePaletteMatNum
253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> stateProgramMatNum
254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> ambDiffSpecProperty
256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> programSingleItem progEnvParam progLocalParam
258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> programMultipleItem progEnvParams progLocalParams
259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramMultipleInit paramMultInitList paramMultipleItem
261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <temp_sym> paramSingleItemUse
262770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <integer> progEnvParamNum progLocalParamNum
264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <state> progEnvParamNums progLocalParamNums
265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <vector> paramConstDecl paramConstUse
267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <vector> paramConstScalarDecl paramConstScalarUse paramConstVector
268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <real> signedFloatConstant
269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%type <negate> optionalSign
270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%{
272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickextern int yylex(YYSTYPE *yylval_param, YYLTYPE *yylloc_param,
273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    void *yyscanner);
274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%}
275770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%%
277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickprogram: language optionSequence statementSequence END
279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanicklanguage: ARBvp_10
282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->prog->Target != GL_VERTEX_PROGRAM_ARB) {
284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid fragment program header");
285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   state->mode = ARB_vertex;
288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ARBfp_10
290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->prog->Target != GL_FRAGMENT_PROGRAM_ARB) {
292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid vertex program header");
293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   state->mode = ARB_fragment;
29588018e2e073909ae807f16707f2701e068900926Ian Romanick
29688018e2e073909ae807f16707f2701e068900926Ian Romanick	   state->option.TexRect =
29788018e2e073909ae807f16707f2701e068900926Ian Romanick	      (state->ctx->Extensions.NV_texture_rectangle != GL_FALSE);
298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
301770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionSequence: optionSequence option
302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	|
303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
3050e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanickoption: OPTION string ';'
306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   int valid = 0;
308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      valid = _mesa_ARBvp_parse_option(state, $2);
311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if (state->mode == ARB_fragment) {
312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      valid = _mesa_ARBfp_parse_option(state, $2);
313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
316301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	   free($2);
317301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick
318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (!valid) {
31941d5696628a5eef62cd671711b33edea9344977dIan Romanick	      const char *const err_str = (state->mode == ARB_vertex)
32041d5696628a5eef62cd671711b33edea9344977dIan Romanick		 ? "invalid ARB vertex program option"
32141d5696628a5eef62cd671711b33edea9344977dIan Romanick		 : "invalid ARB fragment program option";
32241d5696628a5eef62cd671711b33edea9344977dIan Romanick
32341d5696628a5eef62cd671711b33edea9344977dIan Romanick	      yyerror(& @2, state, err_str);
324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
329770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatementSequence: statementSequence statement
330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	|
331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatement: instruction ';'
334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1 != NULL) {
336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      if (state->inst_tail == NULL) {
337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 state->inst_head = $1;
338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      } else {
339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 state->inst_tail->next = $1;
340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      }
341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      state->inst_tail = $1;
343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $1->next = NULL;
344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      state->prog->NumInstructions++;
346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| namingStatement ';'
349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinstruction: ALU_instruction
3520db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	{
3530db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	   $$ = $1;
3540db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	   state->prog->NumAluInstructions++;
3550db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	}
356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TexInstruction
3570db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	{
3580db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	   $$ = $1;
3590db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	   state->prog->NumTexInstructions++;
3600db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	}
361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
363770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickALU_instruction: ARL_instruction
364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| VECTORop_instruction
365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SCALARop_instruction
366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| BINSCop_instruction
367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| BINop_instruction
368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TRIop_instruction
369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SWZ_instruction
370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
372770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTexInstruction: SAMPLE_instruction
373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| KIL_instruction
3748ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	| TXD_instruction
375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
377770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickARL_instruction: ARL maskedAddrReg ',' scalarSrcReg
378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor(OPCODE_ARL, & $2, & $4, NULL, NULL);
380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
383770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickVECTORop_instruction: VECTOR_OP maskedDstReg ',' swizzleSrcReg
384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
385a0f7b869592013b24a5bacf0ceb2bdb1e9146378Paul Berry	   if ($1.Opcode == OPCODE_DDY)
386a0f7b869592013b24a5bacf0ceb2bdb1e9146378Paul Berry	      state->fragment.UsesDFdy = 1;
3879ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick	   $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL);
388770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
391770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSCALARop_instruction: SCALAR_OP maskedDstReg ',' scalarSrcReg
392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
3939ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick	   $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL);
394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
397770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickBINSCop_instruction: BINSC_OP maskedDstReg ',' scalarSrcReg ',' scalarSrcReg
398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
3999ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick	   $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, NULL);
400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
404770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickBINop_instruction: BIN_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg
405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
4069ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick	   $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, NULL);
407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
410770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTRIop_instruction: TRI_OP maskedDstReg ','
411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick                   swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg
412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
4139ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick	   $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, & $8);
414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
415770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
417770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSAMPLE_instruction: SAMPLE_OP maskedDstReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget
418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
4199ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick	   $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL);
420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($$ != NULL) {
4211edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      const GLbitfield tex_mask = (1U << $6);
4221edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      GLbitfield shadow_tex = 0;
4231edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      GLbitfield target_mask = 0;
4241edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4251edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$->Base.TexSrcUnit = $6;
4270db5ef074169589bc4d665094147aa284a5496d7Ian Romanick
4281edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      if ($8 < 0) {
4291edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 shadow_tex = tex_mask;
4301edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4311edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 $$->Base.TexSrcTarget = -$8;
4321edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 $$->Base.TexShadow = 1;
4331edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      } else {
4341edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 $$->Base.TexSrcTarget = $8;
4351edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      }
4361edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4371edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      target_mask = (1U << $$->Base.TexSrcTarget);
4381edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4391edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      /* If this texture unit was previously accessed and that access
4401edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	       * had a different texture target, generate an error.
4411edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	       *
4421edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	       * If this texture unit was previously accessed and that access
4431edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	       * had a different shadow mode, generate an error.
4441edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	       */
4451edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      if ((state->prog->TexturesUsed[$6] != 0)
4461edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		  && ((state->prog->TexturesUsed[$6] != target_mask)
4471edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		      || ((state->prog->ShadowSamplers & tex_mask)
4481edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick			  != shadow_tex))) {
4491edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 yyerror(& @8, state,
4501edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick			 "multiple targets used on one texture image unit");
4511edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick		 YYERROR;
4521edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      }
4531edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4541edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick
4551edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      state->prog->TexturesUsed[$6] |= target_mask;
4561edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	      state->prog->ShadowSamplers |= shadow_tex;
457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
461770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickKIL_instruction: KIL swizzleSrcReg
462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = asm_instruction_ctor(OPCODE_KIL, NULL, & $2, NULL, NULL);
4640db5ef074169589bc4d665094147aa284a5496d7Ian Romanick	   state->fragment.UsesKill = 1;
465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
46681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	| KIL ccTest
46781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	{
46881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$ = asm_instruction_ctor(OPCODE_KIL_NV, NULL, NULL, NULL, NULL);
46981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$->Base.DstReg.CondMask = $2.CondMask;
47081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$->Base.DstReg.CondSwizzle = $2.CondSwizzle;
47181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$->Base.DstReg.CondSrc = $2.CondSrc;
47281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   state->fragment.UsesKill = 1;
47381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	}
474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
4768ca6fd8a83412e3a76746f0ee61027b796516f95Ian RomanickTXD_instruction: TXD_OP maskedDstReg ',' swizzleSrcReg ',' swizzleSrcReg ',' swizzleSrcReg ',' texImageUnit ',' texTarget
4778ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	{
4789ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick	   $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, & $6, & $8);
4798ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	   if ($$ != NULL) {
4808ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      const GLbitfield tex_mask = (1U << $10);
4818ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      GLbitfield shadow_tex = 0;
4828ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      GLbitfield target_mask = 0;
4838ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4848ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4858ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      $$->Base.TexSrcUnit = $10;
4868ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4878ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      if ($12 < 0) {
4888ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 shadow_tex = tex_mask;
4898ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4908ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 $$->Base.TexSrcTarget = -$12;
4918ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 $$->Base.TexShadow = 1;
4928ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      } else {
4938ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 $$->Base.TexSrcTarget = $12;
4948ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      }
4958ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4968ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      target_mask = (1U << $$->Base.TexSrcTarget);
4978ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
4988ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      /* If this texture unit was previously accessed and that access
4998ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	       * had a different texture target, generate an error.
5008ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	       *
5018ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	       * If this texture unit was previously accessed and that access
5028ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	       * had a different shadow mode, generate an error.
5038ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	       */
5048ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      if ((state->prog->TexturesUsed[$10] != 0)
5058ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		  && ((state->prog->TexturesUsed[$10] != target_mask)
5068ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		      || ((state->prog->ShadowSamplers & tex_mask)
5078ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick			  != shadow_tex))) {
5088ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 yyerror(& @12, state,
5098ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick			 "multiple targets used on one texture image unit");
5108ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick		 YYERROR;
5118ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      }
5128ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
5138ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick
5148ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      state->prog->TexturesUsed[$10] |= target_mask;
5158ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	      state->prog->ShadowSamplers |= shadow_tex;
5168ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	   }
5178ca6fd8a83412e3a76746f0ee61027b796516f95Ian Romanick	}
518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
520770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexImageUnit: TEXTURE_UNIT optTexImageUnitNum
521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
526770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexTarget: TEX_1D  { $$ = TEXTURE_1D_INDEX; }
527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEX_2D   { $$ = TEXTURE_2D_INDEX; }
528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEX_3D   { $$ = TEXTURE_3D_INDEX; }
529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEX_CUBE { $$ = TEXTURE_CUBE_INDEX; }
530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEX_RECT { $$ = TEXTURE_RECT_INDEX; }
5311edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	| TEX_SHADOW1D   { $$ = -TEXTURE_1D_INDEX; }
5321edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	| TEX_SHADOW2D   { $$ = -TEXTURE_2D_INDEX; }
5331edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick	| TEX_SHADOWRECT { $$ = -TEXTURE_RECT_INDEX; }
534aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick	| TEX_ARRAY1D         { $$ = TEXTURE_1D_ARRAY_INDEX; }
535aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick	| TEX_ARRAY2D         { $$ = TEXTURE_2D_ARRAY_INDEX; }
536aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick	| TEX_ARRAYSHADOW1D   { $$ = -TEXTURE_1D_ARRAY_INDEX; }
537aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick	| TEX_ARRAYSHADOW2D   { $$ = -TEXTURE_2D_ARRAY_INDEX; }
538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
540770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickSWZ_instruction: SWZ maskedDstReg ',' srcReg ',' extendedSwizzle
541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* FIXME: Is this correct?  Should the extenedSwizzle be applied
543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * FIXME: to the existing swizzle?
544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $4.Base.Swizzle = $6.swizzle;
546648dac4251de69d2949026af3dec0b0befee734bIan Romanick	   $4.Base.Negate = $6.mask;
547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
5489ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick	   $$ = asm_instruction_copy_ctor(& $1, & $2, & $4, NULL, NULL);
549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
552eeb1402c0514248773e66f2077b0fb52f7245d56Ian RomanickscalarSrcReg: optionalSign scalarUse
553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1) {
557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.Negate = ~$$.Base.Negate;
558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
559eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	}
560eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	| optionalSign '|' scalarUse '|'
561eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	{
562eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   $$ = $3;
563eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
564eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   if (!state->option.NV_fragment) {
565eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	      yyerror(& @2, state, "unexpected character '|'");
566eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	      YYERROR;
567eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   }
568eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
569eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   if ($1) {
570eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	      $$.Base.Negate = ~$$.Base.Negate;
571eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   }
572eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
573eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   $$.Base.Abs = 1;
574eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	}
575eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	;
576eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
577eeb1402c0514248773e66f2077b0fb52f7245d56Ian RomanickscalarUse:  srcReg scalarSuffix
578eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	{
579eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   $$ = $1;
580770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle,
582eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick						    $2.swizzle);
583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
584eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	| paramConstScalarUse
585b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick	{
586b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick	   struct asm_symbol temp_sym;
587b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick
588b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick	   if (!state->option.NV_fragment) {
589eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	      yyerror(& @1, state, "expected scalar suffix");
590b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick	      YYERROR;
591b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick	   }
592b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick
593b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick	   memset(& temp_sym, 0, sizeof(temp_sym));
594b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick	   temp_sym.param_binding_begin = ~0;
5957c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul	   initialize_symbol_from_const(state->prog, & temp_sym, & $1, GL_TRUE);
596b8e389bb0315287b72087b93a089ab944d77ab80Ian Romanick
597639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul	   set_src_reg_swz(& $$, PROGRAM_CONSTANT,
598639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul                           temp_sym.param_binding_begin,
599639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul                           temp_sym.param_binding_swizzle);
600770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
601770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
602770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
603770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickswizzleSrcReg: optionalSign srcReg swizzleSuffix
604770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
605770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
606770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
607770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1) {
608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.Negate = ~$$.Base.Negate;
609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
611770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle,
612770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick						    $3.swizzle);
613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
614eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	| optionalSign '|' srcReg swizzleSuffix '|'
615eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	{
616eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   $$ = $3;
617eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
618eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   if (!state->option.NV_fragment) {
619eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	      yyerror(& @2, state, "unexpected character '|'");
620eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	      YYERROR;
621eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   }
622eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
623eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   if ($1) {
624eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	      $$.Base.Negate = ~$$.Base.Negate;
625eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   }
626eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
627eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   $$.Base.Abs = 1;
628eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	   $$.Base.Swizzle = _mesa_combine_swizzles($$.Base.Swizzle,
629eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick						    $4.swizzle);
630eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick	}
631eeb1402c0514248773e66f2077b0fb52f7245d56Ian Romanick
632770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
63481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickmaskedDstReg: dstReg optionalMask optionalCcMask
635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
636770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.WriteMask = $2.mask;
63881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondMask = $3.CondMask;
63981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondSwizzle = $3.CondSwizzle;
64081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondSrc = $3.CondSrc;
641770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($$.File == PROGRAM_OUTPUT) {
643770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      /* Technically speaking, this should check that it is in
644770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       * vertex program mode.  However, PositionInvariant can never be
645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       * set in fragment program mode, so it is somewhat irrelevant.
646770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       */
647770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      if (state->option.PositionInvariant
648770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	       && ($$.Index == VERT_RESULT_HPOS)) {
649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 yyerror(& @1, state, "position-invariant programs cannot "
650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			 "write position");
651770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 YYERROR;
652770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      }
653770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
6545606dfb572bf4b89b4882265924705bacc8c182bIan Romanick	      state->prog->OutputsWritten |= BITFIELD64_BIT($$.Index);
655770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
656770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
658770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
659770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickmaskedAddrReg: addrReg addrWriteMask
660770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
661df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	   set_dst_reg(& $$, PROGRAM_ADDRESS, 0);
662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.WriteMask = $2.mask;
663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
665770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
666770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextendedSwizzle: extSwizComp ',' extSwizComp ',' extSwizComp ',' extSwizComp
667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
668565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   const unsigned xyzw_valid =
669565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      ($1.xyzw_valid << 0)
670565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($3.xyzw_valid << 1)
671565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($5.xyzw_valid << 2)
672565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($7.xyzw_valid << 3);
673565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   const unsigned rgba_valid =
674565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      ($1.rgba_valid << 0)
675565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($3.rgba_valid << 1)
676565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($5.rgba_valid << 2)
677565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($7.rgba_valid << 3);
678565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
679565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   /* All of the swizzle components have to be valid in either RGBA
680565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * or XYZW.  Note that 0 and 1 are valid in both, so both masks
681565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * can have some bits set.
682565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    *
683565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * We somewhat deviate from the spec here.  It would be really hard
684565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * to figure out which component is the error, and there probably
685565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * isn't a lot of benefit.
686565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    */
687565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   if ((rgba_valid != 0x0f) && (xyzw_valid != 0x0f)) {
688565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      yyerror(& @1, state, "cannot combine RGBA and XYZW swizzle "
689565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick		      "components");
690565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      YYERROR;
691565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   }
692565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
693565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.swizzle = MAKE_SWIZZLE4($1.swz, $3.swz, $5.swz, $7.swz);
694565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.mask = ($1.negate) | ($3.negate << 1) | ($5.negate << 2)
695565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      | ($7.negate << 3);
696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
699770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextSwizComp: optionalSign extSwizSel
700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
701565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$ = $2;
702565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.negate = ($1) ? 1 : 0;
703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
705770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
706770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickextSwizSel: INTEGER
707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (($1 != 0) && ($1 != 1)) {
709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid extended swizzle selector");
710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
713565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.swz = ($1 == 0) ? SWIZZLE_ZERO : SWIZZLE_ONE;
714565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
715565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   /* 0 and 1 are valid for both RGBA swizzle names and XYZW
716565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    * swizzle names.
717565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	    */
718565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.xyzw_valid = 1;
719565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   $$.rgba_valid = 1;
720770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
7210e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick	| string
722770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
723301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	   char s;
724301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick
725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (strlen($1) > 1) {
726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid extended swizzle selector");
727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
730301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	   s = $1[0];
731301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	   free($1);
732301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick
733301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	   switch (s) {
734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case 'x':
735565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_X;
736565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.xyzw_valid = 1;
737770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
738770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case 'y':
739565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_Y;
740565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.xyzw_valid = 1;
741770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
742770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case 'z':
743565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_Z;
744565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.xyzw_valid = 1;
745770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
746770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case 'w':
747565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_W;
748565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.xyzw_valid = 1;
749565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      break;
750565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
751565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   case 'r':
752565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_X;
753565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.rgba_valid = 1;
754565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      break;
755565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   case 'g':
756565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_Y;
757565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.rgba_valid = 1;
758770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
759565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   case 'b':
760565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_Z;
761565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.rgba_valid = 1;
762565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      break;
763565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	   case 'a':
764565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.swz = SWIZZLE_W;
765565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      $$.rgba_valid = 1;
766565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick	      break;
767565a2a8f38f1407e2122b2dbfa4a0bc5bb881dd3Ian Romanick
768770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   default:
769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid extended swizzle selector");
770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
774770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
7760e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanicksrcReg: USED_IDENTIFIER /* temporaryReg | progParamSingle */
777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
778770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s = (struct asm_symbol *)
779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $1);
780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
781301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	   free($1);
782301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick
783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid operand variable");
785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if ((s->type != at_param) && (s->type != at_temp)
787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      && (s->type != at_attrib)) {
788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid operand variable");
789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
790770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if ((s->type == at_param) && s->param_is_array) {
791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "non-array access to array PARAM");
792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
795770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_src_reg(& $$);
796770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   switch (s->type) {
797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case at_temp:
798df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	      set_src_reg(& $$, PROGRAM_TEMPORARY, s->temp_binding);
799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
800770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case at_param:
801639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul              set_src_reg_swz(& $$, s->param_binding_type,
802639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul                              s->param_binding_begin,
803639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul                              s->param_binding_swizzle);
804770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   case at_attrib:
806df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	      set_src_reg(& $$, PROGRAM_INPUT, s->attrib_binding);
807dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich	      state->prog->InputsRead |= BITFIELD64_BIT($$.Base.Index);
8088a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick
8098a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick	      if (!validate_inputs(& @1, state)) {
8108a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick		 YYERROR;
8118a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick	      }
8128a430dd4dad8520a7a37573e03d85cfb6316cb56Ian Romanick	      break;
813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   default:
815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      break;
817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| attribBinding
820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
821df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	   set_src_reg(& $$, PROGRAM_INPUT, $1);
822dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich	   state->prog->InputsRead |= BITFIELD64_BIT($$.Base.Index);
823770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
824770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (!validate_inputs(& @1, state)) {
825770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
826770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
828770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| progParamArray '[' progParamArrayMem ']'
829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
830770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (! $3.Base.RelAddr
831ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	       && ((unsigned) $3.Base.Index >= $1->param_binding_length)) {
832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @3, state, "out of bounds array access");
833770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
835770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
836770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_src_reg(& $$);
837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.File = $1->param_binding_type;
838770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($3.Base.RelAddr) {
84056643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul              state->prog->IndirectRegisterFiles |= (1 << $$.Base.File);
841770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $1->param_accessed_indirectly = 1;
842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
843770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.RelAddr = 1;
844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.Index = $3.Base.Index;
845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Symbol = $1;
846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
847770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$.Base.Index = $1->param_binding_begin + $3.Base.Index;
848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
849770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
850770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| paramSingleItemUse
851770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
852df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul           gl_register_file file = ($1.name != NULL)
85369d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick	      ? $1.param_binding_type
85469d3d19b54c46cb7b0e05c04a5304830a1ee2691Ian Romanick	      : PROGRAM_CONSTANT;
855639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul           set_src_reg_swz(& $$, file, $1.param_binding_begin,
856639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul                           $1.param_binding_swizzle);
857770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
858770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
859770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
860770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickdstReg: resultBinding
861770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
862df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	   set_dst_reg(& $$, PROGRAM_OUTPUT, $1);
863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
8640e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick	| USED_IDENTIFIER /* temporaryReg | vertexResultReg */
865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
866770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s = (struct asm_symbol *)
867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $1);
868770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
869301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	   free($1);
870301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick
871770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
872770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid operand variable");
873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if ((s->type != at_output) && (s->type != at_temp)) {
875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid operand variable");
876770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
877770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
878770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
87986b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	   switch (s->type) {
88086b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	   case at_temp:
881df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	      set_dst_reg(& $$, PROGRAM_TEMPORARY, s->temp_binding);
88286b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	      break;
88386b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	   case at_output:
884df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	      set_dst_reg(& $$, PROGRAM_OUTPUT, s->output_binding);
88586b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	      break;
88686b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	   default:
887df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	      set_dst_reg(& $$, s->param_binding_type, s->param_binding_begin);
88886b33b5649710f351d241ce6890200ac1f38f724Ian Romanick	      break;
889770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
890770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
8930e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickprogParamArray: USED_IDENTIFIER
894770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
895770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s = (struct asm_symbol *)
896770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $1);
897770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
898301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	   free($1);
899301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick
900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid operand variable");
902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
903770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if ((s->type != at_param) || !s->param_is_array) {
904770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "array access to non-PARAM variable");
905770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
906770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
907770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = s;
908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
910770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
912770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayMem: progParamArrayAbs | progParamArrayRel;
913770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
914770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayAbs: INTEGER
915770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
916770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_src_reg(& $$);
917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.Index = $1;
918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
919770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
920770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
921770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogParamArrayRel: addrReg addrComponent addrRegRelOffset
922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* FINISHME: Add support for multiple address registers.
924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
925770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* FINISHME: Add support for 4-component address registers.
926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   init_src_reg(& $$);
928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.RelAddr = 1;
929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.Base.Index = $3;
930770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
931770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
933770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegRelOffset:              { $$ = 0; }
934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '+' addrRegPosOffset { $$ = $2; }
935770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '-' addrRegNegOffset { $$ = -$2; }
936770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
937770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
938770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegPosOffset: INTEGER
939770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
9408ad821df0a2d49964141f2ea4ef8179f4edc052fBrian Paul	   if (($1 < 0) || ($1 > (state->limits->MaxAddressOffset - 1))) {
9412aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul              char s[100];
94278a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul              _mesa_snprintf(s, sizeof(s),
9432aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul                             "relative address offset too large (%d)", $1);
9442aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul	      yyerror(& @1, state, s);
945770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
946770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
947770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = $1;
948770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
949770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
950770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
951770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
952770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrRegNegOffset: INTEGER
953770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
9548ad821df0a2d49964141f2ea4ef8179f4edc052fBrian Paul	   if (($1 < 0) || ($1 > state->limits->MaxAddressOffset)) {
9552aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul              char s[100];
95678a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul              _mesa_snprintf(s, sizeof(s),
9572aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul                             "relative address offset too large (%d)", $1);
9582aad3a855b8422124f9c903fa2096ea1fe0a607fBrian Paul	      yyerror(& @1, state, s);
959770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
960770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
961770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = $1;
962770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
963770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
964770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
965770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
9660e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickaddrReg: USED_IDENTIFIER
967770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
968770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s = (struct asm_symbol *)
969770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $1);
970770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
971301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	   free($1);
972301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick
973770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
974770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid array member");
975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if (s->type != at_address) {
977770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state,
978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      "invalid variable for indexed array access");
979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
980770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = s;
982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
983770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
985770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
986770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrComponent: MASK1
987770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
988770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1.mask != WRITEMASK_X) {
989770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid address component selector");
990770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
991770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
992770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = $1;
993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
994770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
995770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
996770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
997770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickaddrWriteMask: MASK1
998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
999770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1.mask != WRITEMASK_X) {
1000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state,
1001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      "address register write mask must be \".x\"");
1002770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1004770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = $1;
1005770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1009770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickscalarSuffix: MASK1;
1010770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1011770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickswizzleSuffix: MASK1
1012770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| MASK4
1013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SWIZZLE
1014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	|              { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; }
1015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1017770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionalMask: MASK4 | MASK3 | MASK2 | MASK1
1018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	|              { $$.swizzle = SWIZZLE_NOOP; $$.mask = WRITEMASK_XYZW; }
1019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
102181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickoptionalCcMask: '(' ccTest ')'
102281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	{
102381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$ = $2;
102481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	}
102581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	| '(' ccTest2 ')'
102681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	{
102781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$ = $2;
102881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	}
102981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	|
103081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	{
103181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondMask = COND_TR;
103281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondSwizzle = SWIZZLE_NOOP;
103381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondSrc = 0;
103481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	}
103581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	;
103681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
103781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickccTest: ccMaskRule swizzleSuffix
103881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	{
103981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$ = $1;
104081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondSwizzle = $2.swizzle;
104181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	}
104281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	;
104381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
104481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickccTest2: ccMaskRule2 swizzleSuffix
104581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	{
104681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$ = $1;
104781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondSwizzle = $2.swizzle;
104881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	}
104981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	;
105081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
105181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickccMaskRule: IDENTIFIER
105281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	{
105381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   const int cond = _mesa_parse_cc($1);
105481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   if ((cond == 0) || ($1[2] != '\0')) {
105581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	      char *const err_str =
105681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick		 make_error_string("invalid condition code \"%s\"", $1);
105781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
105881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	      yyerror(& @1, state, (err_str != NULL)
105981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick		      ? err_str : "invalid condition code");
106081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
106181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	      if (err_str != NULL) {
106232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg		 free(err_str);
106381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	      }
106481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
106581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	      YYERROR;
106681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   }
106781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
106881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondMask = cond;
106981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondSwizzle = SWIZZLE_NOOP;
107081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondSrc = 0;
107181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	}
107281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	;
107381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
107481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian RomanickccMaskRule2: USED_IDENTIFIER
107581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	{
107681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   const int cond = _mesa_parse_cc($1);
107781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   if ((cond == 0) || ($1[2] != '\0')) {
107881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	      char *const err_str =
107981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick		 make_error_string("invalid condition code \"%s\"", $1);
108081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
108181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	      yyerror(& @1, state, (err_str != NULL)
108281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick		      ? err_str : "invalid condition code");
108381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
108481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	      if (err_str != NULL) {
108532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg		 free(err_str);
108681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	      }
108781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
108881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	      YYERROR;
108981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   }
109081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
109181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondMask = cond;
109281722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondSwizzle = SWIZZLE_NOOP;
109381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	   $$.CondSrc = 0;
109481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	}
109581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick	;
109681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick
1097770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicknamingStatement: ATTRIB_statement
1098770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PARAM_statement
1099770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEMP_statement
1100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ADDRESS_statement
1101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| OUTPUT_statement
1102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ALIAS_statement
1103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1105770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickATTRIB_statement: ATTRIB IDENTIFIER '=' attribBinding
1106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s =
1108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      declare_variable(state, $2, at_attrib, & @2);
1109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
1111301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	      free($2);
1112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->attrib_binding = $4;
1115b14c06e10d570edcb4dcbea173d71751563616e7Mathias Fröhlich	      state->InputsBound |= BITFIELD64_BIT(s->attrib_binding);
1116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      if (!validate_inputs(& @4, state)) {
1118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 YYERROR;
1119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      }
1120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1124770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickattribBinding: VERTEX vtxAttribItem
1125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1126770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
1127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| FRAGMENT fragAttribItem
1129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
1131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1134770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxAttribItem: POSITION
1135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_POS;
1137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| WEIGHT vtxOptWeightNum
1139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_WEIGHT;
1141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| NORMAL
1143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_NORMAL;
1145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| COLOR optColorType
1147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1148054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   if (!state->ctx->Extensions.EXT_secondary_color) {
1149054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      yyerror(& @2, state, "GL_EXT_secondary_color not supported");
1150054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      YYERROR;
1151054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   }
1152054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick
1153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_COLOR0 + $2;
1154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1155770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| FOGCOORD
1156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1157054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   if (!state->ctx->Extensions.EXT_fog_coord) {
1158054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      yyerror(& @1, state, "GL_EXT_fog_coord not supported");
1159054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      YYERROR;
1160054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   }
1161054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick
1162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_FOG;
1163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1164770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXCOORD optTexCoordUnitNum
1165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_TEX0 + $2;
1167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1168770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| MATRIXINDEX '[' vtxWeightNum ']'
1169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1170054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   yyerror(& @1, state, "GL_ARB_matrix_palette not supported");
1171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   YYERROR;
1172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| VTXATTRIB '[' vtxAttribNum ']'
1174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = VERT_ATTRIB_GENERIC0 + $3;
1176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1179770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxAttribNum: INTEGER
1180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1181ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->limits->MaxAttribs) {
1182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid vertex attribute reference");
1183770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1190770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxOptWeightNum:  | '[' vtxWeightNum ']';
1191770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvtxWeightNum: INTEGER;
1192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1193770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickfragAttribItem: POSITION
1194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = FRAG_ATTRIB_WPOS;
1196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| COLOR optColorType
1198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = FRAG_ATTRIB_COL0 + $2;
1200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| FOGCOORD
1202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = FRAG_ATTRIB_FOGC;
1204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXCOORD optTexCoordUnitNum
1206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = FRAG_ATTRIB_TEX0 + $2;
1208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1211770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_statement: PARAM_singleStmt | PARAM_multipleStmt;
1212770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1213770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_singleStmt: PARAM IDENTIFIER paramSingleInit
1214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1215770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s =
1216770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      declare_variable(state, $2, at_param, & @2);
1217770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1218770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
1219301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	      free($2);
1220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1221770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->param_binding_type = $3.param_binding_type;
1223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->param_binding_begin = $3.param_binding_begin;
1224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->param_binding_length = $3.param_binding_length;
122584db95bfcd340a26a448fa89a19215711681cb50Eric Anholt              s->param_binding_swizzle = $3.param_binding_swizzle;
1226770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      s->param_is_array = 0;
1227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1231770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM_multipleStmt: PARAM IDENTIFIER '[' optArraySize ']' paramMultipleInit
1232770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1233ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if (($4 != 0) && ((unsigned) $4 != $6.param_binding_length)) {
1234301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	      free($2);
1235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @4, state,
1236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      "parameter array size and number of bindings must match");
1237770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1238770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1239770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      struct asm_symbol *const s =
1240770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 declare_variable(state, $2, $6.type, & @2);
1241770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1242770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      if (s == NULL) {
1243301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick		 free($2);
1244770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 YYERROR;
1245770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      } else {
1246770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 s->param_binding_type = $6.param_binding_type;
1247770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 s->param_binding_begin = $6.param_binding_begin;
1248770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 s->param_binding_length = $6.param_binding_length;
1249639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul                 s->param_binding_swizzle = SWIZZLE_XYZW;
1250770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 s->param_is_array = 1;
1251770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      }
1252770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1253770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1256770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptArraySize:
1257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = 0;
1259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| INTEGER
1261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick        {
1262dd245016657c599ecf24c4abe999319f9c870c47Ian Romanick	   if (($1 < 1) || ((unsigned) $1 > state->limits->MaxParameters)) {
1263f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul              char msg[100];
1264f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul              _mesa_snprintf(msg, sizeof(msg),
1265f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul                             "invalid parameter array size (size=%d max=%u)",
1266f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul                             $1, state->limits->MaxParameters);
1267f3c92c2323b1a00e592a2bae739c420a52d4285bBrian Paul	      yyerror(& @1, state, msg);
1268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
1270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = $1;
1271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1275770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleInit: '=' paramSingleItemDecl
1276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
1278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1281770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultipleInit: '=' '{' paramMultInitList '}'
1282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $3;
1284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1287770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultInitList: paramMultipleItem
1288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| paramMultInitList ',' paramMultipleItem
1289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $1.param_binding_length += $3.param_binding_length;
1291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1293770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1295770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleItemDecl: stateSingleItem
1296770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1297770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_state(state->prog, & $$, $1);
1300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| programSingleItem
1302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1303770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_param(state->prog, & $$, $1);
1306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| paramConstDecl
1308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
13117c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul	   initialize_symbol_from_const(state->prog, & $$, & $1, GL_TRUE);
1312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1315770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamSingleItemUse: stateSingleItem
1316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_state(state->prog, & $$, $1);
1320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| programSingleItem
1322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_param(state->prog, & $$, $1);
1326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| paramConstUse
1328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
13317c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul	   initialize_symbol_from_const(state->prog, & $$, & $1, GL_TRUE);
1332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1335770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamMultipleItem: stateMultipleItem
1336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_state(state->prog, & $$, $1);
1340770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| programMultipleItem
1342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1344770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
1345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   initialize_symbol_from_param(state->prog, & $$, $1);
1346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| paramConstDecl
1348770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset(& $$, 0, sizeof($$));
1350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.param_binding_begin = ~0;
13517c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul	   initialize_symbol_from_const(state->prog, & $$, & $1, GL_FALSE);
1352770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1353770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1355770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMultipleItem: stateSingleItem        { memcpy($$, $1, sizeof($$)); }
1356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateMatrixRows           { memcpy($$, $2, sizeof($$)); }
1357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1359770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateSingleItem: STATE stateMaterialItem  { memcpy($$, $2, sizeof($$)); }
1360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateLightItem            { memcpy($$, $2, sizeof($$)); }
1361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateLightModelItem       { memcpy($$, $2, sizeof($$)); }
1362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateLightProdItem        { memcpy($$, $2, sizeof($$)); }
1363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateTexGenItem           { memcpy($$, $2, sizeof($$)); }
1364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateTexEnvItem           { memcpy($$, $2, sizeof($$)); }
1365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateFogItem              { memcpy($$, $2, sizeof($$)); }
1366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateClipPlaneItem        { memcpy($$, $2, sizeof($$)); }
1367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE statePointItem            { memcpy($$, $2, sizeof($$)); }
1368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| STATE stateMatrixRow            { memcpy($$, $2, sizeof($$)); }
1369333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	| STATE stateDepthItem            { memcpy($$, $2, sizeof($$)); }
1370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1372770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMaterialItem: MATERIAL optFaceType stateMatProperty
1373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_MATERIAL;
1376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2;
1377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $3;
1378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1381770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatProperty: ambDiffSpecProperty
1382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| EMISSION
1386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_EMISSION;
1388770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SHININESS
1390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1391770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_SHININESS;
1392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1393770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1395770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightItem: LIGHT '[' stateLightNumber ']' stateLightProperty
1396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_LIGHT;
1399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $5;
1401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1404770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightProperty: ambDiffSpecProperty
1405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| POSITION
1409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1410770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_POSITION;
1411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ATTENUATION
1413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1414054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   if (!state->ctx->Extensions.EXT_point_parameters) {
1415054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      yyerror(& @1, state, "GL_ARB_point_parameters not supported");
1416054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	      YYERROR;
1417054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   }
1418054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick
1419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_ATTENUATION;
1420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SPOT stateSpotProperty
1422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
1424770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| HALF
1426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1427770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_HALF_VECTOR;
1428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1429770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1431770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateSpotProperty: DIRECTION
1432770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_SPOT_DIRECTION;
1434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1437770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightModelItem: LIGHTMODEL stateLModProperty
1438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $2[0];
1440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2[1];
1441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1444770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLModProperty: AMBIENT
1445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_LIGHTMODEL_AMBIENT;
1448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| optFaceType SCENECOLOR
1450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_LIGHTMODEL_SCENECOLOR;
1453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $1;
1454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1457770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightProdItem: LIGHTPROD '[' stateLightNumber ']' optFaceType stateLProdProperty
1458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_LIGHTPROD;
1461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $5;
1463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $6;
1464770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1467770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLProdProperty: ambDiffSpecProperty;
1468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1469770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexEnvItem: TEXENV optLegacyTexUnitNum stateTexEnvProperty
1470770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1472770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $3;
1473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2;
1474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1477770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexEnvProperty: COLOR
1478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXENV_COLOR;
1480770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1481770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1483770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickambDiffSpecProperty: AMBIENT
1484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1485770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_AMBIENT;
1486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| DIFFUSE
1488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_DIFFUSE;
1490770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1491770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SPECULAR
1492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_SPECULAR;
1494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1497770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateLightNumber: INTEGER
1498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1499ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxLights) {
1500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid light selector");
1501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1508770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenItem: TEXGEN optTexCoordUnitNum stateTexGenType stateTexGenCoord
1509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_TEXGEN;
1512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2;
1513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $3 + $4;
1514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1517770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenType: EYE
1518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_EYE_S;
1520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| OBJECT
1522770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_OBJECT_S;
1524770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1525770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1526770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateTexGenCoord: TEXGEN_S
1527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_EYE_S - STATE_TEXGEN_EYE_S;
1529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXGEN_T
1531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1532770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_EYE_T - STATE_TEXGEN_EYE_S;
1533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1534770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXGEN_R
1535770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_EYE_R - STATE_TEXGEN_EYE_S;
1537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXGEN_Q
1539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_TEXGEN_EYE_Q - STATE_TEXGEN_EYE_S;
1541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1544770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateFogItem: FOG stateFogProperty
1545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1546770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $2;
1548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1551770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateFogProperty: COLOR
1552770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_FOG_COLOR;
1554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PARAMS
1556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_FOG_PARAMS;
1558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1559770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1560770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1561770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateClipPlaneItem: CLIP '[' stateClipPlaneNum ']' PLANE
1562770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1563770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1564770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_CLIPPLANE;
1565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1567770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1569770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateClipPlaneNum: INTEGER
1570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1571ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxClipPlanes) {
1572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid clip plane selector");
1573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1574770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1578770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1579770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
15803fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian PaulstatePointItem: POINT_TOK statePointProperty
1581770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $2;
1584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1585770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1586770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
15873fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian PaulstatePointProperty: SIZE_TOK
1588770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1589770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_POINT_SIZE;
1590770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1591770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ATTENUATION
1592770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1593770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_POINT_ATTENUATION;
1594770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1595770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1596770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1597770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRow: stateMatrixItem ROW '[' stateMatrixRowNum ']'
1598770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1599770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1[0];
1600770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $1[1];
1601770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $4;
1602770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $4;
1603770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[4] = $1[2];
1604770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1605770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1606770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1607770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRows: stateMatrixItem optMatrixRows
1608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1[0];
1610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $1[1];
1611770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $2[2];
1612770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $2[3];
1613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[4] = $1[2];
1614770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1615770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1616770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1617770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptMatrixRows:
1618770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = 0;
1620770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = 3;
1621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1622770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| ROW '[' stateMatrixRowNum DOT_DOT stateMatrixRowNum ']'
1623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1624770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* It seems logical that the matrix row range specifier would have
1625770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * to specify a range or more than one row (i.e., $5 > $3).
1626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * However, the ARB_vertex_program spec says "a program will fail
1627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * to load if <a> is greater than <b>."  This means that $3 == $5
1628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * is valid.
1629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
1630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($3 > $5) {
1631770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @3, state, "invalid matrix row range");
1632770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1633770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1634770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1635770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $3;
1636770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $5;
1637770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1638770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1639770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1640770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixItem: MATRIX stateMatrixName stateOptMatModifier
1641770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1642770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $2[0];
1643770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2[1];
1644770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $3;
1645770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1646770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1647770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1648770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateOptMatModifier:
1649770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1650770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = 0;
1651770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1652770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| stateMatModifier
1653770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1654770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1655770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1656770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1657770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1658770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatModifier: INVERSE
1659770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1660770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_MATRIX_INVERSE;
1661770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TRANSPOSE
1663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_MATRIX_TRANSPOSE;
1665770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1666770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| INVTRANS
1667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1668770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = STATE_MATRIX_INVTRANS;
1669770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1670770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1671770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1672770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixRowNum: INTEGER
1673770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1674770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1 > 3) {
1675770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid matrix row reference");
1676770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1677770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1678770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1679770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1680770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1681770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1682770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1683770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateMatrixName: MODELVIEW stateOptModMatNum
1684770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1685770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_MODELVIEW_MATRIX;
1686770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2;
1687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1688770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PROJECTION
1689770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1690770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_PROJECTION_MATRIX;
1691770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = 0;
1692770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1693770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| MVP
1694770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1695770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_MVP_MATRIX;
1696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = 0;
1697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| TEXTURE optTexCoordUnitNum
1699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_TEXTURE_MATRIX;
1701770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $2;
1702770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PALETTE '[' statePaletteMatNum ']'
1704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1705054ab5a50a324b1d64fe403a65a2a392ba0c09fdIan Romanick	   yyerror(& @1, state, "GL_ARB_matrix_palette not supported");
1706770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   YYERROR;
1707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| MAT_PROGRAM '[' stateProgramMatNum ']'
1709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = STATE_PROGRAM_MATRIX;
1711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1713770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1714770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1715770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateOptModMatNum:
1716770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1717770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = 0;
1718770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1719847bc5c852214a344b6b39c619d182cb1058ecbcIan Romanick	| '[' stateModMatNum ']'
1720770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1721847bc5c852214a344b6b39c619d182cb1058ecbcIan Romanick	   $$ = $2;
1722770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1723770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1724770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateModMatNum: INTEGER
1725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* Since GL_ARB_vertex_blend isn't supported, only modelview matrix
1727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * zero is valid.
1728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
1729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if ($1 != 0) {
1730770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid modelview matrix index");
1731770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1732770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1733770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1735770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1736770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1737770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstatePaletteMatNum: INTEGER
1738770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   /* Since GL_ARB_matrix_palette isn't supported, just let any value
1740770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    * through here.  The error will be generated later.
1741770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    */
1742770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1743770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1744770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1745770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickstateProgramMatNum: INTEGER
1746770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1747ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxProgramMatrices) {
1748770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid program matrix selector");
1749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1750770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1751770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1752770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1756333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian RomanickstateDepthItem: DEPTH RANGE
1757333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	{
1758333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	   memset($$, 0, sizeof($$));
1759333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	   $$[0] = STATE_DEPTH_RANGE;
1760333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	}
1761333bb4f291b224ed82d87ade7ac157fb93fc5d12Ian Romanick	;
1762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1763770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1764770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogramSingleItem: progEnvParam | progLocalParam;
1765770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1766770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogramMultipleItem: progEnvParams | progLocalParams;
1767770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1768770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParams: PROGRAM ENV '[' progEnvParamNums ']'
1769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = state->state_param_enum;
1772770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = STATE_ENV;
1773770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $4[0];
1774770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $4[1];
1775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1776770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1778770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParamNums: progEnvParamNum
1779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1;
1781770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $1;
1782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| progEnvParamNum DOT_DOT progEnvParamNum
1784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1785770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1;
1786770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1787770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1788770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1789770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1790770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParam: PROGRAM ENV '[' progEnvParamNum ']'
1791770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1792770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1793770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = state->state_param_enum;
1794770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = STATE_ENV;
1795770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $4;
1796770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $4;
1797770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1798770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1799770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1800770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParams: PROGRAM LOCAL '[' progLocalParamNums ']'
1801770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1802770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1803770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = state->state_param_enum;
1804770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = STATE_LOCAL;
1805770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $4[0];
1806770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $4[1];
1807770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1809770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParamNums: progLocalParamNum
1810770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1811770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1;
1812770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $1;
1813770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1814770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| progLocalParamNum DOT_DOT progLocalParamNum
1815770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1816770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = $1;
1817770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = $3;
1818770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1819770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1820770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1821770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParam: PROGRAM LOCAL '[' progLocalParamNum ']'
1822770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1823770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   memset($$, 0, sizeof($$));
1824770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[0] = state->state_param_enum;
1825770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[1] = STATE_LOCAL;
1826770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[2] = $4;
1827770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$[3] = $4;
1828770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1829770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1830770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1831770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogEnvParamNum: INTEGER
1832770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1833ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->limits->MaxEnvParams) {
1834770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid environment parameter reference");
1835770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1836770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1837770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1838770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1839770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1840770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1841770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickprogLocalParamNum: INTEGER
1842770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1843ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->limits->MaxLocalParams) {
1844770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid local parameter reference");
1845770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1846770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1847770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
1848770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1849770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1850770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1851770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1852770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1853770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstDecl: paramConstScalarDecl | paramConstVector;
1854770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstUse: paramConstScalarUse | paramConstVector;
1855770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1856770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstScalarDecl: signedFloatConstant
1857770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1858600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.count = 4;
1859324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[0].f = $1;
1860324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[1].f = $1;
1861324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[2].f = $1;
1862324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[3].f = $1;
1863770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1864770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1865770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1866770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstScalarUse: REAL
1867770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1868ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick	   $$.count = 1;
1869324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[0].f = $1;
1870324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[1].f = $1;
1871324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[2].f = $1;
1872324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[3].f = $1;
1873770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1874770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| INTEGER
1875770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1876ac5551fbb97dd668f0c96c334d23b1fc48d16e18Ian Romanick	   $$.count = 1;
1877324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[0].f = (float) $1;
1878324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[1].f = (float) $1;
1879324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[2].f = (float) $1;
1880324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[3].f = (float) $1;
1881770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1882770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1883770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1884770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickparamConstVector: '{' signedFloatConstant '}'
1885770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1886600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.count = 4;
1887324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[0].f = $2;
1888324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[1].f = 0.0f;
1889324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[2].f = 0.0f;
1890324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[3].f = 1.0f;
1891770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1892770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '{' signedFloatConstant ',' signedFloatConstant '}'
1893770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1894600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.count = 4;
1895324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[0].f = $2;
1896324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[1].f = $4;
1897324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[2].f = 0.0f;
1898324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[3].f = 1.0f;
1899770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1900770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '{' signedFloatConstant ',' signedFloatConstant ','
1901770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick              signedFloatConstant '}'
1902770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1903600710907c5b72cf33e0b3ca6dc7e0d2a1a8ab25Ian Romanick	   $$.count = 4;
1904324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[0].f = $2;
1905324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[1].f = $4;
1906324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[2].f = $6;
1907324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[3].f = 1.0f;
1908770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1909770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '{' signedFloatConstant ',' signedFloatConstant ','
1910770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick              signedFloatConstant ',' signedFloatConstant '}'
1911770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1912770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$.count = 4;
1913324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[0].f = $2;
1914324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[1].f = $4;
1915324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[2].f = $6;
1916324857599b2a4735c86e54da9a1776c034dadf72Brian Paul	   $$.data[3].f = $8;
1917770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1918770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1919770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1920770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicksignedFloatConstant: optionalSign REAL
1921770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1922770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = ($1) ? -$2 : $2;
1923770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1924770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| optionalSign INTEGER
1925770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1926770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = (float)(($1) ? -$2 : $2);
1927770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1928770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1929770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1930770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptionalSign: '+'        { $$ = FALSE; }
1931770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '-'            { $$ = TRUE;  }
1932770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	|                { $$ = FALSE; }
1933770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1934770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1935d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickTEMP_statement: optVarSize TEMP { $<integer>$ = $2; } varNameList
1936d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	;
1937d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
19380e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickoptVarSize: string
1939d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	{
1940d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	   /* NV_fragment_program_option defines the size qualifiers in a
1941d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	    * fairly broken way.  "SHORT" or "LONG" can optionally be used
1942d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	    * before TEMP or OUTPUT.  However, neither is a reserved word!
1943d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	    * This means that we have to parse it as an identifier, then check
1944d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	    * to make sure it's one of the valid values.  *sigh*
1945d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	    *
1946d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	    * In addition, the grammar in the extension spec does *not* allow
1947d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	    * the size specifier to be optional, but all known implementations
1948d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	    * do.
1949d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	    */
1950d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	   if (!state->option.NV_fragment) {
1951d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	      yyerror(& @1, state, "unexpected IDENTIFIER");
1952d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	      YYERROR;
1953d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	   }
1954d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
1955d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	   if (strcmp("SHORT", $1) == 0) {
1956d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	   } else if (strcmp("LONG", $1) == 0) {
1957d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	   } else {
1958d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	      char *const err_str =
1959d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick		 make_error_string("invalid storage size specifier \"%s\"",
1960d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick				   $1);
1961d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
1962d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	      yyerror(& @1, state, (err_str != NULL)
1963d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick		      ? err_str : "invalid storage size specifier");
1964d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
1965d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	      if (err_str != NULL) {
196632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg		 free(err_str);
1967d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	      }
1968d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
1969d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	      YYERROR;
1970d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	   }
1971d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	}
1972d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	|
1973d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	{
1974d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	}
1975770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1976770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1977770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickADDRESS_statement: ADDRESS { $<integer>$ = $1; } varNameList
1978770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1979770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1980770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickvarNameList: varNameList ',' IDENTIFIER
1981770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1982770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (!declare_variable(state, $3, $<integer>0, & @3)) {
1983301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	      free($3);
1984770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1985770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1986770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1987770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| IDENTIFIER
1988770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1989770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (!declare_variable(state, $1, $<integer>0, & @1)) {
1990301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	      free($1);
1991770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
1992770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
1993770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
1994770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
1995770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1996d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickOUTPUT_statement: optVarSize OUTPUT IDENTIFIER '=' resultBinding
1997770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
1998770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *const s =
1999d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	      declare_variable(state, $3, at_output, & @3);
2000770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2001770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (s == NULL) {
20024e4c2ee1fd574d1d651c559f46afb6ca5487156dIan Romanick	      free($3);
2003770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2004770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
2005d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	      s->output_binding = $5;
2006770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2007770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2008770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2009770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2010770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickresultBinding: RESULT POSITION
2011770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2012770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
2013770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_HPOS;
2014770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
2015770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "invalid program result name");
2016770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2017770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2018770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2019770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| RESULT FOGCOORD
2020770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2021770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
2022770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_FOGC;
2023770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
2024770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "invalid program result name");
2025770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2026770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2027770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2028770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| RESULT resultColBinding
2029770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2030770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2;
2031770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2032770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| RESULT POINTSIZE
2033770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2034770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
2035770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_PSIZ;
2036770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
2037770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "invalid program result name");
2038770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2039770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2040770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2041770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| RESULT TEXCOORD optTexCoordUnitNum
2042770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2043770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
2044770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_TEX0 + $3;
2045770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
2046770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "invalid program result name");
2047770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2048770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2049770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2050770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| RESULT DEPTH
2051770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2052770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_fragment) {
2053770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = FRAG_RESULT_DEPTH;
2054770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
2055770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @2, state, "invalid program result name");
2056770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2057770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2058770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2059770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2060770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2061770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickresultColBinding: COLOR optResultFaceType optResultColorType
2062770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2063770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $2 + $3;
2064770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2065770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2066770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2067770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptResultFaceType:
2068770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2069d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt	   if (state->mode == ARB_vertex) {
2070d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt	      $$ = VERT_RESULT_COL0;
2071d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt	   } else {
2072d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt	      if (state->option.DrawBuffers)
2073d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt		 $$ = FRAG_RESULT_DATA0;
2074d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt	      else
2075d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt		 $$ = FRAG_RESULT_COLOR;
2076d7f4c4e1b187552ede397f00fb56a6f0bb724ce1Eric Anholt	   }
2077770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
207828cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	| '[' INTEGER ']'
207928cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	{
208028cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	   if (state->mode == ARB_vertex) {
208128cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	      yyerror(& @1, state, "invalid program result name");
208228cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	      YYERROR;
208328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	   } else {
208428cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	      if (!state->option.DrawBuffers) {
208528cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		 /* From the ARB_draw_buffers spec (same text exists
208628cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		  * for ATI_draw_buffers):
208728cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		  *
208828cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		  *     If this option is not specified, a fragment
208928cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		  *     program that attempts to bind
209028cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		  *     "result.color[n]" will fail to load, and only
209128cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		  *     "result.color" will be allowed.
209228cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		  */
209328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		 yyerror(& @1, state,
209428cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt			 "result.color[] used without "
209528cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt			 "`OPTION ARB_draw_buffers' or "
209628cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt			 "`OPTION ATI_draw_buffers'");
209728cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		 YYERROR;
209828cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	      } else if ($2 >= state->MaxDrawBuffers) {
209928cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		 yyerror(& @1, state,
210028cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt			 "result.color[] exceeds MAX_DRAW_BUFFERS_ARB");
210128cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt		 YYERROR;
210228cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	      }
210328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	      $$ = FRAG_RESULT_DATA0 + $2;
210428cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	   }
210528cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt	}
2106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| FRONT
2107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
2109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_COL0;
2110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
2111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid program result name");
2112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| BACK
2116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
2118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = VERT_RESULT_BFC0;
2119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
2120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid program result name");
2121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2125770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2126770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptResultColorType:
2127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = 0;
2129770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PRIMARY
2131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
2133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = 0;
2134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
2135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid program result name");
2136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SECONDARY
2140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (state->mode == ARB_vertex) {
2142770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      $$ = 1;
2143770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
2144770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid program result name");
2145770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2146770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2147770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2148770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2150770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptFaceType:    { $$ = 0; }
2151770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| FRONT	{ $$ = 0; }
2152770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| BACK  { $$ = 1; }
2153770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2154770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2155770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptColorType:       { $$ = 0; }
2156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| PRIMARY   { $$ = 0; }
2157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| SECONDARY { $$ = 1; }
2158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2160770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptTexCoordUnitNum:                { $$ = 0; }
2161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '[' texCoordUnitNum ']'  { $$ = $2; }
2162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2163770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2164770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptTexImageUnitNum:                { $$ = 0; }
2165770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '[' texImageUnitNum ']'  { $$ = $2; }
2166770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2167770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2168770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickoptLegacyTexUnitNum:               { $$ = 0; }
2169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	| '[' legacyTexUnitNum ']' { $$ = $2; }
2170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2172770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexCoordUnitNum: INTEGER
2173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2174ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxTextureCoordUnits) {
2175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid texture coordinate unit selector");
2176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
2180770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2181770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2182770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2183770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicktexImageUnitNum: INTEGER
2184770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2185ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxTextureImageUnits) {
2186770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid texture image unit selector");
2187770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2188770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2189770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
2191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2194770cebbc29863ae944a31463ee4bdeb789105abaIan RomanicklegacyTexUnitNum: INTEGER
2195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2196ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick	   if ((unsigned) $1 >= state->MaxTextureUnits) {
2197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @1, state, "invalid texture unit selector");
2198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   $$ = $1;
2202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2203770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
22050e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian RomanickALIAS_statement: ALIAS IDENTIFIER '=' USED_IDENTIFIER
2206770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	{
2207770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *exist = (struct asm_symbol *)
2208770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $2);
2209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   struct asm_symbol *target = (struct asm_symbol *)
2210770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      _mesa_symbol_table_find_symbol(state->st, 0, $4);
2211770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2212301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	   free($4);
2213301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick
2214770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   if (exist != NULL) {
2215fe86f8d73268785b31bc8d5a278a233bff42034dBrian Paul	      char m[1000];
221678a0c353d0f87c85feaa6dcb3042fc25d424f21bBrian Paul	      _mesa_snprintf(m, sizeof(m), "redeclared identifier: %s", $2);
2217301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	      free($2);
2218fe86f8d73268785b31bc8d5a278a233bff42034dBrian Paul	      yyerror(& @2, state, m);
2219770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2220770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else if (target == NULL) {
2221301a9b7e28f7404b8f6d8c34649f0035b49a8249Ian Romanick	      free($2);
2222770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      yyerror(& @4, state,
2223770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		      "undefined variable binding in ALIAS statement");
2224770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	      YYERROR;
2225770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   } else {
22261c7337d46eab0cfd36ebc0ad22c5a66ec9b91d39Ian Romanick	      _mesa_symbol_table_add_symbol(state->st, 0, $2, target);
2227770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	   }
2228770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	}
2229770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	;
2230770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
22310e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanickstring: IDENTIFIER
22320e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick	| USED_IDENTIFIER
22330e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick	;
22340e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick
2235770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%%
2236770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
22379ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickvoid
22389ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickasm_instruction_set_operands(struct asm_instruction *inst,
22399ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick			     const struct prog_dst_register *dst,
22409ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick			     const struct asm_src_register *src0,
22419ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick			     const struct asm_src_register *src1,
22429ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick			     const struct asm_src_register *src2)
22439ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick{
22449ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   /* In the core ARB extensions only the KIL instruction doesn't have a
22459ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick    * destination register.
22469ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick    */
22479ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   if (dst == NULL) {
22489ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      init_dst_reg(& inst->Base.DstReg);
22499ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   } else {
22509ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      inst->Base.DstReg = *dst;
22519ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   }
22529ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
225381722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   /* The only instruction that doesn't have any source registers is the
225481722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick    * condition-code based KIL instruction added by NV_fragment_program_option.
225581722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick    */
225681722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   if (src0 != NULL) {
225781722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      inst->Base.SrcReg[0] = src0->Base;
225881722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      inst->SrcReg[0] = *src0;
225981722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   } else {
226081722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick      init_src_reg(& inst->SrcReg[0]);
226181722c5d7e8e93d837510b9e6e5d014ec64cf4b3Ian Romanick   }
22629ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
22639ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   if (src1 != NULL) {
22649ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      inst->Base.SrcReg[1] = src1->Base;
22659ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      inst->SrcReg[1] = *src1;
22669ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   } else {
22679ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      init_src_reg(& inst->SrcReg[1]);
22689ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   }
22699ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
22709ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   if (src2 != NULL) {
22719ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      inst->Base.SrcReg[2] = src2->Base;
22729ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      inst->SrcReg[2] = *src2;
22739ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   } else {
22749ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      init_src_reg(& inst->SrcReg[2]);
22759ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   }
22769ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick}
22779ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
22789ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
2279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct asm_instruction *
2280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickasm_instruction_ctor(gl_inst_opcode op,
2281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		     const struct prog_dst_register *dst,
2282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		     const struct asm_src_register *src0,
2283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		     const struct asm_src_register *src1,
2284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		     const struct asm_src_register *src2)
2285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
22869ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   struct asm_instruction *inst = CALLOC_STRUCT(asm_instruction);
2287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (inst) {
2289ef80c2012dff343eb5ff571cea8377ff6a87c0c5Ian Romanick      _mesa_init_instructions(& inst->Base, 1);
2290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      inst->Base.Opcode = op;
229117534ab88ce29119f79de8abfcc4170471e8f5a4Ian Romanick
22929ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      asm_instruction_set_operands(inst, dst, src0, src1, src2);
22939ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   }
2294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
22959ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   return inst;
22969ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick}
22979ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
22989ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
22999ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickstruct asm_instruction *
23009ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanickasm_instruction_copy_ctor(const struct prog_instruction *base,
23019ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick			  const struct prog_dst_register *dst,
23029ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick			  const struct asm_src_register *src0,
23039ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick			  const struct asm_src_register *src1,
23049ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick			  const struct asm_src_register *src2)
23059ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick{
23069ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   struct asm_instruction *inst = CALLOC_STRUCT(asm_instruction);
23079ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick
23089ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick   if (inst) {
23099ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      _mesa_init_instructions(& inst->Base, 1);
23109ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      inst->Base.Opcode = base->Opcode;
2311d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      inst->Base.CondUpdate = base->CondUpdate;
2312d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      inst->Base.CondDst = base->CondDst;
23139ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      inst->Base.SaturateMode = base->SaturateMode;
2314d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      inst->Base.Precision = base->Precision;
2315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
23169ea4319744fb7474635cb1994e1babe1552d4d4fIan Romanick      asm_instruction_set_operands(inst, dst, src0, src1, src2);
2317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return inst;
2320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2321770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2322770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2323770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
2324770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinit_dst_reg(struct prog_dst_register *r)
2325770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2326770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   memset(r, 0, sizeof(*r));
2327770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->File = PROGRAM_UNDEFINED;
2328770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->WriteMask = WRITEMASK_XYZW;
2329770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->CondMask = COND_TR;
2330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->CondSwizzle = SWIZZLE_NOOP;
2331770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2334df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul/** Like init_dst_reg() but set the File and Index fields. */
2335df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulvoid
2336df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulset_dst_reg(struct prog_dst_register *r, gl_register_file file, GLint index)
2337df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul{
2338df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   const GLint maxIndex = 1 << INST_INDEX_BITS;
2339df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   const GLint minIndex = 0;
2340df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   ASSERT(index >= minIndex);
234188bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee   (void) minIndex;
2342df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   ASSERT(index <= maxIndex);
234388bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee   (void) maxIndex;
2344df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   ASSERT(file == PROGRAM_TEMPORARY ||
2345df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	  file == PROGRAM_ADDRESS ||
2346df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul	  file == PROGRAM_OUTPUT);
2347df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   memset(r, 0, sizeof(*r));
2348df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   r->File = file;
2349df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   r->Index = index;
2350df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   r->WriteMask = WRITEMASK_XYZW;
2351df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   r->CondMask = COND_TR;
2352df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   r->CondSwizzle = SWIZZLE_NOOP;
2353df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul}
2354df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul
2355df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul
2356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
2357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinit_src_reg(struct asm_src_register *r)
2358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   memset(r, 0, sizeof(*r));
2360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->Base.File = PROGRAM_UNDEFINED;
2361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->Base.Swizzle = SWIZZLE_NOOP;
2362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   r->Symbol = NULL;
2363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2366639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul/** Like init_src_reg() but set the File and Index fields.
2367639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * \return GL_TRUE if a valid src register, GL_FALSE otherwise
2368639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul */
2369df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulvoid
2370df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paulset_src_reg(struct asm_src_register *r, gl_register_file file, GLint index)
2371df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul{
2372639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   set_src_reg_swz(r, file, index, SWIZZLE_XYZW);
2373639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul}
2374639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul
2375639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul
2376639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paulvoid
2377639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paulset_src_reg_swz(struct asm_src_register *r, gl_register_file file, GLint index,
2378639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul                GLuint swizzle)
2379639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul{
2380df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   const GLint maxIndex = (1 << INST_INDEX_BITS) - 1;
2381df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   const GLint minIndex = -(1 << INST_INDEX_BITS);
2382639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   ASSERT(file < PROGRAM_FILE_MAX);
2383df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   ASSERT(index >= minIndex);
238488bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee   (void) minIndex;
2385df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   ASSERT(index <= maxIndex);
238688bd32383a06224c742f6af59fcd95cd11284d5bVinson Lee   (void) maxIndex;
2387df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   memset(r, 0, sizeof(*r));
2388df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   r->Base.File = file;
2389df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   r->Base.Index = index;
2390639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   r->Base.Swizzle = swizzle;
2391df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul   r->Symbol = NULL;
2392df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul}
2393df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul
2394df5615de1f1bfc68417eb2a6381fe3d8ab9ac035Brian Paul
2395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick/**
2396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Validate the set of inputs used by a program
2397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
2398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * Validates that legal sets of inputs are used by the program.  In this case
2399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * "used" included both reading the input or binding the input to a name using
2400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * the \c ATTRIB command.
2401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick *
2402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \return
2403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick * \c TRUE if the combination of inputs used is valid, \c FALSE otherwise.
2404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick */
2405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint
2406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvalidate_inputs(struct YYLTYPE *locp, struct asm_parser_state *state)
2407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2408b14c06e10d570edcb4dcbea173d71751563616e7Mathias Fröhlich   const GLbitfield64 inputs = state->prog->InputsRead | state->InputsBound;
2409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2410b14c06e10d570edcb4dcbea173d71751563616e7Mathias Fröhlich   if (((inputs & VERT_BIT_FF_ALL) & (inputs >> VERT_ATTRIB_GENERIC0)) != 0) {
2411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      yyerror(locp, state, "illegal use of generic attribute and name attribute");
2412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return 0;
2413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2415770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return 1;
2416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2417770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstruct asm_symbol *
2420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickdeclare_variable(struct asm_parser_state *state, char *name, enum asm_type t,
2421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick		 struct YYLTYPE *locp)
2422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_symbol *s = NULL;
2424770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_symbol *exist = (struct asm_symbol *)
2425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_symbol_table_find_symbol(state->st, 0, name);
2426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2427770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (exist != NULL) {
2429770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      yyerror(locp, state, "redeclared identifier");
2430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   } else {
24311c7337d46eab0cfd36ebc0ad22c5a66ec9b91d39Ian Romanick      s = calloc(1, sizeof(struct asm_symbol));
24321c7337d46eab0cfd36ebc0ad22c5a66ec9b91d39Ian Romanick      s->name = name;
2433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      s->type = t;
2434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      switch (t) {
2436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case at_temp:
2437770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 if (state->prog->NumTemporaries >= state->limits->MaxTemps) {
2438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    yyerror(locp, state, "too many temporaries declared");
2439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    free(s);
2440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    return NULL;
2441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 }
2442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 s->temp_binding = state->prog->NumTemporaries;
2444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 state->prog->NumTemporaries++;
2445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 break;
2446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      case at_address:
2448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 if (state->prog->NumAddressRegs >= state->limits->MaxAddressRegs) {
2449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    yyerror(locp, state, "too many address registers declared");
2450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    free(s);
2451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    return NULL;
2452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 }
2453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 /* FINISHME: Add support for multiple address registers.
2455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  */
2456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 state->prog->NumAddressRegs++;
2457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 break;
2458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      default:
2460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 break;
2461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_symbol_table_add_symbol(state->st, 0, s->name, s);
246494b45567047fd681666f261f1ad0164049f0491aIan Romanick      s->next = state->sym;
246594b45567047fd681666f261f1ad0164049f0491aIan Romanick      state->sym = s;
2466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return s;
2469770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2470770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2472770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint add_state_reference(struct gl_program_parameter_list *param_list,
2473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			const gl_state_index tokens[STATE_LENGTH])
2474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   const GLuint size = 4; /* XXX fix */
2476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   char *name;
2477770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLint index;
2478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   name = _mesa_program_state_string(tokens);
2480770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   index = _mesa_add_parameter(param_list, PROGRAM_STATE_VAR, name,
2481592a6642fc5c9f697bcc6521c99fe00b2de827c8Brian Paul                               size, GL_NONE, NULL, tokens, 0x0);
2482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   param_list->StateFlags |= _mesa_program_state_flags(tokens);
2483770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* free name string here since we duplicated it in add_parameter() */
248532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   free(name);
2486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return index;
2488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2490770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2491770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint
2492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_state(struct gl_program *prog,
2493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     struct asm_symbol *param_var,
2494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     const gl_state_index tokens[STATE_LENGTH])
2495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int idx = -1;
2497770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   gl_state_index state_tokens[STATE_LENGTH];
2498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2499770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   memcpy(state_tokens, tokens, sizeof(state_tokens));
2501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   param_var->type = at_param;
250328b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick   param_var->param_binding_type = PROGRAM_STATE_VAR;
2504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* If we are adding a STATE_MATRIX that has multiple rows, we need to
2506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * unroll it and call add_state_reference() for each row
2507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
2508770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if ((state_tokens[0] == STATE_MODELVIEW_MATRIX ||
2509770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	state_tokens[0] == STATE_PROJECTION_MATRIX ||
2510770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	state_tokens[0] == STATE_MVP_MATRIX ||
2511770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	state_tokens[0] == STATE_TEXTURE_MATRIX ||
2512770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	state_tokens[0] == STATE_PROGRAM_MATRIX)
2513770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick       && (state_tokens[2] != state_tokens[3])) {
2514770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      int row;
2515770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      const int first_row = state_tokens[2];
2516770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      const int last_row = state_tokens[3];
2517770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2518770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      for (row = first_row; row <= last_row; row++) {
2519770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 state_tokens[2] = state_tokens[3] = row;
2520770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2521770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 idx = add_state_reference(prog->Parameters, state_tokens);
2522639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul	 if (param_var->param_binding_begin == ~0U) {
2523770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    param_var->param_binding_begin = idx;
2524639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul            param_var->param_binding_swizzle = SWIZZLE_XYZW;
2525639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul         }
2526639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul
2527770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 param_var->param_binding_length++;
2528770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2529770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2530770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2531770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      idx = add_state_reference(prog->Parameters, state_tokens);
2532639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      if (param_var->param_binding_begin == ~0U) {
2533770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 param_var->param_binding_begin = idx;
2534639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul         param_var->param_binding_swizzle = SWIZZLE_XYZW;
2535639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      }
2536770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      param_var->param_binding_length++;
2537770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2538770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2539770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return idx;
2540770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2541770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2542770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2543770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint
2544770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_param(struct gl_program *prog,
2545770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     struct asm_symbol *param_var,
2546770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     const gl_state_index tokens[STATE_LENGTH])
2547770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2548770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   int idx = -1;
2549770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   gl_state_index state_tokens[STATE_LENGTH];
2550770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2551770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2552770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   memcpy(state_tokens, tokens, sizeof(state_tokens));
2553770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2554770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   assert((state_tokens[0] == STATE_VERTEX_PROGRAM)
2555770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  || (state_tokens[0] == STATE_FRAGMENT_PROGRAM));
2556770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   assert((state_tokens[1] == STATE_ENV)
2557770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  || (state_tokens[1] == STATE_LOCAL));
2558770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2559f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul   /*
2560f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul    * The param type is STATE_VAR.  The program parameter entry will
2561f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul    * effectively be a pointer into the LOCAL or ENV parameter array.
2562f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul    */
2563770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   param_var->type = at_param;
2564f0f68b1e4c3d3d23fc9a7d624a465537b2e74d6cBrian Paul   param_var->param_binding_type = PROGRAM_STATE_VAR;
2565770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2566770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* If we are adding a STATE_ENV or STATE_LOCAL that has multiple elements,
2567770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * we need to unroll it and call add_state_reference() for each row
2568770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
2569770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (state_tokens[2] != state_tokens[3]) {
2570770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      int row;
2571770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      const int first_row = state_tokens[2];
2572770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      const int last_row = state_tokens[3];
2573770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2574770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      for (row = first_row; row <= last_row; row++) {
2575770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 state_tokens[2] = state_tokens[3] = row;
2576770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2577770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 idx = add_state_reference(prog->Parameters, state_tokens);
2578639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul	 if (param_var->param_binding_begin == ~0U) {
2579770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	    param_var->param_binding_begin = idx;
2580639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul            param_var->param_binding_swizzle = SWIZZLE_XYZW;
2581639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul         }
2582770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 param_var->param_binding_length++;
2583770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }
2584770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2585770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   else {
2586770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      idx = add_state_reference(prog->Parameters, state_tokens);
2587639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      if (param_var->param_binding_begin == ~0U) {
2588770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 param_var->param_binding_begin = idx;
2589639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul         param_var->param_binding_swizzle = SWIZZLE_XYZW;
2590639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul      }
2591770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      param_var->param_binding_length++;
2592770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2593770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2594770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return idx;
2595770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2596770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2597770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2598639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul/**
2599639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * Put a float/vector constant/literal into the parameter list.
2600639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * \param param_var  returns info about the parameter/constant's location,
2601639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul *                   binding, type, etc.
2602639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * \param vec  the vector/constant to add
26037c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul * \param allowSwizzle  if true, try to consolidate constants which only differ
26047c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul *                      by a swizzle.  We don't want to do this when building
26057c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul *                      arrays of constants that may be indexed indirectly.
2606639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul * \return index of the constant in the parameter list.
2607639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul */
2608770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickint
2609770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickinitialize_symbol_from_const(struct gl_program *prog,
2610770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			     struct asm_symbol *param_var,
26117c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul			     const struct asm_vector *vec,
26127c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul                             GLboolean allowSwizzle)
2613770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2614639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   unsigned swizzle;
2615639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   const int idx = _mesa_add_unnamed_constant(prog->Parameters,
26167c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul                                              vec->data, vec->count,
26177c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul                                              allowSwizzle ? &swizzle : NULL);
2618770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2619770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   param_var->type = at_param;
262028b13038d84db1c4e1e56e15d310b30ddffcb7bdIan Romanick   param_var->param_binding_type = PROGRAM_CONSTANT;
2621770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2622639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   if (param_var->param_binding_begin == ~0U) {
2623770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      param_var->param_binding_begin = idx;
26247c6ae4c6c87edd02671a3857d1f774835b923e59Brian Paul      param_var->param_binding_swizzle = allowSwizzle ? swizzle : SWIZZLE_XYZW;
2625639e7a140e430aa8839c652459eddc9a4b79f9c6Brian Paul   }
2626770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   param_var->param_binding_length++;
2627770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2628770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return idx;
2629770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2630770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2631770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
263244843c753301db0e8f8343745777479465f34cccIan Romanickchar *
263344843c753301db0e8f8343745777479465f34cccIan Romanickmake_error_string(const char *fmt, ...)
263444843c753301db0e8f8343745777479465f34cccIan Romanick{
263544843c753301db0e8f8343745777479465f34cccIan Romanick   int length;
263644843c753301db0e8f8343745777479465f34cccIan Romanick   char *str;
263744843c753301db0e8f8343745777479465f34cccIan Romanick   va_list args;
263844843c753301db0e8f8343745777479465f34cccIan Romanick
263944843c753301db0e8f8343745777479465f34cccIan Romanick
264044843c753301db0e8f8343745777479465f34cccIan Romanick   /* Call vsnprintf once to determine how large the final string is.  Call it
26416aae062bdf285ce9ce861b4d3b777080664518baJosé Fonseca    * again to do the actual formatting.  from the vsnprintf manual page:
264244843c753301db0e8f8343745777479465f34cccIan Romanick    *
264344843c753301db0e8f8343745777479465f34cccIan Romanick    *    Upon successful return, these functions return the number of
264444843c753301db0e8f8343745777479465f34cccIan Romanick    *    characters printed  (not including the trailing '\0' used to end
264544843c753301db0e8f8343745777479465f34cccIan Romanick    *    output to strings).
264644843c753301db0e8f8343745777479465f34cccIan Romanick    */
2647cca8abe20ec9d1a560cc3fc97545922254d2a574José Fonseca   va_start(args, fmt);
264844843c753301db0e8f8343745777479465f34cccIan Romanick   length = 1 + vsnprintf(NULL, 0, fmt, args);
2649cca8abe20ec9d1a560cc3fc97545922254d2a574José Fonseca   va_end(args);
265044843c753301db0e8f8343745777479465f34cccIan Romanick
265132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   str = malloc(length);
265244843c753301db0e8f8343745777479465f34cccIan Romanick   if (str) {
2653cca8abe20ec9d1a560cc3fc97545922254d2a574José Fonseca      va_start(args, fmt);
2654150cce6aef85d22b5d32fba5d27605a98be6794aBrian Paul      vsnprintf(str, length, fmt, args);
2655cca8abe20ec9d1a560cc3fc97545922254d2a574José Fonseca      va_end(args);
265644843c753301db0e8f8343745777479465f34cccIan Romanick   }
265744843c753301db0e8f8343745777479465f34cccIan Romanick
265844843c753301db0e8f8343745777479465f34cccIan Romanick   return str;
265944843c753301db0e8f8343745777479465f34cccIan Romanick}
266044843c753301db0e8f8343745777479465f34cccIan Romanick
266144843c753301db0e8f8343745777479465f34cccIan Romanick
2662770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
2663770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickyyerror(YYLTYPE *locp, struct asm_parser_state *state, const char *s)
2664770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
266544843c753301db0e8f8343745777479465f34cccIan Romanick   char *err_str;
266644843c753301db0e8f8343745777479465f34cccIan Romanick
2667770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
266844843c753301db0e8f8343745777479465f34cccIan Romanick   err_str = make_error_string("glProgramStringARB(%s)\n", s);
266944843c753301db0e8f8343745777479465f34cccIan Romanick   if (err_str) {
26703888c38fc9e7debc53a901295af0027801c4ae74Vinson Lee      _mesa_error(state->ctx, GL_INVALID_OPERATION, "%s", err_str);
267132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(err_str);
267244843c753301db0e8f8343745777479465f34cccIan Romanick   }
267344843c753301db0e8f8343745777479465f34cccIan Romanick
267444843c753301db0e8f8343745777479465f34cccIan Romanick   err_str = make_error_string("line %u, char %u: error: %s\n",
267544843c753301db0e8f8343745777479465f34cccIan Romanick			       locp->first_line, locp->first_column, s);
267644843c753301db0e8f8343745777479465f34cccIan Romanick   _mesa_set_program_error(state->ctx, locp->position, err_str);
267744843c753301db0e8f8343745777479465f34cccIan Romanick
267844843c753301db0e8f8343745777479465f34cccIan Romanick   if (err_str) {
267932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(err_str);
268044843c753301db0e8f8343745777479465f34cccIan Romanick   }
2681770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2682770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
268344843c753301db0e8f8343745777479465f34cccIan Romanick
2684770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickGLboolean
2685f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_parse_arb_program(struct gl_context *ctx, GLenum target, const GLubyte *str,
2686770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			GLsizei len, struct asm_parser_state *state)
2687770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
2688770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   struct asm_instruction *inst;
2689770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   unsigned i;
2690770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   GLubyte *strz;
269194b45567047fd681666f261f1ad0164049f0491aIan Romanick   GLboolean result = GL_FALSE;
269294b45567047fd681666f261f1ad0164049f0491aIan Romanick   void *temp;
269394b45567047fd681666f261f1ad0164049f0491aIan Romanick   struct asm_symbol *sym;
2694770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
269544843c753301db0e8f8343745777479465f34cccIan Romanick   state->ctx = ctx;
2696770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->Target = target;
2697770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->Parameters = _mesa_new_parameter_list();
2698770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2699770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Make a copy of the program string and force it to be NUL-terminated.
2700770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
270132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg   strz = (GLubyte *) malloc(len + 1);
2702770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (strz == NULL) {
2703770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB");
2704770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return GL_FALSE;
2705770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2706c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke   memcpy (strz, str, len);
2707770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   strz[len] = '\0';
2708770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2709770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->String = strz;
2710770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2711770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->st = _mesa_symbol_table_ctor();
2712770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
271348183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick   state->limits = (target == GL_VERTEX_PROGRAM_ARB)
271448183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick      ? & ctx->Const.VertexProgram
271548183ca8b6adfbb9555428cb8414b821fdd15717Ian Romanick      : & ctx->Const.FragmentProgram;
2716770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
27174cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxTextureImageUnits = ctx->Const.MaxTextureImageUnits;
27184cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxTextureCoordUnits = ctx->Const.MaxTextureCoordUnits;
27194cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxTextureUnits = ctx->Const.MaxTextureUnits;
27204cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxClipPlanes = ctx->Const.MaxClipPlanes;
27214cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxLights = ctx->Const.MaxLights;
27224cf27608bc069225bf91d47585e344a2c122e940Brian Paul   state->MaxProgramMatrices = ctx->Const.MaxProgramMatrices;
272328cec9e832b716b84c11ddabfcee74e0daf6ec49Eric Anholt   state->MaxDrawBuffers = ctx->Const.MaxDrawBuffers;
2724770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2725770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->state_param_enum = (target == GL_VERTEX_PROGRAM_ARB)
2726770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      ? STATE_VERTEX_PROGRAM : STATE_FRAGMENT_PROGRAM;
2727770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2728770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_set_program_error(ctx, -1, NULL);
2729770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2730770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_program_lexer_ctor(& state->scanner, state, (const char *) str, len);
2731770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yyparse(state);
2732770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   _mesa_program_lexer_dtor(state->scanner);
2733770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2734770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
273544843c753301db0e8f8343745777479465f34cccIan Romanick   if (ctx->Program.ErrorPos != -1) {
273694b45567047fd681666f261f1ad0164049f0491aIan Romanick      goto error;
273744843c753301db0e8f8343745777479465f34cccIan Romanick   }
273844843c753301db0e8f8343745777479465f34cccIan Romanick
2739770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (! _mesa_layout_parameters(state)) {
274044843c753301db0e8f8343745777479465f34cccIan Romanick      struct YYLTYPE loc;
274144843c753301db0e8f8343745777479465f34cccIan Romanick
274244843c753301db0e8f8343745777479465f34cccIan Romanick      loc.first_line = 0;
274344843c753301db0e8f8343745777479465f34cccIan Romanick      loc.first_column = 0;
274444843c753301db0e8f8343745777479465f34cccIan Romanick      loc.position = len;
274544843c753301db0e8f8343745777479465f34cccIan Romanick
274644843c753301db0e8f8343745777479465f34cccIan Romanick      yyerror(& loc, state, "invalid PARAM usage");
274794b45567047fd681666f261f1ad0164049f0491aIan Romanick      goto error;
2748770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2749770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2750770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2751770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2752770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Add one instruction to store the "END" instruction.
2753770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
2754770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->Instructions =
2755770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_alloc_instructions(state->prog->NumInstructions + 1);
2756770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   inst = state->inst_head;
2757770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   for (i = 0; i < state->prog->NumInstructions; i++) {
2758770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      struct asm_instruction *const temp = inst->next;
2759770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2760770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      state->prog->Instructions[i] = inst->Base;
2761770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      inst = temp;
2762770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2763770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2764770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /* Finally, tag on an OPCODE_END instruction */
2765770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   {
2766770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      const GLuint numInst = state->prog->NumInstructions;
2767770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      _mesa_init_instructions(state->prog->Instructions + numInst, 1);
2768770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      state->prog->Instructions[numInst].Opcode = OPCODE_END;
2769770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
2770770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumInstructions++;
2771770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
2772c2ee82d6931ad180334b2fcb0028050d65cdd40dIan Romanick   state->prog->NumParameters = state->prog->Parameters->NumParameters;
2773dca6a28a14f22d77273d79d44f57b0d853c0242dMathias Fröhlich   state->prog->NumAttributes = _mesa_bitcount_64(state->prog->InputsRead);
2774c2ee82d6931ad180334b2fcb0028050d65cdd40dIan Romanick
2775770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   /*
2776770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * Initialize native counts to logical counts.  The device driver may
2777770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    * change them if program is translated into a hardware program.
2778770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick    */
2779770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumNativeInstructions = state->prog->NumInstructions;
2780770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumNativeTemporaries = state->prog->NumTemporaries;
2781770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumNativeParameters = state->prog->NumParameters;
2782770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumNativeAttributes = state->prog->NumAttributes;
2783770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   state->prog->NumNativeAddressRegs = state->prog->NumAddressRegs;
2784770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
278594b45567047fd681666f261f1ad0164049f0491aIan Romanick   result = GL_TRUE;
278694b45567047fd681666f261f1ad0164049f0491aIan Romanick
278794b45567047fd681666f261f1ad0164049f0491aIan Romanickerror:
278894b45567047fd681666f261f1ad0164049f0491aIan Romanick   for (inst = state->inst_head; inst != NULL; inst = temp) {
278994b45567047fd681666f261f1ad0164049f0491aIan Romanick      temp = inst->next;
279032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(inst);
279194b45567047fd681666f261f1ad0164049f0491aIan Romanick   }
279294b45567047fd681666f261f1ad0164049f0491aIan Romanick
279394b45567047fd681666f261f1ad0164049f0491aIan Romanick   state->inst_head = NULL;
279494b45567047fd681666f261f1ad0164049f0491aIan Romanick   state->inst_tail = NULL;
279594b45567047fd681666f261f1ad0164049f0491aIan Romanick
279694b45567047fd681666f261f1ad0164049f0491aIan Romanick   for (sym = state->sym; sym != NULL; sym = temp) {
279794b45567047fd681666f261f1ad0164049f0491aIan Romanick      temp = sym->next;
279894b45567047fd681666f261f1ad0164049f0491aIan Romanick
279932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free((void *) sym->name);
280032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg      free(sym);
280194b45567047fd681666f261f1ad0164049f0491aIan Romanick   }
280294b45567047fd681666f261f1ad0164049f0491aIan Romanick   state->sym = NULL;
280394b45567047fd681666f261f1ad0164049f0491aIan Romanick
280494b45567047fd681666f261f1ad0164049f0491aIan Romanick   _mesa_symbol_table_dtor(state->st);
280594b45567047fd681666f261f1ad0164049f0491aIan Romanick   state->st = NULL;
280694b45567047fd681666f261f1ad0164049f0491aIan Romanick
280794b45567047fd681666f261f1ad0164049f0491aIan Romanick   return result;
2808770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
2809