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 "main/glheader.h"
25269f16cd96fdbee5d178130171b4ef40258f61cfNeil Roberts#include "main/imports.h"
26ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_instruction.h"
27ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_statevars.h"
28ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/symbol_table.h"
29ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/program_parser.h"
30ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/program_parse.tab.h"
31770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
32770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define require_ARB_vp (yyextra->mode == ARB_vertex)
33770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define require_ARB_fp (yyextra->mode == ARB_fragment)
34ede0cd4d8c8eb8c6c443c84905138091944d69afIan Romanick#define require_NV_fp  (yyextra->option.NV_fragment)
351edd13bf23c7a9dad00420f519a35f75b27e853bIan Romanick#define require_shadow (yyextra->option.Shadow)
3688018e2e073909ae807f16707f2701e068900926Ian Romanick#define require_rect   (yyextra->option.TexRect)
37aafd5762593aa01f2d612f4d769d1af383422c1cIan Romanick#define require_texarray        (yyextra->option.TexArray)
38770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
39970823978c2f7d2cf0757aa6ddbd6289b34c476fMichal Krol#ifndef HAVE_UNISTD_H
40970823978c2f7d2cf0757aa6ddbd6289b34c476fMichal Krol#define YY_NO_UNISTD_H
41970823978c2f7d2cf0757aa6ddbd6289b34c476fMichal Krol#endif
42970823978c2f7d2cf0757aa6ddbd6289b34c476fMichal Krol
43770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define return_token_or_IDENTIFIER(condition, token)	\
44770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   do {							\
45770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (condition) {					\
46770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 return token;					\
47770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      } else {						\
48731810f8546174e45c717b0a9aa289a26593dfa0Ian Romanick	 return handle_ident(yyextra, yytext, yylval);	\
49770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }							\
50770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   } while (0)
51770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
52770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define return_token_or_DOT(condition, token)		\
53770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   do {							\
54770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if (condition) {					\
55770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 return token;					\
56770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      } else {						\
57770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 yyless(1);					\
58770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 return DOT;					\
59770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }							\
60770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   } while (0)
61770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
62770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
63d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick#define return_opcode(condition, token, opcode, len)	\
64770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   do {							\
65d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick      if (condition &&					\
66d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick	  _mesa_parse_instruction_suffix(yyextra,	\
67d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick					 yytext + len,	\
68d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick					 & yylval->temp_inst)) {	\
69770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 yylval->temp_inst.Opcode = OPCODE_ ## opcode;	\
70770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 return token;					\
71770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      } else {						\
72731810f8546174e45c717b0a9aa289a26593dfa0Ian Romanick	 return handle_ident(yyextra, yytext, yylval);	\
73770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }							\
74770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   } while (0)
75770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
76770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define SWIZZLE_INVAL  MAKE_SWIZZLE4(SWIZZLE_NIL, SWIZZLE_NIL, \
77770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick				     SWIZZLE_NIL, SWIZZLE_NIL)
78770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
79770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic unsigned
80770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickmask_from_char(char c)
81770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
82770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   switch (c) {
83770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'x':
84770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'r':
85770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return WRITEMASK_X;
86770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'y':
87770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'g':
88770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return WRITEMASK_Y;
89770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'z':
90770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'b':
91770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return WRITEMASK_Z;
92770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'w':
93770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'a':
94770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return WRITEMASK_W;
95770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
96770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
97770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return 0;
98770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
99770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstatic unsigned
101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickswiz_from_char(char c)
102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   switch (c) {
104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'x':
105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'r':
106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return SWIZZLE_X;
107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'y':
108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'g':
109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return SWIZZLE_Y;
110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'z':
111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'b':
112770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return SWIZZLE_Z;
113770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'w':
114770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   case 'a':
115770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return SWIZZLE_W;
116770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
117770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
118770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return 0;
119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
1210e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanickstatic int
1220e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanickhandle_ident(struct asm_parser_state *state, const char *text, YYSTYPE *lval)
1230e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick{
1244e4c2ee1fd574d1d651c559f46afb6ca5487156dIan Romanick   lval->string = strdup(text);
1250e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick
1260e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick   return (_mesa_symbol_table_find_symbol(state->st, 0, text) == NULL)
1270e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick      ? IDENTIFIER : USED_IDENTIFIER;
1280e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick}
1290e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick
130770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YY_USER_ACTION							\
131770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   do {									\
132770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      yylloc->first_column = yylloc->last_column;			\
133770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      yylloc->last_column += yyleng;					\
134770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      if ((yylloc->first_line == 1)					\
135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	  && (yylloc->first_column == 1)) {				\
136770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 yylloc->position = 1;						\
137770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      } else {								\
138770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick	 yylloc->position += yylloc->last_column - yylloc->first_column; \
139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      }									\
140770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   } while(0);
141770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
142b4a08a0d87908b024a3d2595073b1beb6eda161eCarl Worth#define YY_NO_INPUT
143b4a08a0d87908b024a3d2595073b1beb6eda161eCarl Worth
144b4a08a0d87908b024a3d2595073b1beb6eda161eCarl Worth/* Yes, this is intentionally doing nothing. We have this line of code
145b4a08a0d87908b024a3d2595073b1beb6eda161eCarl Worthhere only to avoid the compiler complaining about an unput function
146b4a08a0d87908b024a3d2595073b1beb6eda161eCarl Worththat is defined, but never called. */
147b4a08a0d87908b024a3d2595073b1beb6eda161eCarl Worth#define YY_USER_INIT while (0) { unput(0); }
148b4a08a0d87908b024a3d2595073b1beb6eda161eCarl Worth
149770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#define YY_EXTRA_TYPE struct asm_parser_state *
1503c716a7ec2cabfc18a2506f9db655406f8c64fb0Carl Worth
1513c716a7ec2cabfc18a2506f9db655406f8c64fb0Carl Worth/* Flex defines a couple of functions with no declarations nor the
1523c716a7ec2cabfc18a2506f9db655406f8c64fb0Carl Worthstatic keyword. Declare them here to avoid a compiler warning. */
1533c716a7ec2cabfc18a2506f9db655406f8c64fb0Carl Worthint yyget_column  (yyscan_t yyscanner);
1543c716a7ec2cabfc18a2506f9db655406f8c64fb0Carl Worthvoid yyset_column (int  column_no , yyscan_t yyscanner);
1553c716a7ec2cabfc18a2506f9db655406f8c64fb0Carl Worth
156770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%}
157770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
158770cebbc29863ae944a31463ee4bdeb789105abaIan Romanicknum    [0-9]+
159770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickexp    [Ee][-+]?[0-9]+
160770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickfrac   "."[0-9]+
161770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickdot    "."[ \t]*
162770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
163d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanicksz     [HRX]?
164d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanickszf    [HR]?
165d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanickcc     C?
166d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanicksat    (_SAT)?
167d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
168a834381506d5be80251953666198fc3b9bc4b731Dave Airlie%option prefix="_mesa_program_"
169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%option bison-bridge bison-locations reentrant noyywrap
170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%%
171770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
172770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick"!!ARBvp1.0"              { return ARBvp_10; }
173770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick"!!ARBfp1.0"              { return ARBfp_10; }
174770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickADDRESS                   {
175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->integer = at_address;
176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return_token_or_IDENTIFIER(require_ARB_vp, ADDRESS);
177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
178770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickALIAS                     { return ALIAS; }
179770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickATTRIB                    { return ATTRIB; }
180770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickEND                       { return END; }
181770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickOPTION                    { return OPTION; }
182770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickOUTPUT                    { return OUTPUT; }
183770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickPARAM                     { return PARAM; }
184770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickTEMP                      { yylval->integer = at_temp; return TEMP; }
185770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
186d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickABS{sz}{cc}{sat}   { return_opcode(             1, VECTOR_OP, ABS, 3); }
187d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickADD{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, ADD, 3); }
188d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickARL                { return_opcode(require_ARB_vp, ARL, ARL, 3); }
189d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
190d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickCMP{sat}           { return_opcode(require_ARB_fp, TRI_OP, CMP, 3); }
191d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickCOS{szf}{cc}{sat}  { return_opcode(require_ARB_fp, SCALAR_OP, COS, 3); }
192d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
193d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickDDX{szf}{cc}{sat}  { return_opcode(require_NV_fp,  VECTOR_OP, DDX, 3); }
194d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickDDY{szf}{cc}{sat}  { return_opcode(require_NV_fp,  VECTOR_OP, DDY, 3); }
195d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickDP3{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, DP3, 3); }
196d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickDP4{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, DP4, 3); }
197d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickDPH{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, DPH, 3); }
198d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickDST{szf}{cc}{sat}  { return_opcode(             1, BIN_OP, DST, 3); }
199d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
200d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickEX2{szf}{cc}{sat}  { return_opcode(             1, SCALAR_OP, EX2, 3); }
201d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickEXP                { return_opcode(require_ARB_vp, SCALAR_OP, EXP, 3); }
202d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
203d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickFLR{sz}{cc}{sat}   { return_opcode(             1, VECTOR_OP, FLR, 3); }
204d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickFRC{sz}{cc}{sat}   { return_opcode(             1, VECTOR_OP, FRC, 3); }
205d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
206d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickKIL                { return_opcode(require_ARB_fp, KIL, KIL, 3); }
207d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
208d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickLIT{szf}{cc}{sat}  { return_opcode(             1, VECTOR_OP, LIT, 3); }
209d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickLG2{szf}{cc}{sat}  { return_opcode(             1, SCALAR_OP, LG2, 3); }
210d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickLOG                { return_opcode(require_ARB_vp, SCALAR_OP, LOG, 3); }
211d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickLRP{sz}{cc}{sat}   { return_opcode(require_ARB_fp, TRI_OP, LRP, 3); }
212d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
213d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickMAD{sz}{cc}{sat}   { return_opcode(             1, TRI_OP, MAD, 3); }
214d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickMAX{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, MAX, 3); }
215d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickMIN{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, MIN, 3); }
216d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickMOV{sz}{cc}{sat}   { return_opcode(             1, VECTOR_OP, MOV, 3); }
217d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickMUL{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, MUL, 3); }
218d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
219d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickPK2H               { return_opcode(require_NV_fp,  VECTOR_OP, PK2H, 4); }
220d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickPK2US              { return_opcode(require_NV_fp,  VECTOR_OP, PK2US, 5); }
221d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickPK4B               { return_opcode(require_NV_fp,  VECTOR_OP, PK4B, 4); }
222d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickPK4UB              { return_opcode(require_NV_fp,  VECTOR_OP, PK4UB, 5); }
223d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickPOW{szf}{cc}{sat}  { return_opcode(             1, BINSC_OP, POW, 3); }
224d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
225d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickRCP{szf}{cc}{sat}  { return_opcode(             1, SCALAR_OP, RCP, 3); }
226d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickRFL{szf}{cc}{sat}  { return_opcode(require_NV_fp,  BIN_OP,    RFL, 3); }
227d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickRSQ{szf}{cc}{sat}  { return_opcode(             1, SCALAR_OP, RSQ, 3); }
228d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
229d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSCS{sat}           { return_opcode(require_ARB_fp, SCALAR_OP, SCS, 3); }
230d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSEQ{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, SEQ, 3); }
231d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSFL{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, SFL, 3); }
232d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSGE{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, SGE, 3); }
233d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSGT{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, SGT, 3); }
234d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSIN{szf}{cc}{sat}  { return_opcode(require_ARB_fp, SCALAR_OP, SIN, 3); }
235d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSLE{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, SLE, 3); }
236d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSLT{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, SLT, 3); }
237d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSNE{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, SNE, 3); }
238d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSTR{sz}{cc}{sat}   { return_opcode(require_NV_fp,  BIN_OP, STR, 3); }
239d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSUB{sz}{cc}{sat}   { return_opcode(             1, BIN_OP, SUB, 3); }
240d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickSWZ{sat}           { return_opcode(             1, SWZ, SWZ, 3); }
241d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
242d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickTEX{cc}{sat}       { return_opcode(require_ARB_fp, SAMPLE_OP, TEX, 3); }
243d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickTXB{cc}{sat}       { return_opcode(require_ARB_fp, SAMPLE_OP, TXB, 3); }
244d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickTXD{cc}{sat}       { return_opcode(require_NV_fp,  TXD_OP, TXD, 3); }
245d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickTXP{cc}{sat}       { return_opcode(require_ARB_fp, SAMPLE_OP, TXP, 3); }
246d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
247d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickUP2H{cc}{sat}      { return_opcode(require_NV_fp,  SCALAR_OP, UP2H, 4); }
248d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickUP2US{cc}{sat}     { return_opcode(require_NV_fp,  SCALAR_OP, UP2US, 5); }
24909af58d7ed7dfa8f2ce2b881bb849064e136c830Ian RomanickUP4B{cc}{sat}      { return_opcode(require_NV_fp,  SCALAR_OP, UP4B, 4); }
25009af58d7ed7dfa8f2ce2b881bb849064e136c830Ian RomanickUP4UB{cc}{sat}     { return_opcode(require_NV_fp,  SCALAR_OP, UP4UB, 5); }
251d0adebb8d5ef680590b0f281a20516318c0b8b62Ian Romanick
252d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickX2D{szf}{cc}{sat}  { return_opcode(require_NV_fp,  TRI_OP, X2D, 3); }
253d0adebb8d5ef680590b0f281a20516318c0b8b62Ian RomanickXPD{sat}           { return_opcode(             1, BIN_OP, XPD, 3); }
254770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
255770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvertex                    { return_token_or_IDENTIFIER(require_ARB_vp, VERTEX); }
256770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickfragment                  { return_token_or_IDENTIFIER(require_ARB_fp, FRAGMENT); }
257770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickprogram                   { return PROGRAM; }
258770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickstate                     { return STATE; }
259770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickresult                    { return RESULT; }
260770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
261770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}ambient              { return AMBIENT; }
262cbe4133109c95fa6b90d8a601c78f043db456809Ian Romanick{dot}attenuation          { return ATTENUATION; }
263770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}back                 { return BACK; }
264770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}clip                 { return_token_or_DOT(require_ARB_vp, CLIP); }
265770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}color                { return COLOR; }
266770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}depth                { return_token_or_DOT(require_ARB_fp, DEPTH); }
267770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}diffuse              { return DIFFUSE; }
268770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}direction            { return DIRECTION; }
269770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}emission             { return EMISSION; }
270770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}env                  { return ENV; }
271770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}eye                  { return EYE; }
272770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}fogcoord             { return FOGCOORD; }
273770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}fog                  { return FOG; }
274770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}front                { return FRONT; }
275770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}half                 { return HALF; }
276770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}inverse              { return INVERSE; }
277770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}invtrans             { return INVTRANS; }
278770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}light                { return LIGHT; }
279770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}lightmodel           { return LIGHTMODEL; }
280770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}lightprod            { return LIGHTPROD; }
281770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}local                { return LOCAL; }
282770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}material             { return MATERIAL; }
283770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}program              { return MAT_PROGRAM; }
284770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}matrix               { return MATRIX; }
285770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}matrixindex          { return_token_or_DOT(require_ARB_vp, MATRIXINDEX); }
286770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}modelview            { return MODELVIEW; }
287770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}mvp                  { return MVP; }
288770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}normal               { return_token_or_DOT(require_ARB_vp, NORMAL); }
289770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}object               { return OBJECT; }
290770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}palette              { return PALETTE; }
291770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}params               { return PARAMS; }
292770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}plane                { return PLANE; }
2933fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian Paul{dot}point                { return_token_or_DOT(require_ARB_vp, POINT_TOK); }
294770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}pointsize            { return_token_or_DOT(require_ARB_vp, POINTSIZE); }
295770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}position             { return POSITION; }
296770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}primary              { return PRIMARY; }
297770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}projection           { return PROJECTION; }
298770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}range                { return_token_or_DOT(require_ARB_fp, RANGE); }
299770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}row                  { return ROW; }
300770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}scenecolor           { return SCENECOLOR; }
301770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}secondary            { return SECONDARY; }
302770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}shininess            { return SHININESS; }
3033fedd08779c2bc4a5f02c035e7ca4cab5da649ddBrian Paul{dot}size                 { return_token_or_DOT(require_ARB_vp, SIZE_TOK); }
304770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}specular             { return SPECULAR; }
305770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}spot                 { return SPOT; }
306770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}texcoord             { return TEXCOORD; }
307770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}texenv               { return_token_or_DOT(require_ARB_fp, TEXENV); }
308770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}texgen               { return_token_or_DOT(require_ARB_vp, TEXGEN); }
309770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}q                    { return_token_or_DOT(require_ARB_vp, TEXGEN_Q); }
310770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}s                    { return_token_or_DOT(require_ARB_vp, TEXGEN_S); }
311770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}t                    { return_token_or_DOT(require_ARB_vp, TEXGEN_T); }
312770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}texture              { return TEXTURE; }
313770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}transpose            { return TRANSPOSE; }
314770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}attrib               { return_token_or_DOT(require_ARB_vp, VTXATTRIB); }
315770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{dot}weight               { return_token_or_DOT(require_ARB_vp, WEIGHT); }
316770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
317770cebbc29863ae944a31463ee4bdeb789105abaIan Romanicktexture                   { return_token_or_IDENTIFIER(require_ARB_fp, TEXTURE_UNIT); }
318770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick1D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_1D); }
319770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick2D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_2D); }
320770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick3D                        { return_token_or_IDENTIFIER(require_ARB_fp, TEX_3D); }
321770cebbc29863ae944a31463ee4bdeb789105abaIan RomanickCUBE                      { return_token_or_IDENTIFIER(require_ARB_fp, TEX_CUBE); }
32288018e2e073909ae807f16707f2701e068900926Ian RomanickRECT                      { return_token_or_IDENTIFIER(require_ARB_fp && require_rect, TEX_RECT); }
3231edd13bf23c7a9dad00420f519a35f75b27e853bIan RomanickSHADOW1D                  { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow, TEX_SHADOW1D); }
3241edd13bf23c7a9dad00420f519a35f75b27e853bIan RomanickSHADOW2D                  { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow, TEX_SHADOW2D); }
3251edd13bf23c7a9dad00420f519a35f75b27e853bIan RomanickSHADOWRECT                { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow && require_rect, TEX_SHADOWRECT); }
326aafd5762593aa01f2d612f4d769d1af383422c1cIan RomanickARRAY1D                   { return_token_or_IDENTIFIER(require_ARB_fp && require_texarray, TEX_ARRAY1D); }
327aafd5762593aa01f2d612f4d769d1af383422c1cIan RomanickARRAY2D                   { return_token_or_IDENTIFIER(require_ARB_fp && require_texarray, TEX_ARRAY2D); }
328aafd5762593aa01f2d612f4d769d1af383422c1cIan RomanickARRAYSHADOW1D             { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow && require_texarray, TEX_ARRAYSHADOW1D); }
329aafd5762593aa01f2d612f4d769d1af383422c1cIan RomanickARRAYSHADOW2D             { return_token_or_IDENTIFIER(require_ARB_fp && require_shadow && require_texarray, TEX_ARRAYSHADOW2D); }
330770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
3310e7953366f2a8ab1b0e885d94f6635c7640b3cc7Ian Romanick[_a-zA-Z$][_a-zA-Z0-9$]*  { return handle_ident(yyextra, yytext, yylval); }
332770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
333770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".."                      { return DOT_DOT; }
334770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
335770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{num}                     {
336770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->integer = strtol(yytext, NULL, 10);
337770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return INTEGER;
338770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
339770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{num}?{frac}{exp}?        {
340346298c7658f2ec8b105e5e53101637af232724fMarcin Baczyński   yylval->real = _mesa_strtof(yytext, NULL);
341770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return REAL;
342770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
343770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{num}"."/[^.]             {
344346298c7658f2ec8b105e5e53101637af232724fMarcin Baczyński   yylval->real = _mesa_strtof(yytext, NULL);
345770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return REAL;
346770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
347770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{num}{exp}                {
348346298c7658f2ec8b105e5e53101637af232724fMarcin Baczyński   yylval->real = _mesa_strtof(yytext, NULL);
349770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return REAL;
350770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
351770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{num}"."{exp}             {
352346298c7658f2ec8b105e5e53101637af232724fMarcin Baczyński   yylval->real = _mesa_strtof(yytext, NULL);
353770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return REAL;
354770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
355770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
356770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".xyzw"                   {
357770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_NOOP;
358770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_XYZW;
359770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return MASK4;
360770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
361770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
362770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".xy"[zw]                 {
363770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
364770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_XY
365770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      | mask_from_char(yytext[3]);
366770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return MASK3;
367770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
368770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".xzw"                    {
369770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
370770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_XZW;
371770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return MASK3;
372770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
373770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".yzw"                    {
374770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
375770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_YZW;
376770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return MASK3;
377770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
378770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
379770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".x"[yzw]                 {
380770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
381770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_X
382770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      | mask_from_char(yytext[2]);
383770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return MASK2;
384770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
385770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".y"[zw]                  {
386770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
387770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_Y
388770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      | mask_from_char(yytext[2]);
389770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return MASK2;
390770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
391770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".zw"                     {
392770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
393770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_ZW;
394770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return MASK2;
395770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
396770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
397770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick"."[xyzw]                 {
398770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   const unsigned s = swiz_from_char(yytext[1]);
399770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(s, s, s, s);
400770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = mask_from_char(yytext[1]);
401770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return MASK1;
402770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
403770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
404770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick"."[xyzw]{4}              {
405770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(swiz_from_char(yytext[1]),
406770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick					    swiz_from_char(yytext[2]),
407770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick					    swiz_from_char(yytext[3]),
408770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick					    swiz_from_char(yytext[4]));
409770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = 0;
410770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return SWIZZLE;
411770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
412770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
413770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".rgba"                   {
414770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_NOOP;
415770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_XYZW;
416770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return_token_or_DOT(require_ARB_fp, MASK4);
417770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
418770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
419770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".rg"[ba]                 {
420770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
421770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_XY
422770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      | mask_from_char(yytext[3]);
423770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return_token_or_DOT(require_ARB_fp, MASK3);
424770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
425770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".rba"                    {
426770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
427770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_XZW;
428770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return_token_or_DOT(require_ARB_fp, MASK3);
429770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
430770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".gba"                    {
431770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
432770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_YZW;
433770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return_token_or_DOT(require_ARB_fp, MASK3);
434770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
435770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
436770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".r"[gba]                 {
437770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
438770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_X
439770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      | mask_from_char(yytext[2]);
440770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return_token_or_DOT(require_ARB_fp, MASK2);
441770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
442770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".g"[ba]                  {
443770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
444770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_Y
445770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      | mask_from_char(yytext[2]);
446770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return_token_or_DOT(require_ARB_fp, MASK2);
447770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
448770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".ba"                     {
449770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = SWIZZLE_INVAL;
450770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = WRITEMASK_ZW;
451770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return_token_or_DOT(require_ARB_fp, MASK2);
452770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
453770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
454770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick"."[gba]                  {
455770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   const unsigned s = swiz_from_char(yytext[1]);
456770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(s, s, s, s);
457770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = mask_from_char(yytext[1]);
458770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return_token_or_DOT(require_ARB_fp, MASK1);
459770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
460770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
461770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
462770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick".r"                      {
463770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   if (require_ARB_vp) {
464770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return TEXGEN_R;
465770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   } else {
466770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X,
467770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick						SWIZZLE_X, SWIZZLE_X);
468770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      yylval->swiz_mask.mask = WRITEMASK_X;
469770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick      return MASK1;
470770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   }
471770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
472770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
473770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick"."[rgba]{4}              {
474770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.swizzle = MAKE_SWIZZLE4(swiz_from_char(yytext[1]),
475770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick					    swiz_from_char(yytext[2]),
476770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick					    swiz_from_char(yytext[3]),
477770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick					    swiz_from_char(yytext[4]));
478770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylval->swiz_mask.mask = 0;
479770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   return_token_or_DOT(require_ARB_fp, SWIZZLE);
480770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
481770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
482770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick"."                       { return DOT; }
483770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
484770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick\n                        {
485770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylloc->first_line++;
486770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylloc->first_column = 1;
487770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylloc->last_line++;
488770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylloc->last_column = 1;
489770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylloc->position++;
490770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
4919b70c33e735ff060ddad7d0b501d19c670f41618Ian Romanick[ \t\r]+                  /* eat whitespace */ ;
492770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#.*$                      /* eat comments */ ;
493770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick.                         { return yytext[0]; }
494770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick%%
495770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
496770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
497770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_program_lexer_ctor(void **scanner, struct asm_parser_state *state,
498770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick			 const char *string, size_t len)
499770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
500770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylex_init_extra(state, scanner);
501770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yy_scan_bytes(string, len, *scanner);
502770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
503770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick
504770cebbc29863ae944a31463ee4bdeb789105abaIan Romanickvoid
505770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick_mesa_program_lexer_dtor(void *scanner)
506770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick{
507770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick   yylex_destroy(scanner);
508770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick}
509