lp_bld_tgsi_soa.c revision fc9b8cd9dda946d8415732aeeed1eff5541cd1ee
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"
4963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h"
5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h"
5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h"
527821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h"
5363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h"
543d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h"
5563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h"
5680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h"
5763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_TEMPS 256
6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_IMMEDIATES 256
6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\
6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++)
6563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
675b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN)))
6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( CHAN )\
7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0
7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1
7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2
7963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3
8063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT     0
8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT    1
8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT  2
8486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3
8586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
8680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#define LP_TGSI_MAX_NESTING 16
8780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
8880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstruct lp_exec_mask {
8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   struct lp_build_context *bld;
9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   boolean has_mask;
9280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMTypeRef int_vec_type;
9480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef cond_stack[LP_TGSI_MAX_NESTING];
9680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   int cond_stack_size;
9780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef cond_mask;
9880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef break_stack[LP_TGSI_MAX_NESTING];
10018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   int break_stack_size;
10118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef break_mask;
10218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
10318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef cont_stack[LP_TGSI_MAX_NESTING];
10418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   int cont_stack_size;
10518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef cont_mask;
10618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
10718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBasicBlockRef loop_stack[LP_TGSI_MAX_NESTING];
10818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   int loop_stack_size;
10918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBasicBlockRef loop_block;
11018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
11118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
11280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef exec_mask;
11380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin};
11463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context
11663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
11763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_context base;
11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef consts_ptr;
120f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef *pos;
121f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef (*inputs)[NUM_CHANNELS];
12295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef (*outputs)[NUM_CHANNELS];
123c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca
1248be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   struct lp_build_sampler_soa *sampler;
12563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
12695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS];
12795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS];
1281929057eac0c3351e0810612bdae56331a235736José Fonseca
1293d7a88674f9eb3320eeff511968f041426e25023José Fonseca   struct lp_build_mask_context *mask;
13080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   struct lp_exec_mask exec_mask;
13163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca};
13263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
13386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
13486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = {
13586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_LEFT,
13686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_LEFT
13786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
13886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
13986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = {
14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_RIGHT,    QUAD_TOP_RIGHT,
14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT
14386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
14486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
14586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
14686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = {
14786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT,
14886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT
14986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
15086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
15186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
15286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = {
15386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT,
15486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT
15586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
15686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
15780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld)
15880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
15980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->bld = bld;
16080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->has_mask = FALSE;
16180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_stack_size = 0;
16218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_stack_size = 0;
16318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->break_stack_size = 0;
16418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->cont_stack_size = 0;
16580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
16680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->int_vec_type = lp_build_int_vec_type(mask->bld->type);
16780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
16880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
16980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask)
17080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
17118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->loop_stack_size) {
17218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      /*for loops we need to update the entire mask at
17318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin       * runtime */
17418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMValueRef tmp;
17518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      tmp = LLVMBuildAnd(mask->bld->builder,
17618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         mask->cont_mask,
17718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         mask->break_mask,
17818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                         "maskcb");
17918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->exec_mask = LLVMBuildAnd(mask->bld->builder,
18018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     mask->cond_mask,
18118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     tmp,
18218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     "maskfull");
18318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   } else
18418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->exec_mask = mask->cond_mask;
18518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
18618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
18718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->has_mask = (mask->cond_stack_size > 0 ||
18818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                     mask->loop_stack_size > 0);
18980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
19080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
19180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask,
19280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                   LLVMValueRef val)
19380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
19480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask;
19580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = LLVMBuildBitCast(mask->bld->builder, val,
19680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                      mask->int_vec_type, "");
19780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
19880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
19980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
20080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
20180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask)
20280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
20380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef prev_mask = mask->cond_stack[mask->cond_stack_size - 1];
204faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   LLVMValueRef inv_mask = LLVMBuildNot(mask->bld->builder,
205faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin                                        mask->cond_mask, "");
206faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin
207faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   /* means that we didn't have any mask before and that
208faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin    * we were fully enabled */
209faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   if (mask->cond_stack_size <= 1) {
210faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin      prev_mask = LLVMConstAllOnes(mask->int_vec_type);
211faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   }
212faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin
21380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = LLVMBuildAnd(mask->bld->builder,
21480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                  inv_mask,
21580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                  prev_mask, "");
21680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
21780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
21880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
21980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask)
22080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
22180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = mask->cond_stack[--mask->cond_stack_size];
22280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
22380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
22480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
22518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_bgnloop(struct lp_exec_mask *mask)
22618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
22718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
22818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cont_stack_size == 0)
22918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cont_mask = LLVMConstAllOnes(mask->int_vec_type);
23018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cont_stack_size == 0)
23118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->break_mask = LLVMConstAllOnes(mask->int_vec_type);
23218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cond_stack_size == 0)
23318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cond_mask = LLVMConstAllOnes(mask->int_vec_type);
23418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_stack[mask->loop_stack_size++] = mask->loop_block;
23518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_block = lp_build_insert_new_block(mask->bld->builder, "bgnloop");
23618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBuildBr(mask->bld->builder, mask->loop_block);
23718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMPositionBuilderAtEnd(mask->bld->builder, mask->loop_block);
23818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
23918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
24018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
24118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
24218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_break(struct lp_exec_mask *mask)
24318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
24418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder,
24518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         mask->exec_mask,
24618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         "break");
24718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
24818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->break_stack[mask->break_stack_size++] = mask->break_mask;
24918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->break_stack_size > 1) {
25018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->break_mask = LLVMBuildAnd(mask->bld->builder,
25118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                      mask->break_mask,
25218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                      exec_mask, "break_full");
25318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   } else
25418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->break_mask = exec_mask;
25518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
25618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
25718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
25818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
25918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_continue(struct lp_exec_mask *mask)
26018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
26118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder,
26218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         mask->exec_mask,
26318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                         "");
26418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
26518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->cont_stack[mask->cont_stack_size++] = mask->cont_mask;
26618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cont_stack_size > 1) {
26718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cont_mask = LLVMBuildAnd(mask->bld->builder,
26818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     mask->cont_mask,
26918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin                                     exec_mask, "");
27018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   } else
27118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cont_mask = exec_mask;
27218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
27318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
27418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
27518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
27618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
27718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_endloop(struct lp_exec_mask *mask)
27818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{
27918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBasicBlockRef endloop;
280d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca   LLVMTypeRef reg_type = LLVMIntType(mask->bld->type.width*
281d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca                                      mask->bld->type.length);
282d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca   /* i1cond = (mask == 0) */
283d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca   LLVMValueRef i1cond = LLVMBuildICmp(
284d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      mask->bld->builder,
285d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMIntNE,
286d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMBuildBitCast(mask->bld->builder, mask->break_mask, reg_type, ""),
287d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca      LLVMConstNull(reg_type), "");
28818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
28918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   endloop = lp_build_insert_new_block(mask->bld->builder, "endloop");
29018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
29118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMBuildCondBr(mask->bld->builder,
292ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin                   i1cond, mask->loop_block, endloop);
29318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
29418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   LLVMPositionBuilderAtEnd(mask->bld->builder, endloop);
29518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
29618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   mask->loop_block = mask->loop_stack[--mask->loop_stack_size];
29718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   /* pop the break mask */
29818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->cont_stack_size) {
29918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->cont_mask = mask->cont_stack[--mask->cont_stack_size];
30018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   }
30118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (mask->break_stack_size) {
30218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      mask->break_mask = mask->cont_stack[--mask->break_stack_size];
30318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   }
30418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
30518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   lp_exec_mask_update(mask);
30618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin}
30718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
30880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask,
30980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                               LLVMValueRef val,
31080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                               LLVMValueRef dst)
31180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
31280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   if (mask->has_mask) {
31380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMValueRef real_val, dst_val;
31480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
31580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      dst_val = LLVMBuildLoad(mask->bld->builder, dst, "");
31680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      real_val = lp_build_select(mask->bld,
31780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                 mask->exec_mask,
31880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                 val, dst_val);
31980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
32080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMBuildStore(mask->bld->builder, real_val, dst);
32180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   } else
32280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMBuildStore(mask->bld->builder, val, dst);
32380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
32480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
32586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
32686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
32786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld,
32886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
32986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
33086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_left  = lp_build_swizzle1_aos(&bld->base, src, swizzle_left);
33186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right);
33286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_right, src_left);
33386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
33486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
33586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
33686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
33786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld,
33886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
33986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
34086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_top    = lp_build_swizzle1_aos(&bld->base, src, swizzle_top);
34186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom);
34286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_top, src_bottom);
34386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
34486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
34586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
34663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
34763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch.
34863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
34963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef
35063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch(
35163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
3522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst,
3532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
35463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const unsigned chan_index )
35563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
3567d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[index];
357b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
35863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef res;
35963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
36063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (swizzle) {
361b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_X:
362b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Y:
363b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Z:
364b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_W:
36563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
36691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      switch (reg->Register.File) {
36763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_CONSTANT: {
36891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0);
36963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, "");
37063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, "");
37163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = lp_build_broadcast_scalar(&bld->base, scalar);
37263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
37363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
37463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
37563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_IMMEDIATE:
37691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->immediates[reg->Register.Index][swizzle];
37763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
37863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
37963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
38063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_INPUT:
38191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->inputs[reg->Register.Index][swizzle];
38263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
38363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
38463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_TEMPORARY:
38685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         res = LLVMBuildLoad(bld->base.builder, bld->temps[reg->Register.Index][swizzle], "");
38763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if(!res)
38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            return bld->base.undef;
38963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
39163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
39263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
3934d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca         return bld->base.undef;
39463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
39563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
39663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
39763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
39863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
3994d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca      return bld->base.undef;
40063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
40163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
40263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) {
40363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_CLEAR:
40463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
40563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
40663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
40763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_SET:
4081fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* TODO: Use bitwese OR for floating point */
40963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
41063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
41163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
41263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
41363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_TOGGLE:
41463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
41563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
41663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
41763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_KEEP:
41863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
41963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
42063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
42163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return res;
42263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
42363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
42563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
42686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives.
42786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */
42886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void
42986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv(
43086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   struct lp_build_tgsi_soa_context *bld,
43186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const struct tgsi_full_instruction *inst,
43286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   unsigned index,
43386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const unsigned chan_index,
43486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *res,
43586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddx,
43686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddy)
43786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
43886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src;
43986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
44086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   src = emit_fetch(bld, inst, index, chan_index);
44186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
44286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(res)
44386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *res = src;
44486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
44586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   /* TODO: use interpolation coeffs for inputs */
44686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
44786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddx)
44886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddx = emit_ddx(bld, src);
44986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
45086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddy)
45186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddy = emit_ddy(bld, src);
45286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
45386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
45486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
45586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/**
45663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store.
45763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
45863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store(
46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const struct tgsi_full_instruction *inst,
4622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index,
46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef value)
46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
4667d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_dst_register *reg = &inst->Dst[index];
4672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca
46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( inst->Instruction.Saturate ) {
46963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_NONE:
47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_ZERO_ONE:
4737926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, bld->base.zero);
4747926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
47563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
47663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
47763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_MINUS_PLUS_ONE:
478185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul      value = lp_build_max(&bld->base, value, lp_build_const_vec(bld->base.type, -1.0));
4797926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
48063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
4817926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca
4827926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca   default:
4837926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      assert(0);
48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
48563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4865b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   switch( reg->Register.File ) {
48763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_OUTPUT:
48880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_store(&bld->exec_mask, value,
48980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                         bld->outputs[reg->Register.Index][chan_index]);
49063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
49163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
49263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_TEMPORARY:
49380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_store(&bld->exec_mask, value,
49480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                         bld->temps[reg->Register.Index][chan_index]);
49563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
49663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
49763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_ADDRESS:
49863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* FIXME */
49963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
50063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
50163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
502ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca   case TGSI_FILE_PREDICATE:
503ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      /* FIXME */
504ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      assert(0);
505ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      break;
506ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca
50763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
50863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
50963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
51063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
51163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
51263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
51363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
51463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators.
51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
51786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
51863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
51963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld,
52063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          const struct tgsi_full_instruction *inst,
52163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          boolean apply_lodbias,
522faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca          boolean projected,
523faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca          LLVMValueRef *texel)
52463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
52591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell   const uint unit = inst->Src[1].Register.Index;
52663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef lodbias;
52731d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee   LLVMValueRef oow = NULL;
528c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   LLVMValueRef coords[3];
529c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   unsigned num_coords;
53063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
53163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5327d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   switch (inst->Texture.Texture) {
53363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_1D:
534c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 1;
53563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
53663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_2D:
53763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_RECT:
538c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 2;
53963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
540f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW1D:
541f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW2D:
542f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOWRECT:
54363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_3D:
54463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_CUBE:
545c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 3;
54663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
54763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
54863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
54963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return;
55063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
55163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
55263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if(apply_lodbias)
5532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      lodbias = emit_fetch( bld, inst, 0, 3 );
55463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   else
55563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      lodbias = bld->base.zero;
55663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
55763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (projected) {
5582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      oow = emit_fetch( bld, inst, 0, 3 );
55963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      oow = lp_build_rcp(&bld->base, oow);
56063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
56163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
562c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   for (i = 0; i < num_coords; i++) {
563c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      coords[i] = emit_fetch( bld, inst, 0, i );
56463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (projected)
565c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca         coords[i] = lp_build_mul(&bld->base, coords[i], oow);
56663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
567ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   for (i = num_coords; i < 3; i++) {
568ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca      coords[i] = bld->base.undef;
569ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   }
57063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5718be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld->sampler->emit_fetch_texel(bld->sampler,
5728be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.builder,
5738be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.type,
5748be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  unit, num_coords, coords, lodbias,
5758be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  texel);
57663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
57763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
57863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
579feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/**
580feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Kill fragment if any of the src register values are negative.
581feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */
58263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
58363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil(
58463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
5852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst )
58663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
5877d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[0];
5887821664b15501b173b2304bbada758c33c5ff972José Fonseca   LLVMValueRef terms[NUM_CHANNELS];
5893d7a88674f9eb3320eeff511968f041426e25023José Fonseca   LLVMValueRef mask;
59063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
59163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5927821664b15501b173b2304bbada758c33c5ff972José Fonseca   memset(&terms, 0, sizeof terms);
59363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
59463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( chan_index ) {
59563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned swizzle;
59663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5977821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Unswizzle channel */
598b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell      swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
59963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6007821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Check if the component has not been already tested. */
6017821664b15501b173b2304bbada758c33c5ff972José Fonseca      assert(swizzle < NUM_CHANNELS);
6027821664b15501b173b2304bbada758c33c5ff972José Fonseca      if( !terms[swizzle] )
6037821664b15501b173b2304bbada758c33c5ff972José Fonseca         /* TODO: change the comparison operator instead of setting the sign */
6042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         terms[swizzle] =  emit_fetch(bld, inst, 0, chan_index );
60563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
60663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6073d7a88674f9eb3320eeff511968f041426e25023José Fonseca   mask = NULL;
6087821664b15501b173b2304bbada758c33c5ff972José Fonseca   FOR_EACH_CHANNEL( chan_index ) {
609aede39efd86d200ffbace8fc012104e31f673973José Fonseca      if(terms[chan_index]) {
6103d7a88674f9eb3320eeff511968f041426e25023José Fonseca         LLVMValueRef chan_mask;
611aede39efd86d200ffbace8fc012104e31f673973José Fonseca
612feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul         /*
613feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          * If term < 0 then mask = 0 else mask = ~0.
614feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          */
6153d7a88674f9eb3320eeff511968f041426e25023José Fonseca         chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero);
616aede39efd86d200ffbace8fc012104e31f673973José Fonseca
6173d7a88674f9eb3320eeff511968f041426e25023José Fonseca         if(mask)
6183d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, "");
6193d7a88674f9eb3320eeff511968f041426e25023José Fonseca         else
6203d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = chan_mask;
621aede39efd86d200ffbace8fc012104e31f673973José Fonseca      }
62263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
6233d7a88674f9eb3320eeff511968f041426e25023José Fonseca
6243d7a88674f9eb3320eeff511968f041426e25023José Fonseca   if(mask)
6253d7a88674f9eb3320eeff511968f041426e25023José Fonseca      lp_build_mask_update(bld->mask, mask);
62663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
62763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
62863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
62963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
630feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Predicated fragment kill.
631feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * XXX Actually, we do an unconditional kill (as in tgsi_exec.c).
632feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * The only predication is the execution mask which will apply if
633feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * we're inside a loop or conditional.
634feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */
635feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulstatic void
636feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulemit_kilp(struct lp_build_tgsi_soa_context *bld,
637feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul          const struct tgsi_full_instruction *inst)
638feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul{
639feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   LLVMValueRef mask;
640feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
641feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   /* For those channels which are "alive", disable fragment shader
642feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul    * execution.
643feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul    */
644feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   if (bld->exec_mask.has_mask) {
645feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      mask = LLVMBuildNot(bld->base.builder, bld->exec_mask.exec_mask, "kilp");
646feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   }
647feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   else {
648feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      mask = bld->base.zero;
649feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   }
650feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
651feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul   lp_build_mask_update(bld->mask, mask);
652feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul}
653feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
654feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul
655feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/**
65663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Check if inst src/dest regs use indirect addressing into temporary
65763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * register file.
65863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
65963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic boolean
66063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaindirect_temp_reference(const struct tgsi_full_instruction *inst)
66163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
66263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint i;
66363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
6647d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_src_register *reg = &inst->Src[i];
66591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (reg->Register.File == TGSI_FILE_TEMPORARY &&
66691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell          reg->Register.Indirect)
66763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
66863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
66963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumDstRegs; i++) {
6707d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_dst_register *reg = &inst->Dst[i];
6715b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell      if (reg->Register.File == TGSI_FILE_TEMPORARY &&
6725b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell          reg->Register.Indirect)
67363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
67463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
67563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return FALSE;
67663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
67763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
67885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinstatic int
67985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration(
68085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   struct lp_build_tgsi_soa_context *bld,
68185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   const struct tgsi_full_declaration *decl)
68285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{
68385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned first = decl->Range.First;
68485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned last = decl->Range.Last;
68585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned idx, i;
686012fabca722494162c244a367913562b8cfa4677Zack Rusin   LLVMBasicBlockRef current_block =
687012fabca722494162c244a367913562b8cfa4677Zack Rusin      LLVMGetInsertBlock(bld->base.builder);
688012fabca722494162c244a367913562b8cfa4677Zack Rusin   LLVMBasicBlockRef first_block =
689012fabca722494162c244a367913562b8cfa4677Zack Rusin      LLVMGetEntryBasicBlock(
690012fabca722494162c244a367913562b8cfa4677Zack Rusin         LLVMGetBasicBlockParent(current_block));
691012fabca722494162c244a367913562b8cfa4677Zack Rusin   LLVMValueRef first_inst =
692012fabca722494162c244a367913562b8cfa4677Zack Rusin      LLVMGetFirstInstruction(first_block);
693012fabca722494162c244a367913562b8cfa4677Zack Rusin
694012fabca722494162c244a367913562b8cfa4677Zack Rusin   /* we want alloca's to be the first instruction
695012fabca722494162c244a367913562b8cfa4677Zack Rusin    * in the function so we need to rewind the builder
696012fabca722494162c244a367913562b8cfa4677Zack Rusin    * to the very beginning */
697012fabca722494162c244a367913562b8cfa4677Zack Rusin   LLVMPositionBuilderBefore(bld->base.builder,
698012fabca722494162c244a367913562b8cfa4677Zack Rusin                             first_inst);
69985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
70085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   for (idx = first; idx <= last; ++idx) {
70185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      switch (decl->Declaration.File) {
70285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      case TGSI_FILE_TEMPORARY:
70385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         for (i = 0; i < NUM_CHANNELS; i++)
70485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin            bld->temps[idx][i] = lp_build_alloca(&bld->base);
70585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         break;
70685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
70785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      case TGSI_FILE_OUTPUT:
70885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         for (i = 0; i < NUM_CHANNELS; i++)
70985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin            bld->outputs[idx][i] = lp_build_alloca(&bld->base);
71085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         break;
71185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
71285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      default:
71385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         /* don't need to declare other vars */
714dc886ba1391d7d890bd1f5532bc14553e883a418Zack Rusin         break;
715012fabca722494162c244a367913562b8cfa4677Zack Rusin      }
71685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   }
71785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
718012fabca722494162c244a367913562b8cfa4677Zack Rusin   LLVMPositionBuilderAtEnd(bld->base.builder,
719012fabca722494162c244a367913562b8cfa4677Zack Rusin                            current_block);
72085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   return TRUE;
72185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin}
72263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
723fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul
724fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul/**
725fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * Emit LLVM for one TGSI instruction.
726fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * \param return TRUE for success, FALSE otherwise
727fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul */
728fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paulstatic boolean
72963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction(
73063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
731faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_full_instruction *inst,
732faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_opcode_info *info)
73363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
73463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
73590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef src0, src1, src2;
736e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp0, tmp1, tmp2;
737e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp3 = NULL;
738e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp4 = NULL;
739e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp5 = NULL;
740e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp6 = NULL;
741e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp7 = NULL;
742faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef res;
743faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef dst0[NUM_CHANNELS];
74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
74563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* we can't handle indirect addressing into temp register file yet */
74663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (indirect_temp_reference(inst))
74763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return FALSE;
74863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
74989258652b6a1d282bed14549907892bdfda752f0José Fonseca   /*
75089258652b6a1d282bed14549907892bdfda752f0José Fonseca    * Stores and write masks are handled in a general fashion after the long
75189258652b6a1d282bed14549907892bdfda752f0José Fonseca    * instruction opcode switch statement.
75289258652b6a1d282bed14549907892bdfda752f0José Fonseca    *
75389258652b6a1d282bed14549907892bdfda752f0José Fonseca    * Although not stricitly necessary, we avoid generating instructions for
75489258652b6a1d282bed14549907892bdfda752f0José Fonseca    * channels which won't be stored, in cases where's that easy. For some
75589258652b6a1d282bed14549907892bdfda752f0José Fonseca    * complex instructions, like texture sampling, it is more convenient to
75689258652b6a1d282bed14549907892bdfda752f0José Fonseca    * assume a full writemask and then let LLVM optimization passes eliminate
75789258652b6a1d282bed14549907892bdfda752f0José Fonseca    * redundant code.
75889258652b6a1d282bed14549907892bdfda752f0José Fonseca    */
75989258652b6a1d282bed14549907892bdfda752f0José Fonseca
760faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   assert(info->num_dst <= 1);
761faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
762faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
763faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.undef;
764faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
765faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
766faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
76763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->Instruction.Opcode) {
76863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
76963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARL:
7701fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* FIXME */
7712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
77363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_flr(bld, 0, 0);
77463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
775faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
77663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
77763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
77863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
77963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
78063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOV:
7812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
782faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index );
78363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
78463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
78563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
78663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LIT:
7872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) {
788faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
78963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
7902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
7912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
792faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero);
793ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca      }
7942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
795ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = SrcReg[0].yyyy */
7962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
797ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = max(XMM[1], 0) */
798ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero);
799ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[2] = SrcReg[0].wwww */
8002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 0, CHAN_W );
801ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_pow( &bld->base, tmp1, tmp2);
8022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
803c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero);
804faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero);
805c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca      }
8062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) {
807faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
80863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
80963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
81163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCP:
81263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIP */
8132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
814faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rcp(&bld->base, src0);
8152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
816faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
81763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
81963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RSQ:
82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIPSQRT */
8222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
82390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      src0 = lp_build_abs(&bld->base, src0);
824faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rsqrt(&bld->base, src0);
8252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
826faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
82763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
82863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
82963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
83063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EXP:
8312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
8322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
8332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
83457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2_int_part = NULL;
83557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_frac_part = NULL;
83657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2 = NULL;
83757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
8382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
83957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
8402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
84157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2_int_part = &tmp0;
8422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
84357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_frac_part = &tmp1;
8442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
84557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2 = &tmp2;
84657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
84757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2);
84857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
8492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
850faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
8512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
852faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = tmp1;
8532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
854faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
85563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
85663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
8572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
858faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
85963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
86063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
86163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
86263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOG:
8632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
8642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
8652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
866add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_floor_log2 = NULL;
867add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_exp = NULL;
868add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_log2 = NULL;
86957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
8702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
87157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         src0 = lp_build_abs( &bld->base, src0 );
87257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
8732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
87457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_floor_log2 = &tmp0;
8752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
87657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp = &tmp1;
8772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
87857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_log2 = &tmp2;
87957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
88057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2);
88157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
88257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.x = floor(lg2(abs(src.x))) */
8832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
884faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
88557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */
8862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) {
887faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1);
88863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
88957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.z = lg2(abs(src.x)) */
8902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
891faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
89263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
89363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
8942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
895faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
89663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
89763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
89863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
89963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MUL:
9002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
903faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_mul(&bld->base, src0, src1);
90463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
90563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
90663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
90763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ADD:
9082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
911faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add(&bld->base, src0, src1);
91263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
91363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
91463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
91563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP3:
91663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT3 */
9172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
9182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
91990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
9202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
9212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
92290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
92390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
9242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
9252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
92690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
92790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
9282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
929faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
93063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
93263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
93363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP4:
93463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT4 */
9352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
9362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
93790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
9382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
9392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
94090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
94190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
9422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
9432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
94490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
94590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
9462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_W );
9472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_W );
94890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
94990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
9502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
951faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
95263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
95363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
95463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
95563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DST:
9562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
957faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
95863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
9592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
9602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
9612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Y );
962faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1);
96363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
9642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
965faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z );
96663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
9672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
968faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W );
96963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
97063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
97163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
97263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MIN:
9732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
976faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_min( &bld->base, src0, src1 );
97763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
97863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
97963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAX:
9812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
984faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_max( &bld->base, src0, src1 );
98563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
98663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
98763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLT:
98963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETLT */
9902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9931aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 );
994faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9951aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
99663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
99763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
99863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGE:
99963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETGE */
10002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10031aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 );
1004faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
10051aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
100663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
100763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAD:
100963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_MADD */
10102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
10122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
10132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 2, chan_index );
101490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
101590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_add( &bld->base, tmp0, tmp2);
1016faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
101763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SUB:
10212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
10232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
1024faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1);
102563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
102663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LRP:
10292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
103390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, src1, src2 );
103490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, src0, tmp0 );
1035faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 );
103663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
103763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND:
1040873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1041873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
1042873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1043873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
1044185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul         tmp1 = lp_build_const_vec(bld->base.type, 0.5);
1045873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1);
1046faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 );
1047873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
104863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
105063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2A:
10512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
10522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
105390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
10542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
10552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
105690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
105790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
10582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 2, CHAN_X );  /* xmm1 = src[2].x */
105990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
10602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1061faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
106463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FRC:
10662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1067873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
1068873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_floor(&bld->base, src0);
1069f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul         tmp0 = lp_build_sub(&bld->base, src0, tmp0);
1070faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CLAMP:
1075873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1076873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1077873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
1078873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
1079873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_max(&bld->base, tmp0, src1);
1080873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_min(&bld->base, tmp0, src2);
1081faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
1082873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
108363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
108463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
108563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FLR:
10862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1088faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_floor(&bld->base, tmp0);
108963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
109063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
109163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
109263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ROUND:
10932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1095faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_round(&bld->base, tmp0);
109663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
109763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
109863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
109990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   case TGSI_OPCODE_EX2: {
11002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
110190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_exp2( &bld->base, tmp0);
11022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1103faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
110463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
110563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
110690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   }
110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LG2:
11092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
111090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_log2( &bld->base, tmp0);
11112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1112faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
111363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
111463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
111563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
111663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POW:
11172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
11182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src1 = emit_fetch( bld, inst, 1, CHAN_X );
1119faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_pow( &bld->base, src0, src1 );
11202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1121faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
112263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
112363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
112463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
112563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XPD:
11262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
11272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
11282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Z );
11292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp3 = emit_fetch( bld, inst, 0, CHAN_Z );
113063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
11322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
11332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
11342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp4 = emit_fetch( bld, inst, 1, CHAN_Y );
113563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
113790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = tmp0;
113890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_mul( &bld->base, tmp2, tmp1);
113990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = tmp3;
114090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
114190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_sub( &bld->base, tmp2, tmp5);
1142faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = tmp2;
114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
11452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
11462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 1, CHAN_X );
11472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp5 = emit_fetch( bld, inst, 0, CHAN_X );
114863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
115090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_mul( &bld->base, tmp3, tmp2);
115190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp1 = lp_build_mul( &bld->base, tmp1, tmp5);
115290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_sub( &bld->base, tmp3, tmp1);
1153faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = tmp3;
115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
115690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
115790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp2);
115890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_sub( &bld->base, tmp5, tmp0);
1159faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = tmp5;
116063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1162faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
116363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ABS:
11672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1169faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_abs( &bld->base, tmp0 );
117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
117163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
117263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCC:
1174873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1175873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1176fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
117763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DPH:
11792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
11802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
118190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
11822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
11832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
118490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
118590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
11862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
11872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
118890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
118990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
11902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_W );
119190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
11922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1193faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
119463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
119563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
119663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_COS:
11982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
119990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_cos( &bld->base, tmp0 );
12002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1201faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
120263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
120363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
120463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
120563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDX:
120686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
120786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL);
120886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDY:
121286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
121386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]);
121486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
121563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
121663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KILP:
121863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* predicated kill */
1219feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul      emit_kilp( bld, inst );
122063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
122263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KIL:
122363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* conditional kill */
12242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_kil( bld, inst );
122563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2H:
1228fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2US:
1232fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
123363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4B:
1236fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
123763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4UB:
1240fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
124163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RFL:
1244fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
124563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SEQ:
12482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
12502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
12511aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 );
1252faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
12531aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SFL:
1257873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1258faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.zero;
1259873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
126063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
126163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGT:
12632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
12652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
12661aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 );
1267faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
12681aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
126963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SIN:
12722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
127390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_sin( &bld->base, tmp0 );
12742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1275faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
127663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
127763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLE:
12802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
12822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
12831aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 );
1284faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
12851aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SNE:
12892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
12912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
12921aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 );
1293faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
12941aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_STR:
1298873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1299faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.one;
1300873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
130163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TEX:
1304faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, FALSE, FALSE, dst0 );
130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXD:
1308873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1309fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
131063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2H:
1313873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1314873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert (0);
1315fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2US:
1319873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1320873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1321fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
132263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4B:
1325873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1326873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1327fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
132863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4UB:
1331873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1332873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1333fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
133463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_X2D:
1337873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1338873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1339fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
134063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
134163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
134263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARA:
1343873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1344873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1345fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
134663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
134763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
134890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARR:
1350873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
13512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
135363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_rnd( bld, 0, 0 );
135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
1355faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
135663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
135890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif
135963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRA:
1361873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1362873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1363fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
136463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
136563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CAL:
1367873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1368fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
136963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RET:
1372873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1373fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_END:
137763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SSG:
138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SGN */
13812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1383faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 );
138463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
138563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CMP:
13882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
13902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
13912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
13921aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero );
1393faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2);
13941aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
139563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
139663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SCS:
13982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
13992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1400faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 );
140163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
14032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1404faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 );
140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1407faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = bld->base.zero;
140863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1410faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
141363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXB:
1415faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE, dst0 );
141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM:
141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* fall-through */
142063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM4:
142163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* 3 or 4-component normalization */
142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      {
142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4;
142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
14252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) ||
14262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) ||
14272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) ||
14282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) {
142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */
143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm4 = src.x */
143363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = src.x * src.x */
14342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
14352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
143690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = tmp0;
143763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
143890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_mul( &bld->base, tmp0, tmp0);
143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
144063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm5 = src.y */
144163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.y * src.y */
14422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Y);
14432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
144490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = tmp1;
144563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
144690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
144790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm6 = src.z */
145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.z * src.z */
14512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Z);
14522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
145390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = tmp1;
145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
145590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
145690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
145763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            if (dims == 4) {
145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm7 = src.w */
146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm0 = xmm0 + src.w * src.w */
14612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               tmp1 = emit_fetch(bld, inst, 0, CHAN_W);
14622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) {
146390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca                  tmp7 = tmp1;
146463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
146590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
146690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
146763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
146863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm1 = 1 / sqrt(xmm0) */
147090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_rsqrt( &bld->base, tmp0);
147163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
147263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.x = xmm1 * src.x */
14732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
1474faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1);
147563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
147663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
147763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.y = xmm1 * src.y */
14782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
1479faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1);
148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
148163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
148263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.z = xmm1 * src.z */
14832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
1484faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1);
148563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
148663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.w = xmm1 * src.w */
14882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) {
1489faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1);
149063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
149163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
149263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1493faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         /* dst.w = 1.0 */
14942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) {
1495faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_W] = bld->base.one;
149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
149963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
150063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DIV:
1501873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1502873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert( 0 );
1503fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
150563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
150663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2:
15072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
15082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
150990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
15102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
15112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
151290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
151390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
15142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1515faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
151663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
151763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
151863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
151963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXL:
1520faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE, dst0 );
152163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
152263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
152363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXP:
1524faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, FALSE, TRUE, dst0 );
152563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
152618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
152763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRK:
152818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_break(&bld->exec_mask);
152963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
153063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
153163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_IF:
153280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
1533ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin      tmp0 = lp_build_cmp(&bld->base, PIPE_FUNC_NOTEQUAL,
1534ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin                          tmp0, bld->base.zero);
153580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_push(&bld->exec_mask, tmp0);
153663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
153763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1538f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_OPCODE_BGNFOR:
1539873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1540873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1541fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
154263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
154363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
154418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   case TGSI_OPCODE_BGNLOOP:
154518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_bgnloop(&bld->exec_mask);
154618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      break;
154718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
154863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_REP:
1549873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1550873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1551fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
155263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
155363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
155463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ELSE:
155580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_invert(&bld->exec_mask);
155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
155763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
155863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDIF:
155980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_pop(&bld->exec_mask);
156063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
156163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1562f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_OPCODE_ENDFOR:
1563873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1564873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1565fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
156663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
156763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
156818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   case TGSI_OPCODE_ENDLOOP:
156918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_endloop(&bld->exec_mask);
157018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      break;
157118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin
157263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDREP:
1573873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1574873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1575fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
157663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
157763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
157863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PUSHA:
1579873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1580873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1581fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
158263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
158363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
158463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POPA:
1585873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1586873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1587fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
158863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
158963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
159063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CEIL:
1591873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1592873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1593faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_ceil(&bld->base, tmp0);
1594873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
159563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
159663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
159763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_I2F:
1598873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1599873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1600fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
160163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
160263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
160363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NOT:
1604873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1605873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1606fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
160763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
160863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
160963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TRUNC:
16102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
16112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1612faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_trunc(&bld->base, tmp0);
161363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
161463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
161563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
161663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHL:
1617873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1618873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1619fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
162063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
162163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16222c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol   case TGSI_OPCODE_ISHR:
1623873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1624873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1625fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
162663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
162763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
162863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_AND:
1629873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1630873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1631fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
163263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
163363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
163463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_OR:
1635873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1636873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1637fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
163863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
163963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
164063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOD:
1641873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1642873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1643fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
164463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
164563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
164663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XOR:
1647873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1648873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1649fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
165063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
165163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
165263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SAD:
1653873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1654873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1655fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
165663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
165763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
165863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXF:
1659873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1660873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1661fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
166263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
166363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
166463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXQ:
1665873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1666873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
1667fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
166863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
166963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
167063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CONT:
167118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      lp_exec_continue(&bld->exec_mask);
167263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
167363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
167463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EMIT:
1675fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
167663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
167763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
167863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDPRIM:
1679fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
168063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
168163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1682873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOP:
1683873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      break;
1684873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca
168563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
1686fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul      return FALSE;
168763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
168863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1689faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
1690faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1691faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0[chan_index]);
1692faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
1693faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
1694faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
1695fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul   return TRUE;
169663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
169763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1698c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca
1699c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid
170063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder,
170163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  const struct tgsi_token *tokens,
1702b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                  struct lp_type type,
17033d7a88674f9eb3320eeff511968f041426e25023José Fonseca                  struct lp_build_mask_context *mask,
170463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef consts_ptr,
1705f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef *pos,
1706f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef (*inputs)[NUM_CHANNELS],
1707f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  LLVMValueRef (*outputs)[NUM_CHANNELS],
17088be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                  struct lp_build_sampler_soa *sampler)
170963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
171063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context bld;
171163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_parse_context parse;
171263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint num_immediates = 0;
171363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
171463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
171563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* Setup build context */
171663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   memset(&bld, 0, sizeof bld);
171763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_context_init(&bld.base, builder, type);
1718c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca   bld.mask = mask;
1719f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.pos = pos;
1720f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.inputs = inputs;
172163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.outputs = outputs;
172263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.consts_ptr = consts_ptr;
17238be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld.sampler = sampler;
172463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
172580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_init(&bld.exec_mask, &bld.base);
172680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
172763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_init( &parse, tokens );
172863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
172963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   while( !tgsi_parse_end_of_tokens( &parse ) ) {
173063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      tgsi_parse_token( &parse );
173163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
173263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch( parse.FullToken.Token.Type ) {
173363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_DECLARATION:
17341fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca         /* Inputs already interpolated */
173585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         {
173685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin            if (!emit_declaration( &bld, &parse.FullToken.FullDeclaration ))
173785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin               _debug_printf("warning: failed to define LLVM variable\n");
173885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         }
173963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
174063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
174163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_INSTRUCTION:
1742faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         {
17432c90652ed9e119f09af6757c59d10273894ba590José Fonseca            unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
17442c90652ed9e119f09af6757c59d10273894ba590José Fonseca            const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode);
1745faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, info ))
1746faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n",
1747faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca                             info ? info->mnemonic : "<invalid>");
1748faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         }
1749faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
175063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
175163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
175263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_IMMEDIATE:
175363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* simply copy the immediate values into the next immediates[] slot */
175463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         {
175563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
175663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(size <= 4);
175763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(num_immediates < LP_MAX_IMMEDIATES);
175863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = 0; i < size; ++i )
175963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] =
1760185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul                  lp_build_const_vec(type, parse.FullToken.FullImmediate.u[i].Float);
176163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = size; i < 4; ++i )
176263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] = bld.base.undef;
176363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            num_immediates++;
176463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
176563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
176663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
17679381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca      case TGSI_TOKEN_TYPE_PROPERTY:
17689381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca         break;
17699381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca
177063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
177163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
177263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
177363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
177418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   if (0) {
177518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMBasicBlockRef block = LLVMGetInsertBlock(builder);
177618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMValueRef function = LLVMGetBasicBlockParent(block);
177718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      debug_printf("11111111111111111111111111111 \n");
177818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      tgsi_dump(tokens, 0);
177918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      LLVMDumpValue(function);
178018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin      debug_printf("2222222222222222222222222222 \n");
178118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin   }
178263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_free( &parse );
178363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
178463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1785