lp_bld_tgsi_soa.c revision 7926b42d41058e5d2b99ba0e8810f93bc7c12d36
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
2963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_config.h"
3063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_shader_tokens.h"
3163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_debug.h"
3263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_math.h"
3363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_memory.h"
347821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "tgsi/tgsi_info.h"
3563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_parse.h"
3663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_util.h"
3763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_exec.h"
3863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h"
3963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h"
4063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_intr.h"
4163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h"
427821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h"
4363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h"
4463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h"
455999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca#include "lp_bld_debug.h"
4663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_TEMPS 256
4963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_IMMEDIATES 256
5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\
5363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++)
5463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   ((INST)->FullDstRegisters[0].DstRegister.WriteMask & (1 << (CHAN)))
5763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( CHAN )\
6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0
6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1
6763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2
6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3
6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context
7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_context base;
7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef x, y, w;
7695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef a0_ptr;
7795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef dadx_ptr;
7895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef dady_ptr;
7995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
8063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef consts_ptr;
8195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef (*outputs)[NUM_CHANNELS];
8263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef samplers_ptr;
8363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef oow;
8595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
8695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef inputs[PIPE_MAX_SHADER_INPUTS][NUM_CHANNELS];
8795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
8895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS];
8995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS];
901929057eac0c3351e0810612bdae56331a235736José Fonseca
917821664b15501b173b2304bbada758c33c5ff972José Fonseca   LLVMValueRef mask;
927821664b15501b173b2304bbada758c33c5ff972José Fonseca
931929057eac0c3351e0810612bdae56331a235736José Fonseca   /** Coords/texels store */
941929057eac0c3351e0810612bdae56331a235736José Fonseca   LLVMValueRef store_ptr;
9563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca};
9663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
9763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
9863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
9963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch.
10063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
10163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef
10263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch(
10363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
1042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst,
1052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
10663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const unsigned chan_index )
10763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
1082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_src_register *reg = &inst->FullSrcRegisters[index];
10963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned swizzle = tgsi_util_get_full_src_register_extswizzle( reg, chan_index );
11063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef res;
11163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (swizzle) {
11363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_X:
11463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_Y:
11563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_Z:
11663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_W:
11763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch (reg->SrcRegister.File) {
11963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_CONSTANT: {
12063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->SrcRegister.Index*4 + swizzle, 0);
12163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, "");
12263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, "");
12363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = lp_build_broadcast_scalar(&bld->base, scalar);
12463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
12563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
12763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_IMMEDIATE:
12863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = bld->immediates[reg->SrcRegister.Index][swizzle];
12963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
13063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
13163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
13263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_INPUT:
13363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = bld->inputs[reg->SrcRegister.Index][swizzle];
13463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
13563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
13663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
13763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_TEMPORARY:
13863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = bld->temps[reg->SrcRegister.Index][swizzle];
13963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if(!res)
14063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            return bld->base.undef;
14163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
14263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
14363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
14463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
1454d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca         return bld->base.undef;
14663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
14863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
14963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_ZERO:
15063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = bld->base.zero;
15163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
15263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
15363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_ONE:
15463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = bld->base.one;
15563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
15663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
15763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
15863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
1594d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca      return bld->base.undef;
16063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
16163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) {
16363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_CLEAR:
16463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
16563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
16663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_SET:
16863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
16963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
17063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
17163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
17263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_TOGGLE:
17363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
17463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
17563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
17663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_KEEP:
17763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
17863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
17963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return res;
18163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
18263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
18563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store.
18663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
18763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
18863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store(
18963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
19063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const struct tgsi_full_instruction *inst,
1912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
19263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index,
19363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef value)
19463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
1952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_dst_register *reg = &inst->FullDstRegisters[index];
1962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca
19763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( inst->Instruction.Saturate ) {
19863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_NONE:
19963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
20063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
20163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_ZERO_ONE:
2027926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, bld->base.zero);
2037926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
20463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
20563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
20663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_MINUS_PLUS_ONE:
2077926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, lp_build_const_uni(bld->base.type, -1.0));
2087926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
20963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
2107926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca
2117926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca   default:
2127926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      assert(0);
21363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
21463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
21563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( reg->DstRegister.File ) {
21663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_OUTPUT:
21763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      bld->outputs[reg->DstRegister.Index][chan_index] = value;
21863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
21963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
22063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_TEMPORARY:
22163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      bld->temps[reg->DstRegister.Index][chan_index] = value;
22263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
22363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
22463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_ADDRESS:
22563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* FIXME */
22663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
22763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
22863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
22963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
23063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
23163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
23263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
23363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
23463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
23563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecavoid PIPE_CDECL
23663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_fetch_texel_soa( struct tgsi_sampler **samplers,
23763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                               uint32_t unit,
23863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                               float *store )
23963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
24063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_sampler *sampler = samplers[unit];
24163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
24263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
24363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint j;
24463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
24563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   debug_printf("%s sampler: %p (%p) store: %p\n",
24663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                __FUNCTION__,
24763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                sampler, *sampler,
24863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                store );
24963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
25063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   debug_printf("lodbias %f\n", store[12]);
25163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
25263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (j = 0; j < 4; j++)
25363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      debug_printf("sample %d texcoord %f %f\n",
25463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   j,
25563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[0+j],
25663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[4+j]);
25763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
25863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
25963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   {
26063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      float rgba[NUM_CHANNELS][QUAD_SIZE];
26163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      sampler->get_samples(sampler,
26263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                           &store[0],
26363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                           &store[4],
26463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                           &store[8],
26563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                           0.0f, /*store[12],  lodbias */
26663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                           rgba);
26763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      memcpy(store, rgba, sizeof rgba);
26863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
26963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
27063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
27163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (j = 0; j < 4; j++)
27263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      debug_printf("sample %d result %f %f %f %f\n",
27363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   j,
27463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[0+j],
27563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[4+j],
27663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[8+j],
27763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[12+j]);
27863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
27963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
28063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
28163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
28263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators.
28363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
28463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
28563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
28663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld,
28763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          const struct tgsi_full_instruction *inst,
28863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          boolean apply_lodbias,
28963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          boolean projected)
29063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
29163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMTypeRef vec_type = lp_build_vec_type(bld->base.type);
29263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const uint unit = inst->FullSrcRegisters[1].SrcRegister.Index;
29363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef lodbias;
29463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef oow;
29563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef args[3];
29663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned count;
29763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
29863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
29963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->InstructionExtTexture.Texture) {
30063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_1D:
30163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_SHADOW1D:
30263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      count = 1;
30363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
30463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_2D:
30563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_RECT:
30663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_SHADOW2D:
30763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_SHADOWRECT:
30863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      count = 2;
30963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
31063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_3D:
31163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_CUBE:
31263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      count = 3;
31363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
31463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
31563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
31663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return;
31763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
31863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
31963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if(apply_lodbias)
3202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      lodbias = emit_fetch( bld, inst, 0, 3 );
32163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   else
32263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      lodbias = bld->base.zero;
32363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3241929057eac0c3351e0810612bdae56331a235736José Fonseca   if(!bld->store_ptr)
3251929057eac0c3351e0810612bdae56331a235736José Fonseca      bld->store_ptr = LLVMBuildArrayAlloca(bld->base.builder,
3261929057eac0c3351e0810612bdae56331a235736José Fonseca                                            vec_type,
3271929057eac0c3351e0810612bdae56331a235736José Fonseca                                            LLVMConstInt(LLVMInt32Type(), 4, 0),
3281929057eac0c3351e0810612bdae56331a235736José Fonseca                                            "store");
32963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
33063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (projected) {
3312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      oow = emit_fetch( bld, inst, 0, 3 );
33263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      oow = lp_build_rcp(&bld->base, oow);
33363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
33463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
33563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < count; i++) {
33663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0);
3371929057eac0c3351e0810612bdae56331a235736José Fonseca      LLVMValueRef coord_ptr = LLVMBuildGEP(bld->base.builder, bld->store_ptr, &index, 1, "");
33863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      LLVMValueRef coord;
33963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      coord = emit_fetch( bld, inst, 0, i );
34163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
34263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (projected)
34363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         coord = lp_build_mul(&bld->base, coord, oow);
34463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
34563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      LLVMBuildStore(bld->base.builder, coord, coord_ptr);
34663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
34763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
34863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   args[0] = bld->samplers_ptr;
34963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   args[1] = LLVMConstInt(LLVMInt32Type(), unit, 0);
3501929057eac0c3351e0810612bdae56331a235736José Fonseca   args[2] = bld->store_ptr;
35163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
35263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_intrinsic(bld->base.builder, "fetch_texel", LLVMVoidType(), args, 3);
35363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   FOR_EACH_DST0_ENABLED_CHANNEL( inst, i ) {
35563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0);
3561929057eac0c3351e0810612bdae56331a235736José Fonseca      LLVMValueRef res_ptr = LLVMBuildGEP(bld->base.builder, bld->store_ptr, &index, 1, "");
35763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      LLVMValueRef res = LLVMBuildLoad(bld->base.builder, res_ptr, "");
3582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_store( bld, inst, 0, i, res );
35963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
36063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
36163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
36263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
36363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
36463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil(
36563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
3662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst )
36763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
3682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_src_register *reg = &inst->FullSrcRegisters[0];
3697821664b15501b173b2304bbada758c33c5ff972José Fonseca   LLVMValueRef terms[NUM_CHANNELS];
37063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
37163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3727821664b15501b173b2304bbada758c33c5ff972José Fonseca   memset(&terms, 0, sizeof terms);
37363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
37463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( chan_index ) {
37563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned swizzle;
37663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3777821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Unswizzle channel */
3787821664b15501b173b2304bbada758c33c5ff972José Fonseca      swizzle = tgsi_util_get_full_src_register_extswizzle( reg, chan_index );
37963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3807821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Note that we test if the value is less than zero, so 1.0 and 0.0 need
3817821664b15501b173b2304bbada758c33c5ff972José Fonseca       * not to be tested. */
3827821664b15501b173b2304bbada758c33c5ff972José Fonseca      if(swizzle == TGSI_EXTSWIZZLE_ZERO || swizzle == TGSI_EXTSWIZZLE_ONE)
3837821664b15501b173b2304bbada758c33c5ff972José Fonseca         continue;
38463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3857821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Check if the component has not been already tested. */
3867821664b15501b173b2304bbada758c33c5ff972José Fonseca      assert(swizzle < NUM_CHANNELS);
3877821664b15501b173b2304bbada758c33c5ff972José Fonseca      if( !terms[swizzle] )
3887821664b15501b173b2304bbada758c33c5ff972José Fonseca         /* TODO: change the comparison operator instead of setting the sign */
3892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         terms[swizzle] =  emit_fetch(bld, inst, 0, chan_index );
39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
39163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3927821664b15501b173b2304bbada758c33c5ff972José Fonseca   FOR_EACH_CHANNEL( chan_index ) {
393aede39efd86d200ffbace8fc012104e31f673973José Fonseca      if(terms[chan_index]) {
394aede39efd86d200ffbace8fc012104e31f673973José Fonseca         LLVMValueRef mask;
395aede39efd86d200ffbace8fc012104e31f673973José Fonseca
396aede39efd86d200ffbace8fc012104e31f673973José Fonseca         mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero);
397aede39efd86d200ffbace8fc012104e31f673973José Fonseca
398aede39efd86d200ffbace8fc012104e31f673973José Fonseca         if(bld->mask)
399aede39efd86d200ffbace8fc012104e31f673973José Fonseca            bld->mask = LLVMBuildAnd(bld->base.builder, bld->mask, mask, "");
400aede39efd86d200ffbace8fc012104e31f673973José Fonseca         else
401aede39efd86d200ffbace8fc012104e31f673973José Fonseca            bld->mask = mask;
402aede39efd86d200ffbace8fc012104e31f673973José Fonseca      }
40363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
40463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
40563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
40663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
40763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
40863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kilp(
40963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld )
41063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
41163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* XXX todo / fix me */
41263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
41363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
41463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
41563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
41663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Check if inst src/dest regs use indirect addressing into temporary
41763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * register file.
41863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
41963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic boolean
42063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaindirect_temp_reference(const struct tgsi_full_instruction *inst)
42163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
42263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint i;
42363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      const struct tgsi_full_src_register *reg = &inst->FullSrcRegisters[i];
42563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (reg->SrcRegister.File == TGSI_FILE_TEMPORARY &&
42663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          reg->SrcRegister.Indirect)
42763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
42863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
42963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumDstRegs; i++) {
43063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      const struct tgsi_full_dst_register *reg = &inst->FullDstRegisters[i];
43163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (reg->DstRegister.File == TGSI_FILE_TEMPORARY &&
43263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          reg->DstRegister.Indirect)
43363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
43563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return FALSE;
43663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
43763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
43863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
43963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic int
44063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction(
44163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
44263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_full_instruction *inst )
44363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
44463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
44590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef src0, src1, src2;
44690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
44790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef dst0;
44863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
44963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* we can't handle indirect addressing into temp register file yet */
45063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (indirect_temp_reference(inst))
45163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return FALSE;
45263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
45363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->Instruction.Opcode) {
45463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
45563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARL:
4562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
4572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
45863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_flr(bld, 0, 0);
45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
4602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOV:
46663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SWZ:
4672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
4682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
4692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
47363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LIT:
4742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) {
4752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, bld->base.one);
47663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
4772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
4782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
479c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         dst0 = lp_build_max( &bld->base, src0, bld->base.zero);
4802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, dst0);
481ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca      }
4822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
483ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = SrcReg[0].yyyy */
4842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
485ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = max(XMM[1], 0) */
486ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero);
487ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[2] = SrcReg[0].wwww */
4882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 0, CHAN_W );
489ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_pow( &bld->base, tmp1, tmp2);
4902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
491c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero);
492c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         dst0 = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero);
4932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, dst0);
494c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca      }
4952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) {
4962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, bld->base.one);
49763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
49863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
49963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
50063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCP:
50163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIP */
5022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
50390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      dst0 = lp_build_rcp(&bld->base, src0);
5042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
5052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
50663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
50763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
50863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
50963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RSQ:
51063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIPSQRT */
5112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
51290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      src0 = lp_build_abs(&bld->base, src0);
51390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      dst0 = lp_build_rsqrt(&bld->base, src0);
5142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
5152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
51763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
51863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
51963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EXP:
5202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
5212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
5222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
52357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2_int_part = NULL;
52457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_frac_part = NULL;
52557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2 = NULL;
52657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
52857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
53057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2_int_part = &tmp0;
5312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
53257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_frac_part = &tmp1;
5332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
53457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2 = &tmp2;
53557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
53657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2);
53757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
5392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_X, tmp0);
5402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
5412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Y, tmp1);
5422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
5432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Z, tmp2);
54463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
54563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
5462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
54790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = bld->base.one;
5482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
54963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
55063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
55163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
55263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOG:
5532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
5542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
5552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
55657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_floor_log2;
55757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp;
55857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_log2;
55957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
56157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         src0 = lp_build_abs( &bld->base, src0 );
56257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
56457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_floor_log2 = &tmp0;
5652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
56657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp = &tmp1;
5672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
56857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_log2 = &tmp2;
56957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
57057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2);
57157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
57257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.x = floor(lg2(abs(src.x))) */
5732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
5742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_X, tmp0);
57557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */
5762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) {
57757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            tmp1 = lp_build_div( &bld->base, src0, tmp1);
5782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Y, tmp1);
57963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
58057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.z = lg2(abs(src.x)) */
5812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
5822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Z, tmp2);
58363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
58463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
5852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
58657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         tmp0 = bld->base.one;
5872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
58863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
58963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
59063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
59163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MUL:
5922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
5932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
5942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
59590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_mul(&bld->base, src0, src1);
5962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
59763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
59863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
59963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
60063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ADD:
6012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
60490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_add(&bld->base, src0, src1);
6052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
60663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
60763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
60863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
60963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP3:
61063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT3 */
6112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
6122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
61390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
6142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
6152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
61690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
61790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
6192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
62090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
62190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
62463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
62563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
62663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
62763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP4:
62863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT4 */
6292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
6302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
63190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
6322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
6332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
63490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
63590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
6372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
63890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
63990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_W );
6412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_W );
64290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
64390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
64663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
64763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
64863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
64963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DST:
6502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
651ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp0 = bld->base.one;
6522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, tmp0);
65363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
6552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
6562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Y );
65790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
6582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, tmp0);
65963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
6612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Z );
6622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, tmp0);
66363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
6652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 1, CHAN_W );
6662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
66763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
66863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
66963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
67063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MIN:
6712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
67490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_min( &bld->base, src0, src1 );
6752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
67663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
67763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
67863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
67963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAX:
6802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
68390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_max( &bld->base, src0, src1 );
6842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
68563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
68663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
68763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
68863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLT:
68963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETLT */
6902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
6931aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 );
6941aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
6952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
6961aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
69763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
69863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
69963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGE:
70063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETGE */
7012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
7032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
7041aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 );
7051aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
7062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
7071aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
70863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
70963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
71063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAD:
71163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_MADD */
7122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
7142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
7152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 2, chan_index );
71690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
71790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_add( &bld->base, tmp0, tmp2);
7182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
71963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
72063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
72163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
72263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SUB:
7232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
7252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
72690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, tmp0, tmp1);
7272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
72863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
72963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
73063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
73163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LRP:
7322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
7342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
7352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
73690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, src1, src2 );
73790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, src0, tmp0 );
73890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_add( &bld->base, tmp0, src2 );
7392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
74063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
74163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
74263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
74363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND:
74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
74563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
74663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
74763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND0:
74863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
74963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
75063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
75163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2A:
7522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
7532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
75490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
7552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
7562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
75790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
75890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
7592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 2, CHAN_X );  /* xmm1 = src[2].x */
76090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
7612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);  /* dest[ch] = xmm0 */
76363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
76463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
76563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
76690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
76763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FRC:
7682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
77063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_frc( bld, 0, 0 );
7712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
77263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
77363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
77463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
77563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CLAMP:
77663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
77763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
77863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
77963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FLR:
7802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
78263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_flr( bld, 0, 0 );
7832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
78463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
78563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
78663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
78763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ROUND:
7882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
79063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_rnd( bld, 0, 0 );
7912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
79263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
79363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
79490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif
79563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
79690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   case TGSI_OPCODE_EX2: {
7972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
79890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_exp2( &bld->base, tmp0);
7992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
80163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
80263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
80390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   }
80463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
80563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LG2:
8062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
80790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_log2( &bld->base, tmp0);
8082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
81163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
81263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
81363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POW:
8142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
8152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src1 = emit_fetch( bld, inst, 1, CHAN_X );
81690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      dst0 = lp_build_pow( &bld->base, src0, src1 );
8172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
81963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
82263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XPD:
8232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
8242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
8252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Z );
8262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp3 = emit_fetch( bld, inst, 0, CHAN_Z );
82763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
8292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
8302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
8312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp4 = emit_fetch( bld, inst, 1, CHAN_Y );
83263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
83490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = tmp0;
83590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_mul( &bld->base, tmp2, tmp1);
83690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = tmp3;
83790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
83890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_sub( &bld->base, tmp2, tmp5);
8392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, tmp2);
84063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
8422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
8432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 1, CHAN_X );
8442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp5 = emit_fetch( bld, inst, 0, CHAN_X );
84563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
84790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_mul( &bld->base, tmp3, tmp2);
84890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp1 = lp_build_mul( &bld->base, tmp1, tmp5);
84990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_sub( &bld->base, tmp3, tmp1);
8502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, tmp3);
85163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
85390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
85490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp2);
85590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_sub( &bld->base, tmp5, tmp0);
8562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, tmp5);
85763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
85990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = bld->base.one;
8602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
86163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
86263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
86363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
86463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ABS:
8652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
86790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_abs( &bld->base, tmp0 ) ;
8682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
86963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
87063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
87163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
87263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCC:
87363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
87463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
87563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
87663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DPH:
8772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
8782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
87990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
8802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
8812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
88290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
88390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
8852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
88690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
88790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
8882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_W );
88990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
8902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
89263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
89363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
89463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
89563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_COS:
8962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
89790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_cos( &bld->base, tmp0 );
8982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
90063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
90163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
90263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
90363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDX:
90463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
90563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
90663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
90763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDY:
90863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
90963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
91063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
91190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
91263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KILP:
91363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* predicated kill */
91463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_kilp( bld );
91563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0; /* XXX fix me */
91663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
9177821664b15501b173b2304bbada758c33c5ff972José Fonseca#endif
91863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
91963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KIL:
92063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* conditional kill */
9212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_kil( bld, inst );
92263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
92363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
92463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2H:
92563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
92663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
92763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
92863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2US:
92963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
93063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
93263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4B:
93363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
93463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
93563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
93663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4UB:
93763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
93863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
93963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RFL:
94163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
94263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
94363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SEQ:
9452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9481aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 );
9491aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9511aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
95263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
95363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
95463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SFL:
95563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
95663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
95763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
95863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGT:
9592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9621aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 );
9631aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9651aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
96663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
96763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
96863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SIN:
9692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
97090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_sin( &bld->base, tmp0 );
9712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
97363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
97463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
97563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
97663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLE:
9772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9801aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 );
9811aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9831aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
98463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
98563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SNE:
9872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9901aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 );
9911aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9931aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
99463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
99563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
99663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_STR:
99763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
99863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
99963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TEX:
100163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, FALSE, FALSE );
100263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
100363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXD:
100563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
100663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
100763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2H:
100963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
101063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
101263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2US:
101363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
101463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
101663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4B:
101763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4UB:
102163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
102263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_X2D:
102563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
102663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARA:
102963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
103063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
103290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
103363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARR:
10342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
103663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_rnd( bld, 0, 0 );
103763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
10382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
104063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif
104263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRA:
104463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
104563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CAL:
104863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
104963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
105063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
105190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
105263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RET:
105363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_ret( bld );
105463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
105763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_END:
105863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
105963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
106163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SSG:
106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SGN */
10632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_sgn( bld, 0, 0 );
10662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
106763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
106863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
10691aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca#endif
107063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CMP:
10722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
10761aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero );
10771aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, src1, src2);
10782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
10791aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
108063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
108163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
108263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SCS:
10832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
10842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
108590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_cos( &bld->base, tmp0 );
10862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, tmp0);
108763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
10892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
109090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sin( &bld->base, tmp0 );
10912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, tmp0);
109263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1094ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp0 = bld->base.zero;
10952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, tmp0);
109663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1098ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp0 = bld->base.one;
10992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
110063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
110163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
110263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXB:
110463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE );
110563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
110663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM:
110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* fall-through */
110963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM4:
111063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* 3 or 4-component normalization */
111163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      {
111263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4;
111363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) ||
11152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) ||
11162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) ||
11172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) {
111863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
111963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */
112063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
112163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm4 = src.x */
112263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = src.x * src.x */
11232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
11242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
112590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = tmp0;
112663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
112790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_mul( &bld->base, tmp0, tmp0);
112863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
112963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm5 = src.y */
113063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.y * src.y */
11312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Y);
11322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
113390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = tmp1;
113463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
113590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
113690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
113763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm6 = src.z */
113963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.z * src.z */
11402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Z);
11412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
114290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = tmp1;
114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
114490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
114590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
114663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
114763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            if (dims == 4) {
114863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm7 = src.w */
114963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm0 = xmm0 + src.w * src.w */
11502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               tmp1 = emit_fetch(bld, inst, 0, CHAN_W);
11512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) {
115290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca                  tmp7 = tmp1;
115363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
115490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
115590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
115663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
115763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
115863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm1 = 1 / sqrt(xmm0) */
115990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_rsqrt( &bld->base, tmp0);
116063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.x = xmm1 * src.x */
11622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
116390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = lp_build_mul( &bld->base, tmp4, tmp1);
11642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_X, tmp4);
116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
116663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.y = xmm1 * src.y */
11682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
116990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = lp_build_mul( &bld->base, tmp5, tmp1);
11702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_Y, tmp5);
117163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
117263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.z = xmm1 * src.z */
11742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
117590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = lp_build_mul( &bld->base, tmp6, tmp1);
11762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_Z, tmp6);
117763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
117863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.w = xmm1 * src.w */
11802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) {
118190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp7 = lp_build_mul( &bld->base, tmp7, tmp1);
11822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_W, tmp7);
118363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
118463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
118563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* dst0.w = 1.0 */
11872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) {
118890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = bld->base.one;
11892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store(bld, inst, 0, CHAN_W, tmp0);
119063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
119263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
119363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DIV:
119563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
119663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2:
11992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
12002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
120190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
12022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
12032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
120490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
120590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
12062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);  /* dest[ch] = xmm0 */
120863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXL:
121263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE );
121363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
121463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXP:
121663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, FALSE, TRUE );
121763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
121863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRK:
122063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
122163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
122363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_IF:
122463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
122563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOOP:
122863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_REP:
123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
123363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ELSE:
123663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
123763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDIF:
124063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
124163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDLOOP:
124463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
124563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDREP:
124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PUSHA:
125263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
125363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POPA:
125663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
125763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CEIL:
126063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
126163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_I2F:
126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
126563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
126663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NOT:
126863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
126963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
127263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TRUNC:
12732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
127563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
127663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_i2f( bld, 0 );
12772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
127863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif
128163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHL:
128363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
128463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHR:
128763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_AND:
129163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
129263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_OR:
129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
129663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOD:
129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XOR:
130363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
130463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SAD:
130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
130863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXF:
131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXQ:
131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CONT:
131963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
132063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EMIT:
132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDPRIM:
132763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
132863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
133263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
133363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return 1;
133563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
133863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_declaration(
133963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
134063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_full_declaration *decl )
134163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
134263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if( decl->Declaration.File == TGSI_FILE_INPUT ) {
134395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca      LLVMBuilderRef builder = bld->base.builder;
134463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned first, last, mask;
134595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca      unsigned attrib, chan;
134663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
134763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      first = decl->DeclarationRange.First;
134863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      last = decl->DeclarationRange.Last;
134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      mask = decl->Declaration.UsageMask;
135063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca      for( attrib = first; attrib <= last; attrib++ ) {
135295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca         for( chan = 0; chan < NUM_CHANNELS; chan++ ) {
135395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca            LLVMValueRef input = bld->base.undef;
135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca            if( mask & (1 << chan) ) {
135695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), attrib*NUM_CHANNELS + chan, 0);
135795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               LLVMValueRef a0;
135895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               LLVMValueRef dadx;
135995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               LLVMValueRef dady;
136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               switch( decl->Declaration.Interpolate ) {
136263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               case TGSI_INTERPOLATE_PERSPECTIVE:
13635999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca                  /* fall-through */
13645999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca
136595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               case TGSI_INTERPOLATE_LINEAR: {
136695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef dadx_ptr = LLVMBuildGEP(builder, bld->dadx_ptr, &index, 1, "");
136795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef dady_ptr = LLVMBuildGEP(builder, bld->dady_ptr, &index, 1, "");
1368b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  dadx = LLVMBuildLoad(builder, dadx_ptr, "");
1369b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  dady = LLVMBuildLoad(builder, dady_ptr, "");
1370b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  dadx = lp_build_broadcast_scalar(&bld->base, dadx);
1371b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  dady = lp_build_broadcast_scalar(&bld->base, dady);
13725999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca                  lp_build_name(dadx, "dadx_%u.%c", attrib, "xyzw"[chan]);
13735999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca                  lp_build_name(dady, "dady_%u.%c", attrib, "xyzw"[chan]);
13745999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca                  /* fall-through */
137595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               }
137695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
137795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               case TGSI_INTERPOLATE_CONSTANT: {
137895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef a0_ptr = LLVMBuildGEP(builder, bld->a0_ptr, &index, 1, "");
1379b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  a0 = LLVMBuildLoad(builder, a0_ptr, "");
1380b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  a0 = lp_build_broadcast_scalar(&bld->base, a0);
13815999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca                  lp_build_name(a0, "a0_%u.%c", attrib, "xyzw"[chan]);
138263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  break;
138395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               }
138463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
138563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               default:
138695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  assert(0);
138795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  break;
138895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               }
138995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
139095f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               input = a0;
139195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
139295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               if (decl->Declaration.Interpolate != TGSI_INTERPOLATE_CONSTANT) {
139395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  input = lp_build_add(&bld->base, input, lp_build_mul(&bld->base, bld->x, dadx));
139495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  input = lp_build_add(&bld->base, input, lp_build_mul(&bld->base, bld->y, dady));
139563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
139695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
139795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               if (decl->Declaration.Interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
139895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  if(!bld->oow)
139995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                     bld->oow = lp_build_rcp(&bld->base, bld->w);
140095f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  input = lp_build_mul(&bld->base, input, bld->oow);
140195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               }
140295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
14035999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca               lp_build_name(input, "input%u.%c", attrib, "xyzw"[chan]);
140463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
140595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
140695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca            bld->inputs[attrib][chan] = input;
140763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
140863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
140963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
141063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
141363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Translate a TGSI vertex/fragment shader to SSE2 code.
141463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Slightly different things are done for vertex vs. fragment shaders.
141563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * \param tokens  the TGSI input shader
141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * \param bld  the output SSE code/function
141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * \param immediates  buffer to place immediates, later passed to SSE bld
141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * \param return  1 for success, 0 if translation failed
142063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
14217821664b15501b173b2304bbada758c33c5ff972José FonsecaLLVMValueRef
142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder,
142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  const struct tgsi_token *tokens,
142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  union lp_type type,
142595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef *pos,
142695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef a0_ptr,
142795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef dadx_ptr,
142895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef dady_ptr,
142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef consts_ptr,
143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef (*outputs)[4],
143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef samplers_ptr)
143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
143363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context bld;
143463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_parse_context parse;
143563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint num_immediates = 0;
143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
143763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* Setup build context */
143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   memset(&bld, 0, sizeof bld);
144063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_context_init(&bld.base, builder, type);
144195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.x = pos[0];
144295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.y = pos[1];
144395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.w = pos[3];
144495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.a0_ptr = a0_ptr;
144595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.dadx_ptr = dadx_ptr;
144695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.dady_ptr = dady_ptr;
144763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.outputs = outputs;
144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.consts_ptr = consts_ptr;
144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.samplers_ptr = samplers_ptr;
145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_init( &parse, tokens );
145263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   while( !tgsi_parse_end_of_tokens( &parse ) ) {
145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      tgsi_parse_token( &parse );
145563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
145663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch( parse.FullToken.Token.Type ) {
145763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_DECLARATION:
145863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if (parse.FullHeader.Processor.Processor == TGSI_PROCESSOR_FRAGMENT) {
145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            emit_declaration( &bld, &parse.FullToken.FullDeclaration );
146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_INSTRUCTION:
146463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if (!emit_instruction( &bld, &parse.FullToken.FullInstruction )) {
14652c90652ed9e119f09af6757c59d10273894ba590José Fonseca            unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
14662c90652ed9e119f09af6757c59d10273894ba590José Fonseca            const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode);
14672c90652ed9e119f09af6757c59d10273894ba590José Fonseca	    _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n",
14682c90652ed9e119f09af6757c59d10273894ba590José Fonseca	                  info ? info->mnemonic : "<invalid>");
146963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca	 }
147063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
147163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
147263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_IMMEDIATE:
147363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* simply copy the immediate values into the next immediates[] slot */
147463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         {
147563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
147663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(size <= 4);
147763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(num_immediates < LP_MAX_IMMEDIATES);
147863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = 0; i < size; ++i )
147963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] =
148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  lp_build_const_uni(type, parse.FullToken.FullImmediate.u[i].Float);
148163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = size; i < 4; ++i )
148263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] = bld.base.undef;
148363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            num_immediates++;
148463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
148563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
148663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
148863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
148963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
149063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
149163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
149263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_free( &parse );
14937821664b15501b173b2304bbada758c33c5ff972José Fonseca
14947821664b15501b173b2304bbada758c33c5ff972José Fonseca   return bld.mask;
149563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1497