1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**************************************************************************
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the
8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including
9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish,
10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to
11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to
12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions:
13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the
15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h"
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h"
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_prim.h"
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h"
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_inlines.h"
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_text.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_build.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_info.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_parse.h"
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_sanity.h"
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_strings.h"
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_util.h"
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "tgsi_dump.h"
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean is_alpha_underscore( const char *cur )
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*cur >= 'a' && *cur <= 'z') ||
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*cur >= 'A' && *cur <= 'Z') ||
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *cur == '_';
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean is_digit( const char *cur )
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return *cur >= '0' && *cur <= '9';
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean is_digit_alpha_underscore( const char *cur )
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return is_digit( cur ) || is_alpha_underscore( cur );
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic char uprcase( char c )
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c >= 'a' && c <= 'z')
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return c + 'A' - 'a';
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return c;
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Ignore case of str1 and assume str1 is already uppercase.
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return TRUE iff str1 and str2 are equal.
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstreq_nocase_uprcase(const char *str1,
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     const char *str2)
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (*str1 && *str2) {
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*str1 != uprcase(*str2))
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      str1++;
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      str2++;
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return *str1 == 0 && *str2 == 0;
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Return TRUE if both strings match.
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The second string is terminated by zero.
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The pointer to the first string is moved at end of the read word
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on success.
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean str_match_no_case( const char **pcur, const char *str )
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = *pcur;
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (*str != '\0' && *str == uprcase( *cur )) {
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      str++;
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*str == '\0') {
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *pcur = cur;
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Return TRUE if both strings match.
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The first string is be terminated by a non-digit non-letter non-underscore
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * character, the second string is terminated by zero.
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The pointer to the first string is moved at end of the read word
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * on success.
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean str_match_nocase_whole( const char **pcur, const char *str )
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = *pcur;
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (str_match_no_case(&cur, str) &&
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       !is_digit_alpha_underscore(cur)) {
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *pcur = cur;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Eat zero or more whitespaces.
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void eat_opt_white( const char **pcur )
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (**pcur == ' ' || **pcur == '\t' || **pcur == '\n')
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (*pcur)++;
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Eat one or more whitespaces.
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return TRUE if at least one whitespace eaten.
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean eat_white( const char **pcur )
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = *pcur;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( pcur );
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return *pcur > cur;
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse unsigned integer.
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * No checks for overflow.
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_uint( const char **pcur, uint *val )
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = *pcur;
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (is_digit( cur )) {
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *val = *cur++ - '0';
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      while (is_digit( cur ))
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *val = *val * 10 + *cur++ - '0';
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *pcur = cur;
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_int( const char **pcur, int *val )
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = *pcur;
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int sign = (*cur == '-' ? -1 : 1);
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*cur == '+' || *cur == '-')
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (parse_uint(&cur, (uint *)val)) {
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *val *= sign;
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *pcur = cur;
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_identifier( const char **pcur, char *ret )
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = *pcur;
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int i = 0;
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (is_alpha_underscore( cur )) {
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret[i++] = *cur++;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      while (is_alpha_underscore( cur ) || is_digit( cur ))
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ret[i++] = *cur++;
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ret[i++] = '\0';
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *pcur = cur;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse floating point.
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_float( const char **pcur, float *val )
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = *pcur;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean integral_part = FALSE;
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean fractional_part = FALSE;
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *val = (float) atof( cur );
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*cur == '-' || *cur == '+')
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (is_digit( cur )) {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      integral_part = TRUE;
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      while (is_digit( cur ))
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur++;
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*cur == '.') {
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (is_digit( cur )) {
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur++;
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         fractional_part = TRUE;
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         while (is_digit( cur ))
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            cur++;
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!integral_part && !fractional_part)
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (uprcase( *cur ) == 'E') {
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*cur == '-' || *cur == '+')
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur++;
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (is_digit( cur )) {
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur++;
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         while (is_digit( cur ))
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            cur++;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *pcur = cur;
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct translate_ctx
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *text;
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur;
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_token *tokens;
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_token *tokens_cur;
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_token *tokens_end;
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_header *header;
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned processor : 4;
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int implied_array_size : 5;
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void report_error( struct translate_ctx *ctx, const char *msg )
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int line = 1;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int column = 1;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *itr = ctx->text;
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (itr != ctx->cur) {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*itr == '\n') {
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         column = 1;
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++line;
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++column;
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++itr;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   debug_printf( "\nTGSI asm error: %s [%d : %d] \n", msg, line, column );
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse shader header.
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return TRUE for one of the following headers.
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    FRAG
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    GEOM
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    VERT
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_header( struct translate_ctx *ctx )
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint processor;
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (str_match_nocase_whole( &ctx->cur, "FRAG" ))
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      processor = TGSI_PROCESSOR_FRAGMENT;
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (str_match_nocase_whole( &ctx->cur, "VERT" ))
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      processor = TGSI_PROCESSOR_VERTEX;
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (str_match_nocase_whole( &ctx->cur, "GEOM" ))
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      processor = TGSI_PROCESSOR_GEOMETRY;
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (str_match_nocase_whole( &ctx->cur, "COMP" ))
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      processor = TGSI_PROCESSOR_COMPUTE;
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Unknown header" );
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->tokens_cur >= ctx->tokens_end)
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->header = (struct tgsi_header *) ctx->tokens_cur++;
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *ctx->header = tgsi_build_header();
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->tokens_cur >= ctx->tokens_end)
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *(struct tgsi_processor *) ctx->tokens_cur++ = tgsi_build_processor( processor, ctx->header );
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->processor = processor;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_label( struct translate_ctx *ctx, uint *val )
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = ctx->cur;
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (parse_uint( &cur, val )) {
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &cur );
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*cur == ':') {
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur++;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->cur = cur;
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return TRUE;
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_file( const char **pcur, uint *file )
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint i;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < TGSI_FILE_COUNT; i++) {
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const char *cur = *pcur;
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (str_match_nocase_whole( &cur, tgsi_file_names[i] )) {
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *pcur = cur;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *file = i;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return TRUE;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_opt_writemask(
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint *writemask )
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur;
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cur = ctx->cur;
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &cur );
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*cur == '.') {
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *writemask = TGSI_WRITEMASK_NONE;
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &cur );
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (uprcase( *cur ) == 'X') {
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur++;
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *writemask |= TGSI_WRITEMASK_X;
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (uprcase( *cur ) == 'Y') {
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur++;
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *writemask |= TGSI_WRITEMASK_Y;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (uprcase( *cur ) == 'Z') {
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur++;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *writemask |= TGSI_WRITEMASK_Z;
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (uprcase( *cur ) == 'W') {
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur++;
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *writemask |= TGSI_WRITEMASK_W;
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*writemask == TGSI_WRITEMASK_NONE) {
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Writemask expected" );
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur = cur;
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *writemask = TGSI_WRITEMASK_XYZW;
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* <register_file_bracket> ::= <file> `['
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_file_bracket(
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint *file )
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_file( &ctx->cur, file )) {
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Unknown register file" );
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*ctx->cur != '[') {
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Expected `['" );
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->cur++;
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* <register_file_bracket_index> ::= <register_file_bracket> <uint>
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_file_bracket_index(
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint *file,
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int *index )
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint uindex;
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_file_bracket( ctx, file ))
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_uint( &ctx->cur, &uindex )) {
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Expected literal unsigned integer" );
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *index = (int) uindex;
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse simple 1d register operand.
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    <register_dst> ::= <register_file_bracket_index> `]'
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_1d(struct translate_ctx *ctx,
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  uint *file,
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  int *index )
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_file_bracket_index( ctx, file, index ))
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*ctx->cur != ']') {
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Expected `]'" );
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->cur++;
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct parsed_bracket {
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int index;
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint ind_file;
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int ind_index;
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint ind_comp;
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_bracket(
448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct parsed_bracket *brackets)
450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur;
452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint uindex;
453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(brackets, 0, sizeof(struct parsed_bracket));
455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cur = ctx->cur;
459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (parse_file( &cur, &brackets->ind_file )) {
460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_register_1d( ctx, &brackets->ind_file,
461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                              &brackets->ind_index ))
462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &ctx->cur );
464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*ctx->cur == '.') {
466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->cur++;
467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         eat_opt_white(&ctx->cur);
468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         switch (uprcase(*ctx->cur)) {
470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 'X':
471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            brackets->ind_comp = TGSI_SWIZZLE_X;
472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 'Y':
474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            brackets->ind_comp = TGSI_SWIZZLE_Y;
475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 'Z':
477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            brackets->ind_comp = TGSI_SWIZZLE_Z;
478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         case 'W':
480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            brackets->ind_comp = TGSI_SWIZZLE_W;
481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         default:
483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            report_error(ctx, "Expected indirect register swizzle component `x', `y', `z' or `w'");
484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->cur++;
487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         eat_opt_white(&ctx->cur);
488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*ctx->cur == '+' || *ctx->cur == '-')
491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         parse_int( &ctx->cur, &brackets->index );
492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         brackets->index = 0;
494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_uint( &ctx->cur, &uindex )) {
497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Expected literal unsigned integer" );
498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brackets->index = (int) uindex;
501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brackets->ind_file = TGSI_FILE_NULL;
502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brackets->ind_index = 0;
503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*ctx->cur != ']') {
506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Expected `]'" );
507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->cur++;
510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_opt_register_src_bracket(
515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct parsed_bracket *brackets,
517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int *parsed_brackets)
518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = ctx->cur;
520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *parsed_brackets = 0;
522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &cur );
524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (cur[0] == '[') {
525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++cur;
526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur = cur;
527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_register_bracket(ctx, brackets))
529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *parsed_brackets = 1;
532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse source register operand.
539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    <register_src> ::= <register_file_bracket_index> `]' |
540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                       <register_file_bracket> <register_dst> [`.' (`x' | `y' | `z' | `w')] `]' |
541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                       <register_file_bracket> <register_dst> [`.' (`x' | `y' | `z' | `w')] `+' <uint> `]' |
542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                       <register_file_bracket> <register_dst> [`.' (`x' | `y' | `z' | `w')] `-' <uint> `]'
543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_src(
546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint *file,
548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct parsed_bracket *brackets)
549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brackets->ind_comp = TGSI_SWIZZLE_X;
551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_file_bracket( ctx, file ))
552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_bracket( ctx, brackets ))
554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       return FALSE;
555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct parsed_dcl_bracket {
560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint first;
561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint last;
562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org};
563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_dcl_bracket(
566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct parsed_dcl_bracket *bracket)
568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint uindex;
570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(bracket, 0, sizeof(struct parsed_dcl_bracket));
571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_uint( &ctx->cur, &uindex )) {
575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* it can be an empty bracket [] which means its range
576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * is from 0 to some implied size */
577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->cur[0] == ']' && ctx->implied_array_size != 0) {
578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         bracket->first = 0;
579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         bracket->last = ctx->implied_array_size - 1;
580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         goto cleanup;
581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Expected literal unsigned integer" );
583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   bracket->first = uindex;
586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (ctx->cur[0] == '.' && ctx->cur[1] == '.') {
590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint uindex;
591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur += 2;
593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &ctx->cur );
594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_uint( &ctx->cur, &uindex )) {
595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Expected literal integer" );
596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bracket->last = (int) uindex;
599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &ctx->cur );
600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bracket->last = bracket->first;
603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcleanup:
606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*ctx->cur != ']') {
607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Expected `]' or `..'" );
608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->cur++;
611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse register declaration.
615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *    <register_dcl> ::= <register_file_bracket_index> `]' |
616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *                       <register_file_bracket_index> `..' <index> `]'
617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_dcl(
620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint *file,
622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct parsed_dcl_bracket *brackets,
623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int *num_brackets)
624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur;
626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *num_brackets = 0;
628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_file_bracket( ctx, file ))
630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_dcl_bracket( ctx, &brackets[0] ))
632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *num_brackets = 1;
635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cur = ctx->cur;
637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &cur );
638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (cur[0] == '[') {
640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++cur;
641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur = cur;
642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_register_dcl_bracket( ctx, &brackets[1] ))
643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* for geometry shader we don't really care about
645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * the first brackets it's always the size of the
646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * input primitive. so we want to declare just
647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * the index relevant to the semantics which is in
648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * the second bracket */
649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (ctx->processor == TGSI_PROCESSOR_GEOMETRY && *file == TGSI_FILE_INPUT) {
650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         brackets[0] = brackets[1];
651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *num_brackets = 1;
652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *num_brackets = 2;
654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Parse destination register operand.*/
662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_register_dst(
664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint *file,
666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct parsed_bracket *brackets)
667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   brackets->ind_comp = TGSI_SWIZZLE_X;
669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_file_bracket( ctx, file ))
670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_bracket( ctx, brackets ))
672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       return FALSE;
673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_dst_operand(
679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_full_dst_register *dst )
681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint file;
683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint writemask;
684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur;
685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct parsed_bracket bracket[2];
686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int parsed_opt_brackets;
687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_dst( ctx, &file, &bracket[0] ))
689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_opt_register_src_bracket(ctx, &bracket[1], &parsed_opt_brackets))
691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cur = ctx->cur;
694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &cur );
695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_opt_writemask( ctx, &writemask ))
697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Register.File = file;
700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (parsed_opt_brackets) {
701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Register.Dimension = 1;
702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Dimension.Indirect = 0;
703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Dimension.Dimension = 0;
704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Dimension.Index = bracket[0].index;
705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bracket[0] = bracket[1];
706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Register.Index = bracket[0].index;
708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   dst->Register.WriteMask = writemask;
709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bracket[0].ind_file != TGSI_FILE_NULL) {
710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Register.Indirect = 1;
711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Indirect.File = bracket[0].ind_file;
712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Indirect.Index = bracket[0].ind_index;
713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Indirect.SwizzleX = bracket[0].ind_comp;
714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Indirect.SwizzleY = bracket[0].ind_comp;
715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Indirect.SwizzleZ = bracket[0].ind_comp;
716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      dst->Indirect.SwizzleW = bracket[0].ind_comp;
717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_optional_swizzle(
723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint swizzle[4],
725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean *parsed_swizzle )
726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = ctx->cur;
728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   *parsed_swizzle = FALSE;
730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &cur );
732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*cur == '.') {
733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint i;
734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &cur );
737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < 4; i++) {
738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (uprcase( *cur ) == 'X')
739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            swizzle[i] = TGSI_SWIZZLE_X;
740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (uprcase( *cur ) == 'Y')
741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            swizzle[i] = TGSI_SWIZZLE_Y;
742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (uprcase( *cur ) == 'Z')
743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            swizzle[i] = TGSI_SWIZZLE_Z;
744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (uprcase( *cur ) == 'W')
745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            swizzle[i] = TGSI_SWIZZLE_W;
746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else {
747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    report_error( ctx, "Expected register swizzle component `x', `y', `z' or `w'" );
748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    return FALSE;
749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur++;
751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *parsed_swizzle = TRUE;
753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur = cur;
754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_src_operand(
760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_full_src_register *src )
762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint file;
764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint swizzle[4];
765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean parsed_swizzle;
766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct parsed_bracket bracket[2];
767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int parsed_opt_brackets;
768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*ctx->cur == '-') {
770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur++;
771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &ctx->cur );
772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Register.Negate = 1;
773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*ctx->cur == '|') {
776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur++;
777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &ctx->cur );
778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Register.Absolute = 1;
779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_src(ctx, &file, &bracket[0]))
782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_opt_register_src_bracket(ctx, &bracket[1], &parsed_opt_brackets))
784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src->Register.File = file;
787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (parsed_opt_brackets) {
788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Register.Dimension = 1;
789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Dimension.Indirect = 0;
790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Dimension.Dimension = 0;
791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Dimension.Index = bracket[0].index;
792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      bracket[0] = bracket[1];
793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   src->Register.Index = bracket[0].index;
795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (bracket[0].ind_file != TGSI_FILE_NULL) {
796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Register.Indirect = 1;
797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Indirect.File = bracket[0].ind_file;
798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Indirect.Index = bracket[0].ind_index;
799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Indirect.SwizzleX = bracket[0].ind_comp;
800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Indirect.SwizzleY = bracket[0].ind_comp;
801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Indirect.SwizzleZ = bracket[0].ind_comp;
802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src->Indirect.SwizzleW = bracket[0].ind_comp;
803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Parse optional swizzle.
806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle )) {
808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (parsed_swizzle) {
809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src->Register.SwizzleX = swizzle[0];
810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src->Register.SwizzleY = swizzle[1];
811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src->Register.SwizzleZ = swizzle[2];
812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         src->Register.SwizzleW = swizzle[3];
813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (src->Register.Absolute) {
817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &ctx->cur );
818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*ctx->cur != '|') {
819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Expected `|'" );
820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur++;
823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmatch_inst(const char **pcur,
831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           unsigned *saturate,
832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org           const struct tgsi_opcode_info *info)
833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur = *pcur;
835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* simple case: the whole string matches the instruction name */
837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (str_match_nocase_whole(&cur, info->mnemonic)) {
838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *pcur = cur;
839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      *saturate = TGSI_SAT_NONE;
840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return TRUE;
841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (str_match_no_case(&cur, info->mnemonic)) {
844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* the instruction has a suffix, figure it out */
845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (str_match_nocase_whole(&cur, "_SAT")) {
846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *pcur = cur;
847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *saturate = TGSI_SAT_ZERO_ONE;
848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return TRUE;
849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (str_match_nocase_whole(&cur, "_SATNV")) {
852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *pcur = cur;
853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *saturate = TGSI_SAT_MINUS_PLUS_ONE;
854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return TRUE;
855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_instruction(
863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx *ctx,
864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean has_label )
865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint i;
867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint saturate = TGSI_SAT_NONE;
868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct tgsi_opcode_info *info;
869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_full_instruction inst;
870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur;
871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint advance;
872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inst = tgsi_default_full_instruction();
874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Parse predicate.
876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*ctx->cur == '(') {
879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint file;
880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      int index;
881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint swizzle[4];
882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      boolean parsed_swizzle;
883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      inst.Instruction.Predicate = 1;
885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur++;
887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*ctx->cur == '!') {
888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->cur++;
889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         inst.Predicate.Negate = 1;
890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_register_1d( ctx, &file, &index ))
893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (parse_optional_swizzle( ctx, swizzle, &parsed_swizzle )) {
896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (parsed_swizzle) {
897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            inst.Predicate.SwizzleX = swizzle[0];
898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            inst.Predicate.SwizzleY = swizzle[1];
899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            inst.Predicate.SwizzleZ = swizzle[2];
900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            inst.Predicate.SwizzleW = swizzle[3];
901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*ctx->cur != ')') {
905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Expected `)'" );
906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur++;
910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Parse instruction name.
913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < TGSI_OPCODE_LAST; i++) {
916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur = ctx->cur;
917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      info = tgsi_get_opcode_info( i );
919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (match_inst(&cur, &saturate, info)) {
920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (info->num_dst + info->num_src + info->is_tex == 0) {
921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->cur = cur;
922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         else if (*cur == '\0' || eat_white( &cur )) {
925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->cur = cur;
926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i == TGSI_OPCODE_LAST) {
931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (has_label)
932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Unknown opcode" );
933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else
934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Expected `DCL', `IMM' or a label" );
935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inst.Instruction.Opcode = i;
939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inst.Instruction.Saturate = saturate;
940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inst.Instruction.NumDstRegs = info->num_dst;
941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   inst.Instruction.NumSrcRegs = info->num_src;
942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Parse instruction operands.
944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < info->num_dst + info->num_src + info->is_tex; i++) {
946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i > 0) {
947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         eat_opt_white( &ctx->cur );
948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (*ctx->cur != ',') {
949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            report_error( ctx, "Expected `,'" );
950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->cur++;
953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         eat_opt_white( &ctx->cur );
954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i < info->num_dst) {
957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!parse_dst_operand( ctx, &inst.Dst[i] ))
958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (i < info->num_dst + info->num_src) {
961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!parse_src_operand( ctx, &inst.Src[i - info->num_dst] ))
962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else {
965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         uint j;
966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (j = 0; j < TGSI_TEXTURE_COUNT; j++) {
968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (str_match_nocase_whole( &ctx->cur, tgsi_texture_names[j] )) {
969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               inst.Instruction.Texture = 1;
970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               inst.Texture.Texture = j;
971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (j == TGSI_TEXTURE_COUNT) {
975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            report_error( ctx, "Expected texture target" );
976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cur = ctx->cur;
982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &cur );
983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (info->is_branch && *cur == ':') {
984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint target;
985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &cur );
988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_uint( &cur, &target )) {
989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Expected a label" );
990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      inst.Instruction.Label = 1;
993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      inst.Label.Label = target;
994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur = cur;
995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   advance = tgsi_build_full_instruction(
998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      &inst,
999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->tokens_cur,
1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->header,
1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (uint) (ctx->tokens_end - ctx->tokens_cur) );
1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (advance == 0)
1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->tokens_cur += advance;
1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* parses a 4-touple of the form {x, y, z, w}
1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * where x, y, z, w are numbers */
1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_immediate_data(struct translate_ctx *ctx, unsigned type,
1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                                    union tgsi_immediate_data *values)
1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   unsigned i;
1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int ret;
1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*ctx->cur != '{') {
1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Expected `{'" );
1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->cur++;
1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++) {
1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &ctx->cur );
1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i > 0) {
1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (*ctx->cur != ',') {
1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            report_error( ctx, "Expected `,'" );
1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->cur++;
1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         eat_opt_white( &ctx->cur );
1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (type) {
1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TGSI_IMM_FLOAT32:
1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ret = parse_float(&ctx->cur, &values[i].Float);
1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TGSI_IMM_UINT32:
1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ret = parse_uint(&ctx->cur, &values[i].Uint);
1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case TGSI_IMM_INT32:
1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ret = parse_int(&ctx->cur, &values[i].Int);
1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         assert(0);
1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ret = FALSE;
1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!ret) {
1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Expected immediate constant" );
1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*ctx->cur != '}') {
1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Expected `}'" );
1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->cur++;
1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_declaration( struct translate_ctx *ctx )
1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_full_declaration decl;
1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint file;
1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct parsed_dcl_bracket brackets[2];
1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int num_brackets;
1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint writemask;
1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *cur, *cur2;
1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint advance;
1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean is_vs_input;
1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   boolean is_imm_array;
1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!eat_white( &ctx->cur )) {
1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Syntax error" );
1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_register_dcl( ctx, &file, brackets, &num_brackets))
1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_opt_writemask( ctx, &writemask ))
1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   decl = tgsi_default_full_declaration();
1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   decl.Declaration.File = file;
1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   decl.Declaration.UsageMask = writemask;
1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (num_brackets == 1) {
1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      decl.Range.First = brackets[0].first;
1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      decl.Range.Last = brackets[0].last;
1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else {
1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      decl.Range.First = brackets[1].first;
1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      decl.Range.Last = brackets[1].last;
1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      decl.Declaration.Dimension = 1;
1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      decl.Dim.Index2D = brackets[0].first;
1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   is_vs_input = (file == TGSI_FILE_INPUT &&
1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ctx->processor == TGSI_PROCESSOR_VERTEX);
1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   is_imm_array = (file == TGSI_FILE_IMMEDIATE_ARRAY);
1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cur = ctx->cur;
1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &cur );
1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*cur == ',' && !is_vs_input) {
1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint i, j;
1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &cur );
1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (file == TGSI_FILE_RESOURCE) {
1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < TGSI_TEXTURE_COUNT; i++) {
1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (str_match_nocase_whole(&cur, tgsi_texture_names[i])) {
1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               decl.Resource.Resource = i;
1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (i == TGSI_TEXTURE_COUNT) {
1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            report_error(ctx, "Expected texture target");
1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur2 = cur;
1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         eat_opt_white(&cur2);
1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         while (*cur2 == ',') {
1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            cur2++;
1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            eat_opt_white(&cur2);
1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (str_match_nocase_whole(&cur2, "RAW")) {
1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               decl.Resource.Raw = 1;
1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else if (str_match_nocase_whole(&cur2, "WR")) {
1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               decl.Resource.Writable = 1;
1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            cur = cur2;
1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            eat_opt_white(&cur2);
1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->cur = cur;
1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else if (file == TGSI_FILE_SAMPLER_VIEW) {
1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (i = 0; i < TGSI_TEXTURE_COUNT; i++) {
1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (str_match_nocase_whole(&cur, tgsi_texture_names[i])) {
1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               decl.SamplerView.Resource = i;
1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (i == TGSI_TEXTURE_COUNT) {
1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            report_error(ctx, "Expected texture target");
1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         eat_opt_white( &cur );
1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (*cur != ',') {
1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            report_error( ctx, "Expected `,'" );
1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ++cur;
1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         eat_opt_white( &cur );
1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         for (j = 0; j < 4; ++j) {
1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (i = 0; i < PIPE_TYPE_COUNT; ++i) {
1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (str_match_nocase_whole(&cur, tgsi_type_names[i])) {
1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  switch (j) {
1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  case 0:
1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     decl.SamplerView.ReturnTypeX = i;
1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     break;
1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  case 1:
1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     decl.SamplerView.ReturnTypeY = i;
1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     break;
1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  case 2:
1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     decl.SamplerView.ReturnTypeZ = i;
1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     break;
1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  case 3:
1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     decl.SamplerView.ReturnTypeW = i;
1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     break;
1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  default:
1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     assert(0);
1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  }
1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  break;
1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (i == PIPE_TYPE_COUNT) {
1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (j == 0 || j >  2) {
1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  report_error(ctx, "Expected type name");
1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  return FALSE;
1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               break;
1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            } else {
1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               cur2 = cur;
1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               eat_opt_white( &cur2 );
1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (*cur2 == ',') {
1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  cur2++;
1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  eat_opt_white( &cur2 );
1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  cur = cur2;
1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  continue;
1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               } else
1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  break;
1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (j < 4) {
1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            decl.SamplerView.ReturnTypeY =
1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               decl.SamplerView.ReturnTypeZ =
1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               decl.SamplerView.ReturnTypeW =
1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               decl.SamplerView.ReturnTypeX;
1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->cur = cur;
1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      } else {
1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (str_match_nocase_whole(&cur, "LOCAL")) {
1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            decl.Declaration.Local = 1;
1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->cur = cur;
1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         cur = ctx->cur;
1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         eat_opt_white( &cur );
1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (*cur == ',') {
1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            cur++;
1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            eat_opt_white( &cur );
1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            for (i = 0; i < TGSI_SEMANTIC_COUNT; i++) {
1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               if (str_match_nocase_whole(&cur, tgsi_semantic_names[i])) {
1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  uint index;
1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  cur2 = cur;
1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  eat_opt_white( &cur2 );
1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  if (*cur2 == '[') {
1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     cur2++;
1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     eat_opt_white( &cur2 );
1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     if (!parse_uint( &cur2, &index )) {
1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        report_error( ctx, "Expected literal integer" );
1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        return FALSE;
1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     }
1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     eat_opt_white( &cur2 );
1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     if (*cur2 != ']') {
1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        report_error( ctx, "Expected `]'" );
1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                        return FALSE;
1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     }
1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     cur2++;
1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     decl.Semantic.Index = index;
1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                     cur = cur2;
1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  }
1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  decl.Declaration.Semantic = 1;
1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  decl.Semantic.Name = i;
1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  ctx->cur = cur;
1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                  break;
1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               }
1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   } else if (is_imm_array) {
1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      unsigned i;
1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      union tgsi_immediate_data *vals_itr;
1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* we have our immediate data */
1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*cur != '{') {
1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Immediate array without data" );
1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++cur;
1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->cur = cur;
1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      decl.ImmediateData.u =
1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         MALLOC(sizeof(union tgsi_immediate_data) * 4 *
1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org                (decl.Range.Last + 1));
1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      vals_itr = decl.ImmediateData.u;
1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i <= decl.Range.Last; ++i) {
1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!parse_immediate_data(ctx, TGSI_IMM_FLOAT32, vals_itr)) {
1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            FREE(decl.ImmediateData.u);
1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         vals_itr += 4;
1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         eat_opt_white( &ctx->cur );
1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (*ctx->cur != ',') {
1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            if (i !=  decl.Range.Last) {
1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               report_error( ctx, "Not enough data in immediate array!" );
1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               FREE(decl.ImmediateData.u);
1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               return FALSE;
1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            }
1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         } else
1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ++ctx->cur;
1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &ctx->cur );
1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*ctx->cur != '}') {
1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         FREE(decl.ImmediateData.u);
1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Immediate array data missing closing '}'" );
1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ++ctx->cur;
1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   cur = ctx->cur;
1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &cur );
1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (*cur == ',' && !is_vs_input) {
1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint i;
1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      cur++;
1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      eat_opt_white( &cur );
1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (i = 0; i < TGSI_INTERPOLATE_COUNT; i++) {
1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (str_match_nocase_whole( &cur, tgsi_interpolate_names[i] )) {
1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            decl.Declaration.Interpolate = 1;
1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            decl.Interp.Interpolate = i;
1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            ctx->cur = cur;
1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            break;
1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         }
1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (i == TGSI_INTERPOLATE_COUNT) {
1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Expected semantic or interpolate attribute" );
1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   advance = tgsi_build_full_declaration(
1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      &decl,
1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->tokens_cur,
1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->header,
1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (uint) (ctx->tokens_end - ctx->tokens_cur) );
1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (is_imm_array)
1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      FREE(decl.ImmediateData.u);
1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (advance == 0)
1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->tokens_cur += advance;
1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_immediate( struct translate_ctx *ctx )
1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_full_immediate imm;
1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint advance;
1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   int type;
1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!eat_white( &ctx->cur )) {
1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Syntax error" );
1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (type = 0; type < Elements(tgsi_immediate_type_names); ++type) {
1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (str_match_nocase_whole(&ctx->cur, tgsi_immediate_type_names[type]))
1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (type == Elements(tgsi_immediate_type_names)) {
1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Expected immediate type" );
1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   imm = tgsi_default_full_immediate();
1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   imm.Immediate.NrTokens += 4;
1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   imm.Immediate.DataType = type;
1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   parse_immediate_data(ctx, type, imm.u);
1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   advance = tgsi_build_full_immediate(
1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      &imm,
1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->tokens_cur,
1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->header,
1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (uint) (ctx->tokens_end - ctx->tokens_cur) );
1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (advance == 0)
1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->tokens_cur += advance;
1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_primitive( const char **pcur, uint *primitive )
1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint i;
1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < PIPE_PRIM_MAX; i++) {
1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const char *cur = *pcur;
1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (str_match_nocase_whole( &cur, tgsi_primitive_names[i])) {
1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *primitive = i;
1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *pcur = cur;
1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return TRUE;
1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_fs_coord_origin( const char **pcur, uint *fs_coord_origin )
1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint i;
1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < Elements(tgsi_fs_coord_origin_names); i++) {
1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const char *cur = *pcur;
1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (str_match_nocase_whole( &cur, tgsi_fs_coord_origin_names[i])) {
1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *fs_coord_origin = i;
1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *pcur = cur;
1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return TRUE;
1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean
1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgparse_fs_coord_pixel_center( const char **pcur, uint *fs_coord_pixel_center )
1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint i;
1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < Elements(tgsi_fs_coord_pixel_center_names); i++) {
1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const char *cur = *pcur;
1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (str_match_nocase_whole( &cur, tgsi_fs_coord_pixel_center_names[i])) {
1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *fs_coord_pixel_center = i;
1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         *pcur = cur;
1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return TRUE;
1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return FALSE;
1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean parse_property( struct translate_ctx *ctx )
1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_full_property prop;
1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint property_name;
1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint values[8];
1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint advance;
1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   char id[64];
1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!eat_white( &ctx->cur )) {
1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Syntax error" );
1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_identifier( &ctx->cur, id )) {
1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      report_error( ctx, "Syntax error" );
1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (property_name = 0; property_name < TGSI_PROPERTY_COUNT;
1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org        ++property_name) {
1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (streq_nocase_uprcase(tgsi_property_names[property_name], id)) {
1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (property_name >= TGSI_PROPERTY_COUNT) {
1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      debug_printf( "\nError: Unknown property : '%s'", id );
1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   switch(property_name) {
1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_PROPERTY_GS_INPUT_PRIM:
1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_PROPERTY_GS_OUTPUT_PRIM:
1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_primitive(&ctx->cur, &values[0] )) {
1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Unknown primitive name as property!" );
1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (property_name == TGSI_PROPERTY_GS_INPUT_PRIM &&
1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org          ctx->processor == TGSI_PROCESSOR_GEOMETRY) {
1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         ctx->implied_array_size = u_vertices_per_prim(values[0]);
1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_PROPERTY_FS_COORD_ORIGIN:
1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_fs_coord_origin(&ctx->cur, &values[0] )) {
1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Unknown coord origin as property: must be UPPER_LEFT or LOWER_LEFT!" );
1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_PROPERTY_FS_COORD_PIXEL_CENTER:
1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_fs_coord_pixel_center(&ctx->cur, &values[0] )) {
1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Unknown coord pixel center as property: must be HALF_INTEGER or INTEGER!" );
1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      break;
1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   case TGSI_PROPERTY_FS_COLOR0_WRITES_ALL_CBUFS:
1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   default:
1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!parse_uint(&ctx->cur, &values[0] )) {
1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Expected unsigned integer as property!" );
1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prop = tgsi_default_full_property();
1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prop.Property.PropertyName = property_name;
1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prop.Property.NrTokens += 1;
1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   prop.u[0].Data = values[0];
1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   advance = tgsi_build_full_property(
1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      &prop,
1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->tokens_cur,
1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ctx->header,
1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      (uint) (ctx->tokens_end - ctx->tokens_cur) );
1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (advance == 0)
1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx->tokens_cur += advance;
1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic boolean translate( struct translate_ctx *ctx )
1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   eat_opt_white( &ctx->cur );
1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!parse_header( ctx ))
1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   while (*ctx->cur != '\0') {
1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      uint label_val = 0;
1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (!eat_white( &ctx->cur )) {
1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         report_error( ctx, "Syntax error" );
1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (*ctx->cur == '\0')
1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         break;
1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (parse_label( ctx, &label_val )) {
1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!parse_instruction( ctx, TRUE ))
1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (str_match_nocase_whole( &ctx->cur, "DCL" )) {
1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!parse_declaration( ctx ))
1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (str_match_nocase_whole( &ctx->cur, "IMM" )) {
1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!parse_immediate( ctx ))
1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (str_match_nocase_whole( &ctx->cur, "PROPERTY" )) {
1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         if (!parse_property( ctx ))
1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org            return FALSE;
1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      else if (!parse_instruction( ctx, FALSE )) {
1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         return FALSE;
1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return TRUE;
1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgboolean
1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtgsi_text_translate(
1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const char *text,
1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct tgsi_token *tokens,
1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   uint num_tokens )
1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct translate_ctx ctx;
1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.text = text;
1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.cur = text;
1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.tokens = tokens;
1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.tokens_cur = tokens;
1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ctx.tokens_end = tokens + num_tokens;
1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!translate( &ctx ))
1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return FALSE;
1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return tgsi_sanity_check( tokens );
1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
1557