lp_bld_tgsi_soa.c revision 962558daaed43b0111cd062e32821aad106869d7
163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**************************************************************************
263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Copyright 2009 VMware, Inc.
463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * All Rights Reserved.
663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * copy of this software and associated documentation files (the
963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * "Software"), to deal in the Software without restriction, including
1063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
1163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
1263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
1363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * the following conditions:
1463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
1563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * The above copyright notice and this permission notice (including the
1663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
1763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * of the Software.
1863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
1963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
2763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca **************************************************************************/
2863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
295811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca/**
305811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @file
315811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * TGSI to LLVM IR translation -- SoA.
325811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
335811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
345811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
355811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell,
365811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Brian Paul, and others.
375811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca */
385811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca
3963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_config.h"
4063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_shader_tokens.h"
4163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_debug.h"
4263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_math.h"
4363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_memory.h"
442410125d072faeb83c8373e676422f6c44c78febBrian Paul#include "tgsi/tgsi_dump.h"
457821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "tgsi/tgsi_info.h"
4663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_parse.h"
4763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_util.h"
4863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_exec.h"
49021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin#include "tgsi/tgsi_scan.h"
5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h"
5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h"
5263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h"
537821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h"
5463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h"
553d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h"
5663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h"
576c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca#include "lp_bld_limits.h"
5880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h"
5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\
6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++)
6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
655b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN)))
6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( CHAN )\
7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0
7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1
7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2
7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3
7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT     0
8086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT    1
8186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT  2
8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3
8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
8480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
8580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstruct lp_exec_mask {
8680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   struct lp_build_context *bld;
8780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
8880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   boolean has_mask;
8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMTypeRef int_vec_type;
9180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
926c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMValueRef cond_stack[LP_MAX_TGSI_NESTING];
9380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   int cond_stack_size;
9480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef cond_mask;
9580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
966c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMValueRef break_stack[LP_MAX_TGSI_NESTING];
9718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   int break_stack_size;
9818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef break_mask;
9918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
1006c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMValueRef cont_stack[LP_MAX_TGSI_NESTING];
10118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   int cont_stack_size;
10218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef cont_mask;
10318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
1046c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMBasicBlockRef loop_stack[LP_MAX_TGSI_NESTING];
10518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   int loop_stack_size;
10618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBasicBlockRef loop_block;
10718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
10818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
10980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef exec_mask;
11080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin};
11163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context
11363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
11463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_context base;
11563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef consts_ptr;
117f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef *pos;
118f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef (*inputs)[NUM_CHANNELS];
11995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef (*outputs)[NUM_CHANNELS];
120c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca
1218be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   struct lp_build_sampler_soa *sampler;
12263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1236c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMValueRef immediates[LP_MAX_TGSI_IMMEDIATES][NUM_CHANNELS];
1246c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMValueRef temps[LP_MAX_TGSI_TEMPS][NUM_CHANNELS];
1256c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMValueRef addr[LP_MAX_TGSI_ADDRS][NUM_CHANNELS];
1261929057eac0c3351e0810612bdae56331a235736José Fonseca
127021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   /* we allocate an array of temps if we have indirect
128021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin    * addressing and then the temps above is unused */
129021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   LLVMValueRef temps_array;
130021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   boolean has_indirect_addressing;
131021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin
1323d7a88674f9eb3320eeff511968f041426e25023José Fonseca   struct lp_build_mask_context *mask;
13380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   struct lp_exec_mask exec_mask;
13463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca};
13563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
13686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
13786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = {
13886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_LEFT,
13986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_LEFT
14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
14386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = {
14486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_RIGHT,    QUAD_TOP_RIGHT,
14586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT
14686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
14786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
14886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
14986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = {
15086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT,
15186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT
15286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
15386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
15486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
15586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = {
15686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT,
15786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT
15886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
15986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
16080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld)
16180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
16280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->bld = bld;
16380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->has_mask = FALSE;
16480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_stack_size = 0;
16518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_stack_size = 0;
16618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->break_stack_size = 0;
16718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->cont_stack_size = 0;
16880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
16980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->int_vec_type = lp_build_int_vec_type(mask->bld->type);
17080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
17180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
17280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask)
17380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
17418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->loop_stack_size) {
17518a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin      /*for loops we need to update the entire mask at runtime */
17618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMValueRef tmp;
1777fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul      assert(mask->break_mask);
17818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      tmp = LLVMBuildAnd(mask->bld->builder,
17918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         mask->cont_mask,
18018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         mask->break_mask,
18118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         "maskcb");
18218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->exec_mask = LLVMBuildAnd(mask->bld->builder,
18318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     mask->cond_mask,
18418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     tmp,
18518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     "maskfull");
18618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   } else
18718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->exec_mask = mask->cond_mask;
18818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
18918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
19018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->has_mask = (mask->cond_stack_size > 0 ||
19118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                     mask->loop_stack_size > 0);
19280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
19380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
19480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask,
19580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                   LLVMValueRef val)
19680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
1976c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   assert(mask->cond_stack_size < LP_MAX_TGSI_NESTING);
19880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask;
19980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = LLVMBuildBitCast(mask->bld->builder, val,
20080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                      mask->int_vec_type, "");
20180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
20280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
20380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
20480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
20580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask)
20680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
20780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef prev_mask = mask->cond_stack[mask->cond_stack_size - 1];
208faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   LLVMValueRef inv_mask = LLVMBuildNot(mask->bld->builder,
209faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin                                        mask->cond_mask, "");
210faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin
211faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   /* means that we didn't have any mask before and that
212faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin    * we were fully enabled */
213faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   if (mask->cond_stack_size <= 1) {
214faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin      prev_mask = LLVMConstAllOnes(mask->int_vec_type);
215faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   }
216faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin
21780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = LLVMBuildAnd(mask->bld->builder,
21880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                  inv_mask,
21980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                  prev_mask, "");
22080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
22180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
22280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
22380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask)
22480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
22580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = mask->cond_stack[--mask->cond_stack_size];
22680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
22780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
22880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
22918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_bgnloop(struct lp_exec_mask *mask)
23018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
23118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
23218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cont_stack_size == 0)
23318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cont_mask = LLVMConstAllOnes(mask->int_vec_type);
234bba6a196bb69afc72a9ec56740a312987e77afc2Brian Paul   if (mask->break_stack_size == 0)
23518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->break_mask = LLVMConstAllOnes(mask->int_vec_type);
23618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cond_stack_size == 0)
23718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cond_mask = LLVMConstAllOnes(mask->int_vec_type);
2383a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin
2396c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   assert(mask->break_stack_size < LP_MAX_TGSI_NESTING);
2406c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   assert(mask->cont_stack_size < LP_MAX_TGSI_NESTING);
2416c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   assert(mask->break_stack_size < LP_MAX_TGSI_NESTING);
2426c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca
2433a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin   mask->break_stack[mask->break_stack_size++] = mask->break_mask;
2446d2e09fdc23e2573e9466f60db20ef4ac04b367dZack Rusin   mask->cont_stack[mask->cont_stack_size++] = mask->cont_mask;
24518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_stack[mask->loop_stack_size++] = mask->loop_block;
24618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_block = lp_build_insert_new_block(mask->bld->builder, "bgnloop");
24718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBuildBr(mask->bld->builder, mask->loop_block);
24818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMPositionBuilderAtEnd(mask->bld->builder, mask->loop_block);
24918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
25018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
25118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
25218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
25318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_break(struct lp_exec_mask *mask)
25418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
25518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder,
25618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         mask->exec_mask,
25718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         "break");
25818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
259d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin   mask->break_mask = LLVMBuildAnd(mask->bld->builder,
260d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin                                   mask->break_mask,
261d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin                                   exec_mask, "break_full");
26218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
26318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
26418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
26518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
26618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_continue(struct lp_exec_mask *mask)
26718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
26818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder,
26918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         mask->exec_mask,
27018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         "");
27118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
272d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin   mask->cont_mask = LLVMBuildAnd(mask->bld->builder,
273d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin                                  mask->cont_mask,
274d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin                                  exec_mask, "");
27518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
27618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
27718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
27818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
27918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
28018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_endloop(struct lp_exec_mask *mask)
28118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
28218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBasicBlockRef endloop;
283d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca   LLVMTypeRef reg_type = LLVMIntType(mask->bld->type.width*
284d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca                                      mask->bld->type.length);
2857fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul   LLVMValueRef i1cond;
2867fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul
2877fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul   assert(mask->break_mask);
2887fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul
289d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca   /* i1cond = (mask == 0) */
2907fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul   i1cond = LLVMBuildICmp(
291d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      mask->bld->builder,
292d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMIntNE,
293d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMBuildBitCast(mask->bld->builder, mask->break_mask, reg_type, ""),
294d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMConstNull(reg_type), "");
29518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
29618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   endloop = lp_build_insert_new_block(mask->bld->builder, "endloop");
29718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
29818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBuildCondBr(mask->bld->builder,
299ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin                   i1cond, mask->loop_block, endloop);
30018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
30118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMPositionBuilderAtEnd(mask->bld->builder, endloop);
30218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
30318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_block = mask->loop_stack[--mask->loop_stack_size];
30418a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin   /* pop the cont mask */
30518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cont_stack_size) {
30618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cont_mask = mask->cont_stack[--mask->cont_stack_size];
30718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   }
30818a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin   /* pop the break mask */
30918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->break_stack_size) {
3103a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin      mask->break_mask = mask->break_stack[--mask->break_stack_size];
31118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   }
31218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
31318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
31418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
31518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
31618a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin/* stores val into an address pointed to by dst.
31718a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * mask->exec_mask is used to figure out which bits of val
31818a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * should be stored into the address
31918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * (0 means don't store this bit, 1 means do store).
32018a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin */
32180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask,
32280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                               LLVMValueRef val,
32380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                               LLVMValueRef dst)
32480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
32580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   if (mask->has_mask) {
32680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMValueRef real_val, dst_val;
32780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
32880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      dst_val = LLVMBuildLoad(mask->bld->builder, dst, "");
32980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      real_val = lp_build_select(mask->bld,
33080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                 mask->exec_mask,
33180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                 val, dst_val);
33280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
33380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMBuildStore(mask->bld->builder, real_val, dst);
33480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   } else
33580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMBuildStore(mask->bld->builder, val, dst);
33680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
33780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
33886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
33986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
34086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld,
34186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
34286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
34386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_left  = lp_build_swizzle1_aos(&bld->base, src, swizzle_left);
34486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right);
34586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_right, src_left);
34686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
34786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
34886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
34986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
35086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld,
35186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
35286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
35386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_top    = lp_build_swizzle1_aos(&bld->base, src, swizzle_top);
35486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom);
35586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_top, src_bottom);
35686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
35786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
358021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinstatic LLVMValueRef
359021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinget_temp_ptr(struct lp_build_tgsi_soa_context *bld,
360021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             unsigned index,
361021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             unsigned swizzle,
362021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             boolean is_indirect,
363021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             LLVMValueRef addr)
364021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin{
365021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   if (!bld->has_indirect_addressing) {
366021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      return bld->temps[index][swizzle];
367021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   } else {
368021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      LLVMValueRef lindex =
369021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         LLVMConstInt(LLVMInt32Type(), index*4 + swizzle, 0);
370021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      if (is_indirect)
371021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         lindex = lp_build_add(&bld->base, lindex, addr);
372021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      return LLVMBuildGEP(bld->base.builder, bld->temps_array, &lindex, 1, "");
373021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   }
374021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin}
37586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
37663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
37763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch.
37863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
37963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef
38063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch(
38163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
3822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst,
3832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
38463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const unsigned chan_index )
38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
3867d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[index];
387b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef res;
389ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin   LLVMValueRef addr;
39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
39163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (swizzle) {
392b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_X:
393b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Y:
394b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Z:
395b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_W:
39663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
397ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      if (reg->Register.Indirect) {
398ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type);
399ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         unsigned swizzle = tgsi_util_get_src_register_swizzle( &reg->Indirect, chan_index );
400ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         addr = LLVMBuildLoad(bld->base.builder,
401ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                              bld->addr[reg->Indirect.Index][swizzle],
402ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                              "");
403ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         /* for indexing we want integers */
404ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         addr = LLVMBuildFPToSI(bld->base.builder, addr,
405ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                                int_vec_type, "");
406ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         addr = LLVMBuildExtractElement(bld->base.builder,
407ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                                        addr, LLVMConstInt(LLVMInt32Type(), 0, 0),
408ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                                        "");
409021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0));
410ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      }
411ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
41291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      switch (reg->Register.File) {
41363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_CONSTANT: {
41491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0);
415ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         LLVMValueRef scalar, scalar_ptr;
416ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
417ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         if (reg->Register.Indirect) {
418ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin            /*lp_build_printf(bld->base.builder,
419ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin              "\taddr = %d\n", addr);*/
420ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin            index = lp_build_add(&bld->base, index, addr);
421ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         }
422ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, "");
423ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, "");
424ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
42563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = lp_build_broadcast_scalar(&bld->base, scalar);
42663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
42763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
42863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
42963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_IMMEDIATE:
43091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->immediates[reg->Register.Index][swizzle];
43163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
43263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
43363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_INPUT:
43591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->inputs[reg->Register.Index][swizzle];
43663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
43763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
43863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
439021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      case TGSI_FILE_TEMPORARY: {
440021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index,
441021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                              swizzle,
442021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                              reg->Register.Indirect,
443021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                              addr);
444021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         res = LLVMBuildLoad(bld->base.builder, temp_ptr, "");
44563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if(!res)
44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            return bld->base.undef;
44763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
448021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      }
44963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
45063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
45163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
4524d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca         return bld->base.undef;
45363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
45463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
45563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
45663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
45763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
4584d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca      return bld->base.undef;
45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) {
46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_CLEAR:
46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_SET:
4671fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* TODO: Use bitwese OR for floating point */
46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
46963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_TOGGLE:
47363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
47463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
47563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
47663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_KEEP:
47763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
47963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return res;
48163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
48263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
48586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives.
48686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */
48786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void
48886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv(
48986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   struct lp_build_tgsi_soa_context *bld,
49086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const struct tgsi_full_instruction *inst,
49186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   unsigned index,
49286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const unsigned chan_index,
49386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *res,
49486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddx,
49586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddy)
49686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
49786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src;
49886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
49986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   src = emit_fetch(bld, inst, index, chan_index);
50086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
50186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(res)
50286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *res = src;
50386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
50486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   /* TODO: use interpolation coeffs for inputs */
50586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
50686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddx)
50786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddx = emit_ddx(bld, src);
50886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
50986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddy)
51086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddy = emit_ddy(bld, src);
51186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
51286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
51386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
51486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/**
51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store.
51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
51763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
51863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store(
51963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
52063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const struct tgsi_full_instruction *inst,
5212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
52263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index,
52363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef value)
52463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
5257d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_dst_register *reg = &inst->Dst[index];
526021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   LLVMValueRef addr;
5272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca
52863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( inst->Instruction.Saturate ) {
52963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_NONE:
53063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
53163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
53263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_ZERO_ONE:
5337926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, bld->base.zero);
5347926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
53563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
53663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
53763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_MINUS_PLUS_ONE:
538185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul      value = lp_build_max(&bld->base, value, lp_build_const_vec(bld->base.type, -1.0));
5397926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
54063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
5417926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca
5427926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca   default:
5437926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      assert(0);
54463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
54563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
546021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   if (reg->Register.Indirect) {
547021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type);
548021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      unsigned swizzle = tgsi_util_get_src_register_swizzle( &reg->Indirect, chan_index );
549021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = LLVMBuildLoad(bld->base.builder,
550021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                           bld->addr[reg->Indirect.Index][swizzle],
551021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                           "");
552021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      /* for indexing we want integers */
553021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = LLVMBuildFPToSI(bld->base.builder, addr,
554021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                             int_vec_type, "");
555021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = LLVMBuildExtractElement(bld->base.builder,
556021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                     addr, LLVMConstInt(LLVMInt32Type(), 0, 0),
557021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                     "");
558021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0));
559021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   }
560021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin
5615b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   switch( reg->Register.File ) {
56263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_OUTPUT:
56380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_store(&bld->exec_mask, value,
56480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                         bld->outputs[reg->Register.Index][chan_index]);
56563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
56663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
567021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   case TGSI_FILE_TEMPORARY: {
568021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index,
569021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                           chan_index,
570021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                           reg->Register.Indirect,
571021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                           addr);
572021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      lp_exec_mask_store(&bld->exec_mask, value, temp_ptr);
57363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
574021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   }
57563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
57663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_ADDRESS:
577ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      lp_exec_mask_store(&bld->exec_mask, value,
578ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                         bld->addr[reg->Indirect.Index][chan_index]);
57963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
58063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
581ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca   case TGSI_FILE_PREDICATE:
582ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      /* FIXME */
583ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      break;
584ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca
58563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
58663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
58763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
58863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
58963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
59063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
59163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
59263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators.
59363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
59463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
595962558daaed43b0111cd062e32821aad106869d7José Fonsecaenum tex_modifier {
596962558daaed43b0111cd062e32821aad106869d7José Fonseca   TEX_MODIFIER_NONE = 0,
597962558daaed43b0111cd062e32821aad106869d7José Fonseca   TEX_MODIFIER_PROJECTED,
598962558daaed43b0111cd062e32821aad106869d7José Fonseca   TEX_MODIFIER_LOD_BIAS,
599962558daaed43b0111cd062e32821aad106869d7José Fonseca   TEX_MODIFIER_EXPLICIT_LOD,
600962558daaed43b0111cd062e32821aad106869d7José Fonseca   TEX_MODIFIER_EXPLICIT_DERIV
601962558daaed43b0111cd062e32821aad106869d7José Fonseca};
60286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
60363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
60463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld,
60563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          const struct tgsi_full_instruction *inst,
606962558daaed43b0111cd062e32821aad106869d7José Fonseca          enum tex_modifier modifier,
607faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca          LLVMValueRef *texel)
60863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
609962558daaed43b0111cd062e32821aad106869d7José Fonseca   unsigned unit;
61063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef lodbias;
61131d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee   LLVMValueRef oow = NULL;
612c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   LLVMValueRef coords[3];
613962558daaed43b0111cd062e32821aad106869d7José Fonseca   LLVMValueRef ddx[3];
614962558daaed43b0111cd062e32821aad106869d7José Fonseca   LLVMValueRef ddy[3];
615c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   unsigned num_coords;
61663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
61763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6189db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca   if (!bld->sampler) {
6199db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca      _debug_printf("warning: found texture instruction but no sampler generator supplied\n");
6209db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca      for (i = 0; i < 4; i++) {
6219db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca         texel[i] = bld->base.undef;
6229db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca      }
6239db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca      return;
6249db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca   }
6259db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca
6267d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   switch (inst->Texture.Texture) {
62763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_1D:
628c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 1;
62963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
63063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_2D:
63163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_RECT:
632c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 2;
63363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
634f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW1D:
635f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW2D:
636f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOWRECT:
63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_3D:
63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_CUBE:
639c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 3;
64063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
64163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
64263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
64363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return;
64463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
64563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
646962558daaed43b0111cd062e32821aad106869d7José Fonseca   /* FIXME: Treat TEX_MODIFIER_EXPLICIT_LOD correctly */
647962558daaed43b0111cd062e32821aad106869d7José Fonseca   if (modifier == TEX_MODIFIER_LOD_BIAS || TEX_MODIFIER_EXPLICIT_LOD)
6482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      lodbias = emit_fetch( bld, inst, 0, 3 );
64963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   else
65063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      lodbias = bld->base.zero;
65163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
652962558daaed43b0111cd062e32821aad106869d7José Fonseca   if (modifier == TEX_MODIFIER_PROJECTED) {
6532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      oow = emit_fetch( bld, inst, 0, 3 );
65463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      oow = lp_build_rcp(&bld->base, oow);
65563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
65663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
657c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   for (i = 0; i < num_coords; i++) {
658c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      coords[i] = emit_fetch( bld, inst, 0, i );
659962558daaed43b0111cd062e32821aad106869d7José Fonseca      if (modifier == TEX_MODIFIER_PROJECTED)
660c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca         coords[i] = lp_build_mul(&bld->base, coords[i], oow);
66163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
662ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   for (i = num_coords; i < 3; i++) {
663ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca      coords[i] = bld->base.undef;
664ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   }
66563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
666962558daaed43b0111cd062e32821aad106869d7José Fonseca   if (modifier == TEX_MODIFIER_EXPLICIT_DERIV) {
667962558daaed43b0111cd062e32821aad106869d7José Fonseca      for (i = 0; i < num_coords; i++) {
668962558daaed43b0111cd062e32821aad106869d7José Fonseca         ddx[i] = emit_fetch( bld, inst, 1, i );
669962558daaed43b0111cd062e32821aad106869d7José Fonseca         ddy[i] = emit_fetch( bld, inst, 2, i );
670962558daaed43b0111cd062e32821aad106869d7José Fonseca      }
671962558daaed43b0111cd062e32821aad106869d7José Fonseca      unit = inst->Src[3].Register.Index;
672962558daaed43b0111cd062e32821aad106869d7José Fonseca   }  else {
673962558daaed43b0111cd062e32821aad106869d7José Fonseca      for (i = 0; i < num_coords; i++) {
674962558daaed43b0111cd062e32821aad106869d7José Fonseca         ddx[i] = emit_ddx( bld, coords[i] );
675962558daaed43b0111cd062e32821aad106869d7José Fonseca         ddy[i] = emit_ddy( bld, coords[i] );
676962558daaed43b0111cd062e32821aad106869d7José Fonseca      }
677962558daaed43b0111cd062e32821aad106869d7José Fonseca      unit = inst->Src[1].Register.Index;
678962558daaed43b0111cd062e32821aad106869d7José Fonseca   }
679962558daaed43b0111cd062e32821aad106869d7José Fonseca
6808be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld->sampler->emit_fetch_texel(bld->sampler,
6818be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.builder,
6828be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.type,
683962558daaed43b0111cd062e32821aad106869d7José Fonseca                                  unit, num_coords, coords,
684962558daaed43b0111cd062e32821aad106869d7José Fonseca                                  ddx, ddy, lodbias,
6858be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  texel);
68663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
68763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
68863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
689feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/**
690feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Kill fragment if any of the src register values are negative.
691feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */
69263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil(
69463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
6952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst )
69663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
6977d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[0];
6987821664b15501b173b2304bbada758c33c5ff972José Fonseca   LLVMValueRef terms[NUM_CHANNELS];
6993d7a88674f9eb3320eeff511968f041426e25023José Fonseca   LLVMValueRef mask;
70063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
70163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7027821664b15501b173b2304bbada758c33c5ff972José Fonseca   memset(&terms, 0, sizeof terms);
70363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
70463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( chan_index ) {
70563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned swizzle;
70663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7077821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Unswizzle channel */
708b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell      swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
70963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7107821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Check if the component has not been already tested. */
7117821664b15501b173b2304bbada758c33c5ff972José Fonseca      assert(swizzle < NUM_CHANNELS);
7127821664b15501b173b2304bbada758c33c5ff972José Fonseca      if( !terms[swizzle] )
7137821664b15501b173b2304bbada758c33c5ff972José Fonseca         /* TODO: change the comparison operator instead of setting the sign */
7142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         terms[swizzle] =  emit_fetch(bld, inst, 0, chan_index );
71563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
71663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7173d7a88674f9eb3320eeff511968f041426e25023José Fonseca   mask = NULL;
7187821664b15501b173b2304bbada758c33c5ff972José Fonseca   FOR_EACH_CHANNEL( chan_index ) {
719aede39efd86d200ffbace8fc012104e31f673973José Fonseca      if(terms[chan_index]) {
7203d7a88674f9eb3320eeff511968f041426e25023José Fonseca         LLVMValueRef chan_mask;
721aede39efd86d200ffbace8fc012104e31f673973José Fonseca
722feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul         /*
723feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          * If term < 0 then mask = 0 else mask = ~0.
724feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          */
7253d7a88674f9eb3320eeff511968f041426e25023José Fonseca         chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero);
726aede39efd86d200ffbace8fc012104e31f673973José Fonseca
7273d7a88674f9eb3320eeff511968f041426e25023José Fonseca         if(mask)
7283d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, "");
7293d7a88674f9eb3320eeff511968f041426e25023José Fonseca         else
7303d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = chan_mask;
731aede39efd86d200ffbace8fc012104e31f673973José Fonseca      }
73263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
7333d7a88674f9eb3320eeff511968f041426e25023José Fonseca
7343d7a88674f9eb3320eeff511968f041426e25023José Fonseca   if(mask)
7353d7a88674f9eb3320eeff511968f041426e25023José Fonseca      lp_build_mask_update(bld->mask, mask);
73663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
73763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
73863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
73963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
740feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Predicated fragment kill.
741feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * XXX Actually, we do an unconditional kill (as in tgsi_exec.c).
742feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * The only predication is the execution mask which will apply if
743feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * we're inside a loop or conditional.
744feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */
745feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulstatic void
746feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulemit_kilp(struct lp_build_tgsi_soa_context *bld,
747feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          const struct tgsi_full_instruction *inst)
748feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul{
749feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   LLVMValueRef mask;
750feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
751feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   /* For those channels which are "alive", disable fragment shader
752feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul    * execution.
753feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul    */
754feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   if (bld->exec_mask.has_mask) {
755feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      mask = LLVMBuildNot(bld->base.builder, bld->exec_mask.exec_mask, "kilp");
756feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   }
757feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   else {
758feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      mask = bld->base.zero;
759feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   }
760feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
761feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   lp_build_mask_update(bld->mask, mask);
762feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul}
763feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
764e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonsecastatic void
76585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration(
76685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   struct lp_build_tgsi_soa_context *bld,
76785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   const struct tgsi_full_declaration *decl)
76885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{
769a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca   LLVMTypeRef vec_type = lp_build_vec_type(bld->base.type);
770a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca
77185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned first = decl->Range.First;
77285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned last = decl->Range.Last;
77385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned idx, i;
77485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
77585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   for (idx = first; idx <= last; ++idx) {
77685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      switch (decl->Declaration.File) {
77785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      case TGSI_FILE_TEMPORARY:
7786c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca         assert(idx < LP_MAX_TGSI_TEMPS);
779021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         if (bld->has_indirect_addressing) {
780021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin            LLVMValueRef val = LLVMConstInt(LLVMInt32Type(),
781021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                            last*4 + 4, 0);
782a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca            bld->temps_array = lp_build_array_alloca(bld->base.builder,
783a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca                                                     vec_type, val, "");
784021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         } else {
785021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin            for (i = 0; i < NUM_CHANNELS; i++)
786a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca               bld->temps[idx][i] = lp_build_alloca(bld->base.builder,
787a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca                                                    vec_type, "");
788021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         }
78985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         break;
79085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
79185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      case TGSI_FILE_OUTPUT:
79285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         for (i = 0; i < NUM_CHANNELS; i++)
793a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca            bld->outputs[idx][i] = lp_build_alloca(bld->base.builder,
794a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca                                                   vec_type, "");
79585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         break;
79685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
797ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      case TGSI_FILE_ADDRESS:
7986c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca         assert(idx < LP_MAX_TGSI_ADDRS);
799ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         for (i = 0; i < NUM_CHANNELS; i++)
800a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca            bld->addr[idx][i] = lp_build_alloca(bld->base.builder,
801a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca                                                vec_type, "");
802ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         break;
803ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
804e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca      case TGSI_FILE_PREDICATE:
805e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca         _debug_printf("warning: predicate registers not yet implemented\n");
806e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca         break;
807e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca
80885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      default:
80985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         /* don't need to declare other vars */
810dc886ba1391d7d890bd1f5532bc14553e883a418Zack Rusin         break;
811012fabca722494162c244a367913562b8cfa4677Zack Rusin      }
81285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   }
81385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin}
81463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
815fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul
816fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul/**
817fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * Emit LLVM for one TGSI instruction.
818fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * \param return TRUE for success, FALSE otherwise
819fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul */
820fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paulstatic boolean
82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction(
82263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
823faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_full_instruction *inst,
824faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_opcode_info *info)
82563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
82663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
82790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef src0, src1, src2;
828e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp0, tmp1, tmp2;
829e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp3 = NULL;
830e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp4 = NULL;
831e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp5 = NULL;
832e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp6 = NULL;
833e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp7 = NULL;
834faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef res;
835faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef dst0[NUM_CHANNELS];
83663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
83789258652b6a1d282bed14549907892bdfda752f0José Fonseca   /*
83889258652b6a1d282bed14549907892bdfda752f0José Fonseca    * Stores and write masks are handled in a general fashion after the long
83989258652b6a1d282bed14549907892bdfda752f0José Fonseca    * instruction opcode switch statement.
84089258652b6a1d282bed14549907892bdfda752f0José Fonseca    *
84189258652b6a1d282bed14549907892bdfda752f0José Fonseca    * Although not stricitly necessary, we avoid generating instructions for
84289258652b6a1d282bed14549907892bdfda752f0José Fonseca    * channels which won't be stored, in cases where's that easy. For some
84389258652b6a1d282bed14549907892bdfda752f0José Fonseca    * complex instructions, like texture sampling, it is more convenient to
84489258652b6a1d282bed14549907892bdfda752f0José Fonseca    * assume a full writemask and then let LLVM optimization passes eliminate
84589258652b6a1d282bed14549907892bdfda752f0José Fonseca    * redundant code.
84689258652b6a1d282bed14549907892bdfda752f0José Fonseca    */
84789258652b6a1d282bed14549907892bdfda752f0José Fonseca
848faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   assert(info->num_dst <= 1);
849faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
850faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
851faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.undef;
852faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
853faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
854faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
85563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->Instruction.Opcode) {
85663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARL:
8572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
859ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         tmp0 = lp_build_floor(&bld->base, tmp0);
860faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
86163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
86263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
86363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
86463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOV:
8652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
866faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index );
86763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
86863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
86963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
87063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LIT:
8712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) {
872faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
87363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
8752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
876faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero);
877ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca      }
8782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
879ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = SrcReg[0].yyyy */
8802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
881ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = max(XMM[1], 0) */
882ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero);
883ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[2] = SrcReg[0].wwww */
8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 0, CHAN_W );
885ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_pow( &bld->base, tmp1, tmp2);
8862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
887c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero);
888faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero);
889c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca      }
8902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) {
891faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
89263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
89363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
89463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
89563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCP:
89663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIP */
8972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
898faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rcp(&bld->base, src0);
8992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
900faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
90163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
90263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
90363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
90463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RSQ:
90563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIPSQRT */
9062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
90790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      src0 = lp_build_abs(&bld->base, src0);
908faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rsqrt(&bld->base, src0);
9092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
910faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
91163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
91263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
91363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
91463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EXP:
9152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
9162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
9172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
91857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2_int_part = NULL;
91957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_frac_part = NULL;
92057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2 = NULL;
92157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
9222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
92357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
9242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
92557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2_int_part = &tmp0;
9262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
92757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_frac_part = &tmp1;
9282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
92957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2 = &tmp2;
93057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
93157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2);
93257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
9332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
934faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
9352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
936faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = tmp1;
9372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
938faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
93963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
94063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
9412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
942faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
94363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
94463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
94563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOG:
9472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
9482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
9492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
950add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_floor_log2 = NULL;
951add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_exp = NULL;
952add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_log2 = NULL;
95357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
9542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
95557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         src0 = lp_build_abs( &bld->base, src0 );
95657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
9572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
95857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_floor_log2 = &tmp0;
9592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
96057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp = &tmp1;
9612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
96257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_log2 = &tmp2;
96357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
96457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2);
96557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
96657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.x = floor(lg2(abs(src.x))) */
9672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
968faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
96957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */
9702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) {
971faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1);
97263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
97357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.z = lg2(abs(src.x)) */
9742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
975faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
97663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
97763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
9782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
979faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
98063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
98163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
98263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MUL:
9842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
987faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_mul(&bld->base, src0, src1);
98863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
98963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
99063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
99163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ADD:
9922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
995faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add(&bld->base, src0, src1);
99663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
99763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
99863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
99963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP3:
100063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT3 */
10012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
10022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
100390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
10042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
10052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
100690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
100790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
10092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
101090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
101190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1013faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
101463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
101563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
101763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP4:
101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT4 */
10192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
10202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
102190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
10222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
10232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
102490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
102590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
10272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
102890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
102990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_W );
10312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_W );
103290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
103390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1035faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
103663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
103763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DST:
10402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
1041faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
104263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
10442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
10452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Y );
1046faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1);
104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1049faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z );
105063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1052faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W );
105363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
105463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MIN:
10572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1060faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_min( &bld->base, src0, src1 );
106163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAX:
10652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1068faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_max( &bld->base, src0, src1 );
106963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
107063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLT:
107363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETLT */
10742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10771aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 );
1078faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
10791aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
108063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
108163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
108263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGE:
108363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETGE */
10842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10871aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 );
1088faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
10891aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
109063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
109163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
109263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAD:
109363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_MADD */
10942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
10962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
10972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 2, chan_index );
109890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
109990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_add( &bld->base, tmp0, tmp2);
1100faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
110163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
110263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
110363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SUB:
11052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
11072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
1108faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1);
110963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
111063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
111163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
111263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LRP:
11132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
11152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
11162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
111790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, src1, src2 );
111890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, src0, tmp0 );
1119faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 );
112063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
112163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
112263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
112363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND:
1124873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1125873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
1126873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1127873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
1128185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul         tmp1 = lp_build_const_vec(bld->base.type, 0.5);
1129873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1);
1130faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 );
1131873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
113363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2A:
11352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
11362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
113790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
11382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
11392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
114090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
114190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
11422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 2, CHAN_X );  /* xmm1 = src[2].x */
114390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
11442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1145faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
114663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
114763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
114863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
114963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FRC:
11502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1151873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
1152873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_floor(&bld->base, src0);
1153f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul         tmp0 = lp_build_sub(&bld->base, src0, tmp0);
1154faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
115663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
115763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
115863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CLAMP:
1159873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1160873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1161873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1162873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
1163873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_max(&bld->base, tmp0, src1);
1164873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_min(&bld->base, tmp0, src2);
1165faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
1166873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
116863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FLR:
11702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1172faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_floor(&bld->base, tmp0);
117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
117463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
117563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ROUND:
11772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1179faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_round(&bld->base, tmp0);
118063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
118163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
118263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   case TGSI_OPCODE_EX2: {
11842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
118590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_exp2( &bld->base, tmp0);
11862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1187faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
118963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
119090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   }
119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LG2:
11932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
119490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_log2( &bld->base, tmp0);
11952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1196faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
119863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
120063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POW:
12012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
12022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src1 = emit_fetch( bld, inst, 1, CHAN_X );
1203faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_pow( &bld->base, src0, src1 );
12042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1205faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
120663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
120763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
120863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XPD:
12102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
12112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
12122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Z );
12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp3 = emit_fetch( bld, inst, 0, CHAN_Z );
121463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
12162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
12172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
12182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp4 = emit_fetch( bld, inst, 1, CHAN_Y );
121963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
122190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = tmp0;
122290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_mul( &bld->base, tmp2, tmp1);
122390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = tmp3;
122490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
122590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_sub( &bld->base, tmp2, tmp5);
1226faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = tmp2;
122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
12292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
12302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 1, CHAN_X );
12312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp5 = emit_fetch( bld, inst, 0, CHAN_X );
123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
123490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_mul( &bld->base, tmp3, tmp2);
123590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp1 = lp_build_mul( &bld->base, tmp1, tmp5);
123690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_sub( &bld->base, tmp3, tmp1);
1237faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = tmp3;
123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
124090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
124190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp2);
124290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_sub( &bld->base, tmp5, tmp0);
1243faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = tmp5;
124463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1246faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ABS:
12512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1253faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_abs( &bld->base, tmp0 );
125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCC:
1258873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1259873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1260fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
126163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DPH:
12632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
12642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
126590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
12662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
12672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
126890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
126990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
12702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
12712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
127290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
127390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
12742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_W );
127590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
12762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1277faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
127863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_COS:
12822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
128390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_cos( &bld->base, tmp0 );
12842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1285faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
128763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDX:
129086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
129186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL);
129286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
129363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDY:
129686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
129786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]);
129886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KILP:
130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* predicated kill */
1303feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      emit_kilp( bld, inst );
130463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KIL:
130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* conditional kill */
13082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_kil( bld, inst );
130963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2H:
1312fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
131363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2US:
1316fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4B:
1320fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
132163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4UB:
1324fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RFL:
1328fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SEQ:
13322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
13342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
13351aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 );
1336faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
13371aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
133863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
134063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SFL:
1341873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1342faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.zero;
1343873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
134463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
134563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
134663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGT:
13472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
13492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
13501aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 );
1351faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
13521aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
135363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SIN:
13562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
135790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_sin( &bld->base, tmp0 );
13582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1359faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
136263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLE:
13642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
13662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
13671aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 );
1368faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
13691aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
137063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SNE:
13732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
13752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
13761aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 );
1377faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
13781aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
138163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_STR:
1382873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1383faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.one;
1384873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
138563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TEX:
1388962558daaed43b0111cd062e32821aad106869d7José Fonseca      emit_tex( bld, inst, TEX_MODIFIER_NONE, dst0 );
138963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
139063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
139163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXD:
1392962558daaed43b0111cd062e32821aad106869d7José Fonseca      emit_tex( bld, inst, TEX_MODIFIER_EXPLICIT_DERIV, dst0 );
139363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
139463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
139563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2H:
1396873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1397873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert (0);
1398fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
139963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
140063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
140163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2US:
1402873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1403873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1404fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
140663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
140763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4B:
1408873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1409873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1410fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4UB:
1414873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1415873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1416fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_X2D:
1420873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1421873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1422fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARA:
1426873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1427873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1428fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARR:
14322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1434ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         tmp0 = lp_build_round(&bld->base, tmp0);
1435faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
143763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
143863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRA:
1440873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1441873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1442fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
144463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
144563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CAL:
1446873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1447fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RET:
1451873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1452fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
145363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_END:
145663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
145763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SSG:
145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SGN */
14602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1462faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 );
146363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
146463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
146563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CMP:
14672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
14692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
14702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
14711aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero );
1472faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2);
14731aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
147463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
147563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
147663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SCS:
14772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
14782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1479faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 );
148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
14822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1483faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 );
148463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1486faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = bld->base.zero;
148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1489faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
149063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
149163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
149263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
149363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXB:
1494962558daaed43b0111cd062e32821aad106869d7José Fonseca      emit_tex( bld, inst, TEX_MODIFIER_LOD_BIAS, dst0 );
149563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM:
149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* fall-through */
149963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM4:
150063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* 3 or 4-component normalization */
150163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      {
150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4;
150363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
15042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) ||
15052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) ||
15062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) ||
15072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) {
150863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
150963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */
151063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
151163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm4 = src.x */
151263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = src.x * src.x */
15132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
15142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
151590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = tmp0;
151663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
151790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_mul( &bld->base, tmp0, tmp0);
151863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
151963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm5 = src.y */
152063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.y * src.y */
15212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Y);
15222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
152390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = tmp1;
152463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
152590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
152690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
152763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
152863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm6 = src.z */
152963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.z * src.z */
15302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Z);
15312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
153290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = tmp1;
153363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
153490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
153590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
153663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
153763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            if (dims == 4) {
153863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm7 = src.w */
153963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm0 = xmm0 + src.w * src.w */
15402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               tmp1 = emit_fetch(bld, inst, 0, CHAN_W);
15412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) {
154290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca                  tmp7 = tmp1;
154363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
154490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
154590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
154663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
154763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
154863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm1 = 1 / sqrt(xmm0) */
154990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_rsqrt( &bld->base, tmp0);
155063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
155163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.x = xmm1 * src.x */
15522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
1553faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1);
155463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
155563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.y = xmm1 * src.y */
15572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
1558faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1);
155963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
156063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
156163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.z = xmm1 * src.z */
15622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
1563faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1);
156463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
156563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
156663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.w = xmm1 * src.w */
15672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) {
1568faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1);
156963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
157063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
157163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1572faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         /* dst.w = 1.0 */
15732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) {
1574faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_W] = bld->base.one;
157563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
157663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
157763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
157863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
157963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DIV:
1580873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1581873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert( 0 );
1582fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
158363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
158463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
158563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2:
15862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
15872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
158890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
15892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
15902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
159190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
159290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
15932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1594faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
159563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
159663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
159763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
159863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXL:
1599962558daaed43b0111cd062e32821aad106869d7José Fonseca      emit_tex( bld, inst, TEX_MODIFIER_EXPLICIT_LOD, dst0 );
160063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
160163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
160263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXP:
1603962558daaed43b0111cd062e32821aad106869d7José Fonseca      emit_tex( bld, inst, TEX_MODIFIER_PROJECTED, dst0 );
160463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
160518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
160663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRK:
160718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_break(&bld->exec_mask);
160863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
160963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
161063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_IF:
161180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
1612ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin      tmp0 = lp_build_cmp(&bld->base, PIPE_FUNC_NOTEQUAL,
1613ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin                          tmp0, bld->base.zero);
161480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_push(&bld->exec_mask, tmp0);
161563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
161663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
161718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   case TGSI_OPCODE_BGNLOOP:
161818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_bgnloop(&bld->exec_mask);
161918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      break;
162018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
162163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ELSE:
162280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_invert(&bld->exec_mask);
162363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
162463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
162563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDIF:
162680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_pop(&bld->exec_mask);
162763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
162863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
162918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   case TGSI_OPCODE_ENDLOOP:
163018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_endloop(&bld->exec_mask);
163118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      break;
163218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
163363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PUSHA:
1634873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1635873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1636fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
163763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
163863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
163963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POPA:
1640873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1641873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1642fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
164363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
164463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
164563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CEIL:
1646873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1647873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1648faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_ceil(&bld->base, tmp0);
1649873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
165063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
165163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
165263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_I2F:
1653873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1654873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1655fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
165663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
165763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
165863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NOT:
1659873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1660873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1661fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
166263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
166363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
166463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TRUNC:
16652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
16662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1667faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_trunc(&bld->base, tmp0);
166863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
166963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
167063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
167163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHL:
1672873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1673873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1674fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
167563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
167663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16772c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol   case TGSI_OPCODE_ISHR:
1678873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1679873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1680fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
168163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
168263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
168363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_AND:
1684873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1685873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1686fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
168763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
168863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
168963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_OR:
1690873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1691873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1692fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
169363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
169463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
169563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOD:
1696873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1697873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1698fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
169963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
170063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
170163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XOR:
1702873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1703873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1704fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
170563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
170663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
170763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SAD:
1708873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1709873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1710fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
171163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
171263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
171363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXF:
1714873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1715873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1716fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
171763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
171863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
171963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXQ:
1720873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1721873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1722fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
172363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
172463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
172563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CONT:
172618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_continue(&bld->exec_mask);
172763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
172863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
172963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EMIT:
1730fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
173163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
173263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
173363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDPRIM:
1734fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
173563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
173663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1737873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOP:
1738873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      break;
1739873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca
174063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
1741fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
174263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
174363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1744faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
1745faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1746faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0[chan_index]);
1747faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
1748faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
1749faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
1750fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul   return TRUE;
175163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
175263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1753c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca
1754c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid
175563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder,
175663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  const struct tgsi_token *tokens,
1757b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                  struct lp_type type,
17583d7a88674f9eb3320eeff511968f041426e25023José Fonseca                  struct lp_build_mask_context *mask,
175963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef consts_ptr,
1760f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef *pos,
1761f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef (*inputs)[NUM_CHANNELS],
1762f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  LLVMValueRef (*outputs)[NUM_CHANNELS],
1763021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                  struct lp_build_sampler_soa *sampler,
1764021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                  struct tgsi_shader_info *info)
176563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
176663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context bld;
176763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_parse_context parse;
176863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint num_immediates = 0;
176963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
177063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
177163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* Setup build context */
177263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   memset(&bld, 0, sizeof bld);
177363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_context_init(&bld.base, builder, type);
1774c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca   bld.mask = mask;
1775f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.pos = pos;
1776f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.inputs = inputs;
177763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.outputs = outputs;
177863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.consts_ptr = consts_ptr;
17798be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld.sampler = sampler;
1780021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   bld.has_indirect_addressing = info->opcode_count[TGSI_OPCODE_ARR] > 0 ||
1781021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                 info->opcode_count[TGSI_OPCODE_ARL] > 0;
178263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
178380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_init(&bld.exec_mask, &bld.base);
178480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
178563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_init( &parse, tokens );
178663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
178763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   while( !tgsi_parse_end_of_tokens( &parse ) ) {
178863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      tgsi_parse_token( &parse );
178963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
179063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch( parse.FullToken.Token.Type ) {
179163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_DECLARATION:
17921fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca         /* Inputs already interpolated */
1793e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca         emit_declaration( &bld, &parse.FullToken.FullDeclaration );
179463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
179563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
179663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_INSTRUCTION:
1797faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         {
17982c90652ed9e119f09af6757c59d10273894ba590José Fonseca            unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
17995d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee            const struct tgsi_opcode_info *opcode_info = tgsi_get_opcode_info(opcode);
18005d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee            if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, opcode_info ))
1801faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n",
18025d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee                             opcode_info->mnemonic);
1803faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         }
1804faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
180563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
180663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
180763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_IMMEDIATE:
180863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* simply copy the immediate values into the next immediates[] slot */
180963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         {
181063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
181163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(size <= 4);
18126c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca            assert(num_immediates < LP_MAX_TGSI_IMMEDIATES);
181363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = 0; i < size; ++i )
181463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] =
1815185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul                  lp_build_const_vec(type, parse.FullToken.FullImmediate.u[i].Float);
181663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = size; i < 4; ++i )
181763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] = bld.base.undef;
181863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            num_immediates++;
181963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
182063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
182163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18229381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca      case TGSI_TOKEN_TYPE_PROPERTY:
18239381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca         break;
18249381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca
182563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
182663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
182763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
182863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
182918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (0) {
183018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMBasicBlockRef block = LLVMGetInsertBlock(builder);
183118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMValueRef function = LLVMGetBasicBlockParent(block);
183218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      debug_printf("11111111111111111111111111111 \n");
183318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      tgsi_dump(tokens, 0);
183418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMDumpValue(function);
183518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      debug_printf("2222222222222222222222222222 \n");
183618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   }
183763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_free( &parse );
183863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
183963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1840