193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca/**************************************************************************
293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca *
393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * Copyright 2010 VMware, Inc.
493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * All Rights Reserved.
593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca *
693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * copy of this software and associated documentation files (the
893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * "Software"), to deal in the Software without restriction, including
993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
1093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
1193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * permit persons to whom the Software is furnished to do so, subject to
1293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * the following conditions:
1393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca *
1493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * The above copyright notice and this permission notice (including the
1593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * next paragraph) shall be included in all copies or substantial portions
1693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * of the Software.
1793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca *
1893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
2293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca *
2693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca **************************************************************************/
2793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
2893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca/**
2993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * @file
3093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * TGSI to LLVM IR translation -- AoS.
3193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca *
3293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * FIXME:
3393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * - No control flow support: the existing control flow code should be factored
3493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * out into from the SoA code into a common module and shared.
3593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * - No derivatives. Derivate logic should be pluggable, just like the samplers.
3693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca *
3793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
3893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca */
3993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
4093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "pipe/p_config.h"
4193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "pipe/p_shader_tokens.h"
4293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "util/u_debug.h"
4393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "util/u_math.h"
4493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "util/u_memory.h"
4593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "tgsi/tgsi_dump.h"
4693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "tgsi/tgsi_info.h"
4793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "tgsi/tgsi_parse.h"
4893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "tgsi/tgsi_util.h"
4993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "tgsi/tgsi_scan.h"
5093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "lp_bld_type.h"
5193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "lp_bld_const.h"
5293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "lp_bld_arit.h"
5393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "lp_bld_logic.h"
5493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "lp_bld_swizzle.h"
5593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "lp_bld_flow.h"
5693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "lp_bld_quad.h"
5793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "lp_bld_tgsi.h"
5893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#include "lp_bld_debug.h"
593469715a8a171512cf9b528702e70393f01c6041José Fonseca#include "lp_bld_sample.h"
6093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
6193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
6293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca/**
63697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca * Wrapper around lp_build_swizzle_aos which translates swizzles to another
64697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca * ordering.
65697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca */
66697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonsecastatic LLVMValueRef
67bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardswizzle_aos(struct lp_build_tgsi_context *bld_base,
68697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca            LLVMValueRef a,
69697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca            unsigned swizzle_x,
70697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca            unsigned swizzle_y,
71697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca            unsigned swizzle_z,
72697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca            unsigned swizzle_w)
73697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca{
74697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   unsigned char swizzles[4];
75bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct lp_build_tgsi_aos_context *bld = lp_aos_context(bld_base);
76697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca
77697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   assert(swizzle_x < 4);
78697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   assert(swizzle_y < 4);
79697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   assert(swizzle_z < 4);
80697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   assert(swizzle_w < 4);
81697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca
82697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   swizzles[bld->inv_swizzles[0]] = bld->swizzles[swizzle_x];
83697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   swizzles[bld->inv_swizzles[1]] = bld->swizzles[swizzle_y];
84697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   swizzles[bld->inv_swizzles[2]] = bld->swizzles[swizzle_z];
85697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   swizzles[bld->inv_swizzles[3]] = bld->swizzles[swizzle_w];
86697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca
87bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   return lp_build_swizzle_aos(&bld->bld_base.base, a, swizzles);
88697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca}
89697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca
90697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca
91697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonsecastatic LLVMValueRef
92697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonsecaswizzle_scalar_aos(struct lp_build_tgsi_aos_context *bld,
93697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca                   LLVMValueRef a,
94697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca                   unsigned chan)
95697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca{
96697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   chan = bld->swizzles[chan];
97bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   return lp_build_swizzle_scalar_aos(&bld->bld_base.base, a, chan);
98697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca}
99697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca
100697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca
10193158622e26df1227f6eca8d619b5521f4cb1368José Fonsecastatic LLVMValueRef
102bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_fetch_constant(
103bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct lp_build_tgsi_context * bld_base,
104bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   const struct tgsi_full_src_register * reg,
105141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie   enum tgsi_opcode_type stype,
106141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie   unsigned swizzle)
10793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca{
108bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base);
109bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   LLVMBuilderRef builder = bld_base->base.gallivm->builder;
110bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct lp_type type = bld_base->base.type;
11193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   LLVMValueRef res;
11293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   unsigned chan;
11393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
11493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   assert(!reg->Register.Indirect);
11593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
11693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /*
117bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard    * Get the constants components
11893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    */
11993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
120bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   res = bld->bld_base.base.undef;
121bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   for (chan = 0; chan < 4; ++chan) {
122bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      LLVMValueRef index;
123bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      LLVMValueRef scalar_ptr;
124bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      LLVMValueRef scalar;
125bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      LLVMValueRef swizzle;
12693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
127bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      index = lp_build_const_int32(bld->bld_base.base.gallivm,
128bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard                                   reg->Register.Index * 4 + chan);
12993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
130bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      scalar_ptr = LLVMBuildGEP(builder, bld->consts_ptr, &index, 1, "");
13193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
132bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      scalar = LLVMBuildLoad(builder, scalar_ptr, "");
13393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
134bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      lp_build_name(scalar, "const[%u].%c", reg->Register.Index, "xyzw"[chan]);
13593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
13693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /*
137bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard       * NOTE: constants array is always assumed to be RGBA
13893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca       */
13993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
140bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      swizzle = lp_build_const_int32(bld->bld_base.base.gallivm,
141bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard                                     bld->swizzles[chan]);
14293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
143bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      res = LLVMBuildInsertElement(builder, res, scalar, swizzle, "");
144bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   }
14593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
146bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   /*
147bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard    * Broadcast the first quaternion to all others.
148bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard    *
149bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard    * XXX: could be factored into a reusable function.
150bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard    */
15193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
152bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   if (type.length > 4) {
153bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      LLVMValueRef shuffles[LP_MAX_VECTOR_LENGTH];
154bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      unsigned i;
15593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
156bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      for (chan = 0; chan < 4; ++chan) {
157bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard         shuffles[chan] = lp_build_const_int32(bld->bld_base.base.gallivm, chan);
15893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      }
15993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
160bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      for (i = 4; i < type.length; ++i) {
161bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard         shuffles[i] = shuffles[i % 4];
162bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      }
16393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
164bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      res = LLVMBuildShuffleVector(builder,
165bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard                                   res, bld->bld_base.base.undef,
166bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard                                   LLVMConstVector(shuffles, type.length),
167bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard                                   "");
16893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
169bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   return res;
170bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}
17193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
172bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic LLVMValueRef
173bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_fetch_immediate(
174bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct lp_build_tgsi_context * bld_base,
175bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   const struct tgsi_full_src_register * reg,
176141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie   enum tgsi_opcode_type stype,
177141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie   unsigned swizzle)
178bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{
179bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base);
180bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   LLVMValueRef res = bld->immediates[reg->Register.Index];
181bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   assert(res);
182bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   return res;
183bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}
18493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
185bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic LLVMValueRef
186bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_fetch_input(
187bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct lp_build_tgsi_context * bld_base,
188bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   const struct tgsi_full_src_register * reg,
189141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie   enum tgsi_opcode_type stype,
190141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie   unsigned swizzle)
191bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{
192bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base);
193bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   LLVMValueRef res = bld->inputs[reg->Register.Index];
194bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   assert(!reg->Register.Indirect);
195bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   assert(res);
196bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   return res;
197bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}
19893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
199bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic LLVMValueRef
200bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardemit_fetch_temporary(
201bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct lp_build_tgsi_context * bld_base,
202bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   const struct tgsi_full_src_register * reg,
203141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie   enum tgsi_opcode_type stype,
204141f2c2fc9325a5d30629373bb962f42517967aeDave Airlie   unsigned swizzle)
205bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{
206bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct lp_build_tgsi_aos_context * bld = lp_aos_context(bld_base);
207bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   LLVMBuilderRef builder = bld_base->base.gallivm->builder;
208bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   LLVMValueRef temp_ptr = bld->temps[reg->Register.Index];
209bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   LLVMValueRef res = LLVMBuildLoad(builder, temp_ptr, "");
210bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   assert(!reg->Register.Indirect);
211bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   if (!res)
212bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      return bld->bld_base.base.undef;
21393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
21493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   return res;
21593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca}
21693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
21793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca/**
21893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * Register store.
21993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca */
220bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardvoid
221bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlp_emit_store_aos(
22293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   struct lp_build_tgsi_aos_context *bld,
22393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   const struct tgsi_full_instruction *inst,
22493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   unsigned index,
22593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   LLVMValueRef value)
22693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca{
227bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   LLVMBuilderRef builder = bld->bld_base.base.gallivm->builder;
22893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   const struct tgsi_full_dst_register *reg = &inst->Dst[index];
22993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   LLVMValueRef mask = NULL;
23093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   LLVMValueRef ptr;
23193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
23293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /*
23393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * Saturate the value
23493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    */
23593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
23693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   switch (inst->Instruction.Saturate) {
23793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_SAT_NONE:
23893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
23993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
24093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_SAT_ZERO_ONE:
241bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      value = lp_build_max(&bld->bld_base.base, value, bld->bld_base.base.zero);
242bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      value = lp_build_min(&bld->bld_base.base, value, bld->bld_base.base.one);
24393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
24493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
24593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_SAT_MINUS_PLUS_ONE:
246bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      value = lp_build_max(&bld->bld_base.base, value, lp_build_const_vec(bld->bld_base.base.gallivm, bld->bld_base.base.type, -1.0));
247bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      value = lp_build_min(&bld->bld_base.base, value, bld->bld_base.base.one);
24893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
24993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
25093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   default:
25193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
25293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
25393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
25493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /*
25593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * Translate the register file
25693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    */
25793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
25893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   assert(!reg->Register.Indirect);
25993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
26093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   switch (reg->Register.File) {
26193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_FILE_OUTPUT:
26293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      ptr = bld->outputs[reg->Register.Index];
26393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
26493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
26593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_FILE_TEMPORARY:
26693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      ptr = bld->temps[reg->Register.Index];
26793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
26893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
26993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_FILE_ADDRESS:
27093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      ptr = bld->addr[reg->Indirect.Index];
27193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
27293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
27393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_FILE_PREDICATE:
27493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      ptr = bld->preds[reg->Register.Index];
27593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
27693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
27793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   default:
27893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
27993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return;
28093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
28193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
282bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   if (!ptr)
283bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      return;
28493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /*
28593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * Predicate
28693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    */
28793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
28893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   if (inst->Instruction.Predicate) {
28993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      LLVMValueRef pred;
29093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
29193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(inst->Predicate.Index < LP_MAX_TGSI_PREDS);
29293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
2936299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul      pred = LLVMBuildLoad(builder,
29493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                           bld->preds[inst->Predicate.Index], "");
29593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
29693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /*
29793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca       * Convert the value to an integer mask.
29893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca       */
299bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      pred = lp_build_compare(bld->bld_base.base.gallivm,
300bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard                               bld->bld_base.base.type,
30193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                               PIPE_FUNC_NOTEQUAL,
30293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                               pred,
303bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard                               bld->bld_base.base.zero);
30493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
30593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      if (inst->Predicate.Negate) {
3066299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul         pred = LLVMBuildNot(builder, pred, "");
30793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      }
30893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
309bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      pred = bld->bld_base.emit_swizzle(&bld->bld_base, pred,
310697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca                         inst->Predicate.SwizzleX,
311697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca                         inst->Predicate.SwizzleY,
312697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca                         inst->Predicate.SwizzleZ,
313697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca                         inst->Predicate.SwizzleW);
31493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
31593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      if (mask) {
3166299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul         mask = LLVMBuildAnd(builder, mask, pred, "");
31793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      } else {
31893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         mask = pred;
31993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      }
32093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
32193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
32293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /*
32393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * Writemask
32493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    */
32593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
32693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   if (reg->Register.WriteMask != TGSI_WRITEMASK_XYZW) {
32793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      LLVMValueRef writemask;
32893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
329c23fd547c060c4137eab0f878a1028c5903384ebJames Benton      writemask = lp_build_const_mask_aos_swizzled(bld->bld_base.base.gallivm,
330c23fd547c060c4137eab0f878a1028c5903384ebJames Benton                                                   bld->bld_base.base.type,
331c23fd547c060c4137eab0f878a1028c5903384ebJames Benton                                                   reg->Register.WriteMask,
332c23fd547c060c4137eab0f878a1028c5903384ebJames Benton                                                   bld->swizzles);
33393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
33493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      if (mask) {
3356299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul         mask = LLVMBuildAnd(builder, mask, writemask, "");
33693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      } else {
33793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         mask = writemask;
33893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      }
33993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
34093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
34193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   if (mask) {
34293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      LLVMValueRef orig_value;
34393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
3446299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul      orig_value = LLVMBuildLoad(builder, ptr, "");
345bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      value = lp_build_select(&bld->bld_base.base,
34693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                              mask, value, orig_value);
34793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
34893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
3496299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul   LLVMBuildStore(builder, value, ptr);
35093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca}
35193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
35293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
35393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca/**
35493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * High-level instruction translators.
35593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca */
35693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
35793158622e26df1227f6eca8d619b5521f4cb1368José Fonsecastatic LLVMValueRef
35893158622e26df1227f6eca8d619b5521f4cb1368José Fonsecaemit_tex(struct lp_build_tgsi_aos_context *bld,
35993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         const struct tgsi_full_instruction *inst,
36093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         enum lp_build_tex_modifier modifier)
36193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca{
36293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   unsigned target;
36393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   unsigned unit;
36493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   LLVMValueRef coords;
36593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   LLVMValueRef ddx;
36693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   LLVMValueRef ddy;
3673469715a8a171512cf9b528702e70393f01c6041José Fonseca   struct lp_derivatives derivs;
36893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
36993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   if (!bld->sampler) {
37093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      _debug_printf("warning: found texture instruction but no sampler generator supplied\n");
371bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      return bld->bld_base.base.undef;
37293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
37393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
37493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   target = inst->Texture.Texture;
37593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
376bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   coords = lp_build_emit_fetch( &bld->bld_base, inst, 0 , LP_CHAN_ALL);
37793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
3783469715a8a171512cf9b528702e70393f01c6041José Fonseca   if (0 && modifier == LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV) {
379bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      ddx = lp_build_emit_fetch( &bld->bld_base, inst, 1 , LP_CHAN_ALL);
380bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      ddy = lp_build_emit_fetch( &bld->bld_base, inst, 2 , LP_CHAN_ALL);
38193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      unit = inst->Src[3].Register.Index;
38293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }  else {
38393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#if 0
384bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      ddx = lp_build_ddx( &bld->bld_base.base, coords );
385bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      ddy = lp_build_ddy( &bld->bld_base.base, coords );
38693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#else
38793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* TODO */
3883469715a8a171512cf9b528702e70393f01c6041José Fonseca      derivs.ddx_ddy[0] = bld->bld_base.base.one;
3893469715a8a171512cf9b528702e70393f01c6041José Fonseca      derivs.ddx_ddy[1] = bld->bld_base.base.one;
39093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca#endif
39193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      unit = inst->Src[1].Register.Index;
39293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
39393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
39493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   return bld->sampler->emit_fetch_texel(bld->sampler,
395bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard                                         &bld->bld_base.base,
39693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                                         target, unit,
3973469715a8a171512cf9b528702e70393f01c6041José Fonseca                                         coords, derivs,
39893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                                         modifier);
39993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca}
40093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
40193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
402bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardvoid
403bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlp_emit_declaration_aos(
40493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   struct lp_build_tgsi_aos_context *bld,
40593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   const struct tgsi_full_declaration *decl)
40693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca{
407bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   struct gallivm_state *gallivm = bld->bld_base.base.gallivm;
408bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   LLVMTypeRef vec_type = lp_build_vec_type(bld->bld_base.base.gallivm, bld->bld_base.base.type);
40993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
41093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   unsigned first = decl->Range.First;
41193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   unsigned last = decl->Range.Last;
41293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   unsigned idx;
41393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
41493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   for (idx = first; idx <= last; ++idx) {
41593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      switch (decl->Declaration.File) {
41693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      case TGSI_FILE_TEMPORARY:
41793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         assert(idx < LP_MAX_TGSI_TEMPS);
41893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         if (bld->indirect_files & (1 << TGSI_FILE_TEMPORARY)) {
419efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul            LLVMValueRef array_size = lp_build_const_int32(gallivm, last + 1);
420bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard            bld->temps_array = lp_build_array_alloca(bld->bld_base.base.gallivm,
42193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                                                     vec_type, array_size, "");
42293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         } else {
423efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul            bld->temps[idx] = lp_build_alloca(gallivm, vec_type, "");
42493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         }
42593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         break;
42693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
42793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      case TGSI_FILE_OUTPUT:
428efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         bld->outputs[idx] = lp_build_alloca(gallivm, vec_type, "");
42993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         break;
43093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
43193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      case TGSI_FILE_ADDRESS:
43293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         assert(idx < LP_MAX_TGSI_ADDRS);
433efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         bld->addr[idx] = lp_build_alloca(gallivm, vec_type, "");
43493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         break;
43593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
43693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      case TGSI_FILE_PREDICATE:
43793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         assert(idx < LP_MAX_TGSI_PREDS);
438efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul         bld->preds[idx] = lp_build_alloca(gallivm, vec_type, "");
43993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         break;
44093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
44193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      default:
44293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         /* don't need to declare other vars */
44393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         break;
44493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      }
44593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
44693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca}
44793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
44893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
44993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca/**
45093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * Emit LLVM for one TGSI instruction.
45193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca * \param return TRUE for success, FALSE otherwise
45293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca */
453bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardboolean
454bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlp_emit_instruction_aos(
45593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   struct lp_build_tgsi_aos_context *bld,
45693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   const struct tgsi_full_instruction *inst,
45793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   const struct tgsi_opcode_info *info,
45893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   int *pc)
45993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca{
46093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   LLVMValueRef src0, src1, src2;
46193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   LLVMValueRef tmp0, tmp1;
46250095ac87c9a57e2b87220401c2dbdb255cabb4bVinson Lee   LLVMValueRef dst0 = NULL;
46393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
46493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /*
46593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * Stores and write masks are handled in a general fashion after the long
46693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * instruction opcode switch statement.
46793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    *
46893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * Although not stricitly necessary, we avoid generating instructions for
46993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * channels which won't be stored, in cases where's that easy. For some
47093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * complex instructions, like texture sampling, it is more convenient to
47193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * assume a full writemask and then let LLVM optimization passes eliminate
47293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    * redundant code.
47393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca    */
47493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
47593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   (*pc)++;
47693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
47793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   assert(info->num_dst <= 1);
47893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   if (info->num_dst) {
479bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = bld->bld_base.base.undef;
48093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
48193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
48293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   switch (inst->Instruction.Opcode) {
48393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ARL:
484bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
485bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_floor(&bld->bld_base.base, src0);
48693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
48793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
48893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_MOV:
489bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
49093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
49193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
49293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_LIT:
49393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
49493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
49593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_RCP:
49693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /* TGSI_OPCODE_RECIP */
497bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
498bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_rcp(&bld->bld_base.base, src0);
49993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
50093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
50193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_RSQ:
50293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /* TGSI_OPCODE_RECIPSQRT */
503bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
504bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_emit_llvm_unary(&bld->bld_base, TGSI_OPCODE_ABS, src0);
505bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_rsqrt(&bld->bld_base.base, tmp0);
50693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
50793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
50893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_EXP:
50993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
51093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
51193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_LOG:
51293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
51393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
51493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_MUL:
515bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
516bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
517bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_mul(&bld->bld_base.base, src0, src1);
51893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
51993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
52093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ADD:
521bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
522bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
523bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_add(&bld->bld_base.base, src0, src1);
52493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
52593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
52693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_DP3:
52793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /* TGSI_OPCODE_DOT3 */
52893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
52993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
53093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_DP4:
53193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /* TGSI_OPCODE_DOT4 */
53293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
53393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
53493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_DST:
53593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
53693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
53793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_MIN:
538bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
539bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
540bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_max(&bld->bld_base.base, src0, src1);
54193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
54293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
54393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_MAX:
544bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
545bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
546bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_max(&bld->bld_base.base, src0, src1);
54793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
54893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
54993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SLT:
55093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /* TGSI_OPCODE_SETLT */
551bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
552bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
553bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_cmp(&bld->bld_base.base, PIPE_FUNC_LESS, src0, src1);
554bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_select(&bld->bld_base.base, tmp0, bld->bld_base.base.one, bld->bld_base.base.zero);
55593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
55693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
55793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SGE:
55893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /* TGSI_OPCODE_SETGE */
559bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
560bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
561bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_cmp(&bld->bld_base.base, PIPE_FUNC_GEQUAL, src0, src1);
562bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_select(&bld->bld_base.base, tmp0, bld->bld_base.base.one, bld->bld_base.base.zero);
56393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
56493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
56593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_MAD:
56693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /* TGSI_OPCODE_MADD */
567bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
568bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
569bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src2 = lp_build_emit_fetch(&bld->bld_base, inst, 2, LP_CHAN_ALL);
570bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_mul(&bld->bld_base.base, src0, src1);
571bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_add(&bld->bld_base.base, tmp0, src2);
57293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
57393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
57493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SUB:
575bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
576bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
577bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_sub(&bld->bld_base.base, src0, src1);
57893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
57993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
58093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_LRP:
581bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
582bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
583bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src2 = lp_build_emit_fetch(&bld->bld_base, inst, 2, LP_CHAN_ALL);
584bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_sub(&bld->bld_base.base, src1, src2);
585bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_mul(&bld->bld_base.base, src0, tmp0);
586bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_add(&bld->bld_base.base, tmp0, src2);
58793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
58893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
58993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_CND:
590bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
591bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
592bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src2 = lp_build_emit_fetch(&bld->bld_base, inst, 2, LP_CHAN_ALL);
593bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp1 = lp_build_const_vec(bld->bld_base.base.gallivm, bld->bld_base.base.type, 0.5);
594bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_cmp(&bld->bld_base.base, PIPE_FUNC_GREATER, src2, tmp1);
595bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_select(&bld->bld_base.base, tmp0, src0, src1);
59693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
59793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
59893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_DP2A:
59993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
60093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
60193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_FRC:
602bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
603bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_floor(&bld->bld_base.base, src0);
604bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_sub(&bld->bld_base.base, src0, tmp0);
60593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
60693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
60793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_CLAMP:
608bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
609bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
610bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src2 = lp_build_emit_fetch(&bld->bld_base, inst, 2, LP_CHAN_ALL);
611bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_max(&bld->bld_base.base, src0, src1);
612bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_min(&bld->bld_base.base, tmp0, src2);
61393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
61493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
61593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_FLR:
616bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
617bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_floor(&bld->bld_base.base, src0);
61893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
61993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
62093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ROUND:
621bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
622bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_round(&bld->bld_base.base, src0);
62393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
62493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
62593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_EX2:
626bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
627bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_swizzle_scalar_aos(&bld->bld_base.base, src0, TGSI_SWIZZLE_X);
628bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_exp2(&bld->bld_base.base, tmp0);
62993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
63093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
63193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_LG2:
632bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
633697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca      tmp0 = swizzle_scalar_aos(bld, src0, TGSI_SWIZZLE_X);
634bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_log2(&bld->bld_base.base, tmp0);
63593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
63693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
63793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_POW:
638bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
639697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca      src0 = swizzle_scalar_aos(bld, src0, TGSI_SWIZZLE_X);
640bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
641697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca      src1 = swizzle_scalar_aos(bld, src1, TGSI_SWIZZLE_X);
642bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_pow(&bld->bld_base.base, src0, src1);
64393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
64493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
64593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_XPD:
64693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
64793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
64893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_RCC:
64993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
65093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
65193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
65293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
65393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_DPH:
65493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
65593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
65693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_COS:
657bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
658697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca      tmp0 = swizzle_scalar_aos(bld, src0, TGSI_SWIZZLE_X);
659bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_cos(&bld->bld_base.base, tmp0);
66093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
66193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
66293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_DDX:
66393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
66493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
66593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_DDY:
66693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
66793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
66893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_KILP:
66993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* predicated kill */
67093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
67193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
67293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_KIL:
67393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* conditional kill */
67493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
67593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
67693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_PK2H:
67793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
67893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
67993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
68093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_PK2US:
68193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
68293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
68393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
68493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_PK4B:
68593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
68693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
68793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
68893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_PK4UB:
68993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
69093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
69193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_RFL:
69293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
69393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
69493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SEQ:
695bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
696bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
697bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_cmp(&bld->bld_base.base, PIPE_FUNC_EQUAL, src0, src1);
698bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_select(&bld->bld_base.base, tmp0, bld->bld_base.base.one, bld->bld_base.base.zero);
69993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
70093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
70193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SFL:
702bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = bld->bld_base.base.zero;
70393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
70493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
70593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SGT:
706bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
707bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
708bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_cmp(&bld->bld_base.base, PIPE_FUNC_GREATER, src0, src1);
709bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_select(&bld->bld_base.base, tmp0, bld->bld_base.base.one, bld->bld_base.base.zero);
71093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
71193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
71293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SIN:
713bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
714697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca      tmp0 = swizzle_scalar_aos(bld, src0, TGSI_SWIZZLE_X);
715bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_sin(&bld->bld_base.base, tmp0);
71693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
71793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
71893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SLE:
719bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
720bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
721bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_cmp(&bld->bld_base.base, PIPE_FUNC_LEQUAL, src0, src1);
722bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_select(&bld->bld_base.base, tmp0, bld->bld_base.base.one, bld->bld_base.base.zero);
72393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
72493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
72593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SNE:
726bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
727bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
728bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_cmp(&bld->bld_base.base, PIPE_FUNC_NOTEQUAL, src0, src1);
729bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_select(&bld->bld_base.base, tmp0, bld->bld_base.base.one, bld->bld_base.base.zero);
73093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
73193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
73293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_STR:
733bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = bld->bld_base.base.one;
73493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
73593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
73693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_TEX:
73793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      dst0 = emit_tex(bld, inst, LP_BLD_TEX_MODIFIER_NONE);
73893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
73993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
74093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_TXD:
74193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      dst0 = emit_tex(bld, inst, LP_BLD_TEX_MODIFIER_EXPLICIT_DERIV);
74293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
74393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
74493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_UP2H:
74593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated */
74693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert (0);
74793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
74893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
74993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
75093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_UP2US:
75193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated */
75293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
75393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
75493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
75593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
75693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_UP4B:
75793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated */
75893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
75993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
76093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
76193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
76293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_UP4UB:
76393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated */
76493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
76593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
76693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
76793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
76893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_X2D:
76993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
77093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
77193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
77293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
77393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
77493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ARA:
77593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated */
77693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
77793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
77893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
77993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
78093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ARR:
781bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
782bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_round(&bld->bld_base.base, src0);
78393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
78493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
78593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_BRA:
78693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated */
78793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
78893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
78993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
79093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
79193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_CAL:
79293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
79393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
79493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_RET:
79593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
79693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
79793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_END:
79893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      *pc = -1;
79993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
80093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
80193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SSG:
80293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /* TGSI_OPCODE_SGN */
803bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
804bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_sgn(&bld->bld_base.base, tmp0);
80593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
80693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
80793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_CMP:
808bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
809bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src1 = lp_build_emit_fetch(&bld->bld_base, inst, 1, LP_CHAN_ALL);
810bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src2 = lp_build_emit_fetch(&bld->bld_base, inst, 2, LP_CHAN_ALL);
811bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      tmp0 = lp_build_cmp(&bld->bld_base.base, PIPE_FUNC_LESS, src0, bld->bld_base.base.zero);
812bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_select(&bld->bld_base.base, tmp0, src1, src2);
81393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
81493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
81593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SCS:
81693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
81793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
81893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_TXB:
81993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      dst0 = emit_tex(bld, inst, LP_BLD_TEX_MODIFIER_LOD_BIAS);
82093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
82193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
82293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_NRM:
82393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* fall-through */
82493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_NRM4:
82593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
82693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
82793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_DIV:
82893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated */
82993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
83093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
83193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
83293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
83393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_DP2:
83493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
83593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
83693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_TXL:
83793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      dst0 = emit_tex(bld, inst, LP_BLD_TEX_MODIFIER_EXPLICIT_LOD);
83893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
83993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
84093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_TXP:
84193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      dst0 = emit_tex(bld, inst, LP_BLD_TEX_MODIFIER_PROJECTED);
84293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
84393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
84493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_BRK:
84593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
84693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
84793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_IF:
84893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
84993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
85093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_BGNLOOP:
85193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
85293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
85393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_BGNSUB:
85493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
85593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
85693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ELSE:
85793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
85893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
85993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ENDIF:
86093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
86193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
86293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ENDLOOP:
86393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
86493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
86593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ENDSUB:
86693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
86793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
86893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_PUSHA:
86993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
87093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
87193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
87293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
87393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
87493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_POPA:
87593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
87693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
87793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
87893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
87993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
88093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_CEIL:
881bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
882bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_ceil(&bld->bld_base.base, src0);
88393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
88493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
88593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_I2F:
88693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
88793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
88893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
88993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
89093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
89193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_NOT:
89293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
89393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
89493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
89593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
89693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
89793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_TRUNC:
898bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      src0 = lp_build_emit_fetch(&bld->bld_base, inst, 0, LP_CHAN_ALL);
899bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      dst0 = lp_build_trunc(&bld->bld_base.base, src0);
90093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
90193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
90293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SHL:
90393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
90493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
90593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
90693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
90793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
90893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ISHR:
90993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
91093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
91193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
91293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
91393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
91493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_AND:
91593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
91693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
91793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
91893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
91993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
92093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_OR:
92193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
92293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
92393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
92493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
92593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
92693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_MOD:
92793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
92893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
92993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
93093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
93193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
93293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_XOR:
93393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
93493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
93593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
93693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
93793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
93893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_SAD:
93993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
94093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
94193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
94293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
94393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
94493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_TXF:
94593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
94693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
94793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
94893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
94993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
95093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_TXQ:
95193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      /* deprecated? */
95293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      assert(0);
95393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
95493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
95593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
95693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_CONT:
95793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
95893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
95993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_EMIT:
96093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
96193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
96293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
96393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_ENDPRIM:
96493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
96593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
96693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
96793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   case TGSI_OPCODE_NOP:
96893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      break;
96993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
97093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   default:
97193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return FALSE;
97293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
97393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
97493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   if (info->num_dst) {
975bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      lp_emit_store_aos(bld, inst, 0, dst0);
97693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
97793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
97893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   return TRUE;
97993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca}
98093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
98193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
98293158622e26df1227f6eca8d619b5521f4cb1368José Fonsecavoid
983efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paullp_build_tgsi_aos(struct gallivm_state *gallivm,
98493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                  const struct tgsi_token *tokens,
98593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                  struct lp_type type,
98674f6edaee46505935b21e1d34f621b4aaf52fd35José Fonseca                  const unsigned char swizzles[4],
98793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                  LLVMValueRef consts_ptr,
98893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                  const LLVMValueRef *inputs,
98993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                  LLVMValueRef *outputs,
99093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                  struct lp_build_sampler_aos *sampler,
99193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                  const struct tgsi_shader_info *info)
99293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca{
99393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   struct lp_build_tgsi_aos_context bld;
99493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   struct tgsi_parse_context parse;
99593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   uint num_immediates = 0;
99693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   unsigned chan;
99793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   int pc = 0;
99893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
99993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   /* Setup build context */
100093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   memset(&bld, 0, sizeof bld);
1001bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   lp_build_context_init(&bld.bld_base.base, gallivm, type);
100266461aa249a95053fd5887df75ab791558c3a486Dave Airlie   lp_build_context_init(&bld.bld_base.uint_bld, gallivm, lp_uint_type(type));
100366461aa249a95053fd5887df75ab791558c3a486Dave Airlie   lp_build_context_init(&bld.bld_base.int_bld, gallivm, lp_int_type(type));
1004efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul   lp_build_context_init(&bld.int_bld, gallivm, lp_int_type(type));
1005697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca
1006697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   for (chan = 0; chan < 4; ++chan) {
1007697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca      bld.swizzles[chan] = swizzles[chan];
1008697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca      bld.inv_swizzles[swizzles[chan]] = chan;
1009697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca   }
1010697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca
101193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   bld.inputs = inputs;
101293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   bld.outputs = outputs;
101393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   bld.consts_ptr = consts_ptr;
101493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   bld.sampler = sampler;
101593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   bld.indirect_files = info->indirect_files;
1016bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   bld.bld_base.emit_swizzle = swizzle_aos;
1017bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   bld.bld_base.info = info;
1018bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard
1019bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   bld.bld_base.emit_fetch_funcs[TGSI_FILE_CONSTANT] = emit_fetch_constant;
1020bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   bld.bld_base.emit_fetch_funcs[TGSI_FILE_IMMEDIATE] = emit_fetch_immediate;
1021bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   bld.bld_base.emit_fetch_funcs[TGSI_FILE_INPUT] = emit_fetch_input;
1022bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   bld.bld_base.emit_fetch_funcs[TGSI_FILE_TEMPORARY] = emit_fetch_temporary;
102393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
1024bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   /* Set opcode actions */
1025bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   lp_set_default_actions_cpu(&bld.bld_base);
1026bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard
1027bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard   if (!lp_bld_tgsi_list_init(&bld.bld_base)) {
102893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      return;
102993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
103093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
103193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   tgsi_parse_init(&parse, tokens);
103293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
103393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   while (!tgsi_parse_end_of_tokens(&parse)) {
103493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      tgsi_parse_token(&parse);
103593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
103693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      switch(parse.FullToken.Token.Type) {
103793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      case TGSI_TOKEN_TYPE_DECLARATION:
103893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         /* Inputs already interpolated */
1039bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard         lp_emit_declaration_aos(&bld, &parse.FullToken.FullDeclaration);
104093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         break;
104193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
104293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      case TGSI_TOKEN_TYPE_INSTRUCTION:
1043bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard         /* save expanded instruction */
1044bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard         lp_bld_tgsi_add_instruction(&bld.bld_base,
1045bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard                                     &parse.FullToken.FullInstruction);
104693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         break;
104793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
104893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      case TGSI_TOKEN_TYPE_IMMEDIATE:
104993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         /* simply copy the immediate values into the next immediates[] slot */
105093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         {
105193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca            const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
1052697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca            float imm[4];
105393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca            assert(size <= 4);
105493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca            assert(num_immediates < LP_MAX_TGSI_IMMEDIATES);
1055697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca            for (chan = 0; chan < 4; ++chan) {
1056697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca               imm[chan] = 0.0f;
105793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca            }
1058697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca            for (chan = 0; chan < size; ++chan) {
1059697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca               unsigned swizzle = bld.swizzles[chan];
1060697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca               imm[swizzle] = parse.FullToken.FullImmediate.u[chan].Float;
106193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca            }
106293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca            bld.immediates[num_immediates] =
1063efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul                     lp_build_const_aos(gallivm, type,
1064697fdf3fff98943c44bc67f6c6cc17f6334724ddJosé Fonseca                                        imm[0], imm[1], imm[2], imm[3],
106593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                                        NULL);
106693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca            num_immediates++;
106793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         }
106893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         break;
106993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
107093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      case TGSI_TOKEN_TYPE_PROPERTY:
107193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         break;
107293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
107393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      default:
107493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         assert(0);
107593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      }
107693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
107793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
107893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   while (pc != -1) {
1079bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      struct tgsi_full_instruction *instr = bld.bld_base.instructions + pc;
108093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      const struct tgsi_opcode_info *opcode_info =
108193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         tgsi_get_opcode_info(instr->Instruction.Opcode);
1082bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard      if (!lp_emit_instruction_aos(&bld, instr, opcode_info, &pc))
108393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca         _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n",
108493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca                       opcode_info->mnemonic);
108593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
108693158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
108793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   if (0) {
1088efc82aef35a2aac5d2ed9774f6d28f2626796416Brian Paul      LLVMBasicBlockRef block = LLVMGetInsertBlock(gallivm->builder);
108993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      LLVMValueRef function = LLVMGetBasicBlockParent(block);
109093158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      debug_printf("11111111111111111111111111111 \n");
109193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      tgsi_dump(tokens, 0);
109293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      lp_debug_dump_value(function);
109393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      debug_printf("2222222222222222222222222222 \n");
109493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
109593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   tgsi_parse_free(&parse);
1096c426e63aa064debc23f9819c3862f357f1726bceJames Benton   FREE(bld.bld_base.instructions);
109793158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
109893158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   if (0) {
109993158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      LLVMModuleRef module = LLVMGetGlobalParent(
11006299f241e9fdd86e705d144a42d9b1979c13f9adBrian Paul         LLVMGetBasicBlockParent(LLVMGetInsertBlock(gallivm->builder)));
110193158622e26df1227f6eca8d619b5521f4cb1368José Fonseca      LLVMDumpModule(module);
110293158622e26df1227f6eca8d619b5521f4cb1368José Fonseca   }
110393158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
110493158622e26df1227f6eca8d619b5521f4cb1368José Fonseca}
110593158622e26df1227f6eca8d619b5521f4cb1368José Fonseca
1106