lp_bld_tgsi_soa.c revision 2d91903882e399e8ea7306fd37d5d214907247e6
163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**************************************************************************
263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Copyright 2009 VMware, Inc.
463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * All Rights Reserved.
663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * copy of this software and associated documentation files (the
963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * "Software"), to deal in the Software without restriction, including
1063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
1163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
1263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
1363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * the following conditions:
1463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
1563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * The above copyright notice and this permission notice (including the
1663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
1763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * of the Software.
1863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
1963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
2763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca **************************************************************************/
2863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
295811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca/**
305811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @file
315811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * TGSI to LLVM IR translation -- SoA.
325811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
335811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
345811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
355811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell,
365811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Brian Paul, and others.
375811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca */
385811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca
3963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_config.h"
4063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_shader_tokens.h"
4163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_debug.h"
4263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_math.h"
4363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_memory.h"
442410125d072faeb83c8373e676422f6c44c78febBrian Paul#include "tgsi/tgsi_dump.h"
457821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "tgsi/tgsi_info.h"
4663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_parse.h"
4763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_util.h"
4863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_exec.h"
49021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin#include "tgsi/tgsi_scan.h"
5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h"
5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h"
5263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h"
537821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h"
5463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h"
553d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h"
5663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h"
576c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca#include "lp_bld_limits.h"
5880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h"
5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\
6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++)
6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
655b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN)))
6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( CHAN )\
7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0
7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1
7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2
7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3
7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT     0
8086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT    1
8186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT  2
8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3
8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
8480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
8580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstruct lp_exec_mask {
8680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   struct lp_build_context *bld;
8780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
8880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   boolean has_mask;
8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMTypeRef int_vec_type;
9180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
926c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMValueRef cond_stack[LP_MAX_TGSI_NESTING];
9380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   int cond_stack_size;
9480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef cond_mask;
9580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
962d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   LLVMBasicBlockRef loop_block;
9718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef cont_mask;
982d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   LLVMValueRef break_mask;
992d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   LLVMValueRef break_var;
1002d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   struct {
1012d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      LLVMBasicBlockRef loop_block;
1022d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      LLVMValueRef cont_mask;
1032d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      LLVMValueRef break_mask;
1042d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      LLVMValueRef break_var;
1052d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   } loop_stack[LP_MAX_TGSI_NESTING];
10618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   int loop_stack_size;
10718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
10880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef exec_mask;
10980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin};
11063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context
11263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
11363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_context base;
11463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
115ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   /* Builder for integer masks and indices */
116ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   struct lp_build_context int_bld;
117ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef consts_ptr;
119f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef *pos;
120f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef (*inputs)[NUM_CHANNELS];
12195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef (*outputs)[NUM_CHANNELS];
122c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca
1238be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   struct lp_build_sampler_soa *sampler;
12463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1256c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMValueRef immediates[LP_MAX_TGSI_IMMEDIATES][NUM_CHANNELS];
1266c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMValueRef temps[LP_MAX_TGSI_TEMPS][NUM_CHANNELS];
1276c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   LLVMValueRef addr[LP_MAX_TGSI_ADDRS][NUM_CHANNELS];
128ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   LLVMValueRef preds[LP_MAX_TGSI_PREDS][NUM_CHANNELS];
1291929057eac0c3351e0810612bdae56331a235736José Fonseca
130021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   /* we allocate an array of temps if we have indirect
131021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin    * addressing and then the temps above is unused */
132021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   LLVMValueRef temps_array;
133021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   boolean has_indirect_addressing;
134021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin
1353d7a88674f9eb3320eeff511968f041426e25023José Fonseca   struct lp_build_mask_context *mask;
13680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   struct lp_exec_mask exec_mask;
13763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca};
13863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
13986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = {
14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_LEFT,
14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_LEFT
14386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
14486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
14586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
14686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = {
14786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_RIGHT,    QUAD_TOP_RIGHT,
14886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT
14986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
15086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
15186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
15286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = {
15386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT,
15486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT
15586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
15686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
15786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
15886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = {
15986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT,
16086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT
16186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
16286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
16380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld)
16480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
16580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->bld = bld;
16680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->has_mask = FALSE;
16780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_stack_size = 0;
16818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_stack_size = 0;
16980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
17080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->int_vec_type = lp_build_int_vec_type(mask->bld->type);
1712d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->break_mask = mask->cont_mask = mask->cond_mask =
1722d91903882e399e8ea7306fd37d5d214907247e6José Fonseca         LLVMConstAllOnes(mask->int_vec_type);
17380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
17480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
17580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask)
17680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
17718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->loop_stack_size) {
17818a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin      /*for loops we need to update the entire mask at runtime */
17918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMValueRef tmp;
1807fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul      assert(mask->break_mask);
18118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      tmp = LLVMBuildAnd(mask->bld->builder,
18218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         mask->cont_mask,
18318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         mask->break_mask,
18418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         "maskcb");
18518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->exec_mask = LLVMBuildAnd(mask->bld->builder,
18618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     mask->cond_mask,
18718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     tmp,
18818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     "maskfull");
18918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   } else
19018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->exec_mask = mask->cond_mask;
19118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
19218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
19318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->has_mask = (mask->cond_stack_size > 0 ||
19418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                     mask->loop_stack_size > 0);
19580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
19680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
19780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask,
19880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                   LLVMValueRef val)
19980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
2006c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca   assert(mask->cond_stack_size < LP_MAX_TGSI_NESTING);
2012d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   if (mask->cond_stack_size == 0) {
2022d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      assert(mask->cond_mask == LLVMConstAllOnes(mask->int_vec_type));
2032d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   }
20480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask;
2052d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   assert(LLVMTypeOf(val) == mask->int_vec_type);
2062d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->cond_mask = val;
20780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
20880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
20980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
21080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
21180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask)
21280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
2132d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   LLVMValueRef prev_mask;
2142d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   LLVMValueRef inv_mask;
2152d91903882e399e8ea7306fd37d5d214907247e6José Fonseca
2162d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   assert(mask->cond_stack_size);
2172d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   prev_mask = mask->cond_stack[mask->cond_stack_size - 1];
2182d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   if (mask->cond_stack_size == 1) {
2192d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      assert(prev_mask == LLVMConstAllOnes(mask->int_vec_type));
220faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   }
221faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin
2222d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   inv_mask = LLVMBuildNot(mask->bld->builder, mask->cond_mask, "");
2232d91903882e399e8ea7306fd37d5d214907247e6José Fonseca
22480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = LLVMBuildAnd(mask->bld->builder,
22580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                  inv_mask,
22680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                  prev_mask, "");
22780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
22880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
22980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
23080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask)
23180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
2322d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   assert(mask->cond_stack_size);
23380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = mask->cond_stack[--mask->cond_stack_size];
23480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
23580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
23680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
23718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_bgnloop(struct lp_exec_mask *mask)
23818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
2392d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   if (mask->loop_stack_size == 0) {
2402d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      assert(mask->loop_block == NULL);
2412d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      assert(mask->cont_mask == LLVMConstAllOnes(mask->int_vec_type));
2422d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      assert(mask->break_mask == LLVMConstAllOnes(mask->int_vec_type));
2432d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      assert(mask->break_var == NULL);
2442d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   }
2452d91903882e399e8ea7306fd37d5d214907247e6José Fonseca
2462d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   assert(mask->loop_stack_size < LP_MAX_TGSI_NESTING);
24718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
2482d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->loop_stack[mask->loop_stack_size].loop_block = mask->loop_block;
2492d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->loop_stack[mask->loop_stack_size].cont_mask = mask->cont_mask;
2502d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->loop_stack[mask->loop_stack_size].break_mask = mask->break_mask;
2512d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->loop_stack[mask->loop_stack_size].break_var = mask->break_var;
2522d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   ++mask->loop_stack_size;
2533a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin
2542d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->break_var = lp_build_alloca(mask->bld->builder, mask->int_vec_type, "");
2552d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   LLVMBuildStore(mask->bld->builder, mask->break_mask, mask->break_var);
2566c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca
25718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_block = lp_build_insert_new_block(mask->bld->builder, "bgnloop");
25818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBuildBr(mask->bld->builder, mask->loop_block);
25918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMPositionBuilderAtEnd(mask->bld->builder, mask->loop_block);
26018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
2612d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->break_mask = LLVMBuildLoad(mask->bld->builder, mask->break_var, "");
2622d91903882e399e8ea7306fd37d5d214907247e6José Fonseca
26318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
26418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
26518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
26618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_break(struct lp_exec_mask *mask)
26718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
26818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder,
26918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         mask->exec_mask,
27018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         "break");
27118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
272d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin   mask->break_mask = LLVMBuildAnd(mask->bld->builder,
273d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin                                   mask->break_mask,
274d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin                                   exec_mask, "break_full");
27518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
27618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
27718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
27818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
27918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_continue(struct lp_exec_mask *mask)
28018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
28118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder,
28218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         mask->exec_mask,
28318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         "");
28418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
285d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin   mask->cont_mask = LLVMBuildAnd(mask->bld->builder,
286d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin                                  mask->cont_mask,
287d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin                                  exec_mask, "");
28818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
28918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
29018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
29118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
29218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
29318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_endloop(struct lp_exec_mask *mask)
29418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
29518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBasicBlockRef endloop;
296d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca   LLVMTypeRef reg_type = LLVMIntType(mask->bld->type.width*
297d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca                                      mask->bld->type.length);
2987fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul   LLVMValueRef i1cond;
2997fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul
3007fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul   assert(mask->break_mask);
3017fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul
3022d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   /*
3032d91903882e399e8ea7306fd37d5d214907247e6José Fonseca    * Restore the cont_mask, but don't pop
3042d91903882e399e8ea7306fd37d5d214907247e6José Fonseca    */
3052d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   assert(mask->loop_stack_size);
3062d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->cont_mask = mask->loop_stack[mask->loop_stack_size - 1].cont_mask;
3072d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   lp_exec_mask_update(mask);
3082d91903882e399e8ea7306fd37d5d214907247e6José Fonseca
3092d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   /*
3102d91903882e399e8ea7306fd37d5d214907247e6José Fonseca    * Unlike the continue mask, the break_mask must be preserved across loop
3112d91903882e399e8ea7306fd37d5d214907247e6José Fonseca    * iterations
3122d91903882e399e8ea7306fd37d5d214907247e6José Fonseca    */
3132d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   LLVMBuildStore(mask->bld->builder, mask->break_mask, mask->break_var);
3142d91903882e399e8ea7306fd37d5d214907247e6José Fonseca
315d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca   /* i1cond = (mask == 0) */
3167fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul   i1cond = LLVMBuildICmp(
317d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      mask->bld->builder,
318d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMIntNE,
3192d91903882e399e8ea7306fd37d5d214907247e6José Fonseca      LLVMBuildBitCast(mask->bld->builder, mask->exec_mask, reg_type, ""),
320d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMConstNull(reg_type), "");
32118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
32218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   endloop = lp_build_insert_new_block(mask->bld->builder, "endloop");
32318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
32418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBuildCondBr(mask->bld->builder,
325ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin                   i1cond, mask->loop_block, endloop);
32618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
32718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMPositionBuilderAtEnd(mask->bld->builder, endloop);
32818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
3292d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   assert(mask->loop_stack_size);
3302d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   --mask->loop_stack_size;
3312d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->loop_block = mask->loop_stack[mask->loop_stack_size].loop_block;
3322d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->cont_mask = mask->loop_stack[mask->loop_stack_size].cont_mask;
3332d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->break_mask = mask->loop_stack[mask->loop_stack_size].break_mask;
3342d91903882e399e8ea7306fd37d5d214907247e6José Fonseca   mask->break_var = mask->loop_stack[mask->loop_stack_size].break_var;
33518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
33618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
33718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
33818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
33918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin/* stores val into an address pointed to by dst.
34018a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * mask->exec_mask is used to figure out which bits of val
34118a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * should be stored into the address
34218a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * (0 means don't store this bit, 1 means do store).
34318a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin */
34480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask,
345ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca                               LLVMValueRef pred,
34680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                               LLVMValueRef val,
34780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                               LLVMValueRef dst)
34880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
349ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   /* Mix the predicate and execution mask */
35080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   if (mask->has_mask) {
351ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      if (pred) {
352ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         LLVMBuildAnd(mask->bld->builder, pred, mask->exec_mask, "");
353ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      } else {
354ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         pred = mask->exec_mask;
355ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      }
356ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   }
357ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
358ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   if (pred) {
35980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMValueRef real_val, dst_val;
36080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
36180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      dst_val = LLVMBuildLoad(mask->bld->builder, dst, "");
36280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      real_val = lp_build_select(mask->bld,
363ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca                                 pred,
36480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                 val, dst_val);
36580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
36680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMBuildStore(mask->bld->builder, real_val, dst);
36780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   } else
36880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMBuildStore(mask->bld->builder, val, dst);
36980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
37080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
37186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
37286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
37386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld,
37486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
37586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
37686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_left  = lp_build_swizzle1_aos(&bld->base, src, swizzle_left);
37786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right);
37886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_right, src_left);
37986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
38086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
38186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
38286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
38386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld,
38486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
38586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
38686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_top    = lp_build_swizzle1_aos(&bld->base, src, swizzle_top);
38786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom);
38886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_top, src_bottom);
38986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
39086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
391021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinstatic LLVMValueRef
392021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinget_temp_ptr(struct lp_build_tgsi_soa_context *bld,
393021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             unsigned index,
394021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             unsigned swizzle,
395021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             boolean is_indirect,
396021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin             LLVMValueRef addr)
397021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin{
398021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   if (!bld->has_indirect_addressing) {
399021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      return bld->temps[index][swizzle];
400021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   } else {
401021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      LLVMValueRef lindex =
402021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         LLVMConstInt(LLVMInt32Type(), index*4 + swizzle, 0);
403021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      if (is_indirect)
404021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         lindex = lp_build_add(&bld->base, lindex, addr);
405021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      return LLVMBuildGEP(bld->base.builder, bld->temps_array, &lindex, 1, "");
406021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   }
407021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin}
40886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
40963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
41063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch.
41163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
41263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef
41363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch(
41463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
4152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst,
4162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
41763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const unsigned chan_index )
41863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
4197d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[index];
420b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
42163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef res;
422ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin   LLVMValueRef addr;
42363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (swizzle) {
425b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_X:
426b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Y:
427b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Z:
428b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_W:
42963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
430ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      if (reg->Register.Indirect) {
431ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type);
432ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         unsigned swizzle = tgsi_util_get_src_register_swizzle( &reg->Indirect, chan_index );
433ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         addr = LLVMBuildLoad(bld->base.builder,
434ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                              bld->addr[reg->Indirect.Index][swizzle],
435ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                              "");
436ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         /* for indexing we want integers */
437ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         addr = LLVMBuildFPToSI(bld->base.builder, addr,
438ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                                int_vec_type, "");
439ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         addr = LLVMBuildExtractElement(bld->base.builder,
440ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                                        addr, LLVMConstInt(LLVMInt32Type(), 0, 0),
441ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                                        "");
442021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0));
443ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      }
444ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
44591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      switch (reg->Register.File) {
44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_CONSTANT: {
44791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0);
448ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         LLVMValueRef scalar, scalar_ptr;
449ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
450ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         if (reg->Register.Indirect) {
451ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin            /*lp_build_printf(bld->base.builder,
452ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin              "\taddr = %d\n", addr);*/
453ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin            index = lp_build_add(&bld->base, index, addr);
454ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         }
455ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, "");
456ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, "");
457ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
45863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = lp_build_broadcast_scalar(&bld->base, scalar);
45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_IMMEDIATE:
46391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->immediates[reg->Register.Index][swizzle];
46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
46663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_INPUT:
46891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->inputs[reg->Register.Index][swizzle];
46963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
472021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      case TGSI_FILE_TEMPORARY: {
473021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index,
474021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                              swizzle,
475021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                              reg->Register.Indirect,
476021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                              addr);
477021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         res = LLVMBuildLoad(bld->base.builder, temp_ptr, "");
47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if(!res)
47963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            return bld->base.undef;
48063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
481021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      }
48263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
4854d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca         return bld->base.undef;
48663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
48763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
48863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
49063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
4914d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca      return bld->base.undef;
49263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
49363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
49463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) {
49563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_CLEAR:
49663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
49763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
49863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
49963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_SET:
5001fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* TODO: Use bitwese OR for floating point */
50163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
50263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
50363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
50463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
50563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_TOGGLE:
50663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
50763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
50863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
50963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_KEEP:
51063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
51163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
51263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
51363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return res;
51463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
51763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
51886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives.
51986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */
52086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void
52186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv(
52286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   struct lp_build_tgsi_soa_context *bld,
52386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const struct tgsi_full_instruction *inst,
52486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   unsigned index,
52586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const unsigned chan_index,
52686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *res,
52786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddx,
52886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddy)
52986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
53086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src;
53186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
53286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   src = emit_fetch(bld, inst, index, chan_index);
53386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
53486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(res)
53586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *res = src;
53686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
53786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   /* TODO: use interpolation coeffs for inputs */
53886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
53986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddx)
54086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddx = emit_ddx(bld, src);
54186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
54286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddy)
54386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddy = emit_ddy(bld, src);
54486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
54586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
54686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
54786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/**
548ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * Predicate.
549ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca */
550ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonsecastatic void
551ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonsecaemit_fetch_predicate(
552ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
553ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   const struct tgsi_full_instruction *inst,
554ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   LLVMValueRef *pred)
555ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca{
556ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   unsigned index;
557ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   unsigned char swizzles[4];
558ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   LLVMValueRef unswizzled[4] = {NULL, NULL, NULL, NULL};
559ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   LLVMValueRef value;
560ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   unsigned chan;
561ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
562ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   if (!inst->Instruction.Predicate) {
563ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      FOR_EACH_CHANNEL( chan ) {
564ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         pred[chan] = NULL;
565ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      }
566ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      return;
567ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   }
568ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
569ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   swizzles[0] = inst->Predicate.SwizzleX;
570ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   swizzles[1] = inst->Predicate.SwizzleY;
571ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   swizzles[2] = inst->Predicate.SwizzleZ;
572ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   swizzles[3] = inst->Predicate.SwizzleW;
573ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
574ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   index = inst->Predicate.Index;
575ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   assert(index < LP_MAX_TGSI_PREDS);
576ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
577ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   FOR_EACH_CHANNEL( chan ) {
578ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      unsigned swizzle = swizzles[chan];
579ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
580ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      /*
581ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca       * Only fetch the predicate register channels that are actually listed
582ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca       * in the swizzles
583ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca       */
584ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      if (!unswizzled[swizzle]) {
585ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         value = LLVMBuildLoad(bld->base.builder,
586ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca                               bld->preds[index][swizzle], "");
587ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
588ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         /*
589ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca          * Convert the value to an integer mask.
590ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca          *
591ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca          * TODO: Short-circuit this comparison -- a D3D setp_xx instructions
592ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca          * is needlessly causing two comparisons due to storing the intermediate
593ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca          * result as float vector instead of an integer mask vector.
594ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca          */
595ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         value = lp_build_compare(bld->base.builder,
596ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca                                  bld->base.type,
597ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca                                  PIPE_FUNC_NOTEQUAL,
598ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca                                  value,
599ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca                                  bld->base.zero);
600ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         if (inst->Predicate.Negate) {
601ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca            value = LLVMBuildNot(bld->base.builder, value, "");
602ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         }
603ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
604ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         unswizzled[swizzle] = value;
605ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      } else {
606ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         value = unswizzled[swizzle];
607ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      }
608ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
609ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      pred[chan] = value;
610ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   }
611ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca}
612ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
613ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
614ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca/**
61563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store.
61663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
61763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
61863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store(
61963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
62063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const struct tgsi_full_instruction *inst,
6212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
62263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index,
623ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   LLVMValueRef pred,
62463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef value)
62563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
6267d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_dst_register *reg = &inst->Dst[index];
627021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   LLVMValueRef addr;
6282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca
62963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( inst->Instruction.Saturate ) {
63063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_NONE:
63163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
63263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
63363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_ZERO_ONE:
6347926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, bld->base.zero);
6357926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
63663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_MINUS_PLUS_ONE:
639185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul      value = lp_build_max(&bld->base, value, lp_build_const_vec(bld->base.type, -1.0));
6407926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
64163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
6427926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca
6437926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca   default:
6447926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      assert(0);
64563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
64663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
647021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   if (reg->Register.Indirect) {
648021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type);
649021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      unsigned swizzle = tgsi_util_get_src_register_swizzle( &reg->Indirect, chan_index );
650021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = LLVMBuildLoad(bld->base.builder,
651021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                           bld->addr[reg->Indirect.Index][swizzle],
652021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                           "");
653021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      /* for indexing we want integers */
654021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = LLVMBuildFPToSI(bld->base.builder, addr,
655021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                             int_vec_type, "");
656021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = LLVMBuildExtractElement(bld->base.builder,
657021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                     addr, LLVMConstInt(LLVMInt32Type(), 0, 0),
658021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                     "");
659021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0));
660021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   }
661021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin
6625b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   switch( reg->Register.File ) {
66363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_OUTPUT:
664ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      lp_exec_mask_store(&bld->exec_mask, pred, value,
66580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                         bld->outputs[reg->Register.Index][chan_index]);
66663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
66763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
668021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   case TGSI_FILE_TEMPORARY: {
669021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin      LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index,
670021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                           chan_index,
671021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                           reg->Register.Indirect,
672021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                           addr);
673ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      lp_exec_mask_store(&bld->exec_mask, pred, value, temp_ptr);
67463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
675021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   }
67663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
67763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_ADDRESS:
678ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      lp_exec_mask_store(&bld->exec_mask, pred, value,
679ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin                         bld->addr[reg->Indirect.Index][chan_index]);
68063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
68163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
682ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca   case TGSI_FILE_PREDICATE:
683ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      lp_exec_mask_store(&bld->exec_mask, pred, value,
684ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca                         bld->preds[index][chan_index]);
685ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      break;
686ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca
68763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
68863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
68963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
69063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
69163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
69263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
69463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators.
69563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
69663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
697962558daaed43b0111cd062e32821aad106869d7José Fonsecaenum tex_modifier {
698962558daaed43b0111cd062e32821aad106869d7José Fonseca   TEX_MODIFIER_NONE = 0,
699962558daaed43b0111cd062e32821aad106869d7José Fonseca   TEX_MODIFIER_PROJECTED,
700962558daaed43b0111cd062e32821aad106869d7José Fonseca   TEX_MODIFIER_LOD_BIAS,
701962558daaed43b0111cd062e32821aad106869d7José Fonseca   TEX_MODIFIER_EXPLICIT_LOD,
702962558daaed43b0111cd062e32821aad106869d7José Fonseca   TEX_MODIFIER_EXPLICIT_DERIV
703962558daaed43b0111cd062e32821aad106869d7José Fonseca};
70486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
70563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
70663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld,
70763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          const struct tgsi_full_instruction *inst,
708962558daaed43b0111cd062e32821aad106869d7José Fonseca          enum tex_modifier modifier,
709faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca          LLVMValueRef *texel)
71063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
711962558daaed43b0111cd062e32821aad106869d7José Fonseca   unsigned unit;
712ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca   LLVMValueRef lod_bias, explicit_lod;
71331d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee   LLVMValueRef oow = NULL;
714c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   LLVMValueRef coords[3];
715962558daaed43b0111cd062e32821aad106869d7José Fonseca   LLVMValueRef ddx[3];
716962558daaed43b0111cd062e32821aad106869d7José Fonseca   LLVMValueRef ddy[3];
717c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   unsigned num_coords;
71863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
71963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7209db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca   if (!bld->sampler) {
7219db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca      _debug_printf("warning: found texture instruction but no sampler generator supplied\n");
7229db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca      for (i = 0; i < 4; i++) {
7239db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca         texel[i] = bld->base.undef;
7249db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca      }
7259db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca      return;
7269db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca   }
7279db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca
7287d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   switch (inst->Texture.Texture) {
72963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_1D:
730c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 1;
73163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
73263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_2D:
73363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_RECT:
734c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 2;
73563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
736f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW1D:
737f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW2D:
738f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOWRECT:
73963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_3D:
74063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_CUBE:
741c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 3;
74263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
74363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
74563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return;
74663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
74763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
748ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca   if (modifier == TEX_MODIFIER_LOD_BIAS) {
749ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca      lod_bias = emit_fetch( bld, inst, 0, 3 );
750ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca      explicit_lod = NULL;
751ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca   }
752ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca   else if (modifier == TEX_MODIFIER_EXPLICIT_LOD) {
753ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca      lod_bias = NULL;
754ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca      explicit_lod = emit_fetch( bld, inst, 0, 3 );
755ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca   }
756ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca   else {
757ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca      lod_bias = NULL;
758ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca      explicit_lod = NULL;
759ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca   }
76063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
761962558daaed43b0111cd062e32821aad106869d7José Fonseca   if (modifier == TEX_MODIFIER_PROJECTED) {
7622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      oow = emit_fetch( bld, inst, 0, 3 );
76363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      oow = lp_build_rcp(&bld->base, oow);
76463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
76563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
766c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   for (i = 0; i < num_coords; i++) {
767c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      coords[i] = emit_fetch( bld, inst, 0, i );
768962558daaed43b0111cd062e32821aad106869d7José Fonseca      if (modifier == TEX_MODIFIER_PROJECTED)
769c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca         coords[i] = lp_build_mul(&bld->base, coords[i], oow);
77063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
771ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   for (i = num_coords; i < 3; i++) {
772ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca      coords[i] = bld->base.undef;
773ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   }
77463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
775962558daaed43b0111cd062e32821aad106869d7José Fonseca   if (modifier == TEX_MODIFIER_EXPLICIT_DERIV) {
776962558daaed43b0111cd062e32821aad106869d7José Fonseca      for (i = 0; i < num_coords; i++) {
777962558daaed43b0111cd062e32821aad106869d7José Fonseca         ddx[i] = emit_fetch( bld, inst, 1, i );
778962558daaed43b0111cd062e32821aad106869d7José Fonseca         ddy[i] = emit_fetch( bld, inst, 2, i );
779962558daaed43b0111cd062e32821aad106869d7José Fonseca      }
780962558daaed43b0111cd062e32821aad106869d7José Fonseca      unit = inst->Src[3].Register.Index;
781962558daaed43b0111cd062e32821aad106869d7José Fonseca   }  else {
782962558daaed43b0111cd062e32821aad106869d7José Fonseca      for (i = 0; i < num_coords; i++) {
783962558daaed43b0111cd062e32821aad106869d7José Fonseca         ddx[i] = emit_ddx( bld, coords[i] );
784962558daaed43b0111cd062e32821aad106869d7José Fonseca         ddy[i] = emit_ddy( bld, coords[i] );
785962558daaed43b0111cd062e32821aad106869d7José Fonseca      }
786962558daaed43b0111cd062e32821aad106869d7José Fonseca      unit = inst->Src[1].Register.Index;
787962558daaed43b0111cd062e32821aad106869d7José Fonseca   }
7884554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca   for (i = num_coords; i < 3; i++) {
7894554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca      ddx[i] = bld->base.undef;
7904554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca      ddy[i] = bld->base.undef;
7914554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca   }
792962558daaed43b0111cd062e32821aad106869d7José Fonseca
7938be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld->sampler->emit_fetch_texel(bld->sampler,
7948be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.builder,
7958be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.type,
796962558daaed43b0111cd062e32821aad106869d7José Fonseca                                  unit, num_coords, coords,
797ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca                                  ddx, ddy,
798ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca                                  lod_bias, explicit_lod,
7998be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  texel);
80063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
80163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
80263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
803feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/**
804feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Kill fragment if any of the src register values are negative.
805feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */
80663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
80763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil(
80863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
8092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst )
81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
8117d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[0];
8127821664b15501b173b2304bbada758c33c5ff972José Fonseca   LLVMValueRef terms[NUM_CHANNELS];
8133d7a88674f9eb3320eeff511968f041426e25023José Fonseca   LLVMValueRef mask;
81463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
81563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8167821664b15501b173b2304bbada758c33c5ff972José Fonseca   memset(&terms, 0, sizeof terms);
81763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( chan_index ) {
81963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned swizzle;
82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8217821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Unswizzle channel */
822b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell      swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
82363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8247821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Check if the component has not been already tested. */
8257821664b15501b173b2304bbada758c33c5ff972José Fonseca      assert(swizzle < NUM_CHANNELS);
8267821664b15501b173b2304bbada758c33c5ff972José Fonseca      if( !terms[swizzle] )
8277821664b15501b173b2304bbada758c33c5ff972José Fonseca         /* TODO: change the comparison operator instead of setting the sign */
8282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         terms[swizzle] =  emit_fetch(bld, inst, 0, chan_index );
82963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
83063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8313d7a88674f9eb3320eeff511968f041426e25023José Fonseca   mask = NULL;
8327821664b15501b173b2304bbada758c33c5ff972José Fonseca   FOR_EACH_CHANNEL( chan_index ) {
833aede39efd86d200ffbace8fc012104e31f673973José Fonseca      if(terms[chan_index]) {
8343d7a88674f9eb3320eeff511968f041426e25023José Fonseca         LLVMValueRef chan_mask;
835aede39efd86d200ffbace8fc012104e31f673973José Fonseca
836feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul         /*
837feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          * If term < 0 then mask = 0 else mask = ~0.
838feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          */
8393d7a88674f9eb3320eeff511968f041426e25023José Fonseca         chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero);
840aede39efd86d200ffbace8fc012104e31f673973José Fonseca
8413d7a88674f9eb3320eeff511968f041426e25023José Fonseca         if(mask)
8423d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, "");
8433d7a88674f9eb3320eeff511968f041426e25023José Fonseca         else
8443d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = chan_mask;
845aede39efd86d200ffbace8fc012104e31f673973José Fonseca      }
84663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
8473d7a88674f9eb3320eeff511968f041426e25023José Fonseca
8483d7a88674f9eb3320eeff511968f041426e25023José Fonseca   if(mask)
8493d7a88674f9eb3320eeff511968f041426e25023José Fonseca      lp_build_mask_update(bld->mask, mask);
85063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
85163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
85263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
85363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
854feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Predicated fragment kill.
855feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * XXX Actually, we do an unconditional kill (as in tgsi_exec.c).
856feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * The only predication is the execution mask which will apply if
857feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * we're inside a loop or conditional.
858feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */
859feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulstatic void
860feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulemit_kilp(struct lp_build_tgsi_soa_context *bld,
861feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          const struct tgsi_full_instruction *inst)
862feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul{
863feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   LLVMValueRef mask;
864feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
865feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   /* For those channels which are "alive", disable fragment shader
866feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul    * execution.
867feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul    */
868feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   if (bld->exec_mask.has_mask) {
869feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      mask = LLVMBuildNot(bld->base.builder, bld->exec_mask.exec_mask, "kilp");
870feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   }
871feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   else {
872feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      mask = bld->base.zero;
873feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   }
874feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
875feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   lp_build_mask_update(bld->mask, mask);
876feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul}
877feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
878e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonsecastatic void
87985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration(
88085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   struct lp_build_tgsi_soa_context *bld,
88185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   const struct tgsi_full_declaration *decl)
88285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{
883a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca   LLVMTypeRef vec_type = lp_build_vec_type(bld->base.type);
884a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca
88585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned first = decl->Range.First;
88685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned last = decl->Range.Last;
88785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned idx, i;
88885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
88985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   for (idx = first; idx <= last; ++idx) {
89085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      switch (decl->Declaration.File) {
89185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      case TGSI_FILE_TEMPORARY:
8926c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca         assert(idx < LP_MAX_TGSI_TEMPS);
893021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         if (bld->has_indirect_addressing) {
894021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin            LLVMValueRef val = LLVMConstInt(LLVMInt32Type(),
895021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                            last*4 + 4, 0);
896a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca            bld->temps_array = lp_build_array_alloca(bld->base.builder,
897a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca                                                     vec_type, val, "");
898021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         } else {
899021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin            for (i = 0; i < NUM_CHANNELS; i++)
900a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca               bld->temps[idx][i] = lp_build_alloca(bld->base.builder,
901a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca                                                    vec_type, "");
902021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin         }
90385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         break;
90485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
90585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      case TGSI_FILE_OUTPUT:
90685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         for (i = 0; i < NUM_CHANNELS; i++)
907a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca            bld->outputs[idx][i] = lp_build_alloca(bld->base.builder,
908a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca                                                   vec_type, "");
90985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         break;
91085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
911ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin      case TGSI_FILE_ADDRESS:
9126c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca         assert(idx < LP_MAX_TGSI_ADDRS);
913ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         for (i = 0; i < NUM_CHANNELS; i++)
914a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca            bld->addr[idx][i] = lp_build_alloca(bld->base.builder,
915a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca                                                vec_type, "");
916ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         break;
917ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin
918e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca      case TGSI_FILE_PREDICATE:
919ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         assert(idx < LP_MAX_TGSI_PREDS);
920ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         for (i = 0; i < NUM_CHANNELS; i++)
921ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca            bld->preds[idx][i] = lp_build_alloca(bld->base.builder,
922ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca                                                 vec_type, "");
923e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca         break;
924e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca
92585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      default:
92685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         /* don't need to declare other vars */
927dc886ba1391d7d890bd1f5532bc14553e883a418Zack Rusin         break;
928012fabca722494162c244a367913562b8cfa4677Zack Rusin      }
92985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   }
93085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin}
93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
932fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul
933fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul/**
934fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * Emit LLVM for one TGSI instruction.
935fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * \param return TRUE for success, FALSE otherwise
936fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul */
937fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paulstatic boolean
93863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction(
93963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
940faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_full_instruction *inst,
941faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_opcode_info *info)
94263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
94363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
94490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef src0, src1, src2;
945e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp0, tmp1, tmp2;
946e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp3 = NULL;
947e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp4 = NULL;
948e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp5 = NULL;
949e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp6 = NULL;
950e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp7 = NULL;
951faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef res;
952faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef dst0[NUM_CHANNELS];
95363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
95489258652b6a1d282bed14549907892bdfda752f0José Fonseca   /*
95589258652b6a1d282bed14549907892bdfda752f0José Fonseca    * Stores and write masks are handled in a general fashion after the long
95689258652b6a1d282bed14549907892bdfda752f0José Fonseca    * instruction opcode switch statement.
95789258652b6a1d282bed14549907892bdfda752f0José Fonseca    *
95889258652b6a1d282bed14549907892bdfda752f0José Fonseca    * Although not stricitly necessary, we avoid generating instructions for
95989258652b6a1d282bed14549907892bdfda752f0José Fonseca    * channels which won't be stored, in cases where's that easy. For some
96089258652b6a1d282bed14549907892bdfda752f0José Fonseca    * complex instructions, like texture sampling, it is more convenient to
96189258652b6a1d282bed14549907892bdfda752f0José Fonseca    * assume a full writemask and then let LLVM optimization passes eliminate
96289258652b6a1d282bed14549907892bdfda752f0José Fonseca    * redundant code.
96389258652b6a1d282bed14549907892bdfda752f0José Fonseca    */
96489258652b6a1d282bed14549907892bdfda752f0José Fonseca
965faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   assert(info->num_dst <= 1);
966ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   if (info->num_dst) {
967faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
968faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.undef;
969faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
970faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
971faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
97263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->Instruction.Opcode) {
97363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARL:
9742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
976ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         tmp0 = lp_build_floor(&bld->base, tmp0);
977faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
97863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
97963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
98063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOV:
9822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
983faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index );
98463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
98563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
98663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LIT:
9882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) {
989faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
99063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
9912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
9922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
993faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero);
994ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca      }
9952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
996ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = SrcReg[0].yyyy */
9972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
998ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = max(XMM[1], 0) */
999ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero);
1000ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[2] = SrcReg[0].wwww */
10012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 0, CHAN_W );
1002ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_pow( &bld->base, tmp1, tmp2);
10032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1004c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero);
1005faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero);
1006c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca      }
10072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) {
1008faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
100963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
101063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
101263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCP:
101363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIP */
10142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
1015faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rcp(&bld->base, src0);
10162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1017faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
101963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RSQ:
102263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIPSQRT */
10232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
102490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      src0 = lp_build_abs(&bld->base, src0);
1025faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rsqrt(&bld->base, src0);
10262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1027faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
102963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
103163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EXP:
10322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
10332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
10342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
103557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2_int_part = NULL;
103657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_frac_part = NULL;
103757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2 = NULL;
103857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
10392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
104057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
10412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
104257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2_int_part = &tmp0;
10432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
104457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_frac_part = &tmp1;
10452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
104657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2 = &tmp2;
104757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
104857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2);
104957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
10502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
1051faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
10522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
1053faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = tmp1;
10542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
1055faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
105763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
10582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
1059faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
106063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
106163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOG:
10642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
10652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
10662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
1067add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_floor_log2 = NULL;
1068add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_exp = NULL;
1069add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_log2 = NULL;
107057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
10712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
107257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         src0 = lp_build_abs( &bld->base, src0 );
107357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
10742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
107557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_floor_log2 = &tmp0;
10762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
107757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp = &tmp1;
10782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
107957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_log2 = &tmp2;
108057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
108157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2);
108257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
108357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.x = floor(lg2(abs(src.x))) */
10842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
1085faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
108657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */
10872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) {
1088faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1);
108963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
109057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.z = lg2(abs(src.x)) */
10912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
1092faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
109363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
109463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
10952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
1096faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
109763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
109863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
109963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MUL:
11012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
11032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1104faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_mul(&bld->base, src0, src1);
110563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
110663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ADD:
11092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
11112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1112faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add(&bld->base, src0, src1);
111363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
111463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
111563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
111663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP3:
111763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT3 */
11182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
11192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
112090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
11212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
11222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
112390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
112490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
11252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
11262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
112790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
112890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
11292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1130faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
113163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
113363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP4:
113563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT4 */
11362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
11372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
113890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
11392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
11402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
114190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
114290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
11432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
11442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
114590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
114690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
11472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_W );
11482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_W );
114990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
115090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
11512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1152faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
115363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
115663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DST:
11572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
1158faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
115963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
11612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
11622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Y );
1163faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1);
116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1166faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z );
116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1169faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W );
117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
117163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
117263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MIN:
11742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
11762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1177faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_min( &bld->base, src0, src1 );
117863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
117963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
118063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAX:
11822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
11842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1185faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_max( &bld->base, src0, src1 );
118663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
118763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLT:
119063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETLT */
11912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
11932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
11941aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 );
1195faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
11961aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
119863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGE:
120063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETGE */
12012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
12032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
12041aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 );
1205faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
12061aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
120763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
120863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAD:
121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_MADD */
12112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
12142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 2, chan_index );
121590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
121690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_add( &bld->base, tmp0, tmp2);
1217faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
121863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
121963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
122163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SUB:
12222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
12242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
1225faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1);
122663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LRP:
12302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
12322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
12332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
123490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, src1, src2 );
123590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, src0, tmp0 );
1236faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 );
123763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND:
1241873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1242873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
1243873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1244873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
1245185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul         tmp1 = lp_build_const_vec(bld->base.type, 0.5);
1246873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1);
1247faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 );
1248873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2A:
12522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
12532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
125490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
12552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
12562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
125790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
125890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
12592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 2, CHAN_X );  /* xmm1 = src[2].x */
126090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
12612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1262faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
126563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FRC:
12672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1268873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
1269873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_floor(&bld->base, src0);
1270f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul         tmp0 = lp_build_sub(&bld->base, src0, tmp0);
1271faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
127263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
127363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CLAMP:
1276873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1277873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1278873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1279873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
1280873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_max(&bld->base, tmp0, src1);
1281873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_min(&bld->base, tmp0, src2);
1282faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
1283873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
128463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FLR:
12872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1289faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_floor(&bld->base, tmp0);
129063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
129163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ROUND:
12942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1296faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_round(&bld->base, tmp0);
129763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
129863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   case TGSI_OPCODE_EX2: {
13012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
130290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_exp2( &bld->base, tmp0);
13032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1304faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   }
130863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LG2:
13102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
131190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_log2( &bld->base, tmp0);
13122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1313faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POW:
13182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
13192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src1 = emit_fetch( bld, inst, 1, CHAN_X );
1320faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_pow( &bld->base, src0, src1 );
13212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1322faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XPD:
13272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
13282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
13292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Z );
13302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp3 = emit_fetch( bld, inst, 0, CHAN_Z );
133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
13322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
13332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
13342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
13352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp4 = emit_fetch( bld, inst, 1, CHAN_Y );
133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
13372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
133890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = tmp0;
133990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_mul( &bld->base, tmp2, tmp1);
134090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = tmp3;
134190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
134290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_sub( &bld->base, tmp2, tmp5);
1343faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = tmp2;
134463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
13452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
13462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
13472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 1, CHAN_X );
13482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp5 = emit_fetch( bld, inst, 0, CHAN_X );
134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
13502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
135190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_mul( &bld->base, tmp3, tmp2);
135290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp1 = lp_build_mul( &bld->base, tmp1, tmp5);
135390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_sub( &bld->base, tmp3, tmp1);
1354faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = tmp3;
135563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
13562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
135790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
135890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp2);
135990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_sub( &bld->base, tmp5, tmp0);
1360faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = tmp5;
136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
13622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1363faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
136463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
136563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ABS:
13682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1370faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_abs( &bld->base, tmp0 );
137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCC:
1375873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1376873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1377fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DPH:
13802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
13812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
138290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
13832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
13842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
138590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
138690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
13872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
13882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
138990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
139090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
13912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_W );
139290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
13932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1394faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
139563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
139663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
139863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_COS:
13992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
140090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_cos( &bld->base, tmp0 );
14012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1402faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
140363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
140463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
140663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDX:
140786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
140886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL);
140986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
141063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDY:
141386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
141486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]);
141586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KILP:
141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* predicated kill */
1420feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      emit_kilp( bld, inst );
142163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KIL:
142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* conditional kill */
14252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_kil( bld, inst );
142663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
142763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
142863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2H:
1429fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2US:
1433fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
143463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
143563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4B:
1437fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
143863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
144063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4UB:
1441fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
144263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
144463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RFL:
1445fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
144663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
144763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SEQ:
14492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
14512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
14521aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 );
1453faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
14541aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
145563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
145663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SFL:
1458873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1459faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.zero;
1460873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGT:
14642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
14662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
14671aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 );
1468faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
14691aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
147063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
147163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
147263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SIN:
14732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
147490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_sin( &bld->base, tmp0 );
14752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1476faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
147763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
147863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
147963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLE:
14812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
14832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
14841aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 );
1485faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
14861aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
148863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
148963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SNE:
14902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
14922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
14931aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 );
1494faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
14951aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_STR:
1499873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1500faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.one;
1501873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
150363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TEX:
1505962558daaed43b0111cd062e32821aad106869d7José Fonseca      emit_tex( bld, inst, TEX_MODIFIER_NONE, dst0 );
150663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
150763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
150863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXD:
1509962558daaed43b0111cd062e32821aad106869d7José Fonseca      emit_tex( bld, inst, TEX_MODIFIER_EXPLICIT_DERIV, dst0 );
151063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
151163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
151263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2H:
1513873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1514873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert (0);
1515fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
151663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
151763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
151863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2US:
1519873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1520873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1521fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
152263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
152363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
152463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4B:
1525873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1526873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1527fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
152863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
152963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
153063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4UB:
1531873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1532873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1533fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
153463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
153563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
153663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_X2D:
1537873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1538873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1539fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
154063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
154163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
154263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARA:
1543873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1544873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1545fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
154663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
154763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
154863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARR:
15492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
15502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1551ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin         tmp0 = lp_build_round(&bld->base, tmp0);
1552faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
155363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
155463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
155563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRA:
1557873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1558873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1559fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
156063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
156163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
156263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CAL:
1563873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1564fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
156563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
156663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
156763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RET:
1568873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1569fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
157063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
157163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
157263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_END:
157363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
157463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
157563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SSG:
157663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SGN */
15772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
15782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1579faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 );
158063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
158163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
158263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
158363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CMP:
15842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
15852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
15862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
15872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
15881aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero );
1589faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2);
15901aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
159163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
159263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
159363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SCS:
15942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
15952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1596faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 );
159763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
15982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
15992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1600faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 );
160163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
16022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1603faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = bld->base.zero;
160463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
16052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1606faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
160763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
160863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
160963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
161063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXB:
1611962558daaed43b0111cd062e32821aad106869d7José Fonseca      emit_tex( bld, inst, TEX_MODIFIER_LOD_BIAS, dst0 );
161263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
161363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
161463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM:
161563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* fall-through */
161663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM4:
161763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* 3 or 4-component normalization */
161863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      {
161963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4;
162063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) ||
16222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) ||
16232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) ||
16242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) {
162563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
162663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */
162763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
162863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm4 = src.x */
162963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = src.x * src.x */
16302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
16312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
163290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = tmp0;
163363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
163490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_mul( &bld->base, tmp0, tmp0);
163563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
163663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm5 = src.y */
163763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.y * src.y */
16382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Y);
16392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
164090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = tmp1;
164163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
164290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
164390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
164463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
164563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm6 = src.z */
164663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.z * src.z */
16472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Z);
16482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
164990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = tmp1;
165063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
165190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
165290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
165363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
165463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            if (dims == 4) {
165563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm7 = src.w */
165663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm0 = xmm0 + src.w * src.w */
16572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               tmp1 = emit_fetch(bld, inst, 0, CHAN_W);
16582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) {
165990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca                  tmp7 = tmp1;
166063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
166190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
166290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
166363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
166463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
166563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm1 = 1 / sqrt(xmm0) */
166690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_rsqrt( &bld->base, tmp0);
166763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
166863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.x = xmm1 * src.x */
16692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
1670faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1);
167163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
167263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
167363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.y = xmm1 * src.y */
16742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
1675faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1);
167663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
167763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
167863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.z = xmm1 * src.z */
16792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
1680faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1);
168163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
168263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
168363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.w = xmm1 * src.w */
16842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) {
1685faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1);
168663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
168763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
168863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1689faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         /* dst.w = 1.0 */
16902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) {
1691faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_W] = bld->base.one;
169263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
169363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
169463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
169563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
169663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DIV:
1697873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1698873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert( 0 );
1699fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
170063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
170163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
170263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2:
17032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
17042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
170590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
17062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
17072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
170890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
170990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
17102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1711faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
171263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
171363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
171463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
171563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXL:
1716962558daaed43b0111cd062e32821aad106869d7José Fonseca      emit_tex( bld, inst, TEX_MODIFIER_EXPLICIT_LOD, dst0 );
171763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
171863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
171963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXP:
1720962558daaed43b0111cd062e32821aad106869d7José Fonseca      emit_tex( bld, inst, TEX_MODIFIER_PROJECTED, dst0 );
172163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
172218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
172363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRK:
172418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_break(&bld->exec_mask);
172563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
172663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
172763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_IF:
172880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
1729ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin      tmp0 = lp_build_cmp(&bld->base, PIPE_FUNC_NOTEQUAL,
1730ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin                          tmp0, bld->base.zero);
173180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_push(&bld->exec_mask, tmp0);
173263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
173363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
173418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   case TGSI_OPCODE_BGNLOOP:
173518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_bgnloop(&bld->exec_mask);
173618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      break;
173718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
173863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ELSE:
173980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_invert(&bld->exec_mask);
174063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
174163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
174263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDIF:
174380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_pop(&bld->exec_mask);
174463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
174563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
174618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   case TGSI_OPCODE_ENDLOOP:
174718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_endloop(&bld->exec_mask);
174818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      break;
174918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
175063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PUSHA:
1751873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1752873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1753fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
175463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
175563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
175663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POPA:
1757873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1758873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1759fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
176063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
176163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
176263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CEIL:
1763873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1764873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1765faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_ceil(&bld->base, tmp0);
1766873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
176763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
176863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
176963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_I2F:
1770873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1771873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1772fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
177363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
177463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
177563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NOT:
1776873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1777873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1778fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
177963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
178063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
178163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TRUNC:
17822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
17832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1784faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_trunc(&bld->base, tmp0);
178563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
178663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
178763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
178863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHL:
1789873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1790873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1791fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
179263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
179363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
17942c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol   case TGSI_OPCODE_ISHR:
1795873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1796873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1797fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
179863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
179963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
180063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_AND:
1801873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1802873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1803fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
180463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
180563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
180663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_OR:
1807873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1808873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1809fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
181063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
181163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
181263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOD:
1813873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1814873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1815fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
181663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
181763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
181863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XOR:
1819873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1820873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1821fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
182263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
182363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
182463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SAD:
1825873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1826873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1827fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
182863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
182963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
183063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXF:
1831873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1832873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1833fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
183463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
183563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
183663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXQ:
1837873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1838873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1839fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
184063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
184163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
184263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CONT:
184318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_continue(&bld->exec_mask);
184463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
184563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
184663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EMIT:
1847fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
184863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
184963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
185063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDPRIM:
1851fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
185263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
185363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1854873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOP:
1855873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      break;
1856873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca
185763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
1858fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
185963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
186063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1861faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
1862ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      LLVMValueRef pred[NUM_CHANNELS];
1863ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
1864ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca      emit_fetch_predicate( bld, inst, pred );
1865ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca
1866faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1867ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca         emit_store( bld, inst, 0, chan_index, pred[chan_index], dst0[chan_index]);
1868faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
1869faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
1870faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
1871fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul   return TRUE;
187263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
187363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1874c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca
1875c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid
187663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder,
187763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  const struct tgsi_token *tokens,
1878b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                  struct lp_type type,
18793d7a88674f9eb3320eeff511968f041426e25023José Fonseca                  struct lp_build_mask_context *mask,
188063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef consts_ptr,
1881f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef *pos,
1882f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef (*inputs)[NUM_CHANNELS],
1883f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  LLVMValueRef (*outputs)[NUM_CHANNELS],
1884021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                  struct lp_build_sampler_soa *sampler,
1885021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                  struct tgsi_shader_info *info)
188663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
188763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context bld;
188863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_parse_context parse;
188963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint num_immediates = 0;
189063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
189163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
189263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* Setup build context */
189363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   memset(&bld, 0, sizeof bld);
189463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_context_init(&bld.base, builder, type);
1895ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca   lp_build_context_init(&bld.int_bld, builder, lp_int_type(type));
1896c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca   bld.mask = mask;
1897f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.pos = pos;
1898f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.inputs = inputs;
189963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.outputs = outputs;
190063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.consts_ptr = consts_ptr;
19018be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld.sampler = sampler;
1902021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin   bld.has_indirect_addressing = info->opcode_count[TGSI_OPCODE_ARR] > 0 ||
1903021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin                                 info->opcode_count[TGSI_OPCODE_ARL] > 0;
190463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
190580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_init(&bld.exec_mask, &bld.base);
190680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
190763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_init( &parse, tokens );
190863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
190963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   while( !tgsi_parse_end_of_tokens( &parse ) ) {
191063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      tgsi_parse_token( &parse );
191163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
191263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch( parse.FullToken.Token.Type ) {
191363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_DECLARATION:
19141fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca         /* Inputs already interpolated */
1915e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca         emit_declaration( &bld, &parse.FullToken.FullDeclaration );
191663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
191763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
191863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_INSTRUCTION:
1919faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         {
19202c90652ed9e119f09af6757c59d10273894ba590José Fonseca            unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
19215d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee            const struct tgsi_opcode_info *opcode_info = tgsi_get_opcode_info(opcode);
19225d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee            if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, opcode_info ))
1923faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n",
19245d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee                             opcode_info->mnemonic);
1925faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         }
1926faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
192763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
192863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
192963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_IMMEDIATE:
193063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* simply copy the immediate values into the next immediates[] slot */
193163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         {
193263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
193363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(size <= 4);
19346c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca            assert(num_immediates < LP_MAX_TGSI_IMMEDIATES);
193563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = 0; i < size; ++i )
193663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] =
1937185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul                  lp_build_const_vec(type, parse.FullToken.FullImmediate.u[i].Float);
193863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = size; i < 4; ++i )
193963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] = bld.base.undef;
194063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            num_immediates++;
194163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
194263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
194363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
19449381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca      case TGSI_TOKEN_TYPE_PROPERTY:
19459381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca         break;
19469381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca
194763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
194863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
194963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
195063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
195118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (0) {
195218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMBasicBlockRef block = LLVMGetInsertBlock(builder);
195318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMValueRef function = LLVMGetBasicBlockParent(block);
195418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      debug_printf("11111111111111111111111111111 \n");
195518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      tgsi_dump(tokens, 0);
195618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMDumpValue(function);
195718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      debug_printf("2222222222222222222222222222 \n");
195818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   }
195963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_free( &parse );
196063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
196163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1962