1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/*
2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Copyright (C) Intel Corp.  2006.  All Rights Reserved.
3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Intel funded Tungsten Graphics (http://www.tungstengraphics.com) to
4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org develop this 3D driver.
5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org Permission is hereby granted, free of charge, to any person obtaining
7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a 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, sublicense, 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
16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org portions of the Software.
17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **********************************************************************/
27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /*
28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  * Authors:
29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  *   Keith Whitwell <keith@tungstengraphics.com>
30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org  */
31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_context.h"
34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "brw_wm.h"
35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/prog_parameter.h"
36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct brw_wm_ref *get_ref( struct brw_wm_compile *c )
43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(c->nr_refs < BRW_WM_MAX_REF);
45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&c->refs[c->nr_refs], 0, sizeof(*c->refs));
46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &c->refs[c->nr_refs++];
47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct brw_wm_value *get_value( struct brw_wm_compile *c)
50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(c->nr_refs < BRW_WM_MAX_VREG);
52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&c->vreg[c->nr_vreg], 0, sizeof(*c->vreg));
53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &c->vreg[c->nr_vreg++];
54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** return pointer to a newly allocated instruction */
57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct brw_wm_instruction *get_instruction( struct brw_wm_compile *c )
58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   assert(c->nr_insns < BRW_WM_MAX_INSN);
60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   memset(&c->instruction[c->nr_insns], 0, sizeof(*c->instruction));
61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return &c->instruction[c->nr_insns++];
62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Init the "undef" register */
68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void pass0_init_undef( struct brw_wm_compile *c)
69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_wm_ref *ref = &c->undef_ref;
71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref->value = &c->undef_value;
72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref->hw_reg = brw_vec8_grf(0, 0);
73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref->insn = 0;
74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref->prevuse = NULL;
75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Set a FP register to a value */
78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void pass0_set_fpreg_value( struct brw_wm_compile *c,
79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint file,
80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint idx,
81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   GLuint component,
82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				   struct brw_wm_value *value )
83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_wm_ref *ref = get_ref(c);
85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref->value = value;
86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref->hw_reg = brw_vec8_grf(0, 0);
87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref->insn = 0;
88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   ref->prevuse = NULL;
89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->pass0_fp_reg[file][idx][component] = ref;
90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Set a FP register to a ref */
93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void pass0_set_fpreg_ref( struct brw_wm_compile *c,
94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint file,
95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint idx,
96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 GLuint component,
97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				 const struct brw_wm_ref *src_ref )
98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->pass0_fp_reg[file][idx][component] = src_ref;
100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct brw_wm_ref *get_param_ref( struct brw_wm_compile *c,
103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       const GLfloat *param_ptr )
104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i = c->prog_data.nr_params++;
106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (i >= BRW_WM_MAX_PARAM) {
108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("%s: out of params\n", __FUNCTION__);
109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->prog_data.error = 1;
110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      struct brw_wm_ref *ref = get_ref(c);
114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->prog_data.param[i] = param_ptr;
116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->nr_creg = (i+16)/16;
117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Push the offsets into hw_reg.  These will be added to the
119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       * real register numbers once one is allocated in pass2.
120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ref->hw_reg = brw_vec1_grf((i&8)?1:0, i%8);
122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ref->value = &c->creg[i/16];
123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ref->insn = 0;
124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ref->prevuse = NULL;
125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return ref;
127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Return a ref to a constant/literal value */
132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct brw_wm_ref *get_const_ref( struct brw_wm_compile *c,
133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       const GLfloat *constval )
134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Search for an existing const value matching the request:
138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < c->nr_constrefs; i++) {
140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (c->constref[i].constval == *constval)
141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 return c->constref[i].ref;
142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Else try to add a new one:
145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->nr_constrefs < BRW_WM_MAX_CONST) {
147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint i = c->nr_constrefs++;
148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* A constant is a special type of parameter:
150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->constref[i].constval = *constval;
152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->constref[i].ref = get_param_ref(c, constval);
153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return c->constref[i].ref;
155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else {
157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      printf("%s: out of constrefs\n", __FUNCTION__);
158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->prog_data.error = 1;
159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      return NULL;
160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Lookup our internal registers
165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct brw_wm_ref *pass0_get_reg( struct brw_wm_compile *c,
167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       GLuint file,
168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       GLuint idx,
169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org					       GLuint component )
170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct brw_wm_ref *ref = c->pass0_fp_reg[file][idx][component];
172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ref) {
174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (file) {
175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_INPUT:
176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_PAYLOAD:
177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_TEMPORARY:
178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_OUTPUT:
179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_VARYING:
180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_LOCAL_PARAM:
183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ref = get_param_ref(c, &c->fp->program.Base.LocalParams[idx][component]);
184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_ENV_PARAM:
187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 ref = get_param_ref(c, &c->env_param[idx][component]);
188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_STATE_VAR:
191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_UNIFORM:
192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_CONSTANT:
193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case PROGRAM_NAMED_PARAM: {
194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 struct gl_program_parameter_list *plist = c->fp->program.Base.Parameters;
195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 /* There's something really hokey about parameters parsed in
197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * arb programs - they all end up in here, whether they be
198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * state values, parameters or constants.  This duplicates the
199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * structure above & also seems to subvert the limits set for
200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  * each type of constant/param.
201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	  */
202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 switch (plist->Parameters[idx].Type) {
203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case PROGRAM_NAMED_PARAM:
204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case PROGRAM_CONSTANT:
205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* These are invariant:
206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     */
207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ref = get_const_ref(c, &plist->ParameterValues[idx][component].f);
208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case PROGRAM_STATE_VAR:
211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 case PROGRAM_UNIFORM:
212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    /* These may change from run to run:
213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	     */
214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    ref = get_param_ref(c, &plist->ParameterValues[idx][component].f );
215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 default:
218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    assert(0);
219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    break;
220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 assert(0);
226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      c->pass0_fp_reg[file][idx][component] = ref;
230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (!ref)
233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      ref = &c->undef_ref;
234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return ref;
236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Straight translation to internal instruction format
242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void pass0_set_dst( struct brw_wm_compile *c,
245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   struct brw_wm_instruction *out,
246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   const struct prog_instruction *inst,
247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			   GLuint writemask )
248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct prog_dst_register *dst = &inst->DstReg;
250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++) {
253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (writemask & (1<<i)) {
254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 out->dst[i] = get_value(c);
255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 pass0_set_fpreg_value(c, dst->File, dst->Index, i, out->dst[i]);
256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->writemask = writemask;
260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct brw_wm_ref *get_fp_src_reg_ref( struct brw_wm_compile *c,
264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						    struct prog_src_register src,
265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org						    GLuint i )
266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint component = GET_SWZ(src.Swizzle,i);
268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct brw_wm_ref *src_ref;
269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static const GLfloat const_zero = 0.0;
270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   static const GLfloat const_one = 1.0;
271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (component == SWIZZLE_ZERO)
273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src_ref = get_const_ref(c, &const_zero);
274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else if (component == SWIZZLE_ONE)
275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src_ref = get_const_ref(c, &const_one);
276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   else
277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      src_ref = pass0_get_reg(c, src.File, src.Index, component);
278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return src_ref;
280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct brw_wm_ref *get_new_ref( struct brw_wm_compile *c,
284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       struct prog_src_register src,
285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       GLuint i,
286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org				       struct brw_wm_instruction *insn)
287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct brw_wm_ref *ref = get_fp_src_reg_ref(c, src, i);
289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_wm_ref *newref = get_ref(c);
290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   newref->value = ref->value;
292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   newref->hw_reg = ref->hw_reg;
293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (insn) {
295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      newref->insn = insn - c->instruction;
296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      newref->prevuse = newref->value->lastuse;
297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      newref->value->lastuse = newref;
298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (src.Negate & (1 << i))
301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      newref->hw_reg.negate ^= 1;
302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (src.Abs) {
304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      newref->hw_reg.negate = 0;
305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      newref->hw_reg.abs = 1;
306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   return newref;
309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void
313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtranslate_insn(struct brw_wm_compile *c,
314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org               const struct prog_instruction *inst)
315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_wm_instruction *out = get_instruction(c);
317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint writemask = inst->DstReg.WriteMask;
318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint nr_args = brw_wm_nr_args(inst->Opcode);
319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i, j;
320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Copy some data out of the instruction
322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->opcode = inst->Opcode;
324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->saturate = (inst->SaturateMode != SATURATE_OFF);
325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->tex_unit = inst->TexSrcUnit;
326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->tex_idx = inst->TexSrcTarget;
327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->tex_shadow = inst->TexShadow;
328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->eot = inst->Aux & INST_AUX_EOT;
329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   out->target = INST_AUX_GET_TARGET(inst->Aux);
330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Args:
332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < nr_args; i++) {
334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      for (j = 0; j < 4; j++) {
335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 out->src[i][j] = get_new_ref(c, inst->SrcReg[i], j, out);
336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Dst:
340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pass0_set_dst(c, out, inst, writemask);
342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Optimize moves and swizzles away:
348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void pass0_precalc_mov( struct brw_wm_compile *c,
350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			       const struct prog_instruction *inst )
351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   const struct prog_dst_register *dst = &inst->DstReg;
353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint writemask = inst->DstReg.WriteMask;
354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   struct brw_wm_ref *refs[4];
355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* Get the effect of a MOV by manipulating our register table:
358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * First get all refs, then assign refs.  This ensures that "in-place"
359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * swizzles such as:
360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    *   MOV t, t.xxyx
361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * are handled correctly.  Previously, these two steps were done in
362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * one loop and the above case was incorrectly handled.
363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++) {
365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      refs[i] = get_new_ref(c, inst->SrcReg[0], i, NULL);
366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++) {
368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      if (writemask & (1 << i)) {
369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org         pass0_set_fpreg_ref( c, dst->File, dst->Index, i, refs[i]);
370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Initialize payload "registers".
376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void pass0_init_payload( struct brw_wm_compile *c )
378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint i;
380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < 4; i++) {
382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      GLuint j = i >= (c->nr_payload_regs + 1) / 2 ? 0 : i;
383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pass0_set_fpreg_value( c, PROGRAM_PAYLOAD, PAYLOAD_DEPTH, i,
384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     &c->payload.depth[j] );
385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0
388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   /* This seems to be an alternative to the INTERP_WPOS stuff I do
389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    * elsewhere:
390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org    */
391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (c->key.source_depth_reg)
392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pass0_set_fpreg_value(c, PROGRAM_INPUT, FRAG_ATTRIB_WPOS, 2,
393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			    &c->payload.depth[c->key.source_depth_reg/2]);
394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif
395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (i = 0; i < FRAG_ATTRIB_MAX; i++)
397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      pass0_set_fpreg_value( c, PROGRAM_PAYLOAD, i, 0,
398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org			     &c->payload.input_interp[i] );
399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/***********************************************************************
403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * PASS 0
404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Work forwards to give each calculated value a unique number.  Where
406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * an instruction produces duplicate values (eg DP3), all are given
407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the same number.
408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *
409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Translate away swizzling and eliminate non-saturating moves.
410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */
411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid brw_wm_pass0( struct brw_wm_compile *c )
412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{
413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   GLuint insn;
414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->nr_vreg = 0;
416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   c->nr_insns = 0;
417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pass0_init_undef(c);
419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   pass0_init_payload(c);
420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   for (insn = 0; insn < c->nr_fp_insns; insn++) {
422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      const struct prog_instruction *inst = &c->prog_instructions[insn];
423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      /* Optimize away moves, otherwise emit translated instruction:
425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org       */
426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      switch (inst->Opcode) {
427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case OPCODE_MOV:
428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      case OPCODE_SWZ:
429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 if (!inst->SaturateMode) {
430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    pass0_precalc_mov(c, inst);
431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 else {
433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	    translate_insn(c, inst);
434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 }
435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      default:
437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 translate_insn(c, inst);
438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org	 break;
439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      }
440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org
442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   if (unlikely(INTEL_DEBUG & DEBUG_WM)) {
443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org      brw_wm_print_program(c, "pass0");
444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org   }
445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}
446