lp_bld_tgsi_soa.c revision ccf57af93f7118a044fa21e874847fa3ed555bca
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"
447821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "tgsi/tgsi_info.h"
4563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_parse.h"
4663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_util.h"
4763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_exec.h"
4863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h"
4963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h"
5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h"
517821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h"
5263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h"
533d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h"
5463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h"
5580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h"
5663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_TEMPS 256
5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_IMMEDIATES 256
6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\
6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++)
6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
665b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN)))
6763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( CHAN )\
7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0
7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1
7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2
7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3
7963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT     0
8186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT    1
8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT  2
8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3
8486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
8580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#define LP_TGSI_MAX_NESTING 16
8680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
8780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstruct lp_exec_mask {
8880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   struct lp_build_context *bld;
8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   boolean has_mask;
9180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMTypeRef int_vec_type;
9380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef cond_stack[LP_TGSI_MAX_NESTING];
9580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   int cond_stack_size;
9680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef cond_mask;
9780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
9880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef exec_mask;
9980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin};
10063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
10163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context
10263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
10363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_context base;
10463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
10563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef consts_ptr;
106f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef *pos;
107f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef (*inputs)[NUM_CHANNELS];
10895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef (*outputs)[NUM_CHANNELS];
109c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca
1108be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   struct lp_build_sampler_soa *sampler;
11163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS];
11395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS];
1141929057eac0c3351e0810612bdae56331a235736José Fonseca
1153d7a88674f9eb3320eeff511968f041426e25023José Fonseca   struct lp_build_mask_context *mask;
11680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   struct lp_exec_mask exec_mask;
11763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca};
11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
12086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = {
12186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_LEFT,
12286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_LEFT
12386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
12486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
12586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
12686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = {
12786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_RIGHT,    QUAD_TOP_RIGHT,
12886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT
12986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
13086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
13186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
13286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = {
13386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT,
13486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT
13586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
13686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
13786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
13886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = {
13986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT,
14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT
14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
14380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld)
14480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
14580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->bld = bld;
14680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->has_mask = FALSE;
14780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_stack_size = 0;
14880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
14980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->int_vec_type = lp_build_int_vec_type(mask->bld->type);
15080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
15180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
15280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask)
15380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
15480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->exec_mask = mask->cond_mask;
15580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   if (mask->cond_stack_size > 0)
15680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      mask->has_mask = TRUE;
15780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
15880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
15980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask,
16080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                   LLVMValueRef val)
16180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
16280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask;
16380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = LLVMBuildBitCast(mask->bld->builder, val,
16480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                      mask->int_vec_type, "");
16580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
16680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
16780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
16880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
16980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask)
17080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
17180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   LLVMValueRef prev_mask = mask->cond_stack[mask->cond_stack_size - 1];
172faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   LLVMValueRef inv_mask = LLVMBuildNot(mask->bld->builder,
173faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin                                        mask->cond_mask, "");
174faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin
175faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   /* means that we didn't have any mask before and that
176faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin    * we were fully enabled */
177faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   if (mask->cond_stack_size <= 1) {
178faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin      prev_mask = LLVMConstAllOnes(mask->int_vec_type);
179faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin   }
180faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin
18180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = LLVMBuildAnd(mask->bld->builder,
18280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                  inv_mask,
18380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                  prev_mask, "");
18480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
18580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
18680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
18780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask)
18880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
18980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   mask->cond_mask = mask->cond_stack[--mask->cond_stack_size];
19080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_update(mask);
19180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
19280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
19380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask,
19480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                               LLVMValueRef val,
19580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                               LLVMValueRef dst)
19680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{
19780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   if (mask->has_mask) {
19880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMValueRef real_val, dst_val;
19980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
20080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      dst_val = LLVMBuildLoad(mask->bld->builder, dst, "");
20180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      real_val = lp_build_select(mask->bld,
20280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                 mask->exec_mask,
20380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                                 val, dst_val);
20480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
20580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMBuildStore(mask->bld->builder, real_val, dst);
20680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   } else
20780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      LLVMBuildStore(mask->bld->builder, val, dst);
20880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}
20980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
21086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
21186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
21286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld,
21386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
21486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
21586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_left  = lp_build_swizzle1_aos(&bld->base, src, swizzle_left);
21686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right);
21786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_right, src_left);
21886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
21986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
22086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
22186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
22286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld,
22386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
22486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
22586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_top    = lp_build_swizzle1_aos(&bld->base, src, swizzle_top);
22686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom);
22786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_top, src_bottom);
22886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
22986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
23086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
23163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
23263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch.
23363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
23463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef
23563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch(
23663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
2372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst,
2382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
23963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const unsigned chan_index )
24063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
2417d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[index];
242b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
24363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef res;
24463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
24563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (swizzle) {
246b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_X:
247b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Y:
248b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Z:
249b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_W:
25063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
25191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      switch (reg->Register.File) {
25263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_CONSTANT: {
25391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0);
25463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, "");
25563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, "");
25663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = lp_build_broadcast_scalar(&bld->base, scalar);
25763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
25863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
25963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
26063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_IMMEDIATE:
26191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->immediates[reg->Register.Index][swizzle];
26263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
26363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
26463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
26563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_INPUT:
26691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->inputs[reg->Register.Index][swizzle];
26763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
26863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
26963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
27063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_TEMPORARY:
27185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         res = LLVMBuildLoad(bld->base.builder, bld->temps[reg->Register.Index][swizzle], "");
27263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if(!res)
27363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            return bld->base.undef;
27463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
27563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
27663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
27763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
2784d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca         return bld->base.undef;
27963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
28063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
28163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
28263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
28363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
2844d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca      return bld->base.undef;
28563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
28663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
28763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) {
28863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_CLEAR:
28963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
29063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
29163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
29263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_SET:
2931fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* TODO: Use bitwese OR for floating point */
29463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
29563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
29663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
29763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
29863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_TOGGLE:
29963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
30063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
30163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
30263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_KEEP:
30363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
30463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
30563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
30663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return res;
30763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
30863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
30963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
31063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
31186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives.
31286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */
31386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void
31486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv(
31586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   struct lp_build_tgsi_soa_context *bld,
31686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const struct tgsi_full_instruction *inst,
31786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   unsigned index,
31886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const unsigned chan_index,
31986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *res,
32086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddx,
32186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddy)
32286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
32386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src;
32486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
32586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   src = emit_fetch(bld, inst, index, chan_index);
32686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
32786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(res)
32886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *res = src;
32986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
33086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   /* TODO: use interpolation coeffs for inputs */
33186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
33286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddx)
33386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddx = emit_ddx(bld, src);
33486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
33586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddy)
33686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddy = emit_ddy(bld, src);
33786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
33886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
33986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
34086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/**
34163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store.
34263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
34363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
34463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store(
34563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
34663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const struct tgsi_full_instruction *inst,
3472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
34863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index,
34963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef value)
35063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
3517d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_dst_register *reg = &inst->Dst[index];
3522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca
35363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( inst->Instruction.Saturate ) {
35463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_NONE:
35563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
35663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
35763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_ZERO_ONE:
3587926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, bld->base.zero);
3597926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
36063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
36163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
36263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_MINUS_PLUS_ONE:
36377b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca      value = lp_build_max(&bld->base, value, lp_build_const_scalar(bld->base.type, -1.0));
3647926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
36563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
3667926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca
3677926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca   default:
3687926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      assert(0);
36963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
37063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3715b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   switch( reg->Register.File ) {
37263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_OUTPUT:
37380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_store(&bld->exec_mask, value,
37480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                         bld->outputs[reg->Register.Index][chan_index]);
37563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
37663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
37763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_TEMPORARY:
37880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_store(&bld->exec_mask, value,
37980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin                         bld->temps[reg->Register.Index][chan_index]);
38063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
38163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
38263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_ADDRESS:
38363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* FIXME */
38463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
38663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
387ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca   case TGSI_FILE_PREDICATE:
388ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      /* FIXME */
389ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      assert(0);
390ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca      break;
391ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca
39263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
39363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
39463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
39563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
39663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
39763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
39863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
39963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators.
40063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
40163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
40286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
40363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
40463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld,
40563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          const struct tgsi_full_instruction *inst,
40663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          boolean apply_lodbias,
407faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca          boolean projected,
408faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca          LLVMValueRef *texel)
40963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
41091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell   const uint unit = inst->Src[1].Register.Index;
41163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef lodbias;
41231d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee   LLVMValueRef oow = NULL;
413c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   LLVMValueRef coords[3];
414c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   unsigned num_coords;
41563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
41663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4177d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   switch (inst->Texture.Texture) {
41863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_1D:
419c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 1;
42063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
42163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_2D:
42263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_RECT:
423c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 2;
42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
425f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW1D:
426f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW2D:
427f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOWRECT:
42863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_3D:
42963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_CUBE:
430c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 3;
43163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
43263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
43363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return;
43563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
43663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
43763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if(apply_lodbias)
4382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      lodbias = emit_fetch( bld, inst, 0, 3 );
43963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   else
44063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      lodbias = bld->base.zero;
44163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
44263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (projected) {
4432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      oow = emit_fetch( bld, inst, 0, 3 );
44463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      oow = lp_build_rcp(&bld->base, oow);
44563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
447c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   for (i = 0; i < num_coords; i++) {
448c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      coords[i] = emit_fetch( bld, inst, 0, i );
44963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (projected)
450c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca         coords[i] = lp_build_mul(&bld->base, coords[i], oow);
45163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
452ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   for (i = num_coords; i < 3; i++) {
453ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca      coords[i] = bld->base.undef;
454ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   }
45563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4568be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld->sampler->emit_fetch_texel(bld->sampler,
4578be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.builder,
4588be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.type,
4598be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  unit, num_coords, coords, lodbias,
4608be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  texel);
46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil(
46663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
4672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst )
46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
4697d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[0];
4707821664b15501b173b2304bbada758c33c5ff972José Fonseca   LLVMValueRef terms[NUM_CHANNELS];
4713d7a88674f9eb3320eeff511968f041426e25023José Fonseca   LLVMValueRef mask;
47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
47363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4747821664b15501b173b2304bbada758c33c5ff972José Fonseca   memset(&terms, 0, sizeof terms);
47563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
47663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( chan_index ) {
47763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned swizzle;
47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4797821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Unswizzle channel */
480b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell      swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
48163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4827821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Check if the component has not been already tested. */
4837821664b15501b173b2304bbada758c33c5ff972José Fonseca      assert(swizzle < NUM_CHANNELS);
4847821664b15501b173b2304bbada758c33c5ff972José Fonseca      if( !terms[swizzle] )
4857821664b15501b173b2304bbada758c33c5ff972José Fonseca         /* TODO: change the comparison operator instead of setting the sign */
4862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         terms[swizzle] =  emit_fetch(bld, inst, 0, chan_index );
48763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
48863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4893d7a88674f9eb3320eeff511968f041426e25023José Fonseca   mask = NULL;
4907821664b15501b173b2304bbada758c33c5ff972José Fonseca   FOR_EACH_CHANNEL( chan_index ) {
491aede39efd86d200ffbace8fc012104e31f673973José Fonseca      if(terms[chan_index]) {
4923d7a88674f9eb3320eeff511968f041426e25023José Fonseca         LLVMValueRef chan_mask;
493aede39efd86d200ffbace8fc012104e31f673973José Fonseca
4943d7a88674f9eb3320eeff511968f041426e25023José Fonseca         chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero);
495aede39efd86d200ffbace8fc012104e31f673973José Fonseca
4963d7a88674f9eb3320eeff511968f041426e25023José Fonseca         if(mask)
4973d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, "");
4983d7a88674f9eb3320eeff511968f041426e25023José Fonseca         else
4993d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = chan_mask;
500aede39efd86d200ffbace8fc012104e31f673973José Fonseca      }
50163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
5023d7a88674f9eb3320eeff511968f041426e25023José Fonseca
5033d7a88674f9eb3320eeff511968f041426e25023José Fonseca   if(mask)
5043d7a88674f9eb3320eeff511968f041426e25023José Fonseca      lp_build_mask_update(bld->mask, mask);
50563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
50663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
50763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
50863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
50963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Check if inst src/dest regs use indirect addressing into temporary
51063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * register file.
51163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
51263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic boolean
51363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaindirect_temp_reference(const struct tgsi_full_instruction *inst)
51463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint i;
51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
5177d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_src_register *reg = &inst->Src[i];
51891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (reg->Register.File == TGSI_FILE_TEMPORARY &&
51991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell          reg->Register.Indirect)
52063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
52163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
52263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumDstRegs; i++) {
5237d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_dst_register *reg = &inst->Dst[i];
5245b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell      if (reg->Register.File == TGSI_FILE_TEMPORARY &&
5255b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell          reg->Register.Indirect)
52663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
52763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
52863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return FALSE;
52963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
53063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
53185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinstatic int
53285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration(
53385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   struct lp_build_tgsi_soa_context *bld,
53485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   const struct tgsi_full_declaration *decl)
53585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{
53685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned first = decl->Range.First;
53785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned last = decl->Range.Last;
53885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   unsigned idx, i;
53985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
54085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   for (idx = first; idx <= last; ++idx) {
54185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      boolean ok;
54285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
54385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      switch (decl->Declaration.File) {
54485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      case TGSI_FILE_TEMPORARY:
54585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         for (i = 0; i < NUM_CHANNELS; i++)
54685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin            bld->temps[idx][i] = lp_build_alloca(&bld->base);
54785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         ok = TRUE;
54885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         break;
54985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
55085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      case TGSI_FILE_OUTPUT:
55185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         for (i = 0; i < NUM_CHANNELS; i++)
55285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin            bld->outputs[idx][i] = lp_build_alloca(&bld->base);
55385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         ok = TRUE;
55485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         break;
55585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
55685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      default:
55785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         /* don't need to declare other vars */
55885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         ok = TRUE;
55985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      }
56085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
56185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin      if (!ok)
56285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         return FALSE;
56385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   }
56485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin
56585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin   return TRUE;
56685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin}
56763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
56863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic int
56963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction(
57063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
571faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_full_instruction *inst,
572faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_opcode_info *info)
57363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
57463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
57590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef src0, src1, src2;
576e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp0, tmp1, tmp2;
577e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp3 = NULL;
578e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp4 = NULL;
579e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp5 = NULL;
580e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp6 = NULL;
581e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp7 = NULL;
582faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef res;
583faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef dst0[NUM_CHANNELS];
58463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
58563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* we can't handle indirect addressing into temp register file yet */
58663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (indirect_temp_reference(inst))
58763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return FALSE;
58863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
589faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   assert(info->num_dst <= 1);
590faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
591faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
592faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.undef;
593faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
594faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
595faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
59663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->Instruction.Opcode) {
59763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
59863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARL:
5991fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* FIXME */
6002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
60263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_flr(bld, 0, 0);
60363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
604faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
60563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
60663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
60763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
60863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
60963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOV:
6102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
611faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index );
61263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
61363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
61463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
61563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LIT:
6162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) {
617faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
61863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
6202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
621faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero);
622ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca      }
6232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
624ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = SrcReg[0].yyyy */
6252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
626ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = max(XMM[1], 0) */
627ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero);
628ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[2] = SrcReg[0].wwww */
6292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 0, CHAN_W );
630ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_pow( &bld->base, tmp1, tmp2);
6312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
632c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero);
633faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero);
634c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca      }
6352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) {
636faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
63963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
64063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCP:
64163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIP */
6422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
643faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rcp(&bld->base, src0);
6442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
645faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
64663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
64763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
64863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
64963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RSQ:
65063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIPSQRT */
6512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
65290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      src0 = lp_build_abs(&bld->base, src0);
653faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rsqrt(&bld->base, src0);
6542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
655faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
65663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
65763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
65863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
65963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EXP:
6602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
6612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
6622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
66357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2_int_part = NULL;
66457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_frac_part = NULL;
66557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2 = NULL;
66657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
6672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
66857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
6692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
67057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2_int_part = &tmp0;
6712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
67257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_frac_part = &tmp1;
6732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
67457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2 = &tmp2;
67557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
67657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2);
67757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
6782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
679faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
6802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
681faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = tmp1;
6822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
683faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
68463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
68563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
6862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
687faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
68863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
68963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
69063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
69163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOG:
6922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
6932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
6942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
695add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_floor_log2 = NULL;
696add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_exp = NULL;
697add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_log2 = NULL;
69857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
6992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
70057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         src0 = lp_build_abs( &bld->base, src0 );
70157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
7022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
70357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_floor_log2 = &tmp0;
7042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
70557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp = &tmp1;
7062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
70757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_log2 = &tmp2;
70857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
70957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2);
71057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
71157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.x = floor(lg2(abs(src.x))) */
7122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
713faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
71457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */
7152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) {
716faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1);
71763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
71857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.z = lg2(abs(src.x)) */
7192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
720faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
72163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
72263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
7232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
724faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
72563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
72663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
72763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
72863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MUL:
7292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
7312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
732faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_mul(&bld->base, src0, src1);
73363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
73463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
73563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
73663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ADD:
7372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
7392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
740faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add(&bld->base, src0, src1);
74163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
74263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
74363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP3:
74563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT3 */
7462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
7472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
74890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
7492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
7502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
75190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
75290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
7532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
7542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
75590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
75690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
7572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
758faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
75963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
76063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
76163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
76263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP4:
76363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT4 */
7642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
7652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
76690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
7672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
7682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
76990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
77090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
7712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
7722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
77390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
77490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
7752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_W );
7762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_W );
77790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
77890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
7792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
780faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
78163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
78263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
78363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
78463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DST:
7852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
786faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
78763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
7882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
7892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
7902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Y );
791faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1);
79263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
7932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
794faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z );
79563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
7962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
797faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W );
79863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
79963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
80063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
80163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MIN:
8022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
8042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
805faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_min( &bld->base, src0, src1 );
80663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
80763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
80863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
80963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAX:
8102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
8122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
813faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_max( &bld->base, src0, src1 );
81463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
81563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
81663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
81763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLT:
81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETLT */
8192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
8212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
8221aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 );
823faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
8241aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
82563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
82663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
82763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGE:
82863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETGE */
8292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
8312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
8321aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 );
833faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
8341aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
83563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
83663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
83763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAD:
83863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_MADD */
8392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
8412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
8422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 2, chan_index );
84390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
84490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_add( &bld->base, tmp0, tmp2);
845faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
84663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
84763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
84863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
84963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SUB:
8502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
8522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
853faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1);
85463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
85563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
85663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
85763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LRP:
8582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
8602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
8612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
86290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, src1, src2 );
86390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, src0, tmp0 );
864faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 );
86563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
86663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
86763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
86863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND:
869873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
870873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
871873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
872873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
873873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp1 = lp_build_const_scalar(bld->base.type, 0.5);
874873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1);
875faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 );
876873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
87763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
87863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
87963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2A:
8802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
8812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
88290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
8832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
88590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
88690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
8872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 2, CHAN_X );  /* xmm1 = src[2].x */
88890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
8892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
890faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
89163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
89263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
89363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
89463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FRC:
8952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
896873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
897873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_floor(&bld->base, src0);
898f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul         tmp0 = lp_build_sub(&bld->base, src0, tmp0);
899faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
90063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
90163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
90263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
90363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CLAMP:
904873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
905873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
906873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
907873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
908873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_max(&bld->base, tmp0, src1);
909873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_min(&bld->base, tmp0, src2);
910faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
911873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
91263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
91363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
91463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FLR:
9152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
917faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_floor(&bld->base, tmp0);
91863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
91963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
92063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
92163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ROUND:
9222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
924faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_round(&bld->base, tmp0);
92563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
92663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
92763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
92890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   case TGSI_OPCODE_EX2: {
9292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
93090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_exp2( &bld->base, tmp0);
9312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
932faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
93363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
93463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
93590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   }
93663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
93763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LG2:
9382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
93990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_log2( &bld->base, tmp0);
9402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
941faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
94263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
94363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
94463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POW:
9462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
9472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src1 = emit_fetch( bld, inst, 1, CHAN_X );
948faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_pow( &bld->base, src0, src1 );
9492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
950faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
95163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
95263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
95363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
95463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XPD:
9552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
9562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
9572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Z );
9582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp3 = emit_fetch( bld, inst, 0, CHAN_Z );
95963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
9602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
9612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
9622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
9632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp4 = emit_fetch( bld, inst, 1, CHAN_Y );
96463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
9652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
96690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = tmp0;
96790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_mul( &bld->base, tmp2, tmp1);
96890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = tmp3;
96990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
97090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_sub( &bld->base, tmp2, tmp5);
971faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = tmp2;
97263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
9732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
9742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
9752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 1, CHAN_X );
9762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp5 = emit_fetch( bld, inst, 0, CHAN_X );
97763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
9782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
97990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_mul( &bld->base, tmp3, tmp2);
98090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp1 = lp_build_mul( &bld->base, tmp1, tmp5);
98190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_sub( &bld->base, tmp3, tmp1);
982faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = tmp3;
98363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
9842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
98590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
98690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp2);
98790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_sub( &bld->base, tmp5, tmp0);
988faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = tmp5;
98963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
9902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
991faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
99263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
99363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
99463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
99563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ABS:
9962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
998faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_abs( &bld->base, tmp0 );
99963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
100063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
100163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCC:
1003873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1004873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
100563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
100663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DPH:
10082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
10092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
101090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
10112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
10122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
101390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
101490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
10162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
101790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
101890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_W );
102090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
10212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1022faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
102363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
102463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_COS:
10272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
102890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_cos( &bld->base, tmp0 );
10292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1030faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
103163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
103263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
103463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDX:
103586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
103686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL);
103786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
103863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDY:
104186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
104286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]);
104386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
104463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KILP:
104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* predicated kill */
10481fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* FIXME */
10491fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      return 0;
105063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
105163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
105263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KIL:
105363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* conditional kill */
10542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_kil( bld, inst );
105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
105763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2H:
105863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
105963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
106063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2US:
106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
106463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4B:
106663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
106763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
106863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4UB:
107063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RFL:
107463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
107563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SEQ:
10782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10811aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 );
1082faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
10831aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
108463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
108563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
108663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SFL:
1087873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1088faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.zero;
1089873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
109063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
109163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
109263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGT:
10932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10961aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 );
1097faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
10981aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
109963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
110063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SIN:
11022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
110390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_sin( &bld->base, tmp0 );
11042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1105faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
110663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLE:
11102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
11122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
11131aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 );
1114faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
11151aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
111663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
111763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
111863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SNE:
11192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
11212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
11221aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 );
1123faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
11241aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
112563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
112663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
112763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_STR:
1128873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1129faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.one;
1130873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
113163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TEX:
113471c05689528d7987bfb99c3afe04e456887bc7b7Brian Paul      /* XXX what about dst0 writemask? */
1135faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, FALSE, FALSE, dst0 );
113663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
113763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXD:
1139873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
114063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
114163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
114263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2H:
1144873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1145873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert (0);
114663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
114763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
114863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
114963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2US:
1150873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1151873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
115263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
115363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4B:
1156873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1157873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
115863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
115963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
116063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4UB:
1162873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1163873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
116663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_X2D:
1168873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1169873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
117163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
117263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARA:
1174873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1175873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
117663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
117763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
117863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
118063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARR:
1181873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
11822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
118463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_rnd( bld, 0, 0 );
118563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
1186faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
118763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
118990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif
119063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRA:
1192873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1193873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
119463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
119563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
119663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CAL:
1198873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
120063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
120163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
120263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RET:
1203873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1204873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      return 0;
120563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
120663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
120763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_END:
120863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SSG:
121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SGN */
12122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1214faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 );
121563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
121663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
121763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CMP:
12192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
12212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
12222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
12231aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero );
1224faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2);
12251aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
122663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
122863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SCS:
12292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
12302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1231faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 );
123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
12342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1235faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 );
123663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1238faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = bld->base.zero;
123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1241faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
124363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXB:
1246faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE, dst0 );
124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM:
125063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* fall-through */
125163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM4:
125263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* 3 or 4-component normalization */
125363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      {
125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4;
125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
12562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) ||
12572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) ||
12582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) ||
12592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) {
126063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */
126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm4 = src.x */
126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = src.x * src.x */
12652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
12662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
126790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = tmp0;
126863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
126990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_mul( &bld->base, tmp0, tmp0);
127063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm5 = src.y */
127263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.y * src.y */
12732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Y);
12742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
127590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = tmp1;
127663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
127790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
127890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm6 = src.z */
128163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.z * src.z */
12822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Z);
12832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
128490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = tmp1;
128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
128690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
128790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            if (dims == 4) {
129063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm7 = src.w */
129163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm0 = xmm0 + src.w * src.w */
12922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               tmp1 = emit_fetch(bld, inst, 0, CHAN_W);
12932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) {
129490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca                  tmp7 = tmp1;
129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
129690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
129790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
129863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm1 = 1 / sqrt(xmm0) */
130190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_rsqrt( &bld->base, tmp0);
130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.x = xmm1 * src.x */
13042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
1305faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1);
130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.y = xmm1 * src.y */
13092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
1310faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1);
131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.z = xmm1 * src.z */
13142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
1315faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1);
131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.w = xmm1 * src.w */
13192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) {
1320faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1);
132163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
132263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1324faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         /* dst.w = 1.0 */
13252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) {
1326faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_W] = bld->base.one;
132763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
132863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DIV:
1332873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1333873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert( 0 );
133463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
133563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2:
13382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
13392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
134090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
13412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
13422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
134390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
134490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
13452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1346faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
134763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
134863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXL:
1351faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE, dst0 );
135263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
135363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXP:
1355faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, FALSE, TRUE, dst0 );
135663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRK:
1359873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
136263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_IF:
136480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
136580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_push(&bld->exec_mask, tmp0);
136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
136763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1368f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_OPCODE_BGNFOR:
1369873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1370873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_REP:
1375873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1376873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
137763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ELSE:
138180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_invert(&bld->exec_mask);
138263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
138363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
138463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDIF:
138580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin      lp_exec_mask_cond_pop(&bld->exec_mask);
138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1388f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_OPCODE_ENDFOR:
1389873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1390873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
139163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
139263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
139363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
139463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDREP:
1395873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1396873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
139863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
139963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
140063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PUSHA:
1401873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1402873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
140363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
140463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
140663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POPA:
1407873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1408873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
140963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
141063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CEIL:
1413873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1414873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1415faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_ceil(&bld->base, tmp0);
1416873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_I2F:
1420873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1421873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NOT:
1426873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1427873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
142863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TRUNC:
14322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
14332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1434faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_trunc(&bld->base, tmp0);
143563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
143763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHL:
1439873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1440873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
144163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
144263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
14442c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol   case TGSI_OPCODE_ISHR:
1445873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1446873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
144763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_AND:
1451873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1452873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
145363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
145563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_OR:
1457873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1458873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOD:
1463873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1464873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
146563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
146763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XOR:
1469873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1470873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
147163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
147263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
147363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
147463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SAD:
1475873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1476873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
147763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
147863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
147963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXF:
1481873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1482873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
148363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
148463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
148563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
148663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXQ:
1487873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1488873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
148963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
149063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
149163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
149263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CONT:
1493128d93a009c493c65f0fa5d220fac3098a54fa14José Fonseca      /* FIXME */
149463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
149563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EMIT:
149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
149963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
150063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
150163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDPRIM:
150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
150363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1505873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOP:
1506873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      break;
1507873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca
150863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
150963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
151063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
151163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1512faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
1513faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1514faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0[chan_index]);
1515faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
1516faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
1517faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
151863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return 1;
151963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
152063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1521c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca
1522c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid
152363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder,
152463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  const struct tgsi_token *tokens,
1525b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                  struct lp_type type,
15263d7a88674f9eb3320eeff511968f041426e25023José Fonseca                  struct lp_build_mask_context *mask,
152763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef consts_ptr,
1528f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef *pos,
1529f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef (*inputs)[NUM_CHANNELS],
1530f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  LLVMValueRef (*outputs)[NUM_CHANNELS],
15318be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                  struct lp_build_sampler_soa *sampler)
153263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
153363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context bld;
153463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_parse_context parse;
153563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint num_immediates = 0;
153663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
153763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
153863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* Setup build context */
153963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   memset(&bld, 0, sizeof bld);
154063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_context_init(&bld.base, builder, type);
1541c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca   bld.mask = mask;
1542f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.pos = pos;
1543f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.inputs = inputs;
154463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.outputs = outputs;
154563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.consts_ptr = consts_ptr;
15468be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld.sampler = sampler;
154763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
154880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin   lp_exec_mask_init(&bld.exec_mask, &bld.base);
154980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin
155063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_init( &parse, tokens );
155163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
155263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   while( !tgsi_parse_end_of_tokens( &parse ) ) {
155363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      tgsi_parse_token( &parse );
155463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
155563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch( parse.FullToken.Token.Type ) {
155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_DECLARATION:
15571fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca         /* Inputs already interpolated */
155885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         {
155985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin            if (!emit_declaration( &bld, &parse.FullToken.FullDeclaration ))
156085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin               _debug_printf("warning: failed to define LLVM variable\n");
156185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin         }
156263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
156363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
156463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_INSTRUCTION:
1565faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         {
15662c90652ed9e119f09af6757c59d10273894ba590José Fonseca            unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
15672c90652ed9e119f09af6757c59d10273894ba590José Fonseca            const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode);
1568faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, info ))
1569faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n",
1570faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca                             info ? info->mnemonic : "<invalid>");
1571faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         }
1572faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
157363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
157463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
157563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_IMMEDIATE:
157663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* simply copy the immediate values into the next immediates[] slot */
157763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         {
157863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
157963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(size <= 4);
158063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(num_immediates < LP_MAX_IMMEDIATES);
158163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = 0; i < size; ++i )
158263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] =
158377b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca                  lp_build_const_scalar(type, parse.FullToken.FullImmediate.u[i].Float);
158463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = size; i < 4; ++i )
158563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] = bld.base.undef;
158663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            num_immediates++;
158763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
158863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
158963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
15909381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca      case TGSI_TOKEN_TYPE_PROPERTY:
15919381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca         break;
15929381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca
159363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
159463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
159563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
159663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
159763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
159863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_free( &parse );
159963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
160063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1601