lp_bld_tgsi_soa.c revision 021e0dc78b15fab29e761012860276c2597c8d8f
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"
5780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h"
5863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_TEMPS 256
6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_IMMEDIATES 256
6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\
6563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++)
6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
685b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN)))
6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( CHAN )\
7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0
7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1
7963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2
8063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3
8163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT     0
8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT    1
8486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT  2
8586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3
8686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
8780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#define LP_TGSI_MAX_NESTING 16
8880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstruct lp_exec_mask {
9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   struct lp_build_context *bld;
9180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   boolean has_mask;
9380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMTypeRef int_vec_type;
9580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef cond_stack[LP_TGSI_MAX_NESTING];
9780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   int cond_stack_size;
9880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef cond_mask;
9980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
10018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef break_stack[LP_TGSI_MAX_NESTING];
10118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   int break_stack_size;
10218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef break_mask;
10318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
10418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef cont_stack[LP_TGSI_MAX_NESTING];
10518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   int cont_stack_size;
10618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef cont_mask;
10718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
10818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBasicBlockRef loop_stack[LP_TGSI_MAX_NESTING];
10918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   int loop_stack_size;
11018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBasicBlockRef loop_block;
11118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
11218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
11380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef exec_mask;
11480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin};
11563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context
11763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_context base;
11963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
12063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef consts_ptr;
121f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef *pos;
122f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef (*inputs)[NUM_CHANNELS];
12395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef (*outputs)[NUM_CHANNELS];
124c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca
1258be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   struct lp_build_sampler_soa *sampler;
12663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
12795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS];
12895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS];
129ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin   LLVMValueRef addr[LP_MAX_TEMPS][NUM_CHANNELS];
1301929057eac0c3351e0810612bdae56331a235736José Fonseca
131021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   /* we allocate an array of temps if we have indirect
132021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin    * addressing and then the temps above is unused */
133021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   LLVMValueRef temps_array;
134021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   boolean has_indirect_addressing;
135021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin
1363d7a88674f9eb3320eeff511968f041426e25023José Fonseca   struct lp_build_mask_context *mask;
13780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   struct lp_exec_mask exec_mask;
13863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca};
13963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = {
14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_LEFT,
14386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_LEFT
14486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
14586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
14686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
14786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = {
14886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_RIGHT,    QUAD_TOP_RIGHT,
14986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT
15086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
15186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
15286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
15386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = {
15486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT,
15586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT
15686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
15786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
15886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
15986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = {
16086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT,
16186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT
16286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
16386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
16480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld)
16580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
16680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->bld = bld;
16780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->has_mask = FALSE;
16880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_stack_size = 0;
16918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_stack_size = 0;
17018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->break_stack_size = 0;
17118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->cont_stack_size = 0;
17280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
17380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->int_vec_type = lp_build_int_vec_type(mask->bld->type);
17480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
17580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
17680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask)
17780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
17818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->loop_stack_size) {
17918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin      /*for loops we need to update the entire mask at runtime */
18018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMValueRef tmp;
1817fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul      assert(mask->break_mask);
18218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      tmp = LLVMBuildAnd(mask->bld->builder,
18318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         mask->cont_mask,
18418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         mask->break_mask,
18518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         "maskcb");
18618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->exec_mask = LLVMBuildAnd(mask->bld->builder,
18718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     mask->cond_mask,
18818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     tmp,
18918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     "maskfull");
19018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   } else
19118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->exec_mask = mask->cond_mask;
19218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
19318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
19418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->has_mask = (mask->cond_stack_size > 0 ||
19518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                     mask->loop_stack_size > 0);
19680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
19780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
19880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask,
19980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                   LLVMValueRef val)
20080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
20180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask;
20280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = LLVMBuildBitCast(mask->bld->builder, val,
20380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                      mask->int_vec_type, "");
20480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
20580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
20680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
20780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
20880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask)
20980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
21080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef prev_mask = mask->cond_stack[mask->cond_stack_size - 1];
211faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   LLVMValueRef inv_mask = LLVMBuildNot(mask->bld->builder,
212faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin                                        mask->cond_mask, "");
213faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin
214faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   /* means that we didn't have any mask before and that
215faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin    * we were fully enabled */
216faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   if (mask->cond_stack_size <= 1) {
217faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin      prev_mask = LLVMConstAllOnes(mask->int_vec_type);
218faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   }
219faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin
22080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = LLVMBuildAnd(mask->bld->builder,
22180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                  inv_mask,
22280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                  prev_mask, "");
22380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
22480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
22580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
22680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask)
22780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
22880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = mask->cond_stack[--mask->cond_stack_size];
22980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
23080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
23180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
23218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_bgnloop(struct lp_exec_mask *mask)
23318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
23418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
23518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cont_stack_size == 0)
23618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cont_mask = LLVMConstAllOnes(mask->int_vec_type);
237bba6a196bb69afc72a9ec56740a312987e77afc2Brian Paul   if (mask->break_stack_size == 0)
23818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->break_mask = LLVMConstAllOnes(mask->int_vec_type);
23918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cond_stack_size == 0)
24018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cond_mask = LLVMConstAllOnes(mask->int_vec_type);
2413a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin
2423a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin   mask->break_stack[mask->break_stack_size++] = mask->break_mask;
2436d2e09fdc23e2573e9466f60db20ef4ac04b367dZack Rusin   mask->cont_stack[mask->cont_stack_size++] = mask->cont_mask;
24418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_stack[mask->loop_stack_size++] = mask->loop_block;
24518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_block = lp_build_insert_new_block(mask->bld->builder, "bgnloop");
24618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBuildBr(mask->bld->builder, mask->loop_block);
24718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMPositionBuilderAtEnd(mask->bld->builder, mask->loop_block);
24818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
24918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
25018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
25118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
25218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_break(struct lp_exec_mask *mask)
25318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
25418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder,
25518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         mask->exec_mask,
25618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         "break");
25718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
25818a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin   /* mask->break_stack_size > 1 implies that we encountered a break
25918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin    * statemant already and if that's the case we want to make sure
26018a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin    * our mask is a combination of the previous break and the current
26118a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin    * execution mask */
26218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->break_stack_size > 1) {
26318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->break_mask = LLVMBuildAnd(mask->bld->builder,
26418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                      mask->break_mask,
26518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                      exec_mask, "break_full");
26618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   } else
26718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->break_mask = exec_mask;
26818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
26918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
27018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
27118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
27218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_continue(struct lp_exec_mask *mask)
27318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
27418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder,
27518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         mask->exec_mask,
27618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         "");
27718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
27818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cont_stack_size > 1) {
27918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cont_mask = LLVMBuildAnd(mask->bld->builder,
28018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     mask->cont_mask,
28118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     exec_mask, "");
28218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   } else
28318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cont_mask = exec_mask;
28418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
28518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
28618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
28718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
28818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
28918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_endloop(struct lp_exec_mask *mask)
29018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
29118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBasicBlockRef endloop;
292d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca   LLVMTypeRef reg_type = LLVMIntType(mask->bld->type.width*
293d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca                                      mask->bld->type.length);
2947fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul   LLVMValueRef i1cond;
2957fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul
2967fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul   assert(mask->break_mask);
2977fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul
298d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca   /* i1cond = (mask == 0) */
2997fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul   i1cond = LLVMBuildICmp(
300d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      mask->bld->builder,
301d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMIntNE,
302d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMBuildBitCast(mask->bld->builder, mask->break_mask, reg_type, ""),
303d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMConstNull(reg_type), "");
30418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
30518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   endloop = lp_build_insert_new_block(mask->bld->builder, "endloop");
30618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
30718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBuildCondBr(mask->bld->builder,
308ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin                   i1cond, mask->loop_block, endloop);
30918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
31018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMPositionBuilderAtEnd(mask->bld->builder, endloop);
31118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
31218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_block = mask->loop_stack[--mask->loop_stack_size];
31318a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin   /* pop the cont mask */
31418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cont_stack_size) {
31518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cont_mask = mask->cont_stack[--mask->cont_stack_size];
31618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   }
31718a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin   /* pop the break mask */
31818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->break_stack_size) {
3193a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin      mask->break_mask = mask->break_stack[--mask->break_stack_size];
32018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   }
32118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
32218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
32318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
32418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
32518a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin/* stores val into an address pointed to by dst.
32618a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * mask->exec_mask is used to figure out which bits of val
32718a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * should be stored into the address
32818a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * (0 means don't store this bit, 1 means do store).
32918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin */
33080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask,
33180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                               LLVMValueRef val,
33280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                               LLVMValueRef dst)
33380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
33480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   if (mask->has_mask) {
33580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMValueRef real_val, dst_val;
33680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
33780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      dst_val = LLVMBuildLoad(mask->bld->builder, dst, "");
33880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      real_val = lp_build_select(mask->bld,
33980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                 mask->exec_mask,
34080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                 val, dst_val);
34180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
34280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMBuildStore(mask->bld->builder, real_val, dst);
34380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   } else
34480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMBuildStore(mask->bld->builder, val, dst);
34580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
34680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
34786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
34886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
34986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld,
35086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
35186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
35286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_left  = lp_build_swizzle1_aos(&bld->base, src, swizzle_left);
35386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right);
35486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_right, src_left);
35586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
35686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
35786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
35886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
35986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld,
36086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
36186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
36286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_top    = lp_build_swizzle1_aos(&bld->base, src, swizzle_top);
36386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom);
36486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_top, src_bottom);
36586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
36686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
367021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinstatic LLVMValueRef
368021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinget_temp_ptr(struct lp_build_tgsi_soa_context *bld,
369021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             unsigned index,
370021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             unsigned swizzle,
371021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             boolean is_indirect,
372021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             LLVMValueRef addr)
373021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin{
374021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   if (!bld->has_indirect_addressing) {
375021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      return bld->temps[index][swizzle];
376021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   } else {
377021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      LLVMValueRef lindex =
378021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         LLVMConstInt(LLVMInt32Type(), index*4 + swizzle, 0);
379021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      if (is_indirect)
380021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         lindex = lp_build_add(&bld->base, lindex, addr);
381021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      return LLVMBuildGEP(bld->base.builder, bld->temps_array, &lindex, 1, "");
382021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   }
383021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin}
38486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
38663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch.
38763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef
38963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch(
39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
3912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst,
3922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
39363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const unsigned chan_index )
39463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
3957d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[index];
396b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
39763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef res;
398ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin   LLVMValueRef addr;
39963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
40063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (swizzle) {
401b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_X:
402b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Y:
403b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Z:
404b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_W:
40563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
406ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      if (reg->Register.Indirect) {
407ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type);
408ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         unsigned swizzle = tgsi_util_get_src_register_swizzle( &reg->Indirect, chan_index );
409ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         addr = LLVMBuildLoad(bld->base.builder,
410ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                              bld->addr[reg->Indirect.Index][swizzle],
411ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                              "");
412ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         /* for indexing we want integers */
413ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         addr = LLVMBuildFPToSI(bld->base.builder, addr,
414ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                                int_vec_type, "");
415ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         addr = LLVMBuildExtractElement(bld->base.builder,
416ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                                        addr, LLVMConstInt(LLVMInt32Type(), 0, 0),
417ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                                        "");
418021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0));
419ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      }
420ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
42191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      switch (reg->Register.File) {
42263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_CONSTANT: {
42391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0);
424ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         LLVMValueRef scalar, scalar_ptr;
425ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
426ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         if (reg->Register.Indirect) {
427ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin            /*lp_build_printf(bld->base.builder,
428ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin              "\taddr = %d\n", addr);*/
429ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin            index = lp_build_add(&bld->base, index, addr);
430ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         }
431ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, "");
432ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, "");
433ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = lp_build_broadcast_scalar(&bld->base, scalar);
43563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
43663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
43763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
43863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_IMMEDIATE:
43991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->immediates[reg->Register.Index][swizzle];
44063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
44163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
44263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
44363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_INPUT:
44491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->inputs[reg->Register.Index][swizzle];
44563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
44763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
448021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      case TGSI_FILE_TEMPORARY: {
449021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index,
450021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                              swizzle,
451021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                              reg->Register.Indirect,
452021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                              addr);
453021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         res = LLVMBuildLoad(bld->base.builder, temp_ptr, "");
45463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if(!res)
45563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            return bld->base.undef;
45663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
457021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      }
45863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
4614d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca         return bld->base.undef;
46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
46663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
4674d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca      return bld->base.undef;
46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
46963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) {
47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_CLEAR:
47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
47363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
47463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
47563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_SET:
4761fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* TODO: Use bitwese OR for floating point */
47763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
47963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
48063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_TOGGLE:
48263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
48363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_KEEP:
48663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
48763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
48863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return res;
49063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
49163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
49263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
49363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
49486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives.
49586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */
49686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void
49786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv(
49886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   struct lp_build_tgsi_soa_context *bld,
49986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const struct tgsi_full_instruction *inst,
50086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   unsigned index,
50186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const unsigned chan_index,
50286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *res,
50386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddx,
50486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddy)
50586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
50686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src;
50786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
50886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   src = emit_fetch(bld, inst, index, chan_index);
50986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
51086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(res)
51186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *res = src;
51286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
51386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   /* TODO: use interpolation coeffs for inputs */
51486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
51586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddx)
51686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddx = emit_ddx(bld, src);
51786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
51886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddy)
51986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddy = emit_ddy(bld, src);
52086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
52186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
52286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
52386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/**
52463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store.
52563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
52663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
52763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store(
52863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
52963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const struct tgsi_full_instruction *inst,
5302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
53163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index,
53263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef value)
53363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
5347d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_dst_register *reg = &inst->Dst[index];
535021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   LLVMValueRef addr;
5362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca
53763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( inst->Instruction.Saturate ) {
53863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_NONE:
53963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
54063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
54163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_ZERO_ONE:
5427926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, bld->base.zero);
5437926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
54463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
54563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
54663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_MINUS_PLUS_ONE:
547185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul      value = lp_build_max(&bld->base, value, lp_build_const_vec(bld->base.type, -1.0));
5487926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
54963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
5507926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca
5517926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca   default:
5527926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      assert(0);
55363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
55463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
555021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   if (reg->Register.Indirect) {
556021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type);
557021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      unsigned swizzle = tgsi_util_get_src_register_swizzle( &reg->Indirect, chan_index );
558021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = LLVMBuildLoad(bld->base.builder,
559021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                           bld->addr[reg->Indirect.Index][swizzle],
560021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                           "");
561021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      /* for indexing we want integers */
562021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = LLVMBuildFPToSI(bld->base.builder, addr,
563021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                             int_vec_type, "");
564021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = LLVMBuildExtractElement(bld->base.builder,
565021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                     addr, LLVMConstInt(LLVMInt32Type(), 0, 0),
566021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                     "");
567021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0));
568021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   }
569021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin
5705b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   switch( reg->Register.File ) {
57163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_OUTPUT:
57280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_store(&bld->exec_mask, value,
57380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                         bld->outputs[reg->Register.Index][chan_index]);
57463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
57563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
576021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   case TGSI_FILE_TEMPORARY: {
577021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index,
578021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                           chan_index,
579021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                           reg->Register.Indirect,
580021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                           addr);
581021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      lp_exec_mask_store(&bld->exec_mask, value, temp_ptr);
58263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
583021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   }
58463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
58563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_ADDRESS:
586ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      lp_exec_mask_store(&bld->exec_mask, value,
587ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                         bld->addr[reg->Indirect.Index][chan_index]);
58863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
58963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
590ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca   case TGSI_FILE_PREDICATE:
591ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      /* FIXME */
592ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      assert(0);
593ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      break;
594ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca
59563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
59663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
59763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
59863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
59963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
60063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
60163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
60263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators.
60363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
60463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
60586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
60663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
60763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld,
60863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          const struct tgsi_full_instruction *inst,
60963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          boolean apply_lodbias,
610faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca          boolean projected,
611faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca          LLVMValueRef *texel)
61263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
61391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell   const uint unit = inst->Src[1].Register.Index;
61463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef lodbias;
61531d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee   LLVMValueRef oow = NULL;
616c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   LLVMValueRef coords[3];
617c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   unsigned num_coords;
61863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
61963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6207d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   switch (inst->Texture.Texture) {
62163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_1D:
622c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 1;
62363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
62463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_2D:
62563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_RECT:
626c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 2;
62763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
628f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW1D:
629f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW2D:
630f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOWRECT:
63163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_3D:
63263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_CUBE:
633c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 3;
63463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
63563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
63663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return;
63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
63963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
64063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if(apply_lodbias)
6412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      lodbias = emit_fetch( bld, inst, 0, 3 );
64263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   else
64363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      lodbias = bld->base.zero;
64463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
64563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (projected) {
6462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      oow = emit_fetch( bld, inst, 0, 3 );
64763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      oow = lp_build_rcp(&bld->base, oow);
64863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
64963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
650c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   for (i = 0; i < num_coords; i++) {
651c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      coords[i] = emit_fetch( bld, inst, 0, i );
65263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (projected)
653c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca         coords[i] = lp_build_mul(&bld->base, coords[i], oow);
65463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
655ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   for (i = num_coords; i < 3; i++) {
656ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca      coords[i] = bld->base.undef;
657ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   }
65863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6598be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld->sampler->emit_fetch_texel(bld->sampler,
6608be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.builder,
6618be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.type,
6628be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  unit, num_coords, coords, lodbias,
6638be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  texel);
66463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
66563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
66663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
667feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/**
668feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Kill fragment if any of the src register values are negative.
669feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */
67063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
67163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil(
67263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
6732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst )
67463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
6757d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[0];
6767821664b15501b173b2304bbada758c33c5ff972José Fonseca   LLVMValueRef terms[NUM_CHANNELS];
6773d7a88674f9eb3320eeff511968f041426e25023José Fonseca   LLVMValueRef mask;
67863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
67963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6807821664b15501b173b2304bbada758c33c5ff972José Fonseca   memset(&terms, 0, sizeof terms);
68163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
68263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( chan_index ) {
68363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned swizzle;
68463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6857821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Unswizzle channel */
686b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell      swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
68763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6887821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Check if the component has not been already tested. */
6897821664b15501b173b2304bbada758c33c5ff972José Fonseca      assert(swizzle < NUM_CHANNELS);
6907821664b15501b173b2304bbada758c33c5ff972José Fonseca      if( !terms[swizzle] )
6917821664b15501b173b2304bbada758c33c5ff972José Fonseca         /* TODO: change the comparison operator instead of setting the sign */
6922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         terms[swizzle] =  emit_fetch(bld, inst, 0, chan_index );
69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
69463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6953d7a88674f9eb3320eeff511968f041426e25023José Fonseca   mask = NULL;
6967821664b15501b173b2304bbada758c33c5ff972José Fonseca   FOR_EACH_CHANNEL( chan_index ) {
697aede39efd86d200ffbace8fc012104e31f673973José Fonseca      if(terms[chan_index]) {
6983d7a88674f9eb3320eeff511968f041426e25023José Fonseca         LLVMValueRef chan_mask;
699aede39efd86d200ffbace8fc012104e31f673973José Fonseca
700feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul         /*
701feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          * If term < 0 then mask = 0 else mask = ~0.
702feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          */
7033d7a88674f9eb3320eeff511968f041426e25023José Fonseca         chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero);
704aede39efd86d200ffbace8fc012104e31f673973José Fonseca
7053d7a88674f9eb3320eeff511968f041426e25023José Fonseca         if(mask)
7063d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, "");
7073d7a88674f9eb3320eeff511968f041426e25023José Fonseca         else
7083d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = chan_mask;
709aede39efd86d200ffbace8fc012104e31f673973José Fonseca      }
71063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
7113d7a88674f9eb3320eeff511968f041426e25023José Fonseca
7123d7a88674f9eb3320eeff511968f041426e25023José Fonseca   if(mask)
7133d7a88674f9eb3320eeff511968f041426e25023José Fonseca      lp_build_mask_update(bld->mask, mask);
71463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
71563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
71663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
71763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
718feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Predicated fragment kill.
719feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * XXX Actually, we do an unconditional kill (as in tgsi_exec.c).
720feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * The only predication is the execution mask which will apply if
721feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * we're inside a loop or conditional.
722feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */
723feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulstatic void
724feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulemit_kilp(struct lp_build_tgsi_soa_context *bld,
725feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          const struct tgsi_full_instruction *inst)
726feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul{
727feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   LLVMValueRef mask;
728feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
729feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   /* For those channels which are "alive", disable fragment shader
730feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul    * execution.
731feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul    */
732feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   if (bld->exec_mask.has_mask) {
733feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      mask = LLVMBuildNot(bld->base.builder, bld->exec_mask.exec_mask, "kilp");
734feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   }
735feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   else {
736feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      mask = bld->base.zero;
737feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   }
738feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
739feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   lp_build_mask_update(bld->mask, mask);
740feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul}
741feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
74285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinstatic int
74385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration(
74485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   struct lp_build_tgsi_soa_context *bld,
74585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   const struct tgsi_full_declaration *decl)
74685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{
74785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned first = decl->Range.First;
74885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned last = decl->Range.Last;
74985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned idx, i;
750012fabca722494162c244a367913562b8cfa4677Zack Rusin   LLVMBasicBlockRef current_block =
751012fabca722494162c244a367913562b8cfa4677Zack Rusin      LLVMGetInsertBlock(bld->base.builder);
752012fabca722494162c244a367913562b8cfa4677Zack Rusin   LLVMBasicBlockRef first_block =
753012fabca722494162c244a367913562b8cfa4677Zack Rusin      LLVMGetEntryBasicBlock(
754012fabca722494162c244a367913562b8cfa4677Zack Rusin         LLVMGetBasicBlockParent(current_block));
755012fabca722494162c244a367913562b8cfa4677Zack Rusin   LLVMValueRef first_inst =
756012fabca722494162c244a367913562b8cfa4677Zack Rusin      LLVMGetFirstInstruction(first_block);
757012fabca722494162c244a367913562b8cfa4677Zack Rusin
758012fabca722494162c244a367913562b8cfa4677Zack Rusin   /* we want alloca's to be the first instruction
759012fabca722494162c244a367913562b8cfa4677Zack Rusin    * in the function so we need to rewind the builder
760012fabca722494162c244a367913562b8cfa4677Zack Rusin    * to the very beginning */
761012fabca722494162c244a367913562b8cfa4677Zack Rusin   LLVMPositionBuilderBefore(bld->base.builder,
762012fabca722494162c244a367913562b8cfa4677Zack Rusin                             first_inst);
76385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
76485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   for (idx = first; idx <= last; ++idx) {
76585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      switch (decl->Declaration.File) {
76685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      case TGSI_FILE_TEMPORARY:
767021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         if (bld->has_indirect_addressing) {
768021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin            LLVMValueRef val = LLVMConstInt(LLVMInt32Type(),
769021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                            last*4 + 4, 0);
770021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin            bld->temps_array = LLVMBuildArrayAlloca(bld->base.builder,
771021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                                    lp_build_vec_type(bld->base.type),
772021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                                    val, "");
773021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         } else {
774021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin            for (i = 0; i < NUM_CHANNELS; i++)
775021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin               bld->temps[idx][i] = lp_build_alloca(&bld->base);
776021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         }
77785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         break;
77885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
77985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      case TGSI_FILE_OUTPUT:
78085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         for (i = 0; i < NUM_CHANNELS; i++)
78185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin            bld->outputs[idx][i] = lp_build_alloca(&bld->base);
78285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         break;
78385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
784ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      case TGSI_FILE_ADDRESS:
785ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         for (i = 0; i < NUM_CHANNELS; i++)
786ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin            bld->addr[idx][i] = lp_build_alloca(&bld->base);
787ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         break;
788ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
78985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      default:
79085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         /* don't need to declare other vars */
791dc886ba1391d7d890bd1f5532bc14553e883a418Zack Rusin         break;
792012fabca722494162c244a367913562b8cfa4677Zack Rusin      }
79385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   }
79485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
795012fabca722494162c244a367913562b8cfa4677Zack Rusin   LLVMPositionBuilderAtEnd(bld->base.builder,
796012fabca722494162c244a367913562b8cfa4677Zack Rusin                            current_block);
79785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   return TRUE;
79885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin}
79963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
800fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul
801fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul/**
802fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * Emit LLVM for one TGSI instruction.
803fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * \param return TRUE for success, FALSE otherwise
804fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul */
805fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paulstatic boolean
80663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction(
80763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
808faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_full_instruction *inst,
809faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_opcode_info *info)
81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
81163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
81290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef src0, src1, src2;
813e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp0, tmp1, tmp2;
814e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp3 = NULL;
815e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp4 = NULL;
816e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp5 = NULL;
817e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp6 = NULL;
818e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp7 = NULL;
819faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef res;
820faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef dst0[NUM_CHANNELS];
82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
82289258652b6a1d282bed14549907892bdfda752f0José Fonseca   /*
82389258652b6a1d282bed14549907892bdfda752f0José Fonseca    * Stores and write masks are handled in a general fashion after the long
82489258652b6a1d282bed14549907892bdfda752f0José Fonseca    * instruction opcode switch statement.
82589258652b6a1d282bed14549907892bdfda752f0José Fonseca    *
82689258652b6a1d282bed14549907892bdfda752f0José Fonseca    * Although not stricitly necessary, we avoid generating instructions for
82789258652b6a1d282bed14549907892bdfda752f0José Fonseca    * channels which won't be stored, in cases where's that easy. For some
82889258652b6a1d282bed14549907892bdfda752f0José Fonseca    * complex instructions, like texture sampling, it is more convenient to
82989258652b6a1d282bed14549907892bdfda752f0José Fonseca    * assume a full writemask and then let LLVM optimization passes eliminate
83089258652b6a1d282bed14549907892bdfda752f0José Fonseca    * redundant code.
83189258652b6a1d282bed14549907892bdfda752f0José Fonseca    */
83289258652b6a1d282bed14549907892bdfda752f0José Fonseca
833faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   assert(info->num_dst <= 1);
834faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
835faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
836faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.undef;
837faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
838faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
839faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
84063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->Instruction.Opcode) {
84163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARL:
8422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
844ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         tmp0 = lp_build_floor(&bld->base, tmp0);
845faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
84663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
84763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
84863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
84963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOV:
8502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
851faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index );
85263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
85363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
85463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
85563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LIT:
8562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) {
857faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
85863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
8602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
861faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero);
862ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca      }
8632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
864ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = SrcReg[0].yyyy */
8652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
866ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = max(XMM[1], 0) */
867ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero);
868ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[2] = SrcReg[0].wwww */
8692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 0, CHAN_W );
870ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_pow( &bld->base, tmp1, tmp2);
8712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
872c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero);
873faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero);
874c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca      }
8752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) {
876faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
87763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
87863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
87963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
88063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCP:
88163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIP */
8822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
883faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rcp(&bld->base, src0);
8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
885faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
88663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
88763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
88863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
88963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RSQ:
89063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIPSQRT */
8912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
89290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      src0 = lp_build_abs(&bld->base, src0);
893faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rsqrt(&bld->base, src0);
8942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
895faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
89663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
89763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
89863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
89963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EXP:
9002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
9012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
9022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
90357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2_int_part = NULL;
90457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_frac_part = NULL;
90557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2 = NULL;
90657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
9072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
90857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
9092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
91057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2_int_part = &tmp0;
9112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
91257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_frac_part = &tmp1;
9132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
91457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2 = &tmp2;
91557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
91657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2);
91757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
9182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
919faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
9202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
921faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = tmp1;
9222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
923faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
92463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
92563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
9262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
927faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
92863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
92963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
93063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOG:
9322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
9332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
9342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
935add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_floor_log2 = NULL;
936add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_exp = NULL;
937add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_log2 = NULL;
93857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
9392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
94057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         src0 = lp_build_abs( &bld->base, src0 );
94157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
9422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
94357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_floor_log2 = &tmp0;
9442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
94557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp = &tmp1;
9462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
94757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_log2 = &tmp2;
94857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
94957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2);
95057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
95157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.x = floor(lg2(abs(src.x))) */
9522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
953faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
95457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */
9552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) {
956faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1);
95763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
95857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.z = lg2(abs(src.x)) */
9592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
960faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
96163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
96263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
9632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
964faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
96563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
96663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
96763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
96863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MUL:
9692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
972faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_mul(&bld->base, src0, src1);
97363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
97463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
97563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
97663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ADD:
9772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
980faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add(&bld->base, src0, src1);
98163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
98263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
98363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP3:
98563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT3 */
9862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
9872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
98890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
9892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
9902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
99190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
99290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
9932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
9942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
99590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
99690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
9972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
998faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
99963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
100063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
100163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP4:
100363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT4 */
10042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
10052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
100690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
10072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
10082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
100990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
101090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
10122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
101390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
101490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_W );
10162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_W );
101790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
101890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1020faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
102163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
102263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DST:
10252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
1026faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
10292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
10302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Y );
1031faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1);
103263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1034faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z );
103563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1037faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W );
103863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MIN:
10422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1045faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_min( &bld->base, src0, src1 );
104663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAX:
10502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1053faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_max( &bld->base, src0, src1 );
105463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
105763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLT:
105863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETLT */
10592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10621aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 );
1063faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
10641aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
106663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGE:
106863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETGE */
10692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10721aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 );
1073faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
10741aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
107563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAD:
107863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_MADD */
10792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
10812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
10822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 2, chan_index );
108390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
108490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_add( &bld->base, tmp0, tmp2);
1085faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
108663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
108763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
108863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
108963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SUB:
10902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
10922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
1093faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1);
109463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
109563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
109663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
109763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LRP:
10982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
11002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
11012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
110290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, src1, src2 );
110390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, src0, tmp0 );
1104faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 );
110563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
110663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND:
1109873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1110873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
1111873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1112873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
1113185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul         tmp1 = lp_build_const_vec(bld->base.type, 0.5);
1114873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1);
1115faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 );
1116873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
111763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
111863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
111963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2A:
11202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
11212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
112290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
11232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
11242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
112590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
112690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
11272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 2, CHAN_X );  /* xmm1 = src[2].x */
112890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
11292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1130faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
113163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
113363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FRC:
11352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1136873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
1137873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_floor(&bld->base, src0);
1138f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul         tmp0 = lp_build_sub(&bld->base, src0, tmp0);
1139faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
114063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
114163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
114263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CLAMP:
1144873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1145873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1146873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1147873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
1148873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_max(&bld->base, tmp0, src1);
1149873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_min(&bld->base, tmp0, src2);
1150faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
1151873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
115263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
115363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FLR:
11552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1157faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_floor(&bld->base, tmp0);
115863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
115963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
116063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ROUND:
11622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1164faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_round(&bld->base, tmp0);
116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
116663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   case TGSI_OPCODE_EX2: {
11692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
117090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_exp2( &bld->base, tmp0);
11712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1172faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
117463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
117590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   }
117663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LG2:
11782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
117990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_log2( &bld->base, tmp0);
11802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1181faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
118263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
118363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
118463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POW:
11862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
11872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src1 = emit_fetch( bld, inst, 1, CHAN_X );
1188faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_pow( &bld->base, src0, src1 );
11892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1190faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
119263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
119363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XPD:
11952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
11962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
11972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Z );
11982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp3 = emit_fetch( bld, inst, 0, CHAN_Z );
119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
12012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
12022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
12032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp4 = emit_fetch( bld, inst, 1, CHAN_Y );
120463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
120690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = tmp0;
120790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_mul( &bld->base, tmp2, tmp1);
120890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = tmp3;
120990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
121090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_sub( &bld->base, tmp2, tmp5);
1211faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = tmp2;
121263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
12142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
12152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 1, CHAN_X );
12162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp5 = emit_fetch( bld, inst, 0, CHAN_X );
121763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
121990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_mul( &bld->base, tmp3, tmp2);
122090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp1 = lp_build_mul( &bld->base, tmp1, tmp5);
122190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_sub( &bld->base, tmp3, tmp1);
1222faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = tmp3;
122363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
122590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
122690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp2);
122790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_sub( &bld->base, tmp5, tmp0);
1228faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = tmp5;
122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1231faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
123363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ABS:
12362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1238faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_abs( &bld->base, tmp0 );
123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
124063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCC:
1243873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1244873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1245fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DPH:
12482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
12492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
125090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
12512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
12522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
125390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
125490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
12552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
12562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
125790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
125890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
12592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_W );
126090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
12612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1262faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
126563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_COS:
12672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
126890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_cos( &bld->base, tmp0 );
12692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1270faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
127163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
127263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDX:
127586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
127686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL);
127786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
127863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDY:
128186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
128286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]);
128386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
128463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KILP:
128763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* predicated kill */
1288feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      emit_kilp( bld, inst );
128963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KIL:
129263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* conditional kill */
12932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_kil( bld, inst );
129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2H:
1297fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
129863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2US:
1301fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4B:
1305fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4UB:
1309fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
131063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RFL:
1313fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SEQ:
13172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
13192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
13201aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 );
1321faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
13221aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SFL:
1326873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1327faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.zero;
1328873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGT:
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_GREATER, 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_SIN:
13412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
134290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_sin( &bld->base, tmp0 );
13432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1344faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
134563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
134663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
134763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
134863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLE:
13492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
13512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
13521aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 );
1353faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
13541aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
135563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
135663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SNE:
13582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
13602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
13611aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 );
1362faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
13631aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
136463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
136563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_STR:
1367873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1368faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.one;
1369873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
137063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TEX:
1373faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, FALSE, FALSE, dst0 );
137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXD:
1377873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1378fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
138163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2H:
1382873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1383873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert (0);
1384fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
138563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2US:
1388873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1389873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1390fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
139163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
139263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
139363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4B:
1394873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1395873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1396fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
139863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
139963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4UB:
1400873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1401873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1402fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
140363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
140463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_X2D:
1406873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1407873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1408fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
140963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
141063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARA:
1412873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1413873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1414fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
141563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARR:
14182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1420ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         tmp0 = lp_build_round(&bld->base, tmp0);
1421faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRA:
1426873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1427873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1428fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CAL:
1432873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1433fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
143463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
143563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RET:
1437873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1438fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
144063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
144163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_END:
144263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
144463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SSG:
144563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SGN */
14462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1448faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 );
144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
145163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CMP:
14532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
14552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
14562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
14571aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero );
1458faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2);
14591aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SCS:
14632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
14642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1465faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 );
146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
14682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1469faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 );
147063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1472faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = bld->base.zero;
147363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1475faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
147663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
147763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
147863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
147963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXB:
1480faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE, dst0 );
148163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
148263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
148363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM:
148463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* fall-through */
148563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM4:
148663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* 3 or 4-component normalization */
148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      {
148863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4;
148963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
14902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) ||
14912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) ||
14922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) ||
14932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) {
149463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
149563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */
149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm4 = src.x */
149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = src.x * src.x */
14992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
15002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
150190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = tmp0;
150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
150390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_mul( &bld->base, tmp0, tmp0);
150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
150563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm5 = src.y */
150663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.y * src.y */
15072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Y);
15082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
150990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = tmp1;
151063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
151190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
151290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
151363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
151463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm6 = src.z */
151563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.z * src.z */
15162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Z);
15172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
151890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = tmp1;
151963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
152090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
152190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
152263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
152363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            if (dims == 4) {
152463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm7 = src.w */
152563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm0 = xmm0 + src.w * src.w */
15262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               tmp1 = emit_fetch(bld, inst, 0, CHAN_W);
15272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) {
152890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca                  tmp7 = tmp1;
152963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
153090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
153190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
153263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
153363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
153463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm1 = 1 / sqrt(xmm0) */
153590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_rsqrt( &bld->base, tmp0);
153663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
153763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.x = xmm1 * src.x */
15382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
1539faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1);
154063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
154163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
154263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.y = xmm1 * src.y */
15432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
1544faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1);
154563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
154663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
154763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.z = xmm1 * src.z */
15482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
1549faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1);
155063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
155163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
155263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.w = xmm1 * src.w */
15532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) {
1554faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1);
155563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
155763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1558faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         /* dst.w = 1.0 */
15592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) {
1560faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_W] = bld->base.one;
156163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
156263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
156363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
156463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
156563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DIV:
1566873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1567873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert( 0 );
1568fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
156963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
157063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
157163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2:
15722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
15732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
157490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
15752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
15762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
157790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
157890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
15792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1580faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
158163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
158263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
158363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
158463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXL:
1585faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE, dst0 );
158663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
158763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
158863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXP:
1589faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, FALSE, TRUE, dst0 );
159063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
159118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
159263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRK:
159318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_break(&bld->exec_mask);
159463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
159563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
159663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_IF:
159780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
1598ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin      tmp0 = lp_build_cmp(&bld->base, PIPE_FUNC_NOTEQUAL,
1599ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin                          tmp0, bld->base.zero);
160080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_push(&bld->exec_mask, tmp0);
160163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
160263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1603f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_OPCODE_BGNFOR:
1604873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1605873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1606fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
160763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
160863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
160918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   case TGSI_OPCODE_BGNLOOP:
161018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_bgnloop(&bld->exec_mask);
161118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      break;
161218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
161363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_REP:
1614873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1615873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1616fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
161763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
161863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
161963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ELSE:
162080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_invert(&bld->exec_mask);
162163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
162263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
162363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDIF:
162480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_pop(&bld->exec_mask);
162563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
162663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1627f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_OPCODE_ENDFOR:
1628873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1629873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1630fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
163163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
163263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
163318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   case TGSI_OPCODE_ENDLOOP:
163418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_endloop(&bld->exec_mask);
163518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      break;
163618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
163763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDREP:
1638873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1639873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1640fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
164163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
164263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
164363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PUSHA:
1644873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1645873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1646fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
164763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
164863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
164963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POPA:
1650873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1651873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1652fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
165363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
165463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
165563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CEIL:
1656873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1657873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1658faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_ceil(&bld->base, tmp0);
1659873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
166063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
166163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
166263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_I2F:
1663873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1664873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1665fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
166663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
166763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
166863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NOT:
1669873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1670873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1671fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
167263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
167363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
167463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TRUNC:
16752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
16762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1677faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_trunc(&bld->base, tmp0);
167863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
167963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
168063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
168163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHL:
1682873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1683873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1684fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
168563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
168663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16872c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol   case TGSI_OPCODE_ISHR:
1688873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1689873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1690fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
169163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
169263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
169363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_AND:
1694873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1695873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1696fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
169763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
169863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
169963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_OR:
1700873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1701873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1702fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
170363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
170463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
170563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOD:
1706873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1707873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1708fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
170963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
171063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
171163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XOR:
1712873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1713873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1714fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
171563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
171663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
171763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SAD:
1718873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1719873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1720fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
172163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
172263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
172363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXF:
1724873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1725873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1726fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
172763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
172863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
172963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXQ:
1730873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1731873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1732fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
173363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
173463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
173563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CONT:
173618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_continue(&bld->exec_mask);
173763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
173863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
173963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EMIT:
1740fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
174163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
174263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
174363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDPRIM:
1744fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
174563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
174663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1747873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOP:
1748873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      break;
1749873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca
175063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
1751fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
175263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
175363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1754faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
1755faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1756faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0[chan_index]);
1757faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
1758faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
1759faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
1760fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul   return TRUE;
176163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
176263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1763c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca
1764c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid
176563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder,
176663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  const struct tgsi_token *tokens,
1767b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                  struct lp_type type,
17683d7a88674f9eb3320eeff511968f041426e25023José Fonseca                  struct lp_build_mask_context *mask,
176963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef consts_ptr,
1770f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef *pos,
1771f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef (*inputs)[NUM_CHANNELS],
1772f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  LLVMValueRef (*outputs)[NUM_CHANNELS],
1773021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                  struct lp_build_sampler_soa *sampler,
1774021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                  struct tgsi_shader_info *info)
177563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
177663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context bld;
177763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_parse_context parse;
177863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint num_immediates = 0;
177963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
178063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
178163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* Setup build context */
178263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   memset(&bld, 0, sizeof bld);
178363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_context_init(&bld.base, builder, type);
1784c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca   bld.mask = mask;
1785f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.pos = pos;
1786f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.inputs = inputs;
178763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.outputs = outputs;
178863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.consts_ptr = consts_ptr;
17898be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld.sampler = sampler;
1790021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   bld.has_indirect_addressing = info->opcode_count[TGSI_OPCODE_ARR] > 0 ||
1791021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                 info->opcode_count[TGSI_OPCODE_ARL] > 0;
179263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
179380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_init(&bld.exec_mask, &bld.base);
179480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
179563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_init( &parse, tokens );
179663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
179763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   while( !tgsi_parse_end_of_tokens( &parse ) ) {
179863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      tgsi_parse_token( &parse );
179963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
180063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch( parse.FullToken.Token.Type ) {
180163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_DECLARATION:
18021fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca         /* Inputs already interpolated */
180385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         {
180485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin            if (!emit_declaration( &bld, &parse.FullToken.FullDeclaration ))
180585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin               _debug_printf("warning: failed to define LLVM variable\n");
180685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         }
180763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
180863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
180963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_INSTRUCTION:
1810faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         {
18112c90652ed9e119f09af6757c59d10273894ba590José Fonseca            unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
18122c90652ed9e119f09af6757c59d10273894ba590José Fonseca            const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode);
1813faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, info ))
1814faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n",
1815faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca                             info ? info->mnemonic : "<invalid>");
1816faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         }
1817faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
181863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
181963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
182063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_IMMEDIATE:
182163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* simply copy the immediate values into the next immediates[] slot */
182263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         {
182363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
182463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(size <= 4);
182563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(num_immediates < LP_MAX_IMMEDIATES);
182663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = 0; i < size; ++i )
182763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] =
1828185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul                  lp_build_const_vec(type, parse.FullToken.FullImmediate.u[i].Float);
182963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = size; i < 4; ++i )
183063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] = bld.base.undef;
183163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            num_immediates++;
183263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
183363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
183463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18359381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca      case TGSI_TOKEN_TYPE_PROPERTY:
18369381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca         break;
18379381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca
183863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
183963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
184063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
184163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
184218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (0) {
184318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMBasicBlockRef block = LLVMGetInsertBlock(builder);
184418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMValueRef function = LLVMGetBasicBlockParent(block);
184518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      debug_printf("11111111111111111111111111111 \n");
184618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      tgsi_dump(tokens, 0);
184718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMDumpValue(function);
184818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      debug_printf("2222222222222222222222222222 \n");
184918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   }
185063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_free( &parse );
185163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
185263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1853