lp_bld_tgsi_soa.c revision ba33ef00118d1c6017585af1498b89e99fe045be
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_intr.h"
5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h"
527821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h"
5363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h"
543d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h"
5563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h"
565999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca#include "lp_bld_debug.h"
5763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_TEMPS 256
6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_IMMEDIATES 256
6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\
6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++)
6563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
675b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN)))
6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( CHAN )\
7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0
7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1
7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2
7963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3
8063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT     0
8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT    1
8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT  2
8486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3
8586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
8663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context
8863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
8963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_context base;
9063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
9163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef consts_ptr;
92f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef *pos;
93f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef (*inputs)[NUM_CHANNELS];
9495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef (*outputs)[NUM_CHANNELS];
95c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca
968be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   struct lp_build_sampler_soa *sampler;
9763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
9895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS];
9995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS];
1001929057eac0c3351e0810612bdae56331a235736José Fonseca
1013d7a88674f9eb3320eeff511968f041426e25023José Fonseca   struct lp_build_mask_context *mask;
10263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca};
10363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
10463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
10586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
10686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = {
10786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_LEFT,
10886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_LEFT
10986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
11086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
11186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
11286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = {
11386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_RIGHT,    QUAD_TOP_RIGHT,
11486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT
11586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
11686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
11786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
11886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = {
11986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT,
12086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_TOP_LEFT,     QUAD_TOP_RIGHT
12186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
12286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
12386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char
12486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = {
12586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT,
12686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   QUAD_BOTTOM_LEFT,  QUAD_BOTTOM_RIGHT
12786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca};
12886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
12986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
13086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
13186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld,
13286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
13386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
13486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_left  = lp_build_swizzle1_aos(&bld->base, src, swizzle_left);
13586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right);
13686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_right, src_left);
13786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
13886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
13986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef
14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld,
14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         LLVMValueRef src)
14386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
14486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_top    = lp_build_swizzle1_aos(&bld->base, src, swizzle_top);
14586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom);
14686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   return lp_build_sub(&bld->base, src_top, src_bottom);
14786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
14886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
14986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
15063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
15163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch.
15263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
15363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef
15463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch(
15563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
1562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst,
1572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
15863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const unsigned chan_index )
15963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
1607d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[index];
161b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
16263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef res;
16363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (swizzle) {
165b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_X:
166b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Y:
167b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_Z:
168b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell   case TGSI_SWIZZLE_W:
16963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
17091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      switch (reg->Register.File) {
17163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_CONSTANT: {
17291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0);
17363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, "");
17463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, "");
17563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = lp_build_broadcast_scalar(&bld->base, scalar);
17663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
17763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
17863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
17963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_IMMEDIATE:
18091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->immediates[reg->Register.Index][swizzle];
18163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
18263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
18363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_INPUT:
18591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->inputs[reg->Register.Index][swizzle];
18663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
18763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
18863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_TEMPORARY:
19091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell         res = bld->temps[reg->Register.Index][swizzle];
19163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if(!res)
19263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            return bld->base.undef;
19363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
19463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
19563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
19663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
1974d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca         return bld->base.undef;
19863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
19963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
20063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
20163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
20263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
2034d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca      return bld->base.undef;
20463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
20563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
20663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) {
20763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_CLEAR:
20863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
20963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
21063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
21163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_SET:
2121fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* TODO: Use bitwese OR for floating point */
21363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
21463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
21563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
21663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
21763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_TOGGLE:
21863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
21963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
22063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
22163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_KEEP:
22263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
22363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
22463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
22563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return res;
22663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
22763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
22863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
22963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
23086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives.
23186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */
23286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void
23386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv(
23486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   struct lp_build_tgsi_soa_context *bld,
23586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const struct tgsi_full_instruction *inst,
23686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   unsigned index,
23786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   const unsigned chan_index,
23886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *res,
23986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddx,
24086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef *ddy)
24186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{
24286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   LLVMValueRef src;
24386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
24486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   src = emit_fetch(bld, inst, index, chan_index);
24586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
24686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(res)
24786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *res = src;
24886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
24986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   /* TODO: use interpolation coeffs for inputs */
25086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
25186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddx)
25286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddx = emit_ddx(bld, src);
25386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
25486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca   if(ddy)
25586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      *ddy = emit_ddy(bld, src);
25686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}
25786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
25886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
25986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/**
26063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store.
26163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
26263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
26363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store(
26463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
26563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const struct tgsi_full_instruction *inst,
2662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
26763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index,
26863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef value)
26963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
2707d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_dst_register *reg = &inst->Dst[index];
2712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca
27263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( inst->Instruction.Saturate ) {
27363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_NONE:
27463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
27563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
27663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_ZERO_ONE:
2777926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, bld->base.zero);
2787926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
27963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
28063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
28163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_MINUS_PLUS_ONE:
28277b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca      value = lp_build_max(&bld->base, value, lp_build_const_scalar(bld->base.type, -1.0));
2837926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
28463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
2857926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca
2867926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca   default:
2877926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      assert(0);
28863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
28963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
2905b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell   switch( reg->Register.File ) {
29163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_OUTPUT:
2925b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell      bld->outputs[reg->Register.Index][chan_index] = value;
29363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
29463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
29563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_TEMPORARY:
2965b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell      bld->temps[reg->Register.Index][chan_index] = value;
29763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
29863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
29963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_ADDRESS:
30063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* FIXME */
30163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
30263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
30363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
30463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
30563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
30663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
30763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
30863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
30963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
31063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
31163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators.
31263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
31363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
31486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca
31563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
31663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld,
31763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          const struct tgsi_full_instruction *inst,
31863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          boolean apply_lodbias,
319faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca          boolean projected,
320faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca          LLVMValueRef *texel)
32163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
32291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell   const uint unit = inst->Src[1].Register.Index;
32363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef lodbias;
32431d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee   LLVMValueRef oow = NULL;
325c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   LLVMValueRef coords[3];
326c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   unsigned num_coords;
32763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
32863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3297d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   switch (inst->Texture.Texture) {
33063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_1D:
331c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 1;
33263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
33363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_2D:
33463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_RECT:
335c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 2;
33663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
337f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW1D:
338f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW2D:
339f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOWRECT:
34063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_3D:
34163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_CUBE:
342c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 3;
34363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
34463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
34563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
34663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return;
34763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
34863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
34963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if(apply_lodbias)
3502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      lodbias = emit_fetch( bld, inst, 0, 3 );
35163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   else
35263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      lodbias = bld->base.zero;
35363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
35463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (projected) {
3552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      oow = emit_fetch( bld, inst, 0, 3 );
35663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      oow = lp_build_rcp(&bld->base, oow);
35763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
35863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
359c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   for (i = 0; i < num_coords; i++) {
360c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      coords[i] = emit_fetch( bld, inst, 0, i );
36163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (projected)
362c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca         coords[i] = lp_build_mul(&bld->base, coords[i], oow);
36363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
364ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   for (i = num_coords; i < 3; i++) {
365ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca      coords[i] = bld->base.undef;
366ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca   }
36763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3688be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld->sampler->emit_fetch_texel(bld->sampler,
3698be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.builder,
3708be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.type,
3718be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  unit, num_coords, coords, lodbias,
3728be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  texel);
37363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
37463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
37563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
37663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
37763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil(
37863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
3792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst )
38063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
3817d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell   const struct tgsi_full_src_register *reg = &inst->Src[0];
3827821664b15501b173b2304bbada758c33c5ff972José Fonseca   LLVMValueRef terms[NUM_CHANNELS];
3833d7a88674f9eb3320eeff511968f041426e25023José Fonseca   LLVMValueRef mask;
38463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3867821664b15501b173b2304bbada758c33c5ff972José Fonseca   memset(&terms, 0, sizeof terms);
38763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( chan_index ) {
38963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned swizzle;
39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3917821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Unswizzle channel */
392b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell      swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index );
39363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3947821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Check if the component has not been already tested. */
3957821664b15501b173b2304bbada758c33c5ff972José Fonseca      assert(swizzle < NUM_CHANNELS);
3967821664b15501b173b2304bbada758c33c5ff972José Fonseca      if( !terms[swizzle] )
3977821664b15501b173b2304bbada758c33c5ff972José Fonseca         /* TODO: change the comparison operator instead of setting the sign */
3982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         terms[swizzle] =  emit_fetch(bld, inst, 0, chan_index );
39963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
40063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4013d7a88674f9eb3320eeff511968f041426e25023José Fonseca   mask = NULL;
4027821664b15501b173b2304bbada758c33c5ff972José Fonseca   FOR_EACH_CHANNEL( chan_index ) {
403aede39efd86d200ffbace8fc012104e31f673973José Fonseca      if(terms[chan_index]) {
4043d7a88674f9eb3320eeff511968f041426e25023José Fonseca         LLVMValueRef chan_mask;
405aede39efd86d200ffbace8fc012104e31f673973José Fonseca
4063d7a88674f9eb3320eeff511968f041426e25023José Fonseca         chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero);
407aede39efd86d200ffbace8fc012104e31f673973José Fonseca
4083d7a88674f9eb3320eeff511968f041426e25023José Fonseca         if(mask)
4093d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, "");
4103d7a88674f9eb3320eeff511968f041426e25023José Fonseca         else
4113d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = chan_mask;
412aede39efd86d200ffbace8fc012104e31f673973José Fonseca      }
41363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
4143d7a88674f9eb3320eeff511968f041426e25023José Fonseca
4153d7a88674f9eb3320eeff511968f041426e25023José Fonseca   if(mask)
4163d7a88674f9eb3320eeff511968f041426e25023José Fonseca      lp_build_mask_update(bld->mask, mask);
41763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
41863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
41963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
42063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
42163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Check if inst src/dest regs use indirect addressing into temporary
42263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * register file.
42363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic boolean
42563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaindirect_temp_reference(const struct tgsi_full_instruction *inst)
42663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
42763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint i;
42863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
4297d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_src_register *reg = &inst->Src[i];
43091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell      if (reg->Register.File == TGSI_FILE_TEMPORARY &&
43191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell          reg->Register.Indirect)
43263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
43363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumDstRegs; i++) {
4357d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell      const struct tgsi_full_dst_register *reg = &inst->Dst[i];
4365b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell      if (reg->Register.File == TGSI_FILE_TEMPORARY &&
4375b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell          reg->Register.Indirect)
43863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
43963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
44063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return FALSE;
44163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
44263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
44363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
44463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic int
44563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction(
44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
447faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_full_instruction *inst,
448faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   const struct tgsi_opcode_info *info)
44963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
45063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
45190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef src0, src1, src2;
452e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp0, tmp1, tmp2;
453e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp3 = NULL;
454e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp4 = NULL;
455e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp5 = NULL;
456e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp6 = NULL;
457e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee   LLVMValueRef tmp7 = NULL;
458faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef res;
459faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   LLVMValueRef dst0[NUM_CHANNELS];
46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* we can't handle indirect addressing into temp register file yet */
46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (indirect_temp_reference(inst))
46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return FALSE;
46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
465faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   assert(info->num_dst <= 1);
466faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
467faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
468faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.undef;
469faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
470faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
471faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->Instruction.Opcode) {
47363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
47463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARL:
4751fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* FIXME */
4762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
4772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_flr(bld, 0, 0);
47963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
480faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
48163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
48263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
48363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOV:
4862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
487faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index );
48863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
48963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
49063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
49163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LIT:
4922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) {
493faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
49463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
4952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
4962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
497faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero);
498ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca      }
4992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
500ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = SrcReg[0].yyyy */
5012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
502ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = max(XMM[1], 0) */
503ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero);
504ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[2] = SrcReg[0].wwww */
5052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 0, CHAN_W );
506ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_pow( &bld->base, tmp1, tmp2);
5072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
508c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero);
509faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero);
510c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca      }
5112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) {
512faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
51363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
51463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCP:
51763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIP */
5182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
519faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rcp(&bld->base, src0);
5202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
521faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
52263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
52363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
52463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
52563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RSQ:
52663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIPSQRT */
5272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
52890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      src0 = lp_build_abs(&bld->base, src0);
529faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_rsqrt(&bld->base, src0);
5302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
531faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
53263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
53363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
53463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
53563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EXP:
5362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
5372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
5382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
53957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2_int_part = NULL;
54057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_frac_part = NULL;
54157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2 = NULL;
54257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
54457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
54657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2_int_part = &tmp0;
5472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
54857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_frac_part = &tmp1;
5492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
55057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2 = &tmp2;
55157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
55257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2);
55357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
555faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
5562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
557faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = tmp1;
5582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
559faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
56063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
56163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
5622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
563faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
56463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
56563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
56663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
56763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOG:
5682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
5692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
5702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
571add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_floor_log2 = NULL;
572add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_exp = NULL;
573add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee         LLVMValueRef *p_log2 = NULL;
57457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
57657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         src0 = lp_build_abs( &bld->base, src0 );
57757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
57957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_floor_log2 = &tmp0;
5802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
58157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp = &tmp1;
5822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
58357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_log2 = &tmp2;
58457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
58557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2);
58657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
58757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.x = floor(lg2(abs(src.x))) */
5882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
589faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_X] = tmp0;
59057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */
5912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) {
592faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1);
59363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
59457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.z = lg2(abs(src.x)) */
5952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
596faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_Z] = tmp2;
59763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
59863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
5992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
600faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
60163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
60263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
60363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
60463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MUL:
6052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
608faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_mul(&bld->base, src0, src1);
60963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
61063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
61163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
61263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ADD:
6132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
616faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add(&bld->base, src0, src1);
61763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
61863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
61963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
62063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP3:
62163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT3 */
6222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
6232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
62490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
6252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
6262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
62790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
62890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
6302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
63190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
63290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
634faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
63563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
63663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP4:
63963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT4 */
6402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
6412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
64290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
6432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
6442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
64590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
64690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
6482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
64990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
65090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_W );
6522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_W );
65390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
65490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
656faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
65763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
65863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
65963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
66063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DST:
6612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
662faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = bld->base.one;
66363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
6652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
6662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Y );
667faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1);
66863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
670faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z );
67163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
673faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W );
67463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
67563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
67663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
67763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MIN:
6782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
681faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_min( &bld->base, src0, src1 );
68263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
68363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
68463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
68563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAX:
6862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
689faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_max( &bld->base, src0, src1 );
69063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
69163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
69263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLT:
69463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETLT */
6952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
6981aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 );
699faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
7001aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
70163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
70263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
70363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGE:
70463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETGE */
7052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
7072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
7081aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 );
709faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
7101aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
71163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
71263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
71363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAD:
71463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_MADD */
7152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
7172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
7182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 2, chan_index );
71990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
72090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_add( &bld->base, tmp0, tmp2);
721faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
72263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
72363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
72463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
72563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SUB:
7262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
7282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
729faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1);
73063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
73163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
73263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
73363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LRP:
7342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
7362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
7372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
73890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, src1, src2 );
73990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, src0, tmp0 );
740faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 );
74163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
74263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
74363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND:
745873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
746873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
747873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
748873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
749873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp1 = lp_build_const_scalar(bld->base.type, 0.5);
750873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1);
751faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 );
752873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
75363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
75463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
75563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2A:
7562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
7572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
75890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
7592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
7602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
76190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
76290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
7632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 2, CHAN_X );  /* xmm1 = src[2].x */
76490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
7652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
766faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
76763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
76863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
76963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
77063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FRC:
7712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
772873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
773873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_floor(&bld->base, src0);
774f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul         tmp0 = lp_build_sub(&bld->base, src0, tmp0);
775faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
77663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
77763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
77863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
77963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CLAMP:
780873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
781873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
782873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
783873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
784873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_max(&bld->base, tmp0, src1);
785873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_min(&bld->base, tmp0, src2);
786faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
787873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
78863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
78963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
79063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FLR:
7912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
793faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_floor(&bld->base, tmp0);
79463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
79563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
79663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
79763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ROUND:
7982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
800faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_round(&bld->base, tmp0);
80163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
80263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
80363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
80490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   case TGSI_OPCODE_EX2: {
8052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
80690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_exp2( &bld->base, tmp0);
8072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
808faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
80963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
81190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   }
81263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
81363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LG2:
8142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
81590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_log2( &bld->base, tmp0);
8162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
817faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
81963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POW:
8222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
8232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src1 = emit_fetch( bld, inst, 1, CHAN_X );
824faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      res = lp_build_pow( &bld->base, src0, src1 );
8252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
826faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = res;
82763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
82863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
82963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
83063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XPD:
8312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
8322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
8332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Z );
8342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp3 = emit_fetch( bld, inst, 0, CHAN_Z );
83563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
8372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
8382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
8392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp4 = emit_fetch( bld, inst, 1, CHAN_Y );
84063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
84290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = tmp0;
84390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_mul( &bld->base, tmp2, tmp1);
84490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = tmp3;
84590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
84690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_sub( &bld->base, tmp2, tmp5);
847faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = tmp2;
84863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
8502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
8512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 1, CHAN_X );
8522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp5 = emit_fetch( bld, inst, 0, CHAN_X );
85363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
85590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_mul( &bld->base, tmp3, tmp2);
85690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp1 = lp_build_mul( &bld->base, tmp1, tmp5);
85790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_sub( &bld->base, tmp3, tmp1);
858faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = tmp3;
85963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
86190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
86290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp2);
86390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_sub( &bld->base, tmp5, tmp0);
864faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = tmp5;
86563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
867faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
86863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
86963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
87063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
87163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ABS:
8722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
874faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_abs( &bld->base, tmp0 );
87563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
87663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
87763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
87863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCC:
879873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
880873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
88163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
88263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
88363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DPH:
8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
8852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
88690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
8872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
8882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
88990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
89090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
8912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
8922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
89390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
89490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
8952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_W );
89690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
8972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
898faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
89963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
90063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
90163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
90263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_COS:
9032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
90490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_cos( &bld->base, tmp0 );
9052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
906faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
90763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
90863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
90963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
91063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDX:
91186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
91286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL);
91386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
91463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
91563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
91663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDY:
91786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
91886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca         emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]);
91986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca      }
92063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
92163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
92263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KILP:
92363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* predicated kill */
9241fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* FIXME */
9251fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      return 0;
92663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
92763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
92863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KIL:
92963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* conditional kill */
9302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_kil( bld, inst );
93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
93263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
93363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2H:
93463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
93563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
93663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
93763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2US:
93863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
93963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
94063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4B:
94263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
94363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
94463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4UB:
94663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
94763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
94863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RFL:
95063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
95163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
95263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
95363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SEQ:
9542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9571aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 );
958faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9591aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
96063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
96163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
96263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SFL:
963873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
964faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.zero;
965873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
96663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
96763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
96863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGT:
9692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9721aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 );
973faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9741aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
97563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
97663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
97763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SIN:
9782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
97990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_sin( &bld->base, tmp0 );
9802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
981faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
98263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
98363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
98463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLE:
9862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9891aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 );
990faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9911aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
99263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
99363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
99463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SNE:
9952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9981aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 );
999faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
10001aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
100163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
100263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_STR:
1004873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1005faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = bld->base.one;
1006873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
100763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
100863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TEX:
1010faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, FALSE, FALSE, dst0 );
101163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
101363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXD:
1014873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
101563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
101663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2H:
1019873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1020873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert (0);
102163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
102263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2US:
1025873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1026873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
103063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4B:
1031873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1032873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
103363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
103463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
103663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4UB:
1037873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1038873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
104063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_X2D:
1043873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1044873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
104563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
104663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARA:
1049873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1050873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
105163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
105263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
105363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
105490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARR:
1056873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
10572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
105963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_rnd( bld, 0, 0 );
106063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
1061faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;
106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
106490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif
106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRA:
1067873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1068873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
106963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
107063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CAL:
1073873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
107463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
107563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RET:
1078873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1079873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      return 0;
108063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
108163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
108263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_END:
108363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
108463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
108563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SSG:
108663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SGN */
10872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1089faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 );
109063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
109163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
109263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
109363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CMP:
10942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
10981aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero );
1099faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2);
11001aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
110163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
110263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SCS:
11042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
11052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1106faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 );
110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
11092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1110faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 );
111163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1113faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_Z] = bld->base.zero;
111463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1116faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[CHAN_W] = bld->base.one;
111763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
111863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
111963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
112063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXB:
1121faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE, dst0 );
112263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
112363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
112463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM:
112563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* fall-through */
112663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM4:
112763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* 3 or 4-component normalization */
112863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      {
112963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4;
113063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) ||
11322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) ||
11332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) ||
11342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) {
113563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */
113763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm4 = src.x */
113963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = src.x * src.x */
11402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
11412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
114290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = tmp0;
114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
114490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_mul( &bld->base, tmp0, tmp0);
114563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
114663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm5 = src.y */
114763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.y * src.y */
11482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Y);
11492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
115090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = tmp1;
115163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
115290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
115390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm6 = src.z */
115663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.z * src.z */
11572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Z);
11582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
115990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = tmp1;
116063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
116190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
116290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
116363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            if (dims == 4) {
116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm7 = src.w */
116663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm0 = xmm0 + src.w * src.w */
11672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               tmp1 = emit_fetch(bld, inst, 0, CHAN_W);
11682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) {
116990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca                  tmp7 = tmp1;
117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
117190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
117290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
117463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm1 = 1 / sqrt(xmm0) */
117690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_rsqrt( &bld->base, tmp0);
117763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.x = xmm1 * src.x */
11792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
1180faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1);
118163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
118263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.y = xmm1 * src.y */
11842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
1185faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1);
118663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
118763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.z = xmm1 * src.z */
11892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
1190faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1);
119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
119263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.w = xmm1 * src.w */
11942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) {
1195faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1);
119663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
119863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1199faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         /* dst.w = 1.0 */
12002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) {
1201faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            dst0[CHAN_W] = bld->base.one;
120263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
120363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
120463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
120563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
120663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DIV:
1207873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1208873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert( 0 );
120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2:
12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
12142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
121590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
12162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
12172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
121890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
121990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
12202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1221faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = tmp0;  /* dest[ch] = xmm0 */
122263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
122363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
122563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXL:
1226faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE, dst0 );
122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXP:
1230faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      emit_tex( bld, inst, FALSE, TRUE, dst0 );
123163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRK:
1234873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
123563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
123663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_IF:
1239873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
124063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
124163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1243f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_OPCODE_BGNFOR:
1244873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1245873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_REP:
1250873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1251873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
125263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
125363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ELSE:
1256873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
125763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
125863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDIF:
1261873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1265f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_OPCODE_ENDFOR:
1266873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1267873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
126863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
126963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDREP:
1272873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1273873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
127463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
127563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PUSHA:
1278873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1279873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
128063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
128163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POPA:
1284873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1285873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
128763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CEIL:
1290873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1291873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1292faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_ceil(&bld->base, tmp0);
1293873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_I2F:
1297873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1298873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NOT:
1303873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1304873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TRUNC:
13092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
13102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1311faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         dst0[chan_index] = lp_build_trunc(&bld->base, tmp0);
131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
131363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHL:
1316873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1317873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
131963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
13212c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol   case TGSI_OPCODE_ISHR:
1322873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1323873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_AND:
1328873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1329873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_OR:
1334873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1335873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
133763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOD:
1340873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1341873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
134263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
134363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
134463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
134563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XOR:
1346873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1347873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
134863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
135063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SAD:
1352873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1353873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
135563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
135663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXF:
1358873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1359873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
136263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXQ:
1364873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1365873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
136763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
136863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CONT:
1370873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1371873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
137363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EMIT:
137663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
137763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDPRIM:
138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
138163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
138263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1383873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOP:
1384873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      break;
1385873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca
138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
138863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
138963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1390faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   if(info->num_dst) {
1391faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1392faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0[chan_index]);
1393faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca      }
1394faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca   }
1395faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
139663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return 1;
139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
139863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1399c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca
1400c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid
140163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder,
140263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  const struct tgsi_token *tokens,
1403b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca                  struct lp_type type,
14043d7a88674f9eb3320eeff511968f041426e25023José Fonseca                  struct lp_build_mask_context *mask,
140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef consts_ptr,
1406f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef *pos,
1407f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef (*inputs)[NUM_CHANNELS],
1408f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  LLVMValueRef (*outputs)[NUM_CHANNELS],
14098be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                  struct lp_build_sampler_soa *sampler)
141063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context bld;
141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_parse_context parse;
141363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint num_immediates = 0;
141463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
141563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* Setup build context */
141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   memset(&bld, 0, sizeof bld);
141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_context_init(&bld.base, builder, type);
1419c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca   bld.mask = mask;
1420f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.pos = pos;
1421f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.inputs = inputs;
142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.outputs = outputs;
142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.consts_ptr = consts_ptr;
14248be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld.sampler = sampler;
142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
142663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_init( &parse, tokens );
142763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
142863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   while( !tgsi_parse_end_of_tokens( &parse ) ) {
142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      tgsi_parse_token( &parse );
143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch( parse.FullToken.Token.Type ) {
143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_DECLARATION:
14331fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca         /* Inputs already interpolated */
143463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
143563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_INSTRUCTION:
1437faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         {
14382c90652ed9e119f09af6757c59d10273894ba590José Fonseca            unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
14392c90652ed9e119f09af6757c59d10273894ba590José Fonseca            const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode);
1440faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca            if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, info ))
1441faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca               _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n",
1442faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca                             info ? info->mnemonic : "<invalid>");
1443faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca         }
1444faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca
144563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
144663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
144763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_IMMEDIATE:
144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* simply copy the immediate values into the next immediates[] slot */
144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         {
145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
145163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(size <= 4);
145263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(num_immediates < LP_MAX_IMMEDIATES);
145363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = 0; i < size; ++i )
145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] =
145577b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca                  lp_build_const_scalar(type, parse.FullToken.FullImmediate.u[i].Float);
145663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = size; i < 4; ++i )
145763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] = bld.base.undef;
145863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            num_immediates++;
145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
146363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
146463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
146563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_free( &parse );
146863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
146963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1470