lp_bld_tgsi_soa.c revision 5811ed87d732101ab8cfbd087bc99d8c6c963f30
163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**************************************************************************
263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Copyright 2009 VMware, Inc.
463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * All Rights Reserved.
663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * copy of this software and associated documentation files (the
963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * "Software"), to deal in the Software without restriction, including
1063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
1163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
1263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
1363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * the following conditions:
1463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
1563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * The above copyright notice and this permission notice (including the
1663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
1763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * of the Software.
1863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
1963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
2063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca *
2763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca **************************************************************************/
2863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
295811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca/**
305811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @file
315811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * TGSI to LLVM IR translation -- SoA.
325811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
335811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @author Jose Fonseca <jfonseca@vmware.com>
345811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca *
355811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell,
365811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Brian Paul, and others.
375811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca */
385811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca
3963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_config.h"
4063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_shader_tokens.h"
4163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_debug.h"
4263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_math.h"
4363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_memory.h"
447821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "tgsi/tgsi_info.h"
4563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_parse.h"
4663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_util.h"
4763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_exec.h"
4863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h"
4963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h"
5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_intr.h"
5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h"
527821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h"
5363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h"
543d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h"
5563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h"
565999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca#include "lp_bld_debug.h"
5763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_TEMPS 256
6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_IMMEDIATES 256
6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\
6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++)
6563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   ((INST)->FullDstRegisters[0].DstRegister.WriteMask & (1 << (CHAN)))
6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\
7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (IS_DST0_CHANNEL_ENABLED( INST, CHAN ))
7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\
7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( CHAN )\
7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )
7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0
7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1
7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2
7963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3
8063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context
8363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
8463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_context base;
8563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
8695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef x, y, w;
8795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef a0_ptr;
8895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef dadx_ptr;
8995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef dady_ptr;
9095f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
9163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef consts_ptr;
9295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef (*outputs)[NUM_CHANNELS];
9363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef samplers_ptr;
9463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
9595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef oow;
9695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
9795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef inputs[PIPE_MAX_SHADER_INPUTS][NUM_CHANNELS];
9895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
9995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS];
10095f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS];
1011929057eac0c3351e0810612bdae56331a235736José Fonseca
1023d7a88674f9eb3320eeff511968f041426e25023José Fonseca   struct lp_build_mask_context *mask;
1037821664b15501b173b2304bbada758c33c5ff972José Fonseca
1041929057eac0c3351e0810612bdae56331a235736José Fonseca   /** Coords/texels store */
1051929057eac0c3351e0810612bdae56331a235736José Fonseca   LLVMValueRef store_ptr;
10663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca};
10763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
10863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
10963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
11063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch.
11163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
11263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef
11363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch(
11463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
1152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst,
1162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
11763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const unsigned chan_index )
11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
1192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_src_register *reg = &inst->FullSrcRegisters[index];
12063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned swizzle = tgsi_util_get_full_src_register_extswizzle( reg, chan_index );
12163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef res;
12263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
12363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (swizzle) {
12463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_X:
12563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_Y:
12663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_Z:
12763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_W:
12863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
12963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch (reg->SrcRegister.File) {
13063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_CONSTANT: {
13163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->SrcRegister.Index*4 + swizzle, 0);
13263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, "");
13363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, "");
13463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = lp_build_broadcast_scalar(&bld->base, scalar);
13563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
13663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
13763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
13863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_IMMEDIATE:
13963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = bld->immediates[reg->SrcRegister.Index][swizzle];
14063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
14163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
14263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
14363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_INPUT:
14463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = bld->inputs[reg->SrcRegister.Index][swizzle];
14563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
14663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
14763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
14863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_TEMPORARY:
14963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = bld->temps[reg->SrcRegister.Index][swizzle];
15063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if(!res)
15163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            return bld->base.undef;
15263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
15363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
15463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
15563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
1564d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca         return bld->base.undef;
15763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
15863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
15963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_ZERO:
16163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = bld->base.zero;
16263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
16363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_ONE:
16563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = bld->base.one;
16663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
16763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
16963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
1704d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca      return bld->base.undef;
17163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
17263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
17363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) {
17463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_CLEAR:
17563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
17663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
17763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
17863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_SET:
17963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
18063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
18163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
18263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_TOGGLE:
18463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
18563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
18663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_KEEP:
18863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
18963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
19063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
19163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return res;
19263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
19363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
19463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
19563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
19663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store.
19763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
19863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
19963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store(
20063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
20163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const struct tgsi_full_instruction *inst,
2022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
20363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index,
20463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef value)
20563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
2062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_dst_register *reg = &inst->FullDstRegisters[index];
2072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca
20863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( inst->Instruction.Saturate ) {
20963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_NONE:
21063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
21163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
21263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_ZERO_ONE:
2137926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, bld->base.zero);
2147926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
21563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
21663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
21763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_MINUS_PLUS_ONE:
2187926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, lp_build_const_uni(bld->base.type, -1.0));
2197926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
22063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
2217926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca
2227926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca   default:
2237926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      assert(0);
22463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
22563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
22663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( reg->DstRegister.File ) {
22763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_OUTPUT:
22863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      bld->outputs[reg->DstRegister.Index][chan_index] = value;
22963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
23063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
23163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_TEMPORARY:
23263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      bld->temps[reg->DstRegister.Index][chan_index] = value;
23363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
23463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
23563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_ADDRESS:
23663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* FIXME */
23763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
23863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
23963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
24063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
24163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
24263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
24363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
24463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
24563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
24663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecavoid PIPE_CDECL
24763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_fetch_texel_soa( struct tgsi_sampler **samplers,
24863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                               uint32_t unit,
24963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                               float *store )
25063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
25163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_sampler *sampler = samplers[unit];
25263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
25363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
25463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint j;
25563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
25663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   debug_printf("%s sampler: %p (%p) store: %p\n",
25763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                __FUNCTION__,
25863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                sampler, *sampler,
25963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                store );
26063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
26163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   debug_printf("lodbias %f\n", store[12]);
26263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
26363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (j = 0; j < 4; j++)
26463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      debug_printf("sample %d texcoord %f %f\n",
26563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   j,
26663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[0+j],
26763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[4+j]);
26863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
26963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
27063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   {
27163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      float rgba[NUM_CHANNELS][QUAD_SIZE];
27263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      sampler->get_samples(sampler,
27363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                           &store[0],
27463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                           &store[4],
27563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                           &store[8],
27663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                           0.0f, /*store[12],  lodbias */
27763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                           rgba);
27863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      memcpy(store, rgba, sizeof rgba);
27963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
28063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
28163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
28263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (j = 0; j < 4; j++)
28363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      debug_printf("sample %d result %f %f %f %f\n",
28463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   j,
28563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[0+j],
28663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[4+j],
28763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[8+j],
28863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                   store[12+j]);
28963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
29063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
29163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
29263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
29363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators.
29463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
29563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
29663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
29763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld,
29863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          const struct tgsi_full_instruction *inst,
29963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          boolean apply_lodbias,
30063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          boolean projected)
30163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
30263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMTypeRef vec_type = lp_build_vec_type(bld->base.type);
30363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const uint unit = inst->FullSrcRegisters[1].SrcRegister.Index;
30463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef lodbias;
30563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef oow;
30663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef args[3];
30763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned count;
30863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
30963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
31063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->InstructionExtTexture.Texture) {
31163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_1D:
31263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_SHADOW1D:
31363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      count = 1;
31463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
31563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_2D:
31663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_RECT:
31763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_SHADOW2D:
31863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_SHADOWRECT:
31963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      count = 2;
32063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
32163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_3D:
32263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_CUBE:
32363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      count = 3;
32463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
32563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
32663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
32763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return;
32863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
32963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
33063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if(apply_lodbias)
3312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      lodbias = emit_fetch( bld, inst, 0, 3 );
33263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   else
33363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      lodbias = bld->base.zero;
33463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3351929057eac0c3351e0810612bdae56331a235736José Fonseca   if(!bld->store_ptr)
3361929057eac0c3351e0810612bdae56331a235736José Fonseca      bld->store_ptr = LLVMBuildArrayAlloca(bld->base.builder,
3371929057eac0c3351e0810612bdae56331a235736José Fonseca                                            vec_type,
3381929057eac0c3351e0810612bdae56331a235736José Fonseca                                            LLVMConstInt(LLVMInt32Type(), 4, 0),
3391929057eac0c3351e0810612bdae56331a235736José Fonseca                                            "store");
34063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
34163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (projected) {
3422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      oow = emit_fetch( bld, inst, 0, 3 );
34363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      oow = lp_build_rcp(&bld->base, oow);
34463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
34563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
34663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < count; i++) {
34763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0);
3481929057eac0c3351e0810612bdae56331a235736José Fonseca      LLVMValueRef coord_ptr = LLVMBuildGEP(bld->base.builder, bld->store_ptr, &index, 1, "");
34963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      LLVMValueRef coord;
35063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      coord = emit_fetch( bld, inst, 0, i );
35263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
35363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (projected)
35463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         coord = lp_build_mul(&bld->base, coord, oow);
35563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
35663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      LLVMBuildStore(bld->base.builder, coord, coord_ptr);
35763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
35863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
35963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   args[0] = bld->samplers_ptr;
36063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   args[1] = LLVMConstInt(LLVMInt32Type(), unit, 0);
3611929057eac0c3351e0810612bdae56331a235736José Fonseca   args[2] = bld->store_ptr;
36263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
36363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_intrinsic(bld->base.builder, "fetch_texel", LLVMVoidType(), args, 3);
36463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   FOR_EACH_DST0_ENABLED_CHANNEL( inst, i ) {
36663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), i, 0);
3671929057eac0c3351e0810612bdae56331a235736José Fonseca      LLVMValueRef res_ptr = LLVMBuildGEP(bld->base.builder, bld->store_ptr, &index, 1, "");
36863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      LLVMValueRef res = LLVMBuildLoad(bld->base.builder, res_ptr, "");
3692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_store( bld, inst, 0, i, res );
37063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
37163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
37263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
37363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
37463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
37563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil(
37663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
3772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst )
37863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
3792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_src_register *reg = &inst->FullSrcRegisters[0];
3807821664b15501b173b2304bbada758c33c5ff972José Fonseca   LLVMValueRef terms[NUM_CHANNELS];
3813d7a88674f9eb3320eeff511968f041426e25023José Fonseca   LLVMValueRef mask;
38263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
38363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3847821664b15501b173b2304bbada758c33c5ff972José Fonseca   memset(&terms, 0, sizeof terms);
38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
38663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( chan_index ) {
38763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned swizzle;
38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3897821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Unswizzle channel */
3907821664b15501b173b2304bbada758c33c5ff972José Fonseca      swizzle = tgsi_util_get_full_src_register_extswizzle( reg, chan_index );
39163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3927821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Note that we test if the value is less than zero, so 1.0 and 0.0 need
3937821664b15501b173b2304bbada758c33c5ff972José Fonseca       * not to be tested. */
3947821664b15501b173b2304bbada758c33c5ff972José Fonseca      if(swizzle == TGSI_EXTSWIZZLE_ZERO || swizzle == TGSI_EXTSWIZZLE_ONE)
3957821664b15501b173b2304bbada758c33c5ff972José Fonseca         continue;
39663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3977821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Check if the component has not been already tested. */
3987821664b15501b173b2304bbada758c33c5ff972José Fonseca      assert(swizzle < NUM_CHANNELS);
3997821664b15501b173b2304bbada758c33c5ff972José Fonseca      if( !terms[swizzle] )
4007821664b15501b173b2304bbada758c33c5ff972José Fonseca         /* TODO: change the comparison operator instead of setting the sign */
4012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         terms[swizzle] =  emit_fetch(bld, inst, 0, chan_index );
40263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
40363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
4043d7a88674f9eb3320eeff511968f041426e25023José Fonseca   mask = NULL;
4057821664b15501b173b2304bbada758c33c5ff972José Fonseca   FOR_EACH_CHANNEL( chan_index ) {
406aede39efd86d200ffbace8fc012104e31f673973José Fonseca      if(terms[chan_index]) {
4073d7a88674f9eb3320eeff511968f041426e25023José Fonseca         LLVMValueRef chan_mask;
408aede39efd86d200ffbace8fc012104e31f673973José Fonseca
4093d7a88674f9eb3320eeff511968f041426e25023José Fonseca         chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero);
410aede39efd86d200ffbace8fc012104e31f673973José Fonseca
4113d7a88674f9eb3320eeff511968f041426e25023José Fonseca         if(mask)
4123d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, "");
4133d7a88674f9eb3320eeff511968f041426e25023José Fonseca         else
4143d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = chan_mask;
415aede39efd86d200ffbace8fc012104e31f673973José Fonseca      }
41663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
4173d7a88674f9eb3320eeff511968f041426e25023José Fonseca
4183d7a88674f9eb3320eeff511968f041426e25023José Fonseca   if(mask)
4193d7a88674f9eb3320eeff511968f041426e25023José Fonseca      lp_build_mask_update(bld->mask, mask);
42063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
42163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
42263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
42363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kilp(
42563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld )
42663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
42763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* XXX todo / fix me */
42863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
42963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
43063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
43163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
43263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Check if inst src/dest regs use indirect addressing into temporary
43363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * register file.
43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
43563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic boolean
43663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaindirect_temp_reference(const struct tgsi_full_instruction *inst)
43763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
43863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint i;
43963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
44063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      const struct tgsi_full_src_register *reg = &inst->FullSrcRegisters[i];
44163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (reg->SrcRegister.File == TGSI_FILE_TEMPORARY &&
44263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          reg->SrcRegister.Indirect)
44363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
44463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
44563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumDstRegs; i++) {
44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      const struct tgsi_full_dst_register *reg = &inst->FullDstRegisters[i];
44763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (reg->DstRegister.File == TGSI_FILE_TEMPORARY &&
44863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          reg->DstRegister.Indirect)
44963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
45063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
45163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return FALSE;
45263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
45363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
45463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
45563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic int
45663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction(
45763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
45863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_full_instruction *inst )
45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
46190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef src0, src1, src2;
46290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
46390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef dst0;
46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* we can't handle indirect addressing into temp register file yet */
46663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (indirect_temp_reference(inst))
46763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return FALSE;
46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
46963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->Instruction.Opcode) {
47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARL:
4722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
4732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
47463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_flr(bld, 0, 0);
47563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
4762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
47763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
47963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
48063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOV:
48263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SWZ:
4832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
4842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
4852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
48663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
48763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
48863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
48963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LIT:
4902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) {
4912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, bld->base.one);
49263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
4932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
4942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
495c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         dst0 = lp_build_max( &bld->base, src0, bld->base.zero);
4962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, dst0);
497ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca      }
4982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
499ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = SrcReg[0].yyyy */
5002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
501ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = max(XMM[1], 0) */
502ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero);
503ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[2] = SrcReg[0].wwww */
5042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 0, CHAN_W );
505ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_pow( &bld->base, tmp1, tmp2);
5062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
507c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero);
508c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         dst0 = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero);
5092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, dst0);
510c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca      }
5112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) {
5122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, bld->base.one);
51363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
51463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCP:
51763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIP */
5182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
51990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      dst0 = lp_build_rcp(&bld->base, src0);
5202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
5212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
52263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
52363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
52463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
52563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RSQ:
52663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIPSQRT */
5272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
52890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      src0 = lp_build_abs(&bld->base, src0);
52990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      dst0 = lp_build_rsqrt(&bld->base, src0);
5302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
5312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
53263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
53363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
53463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
53563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EXP:
5362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
5372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
5382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
53957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2_int_part = NULL;
54057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_frac_part = NULL;
54157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2 = NULL;
54257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
54457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
54657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2_int_part = &tmp0;
5472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
54857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_frac_part = &tmp1;
5492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
55057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2 = &tmp2;
55157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
55257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2);
55357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
5552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_X, tmp0);
5562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
5572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Y, tmp1);
5582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
5592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Z, tmp2);
56063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
56163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
5622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
56390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = bld->base.one;
5642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
56563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
56663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
56763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
56863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOG:
5692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
5702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
5712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
57257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_floor_log2;
57357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp;
57457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_log2;
57557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
57757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         src0 = lp_build_abs( &bld->base, src0 );
57857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
58057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_floor_log2 = &tmp0;
5812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
58257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp = &tmp1;
5832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
58457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_log2 = &tmp2;
58557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
58657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2);
58757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
58857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.x = floor(lg2(abs(src.x))) */
5892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
5902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_X, tmp0);
59157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */
5922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) {
59357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            tmp1 = lp_build_div( &bld->base, src0, tmp1);
5942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Y, tmp1);
59563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
59657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.z = lg2(abs(src.x)) */
5972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
5982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Z, tmp2);
59963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
60063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
6012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
60257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         tmp0 = bld->base.one;
6032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
60463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
60563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
60663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
60763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MUL:
6082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
61190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_mul(&bld->base, src0, src1);
6122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
61363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
61463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
61563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
61663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ADD:
6172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
62090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_add(&bld->base, src0, src1);
6212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
62263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
62363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
62463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
62563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP3:
62663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT3 */
6272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
6282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
62990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
6302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
6312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
63290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
63390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
6352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
63690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
63790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
64063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
64163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
64263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
64363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP4:
64463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT4 */
6452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
6462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
64790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
6482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
6492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
65090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
65190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
6532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
65490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
65590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_W );
6572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_W );
65890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
65990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
6602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
66263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
66363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
66463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
66563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DST:
6662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
667ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp0 = bld->base.one;
6682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, tmp0);
66963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
6712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
6722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Y );
67390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
6742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, tmp0);
67563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
6772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Z );
6782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, tmp0);
67963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
6812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 1, CHAN_W );
6822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
68363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
68463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
68563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
68663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MIN:
6872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
69090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_min( &bld->base, src0, src1 );
6912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
69263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
69463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
69563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAX:
6962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
69990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_max( &bld->base, src0, src1 );
7002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
70163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
70263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
70363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
70463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLT:
70563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETLT */
7062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
7082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
7091aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 );
7101aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
7112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
7121aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
71363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
71463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
71563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGE:
71663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETGE */
7172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
7192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
7201aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 );
7211aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
7222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
7231aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
72463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
72563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
72663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAD:
72763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_MADD */
7282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
7302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
7312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 2, chan_index );
73290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
73390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_add( &bld->base, tmp0, tmp2);
7342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
73563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
73663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
73763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
73863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SUB:
7392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
7412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
74290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, tmp0, tmp1);
7432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
74563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
74663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
74763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LRP:
7482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
7502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
7512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
75290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, src1, src2 );
75390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, src0, tmp0 );
75490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_add( &bld->base, tmp0, src2 );
7552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
75663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
75763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
75863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
75963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND:
76063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
76163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
76263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
76363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND0:
76463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
76563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
76663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
76763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2A:
7682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
7692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
77090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
7712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
7722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
77390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
77490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
7752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 2, CHAN_X );  /* xmm1 = src[2].x */
77690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
7772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);  /* dest[ch] = xmm0 */
77963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
78063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
78163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
78290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
78363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FRC:
7842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
78663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_frc( bld, 0, 0 );
7872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
78863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
78963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
79063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
79163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CLAMP:
79263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
79363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
79463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
79563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FLR:
7962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
79863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_flr( bld, 0, 0 );
7992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
80063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
80163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
80263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
80363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ROUND:
8042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
80663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_rnd( bld, 0, 0 );
8072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
80863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
80963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
81090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif
81163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
81290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   case TGSI_OPCODE_EX2: {
8132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
81490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_exp2( &bld->base, tmp0);
8152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
81763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
81990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   }
82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LG2:
8222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
82390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_log2( &bld->base, tmp0);
8242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
82663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
82763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
82863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
82963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POW:
8302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
8312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src1 = emit_fetch( bld, inst, 1, CHAN_X );
83290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      dst0 = lp_build_pow( &bld->base, src0, src1 );
8332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
83563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
83663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
83763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
83863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XPD:
8392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
8402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
8412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Z );
8422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp3 = emit_fetch( bld, inst, 0, CHAN_Z );
84363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
8452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
8462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
8472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp4 = emit_fetch( bld, inst, 1, CHAN_Y );
84863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
85090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = tmp0;
85190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_mul( &bld->base, tmp2, tmp1);
85290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = tmp3;
85390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
85490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_sub( &bld->base, tmp2, tmp5);
8552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, tmp2);
85663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
8582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
8592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 1, CHAN_X );
8602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp5 = emit_fetch( bld, inst, 0, CHAN_X );
86163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
86390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_mul( &bld->base, tmp3, tmp2);
86490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp1 = lp_build_mul( &bld->base, tmp1, tmp5);
86590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_sub( &bld->base, tmp3, tmp1);
8662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, tmp3);
86763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
86990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
87090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp2);
87190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_sub( &bld->base, tmp5, tmp0);
8722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, tmp5);
87363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
87590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = bld->base.one;
8762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
87763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
87863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
87963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
88063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ABS:
8812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
88390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_abs( &bld->base, tmp0 ) ;
8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
88563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
88663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
88763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
88863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCC:
88963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
89063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
89163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
89263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DPH:
8932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
8942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
89590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
8962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
8972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
89890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
89990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
9002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
9012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
90290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
90390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
9042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_W );
90590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
9062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
90863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
90963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
91063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
91163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_COS:
9122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
91390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_cos( &bld->base, tmp0 );
9142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
91663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
91763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
91863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
91963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDX:
92063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
92163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
92263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
92363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDY:
92463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
92563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
92663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
92790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
92863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KILP:
92963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* predicated kill */
93063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_kilp( bld );
93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0; /* XXX fix me */
93263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
9337821664b15501b173b2304bbada758c33c5ff972José Fonseca#endif
93463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
93563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KIL:
93663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* conditional kill */
9372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_kil( bld, inst );
93863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
93963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2H:
94163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
94263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
94363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2US:
94563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
94663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
94763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4B:
94963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
95063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
95163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
95263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4UB:
95363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
95463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
95563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
95663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RFL:
95763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
95863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
95963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
96063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SEQ:
9612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9641aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 );
9651aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9671aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
96863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
96963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
97063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SFL:
97163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
97263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
97363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
97463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGT:
9752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9781aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 );
9791aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9811aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
98263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
98363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SIN:
9852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
98690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_sin( &bld->base, tmp0 );
9872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
98963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
99063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
99163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
99263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLE:
9932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9961aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 );
9971aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9991aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
100063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
100163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SNE:
10032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10061aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 );
10071aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
10082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
10091aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
101063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
101263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_STR:
101363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
101463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
101663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TEX:
101763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, FALSE, FALSE );
101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXD:
102163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
102263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2H:
102563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
102663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2US:
102963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
103063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
103263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4B:
103363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
103463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
103663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4UB:
103763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
103863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_X2D:
104163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
104263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARA:
104563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
104663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
104963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARR:
10502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
105263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_rnd( bld, 0, 0 );
105363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
10542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
105790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif
105863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
105963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRA:
106063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
106163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CAL:
106463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
106663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
106790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
106863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RET:
106963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_ret( bld );
107063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_END:
107463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
107763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SSG:
107863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SGN */
10792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
108163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_sgn( bld, 0, 0 );
10822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
108363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
108463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
10851aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca#endif
108663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
108763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CMP:
10882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
10921aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero );
10931aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, src1, src2);
10942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
10951aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
109663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
109763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
109863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SCS:
10992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
11002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
110190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_cos( &bld->base, tmp0 );
11022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, tmp0);
110363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
11052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
110690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sin( &bld->base, tmp0 );
11072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, tmp0);
110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1110ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp0 = bld->base.zero;
11112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, tmp0);
111263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
11132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1114ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp0 = bld->base.one;
11152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
111663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
111763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
111863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
111963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXB:
112063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE );
112163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
112263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
112363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM:
112463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* fall-through */
112563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM4:
112663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* 3 or 4-component normalization */
112763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      {
112863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4;
112963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) ||
11312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) ||
11322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) ||
11332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) {
113463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */
113663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm4 = src.x */
113863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = src.x * src.x */
11392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
11402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
114190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = tmp0;
114263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
114390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_mul( &bld->base, tmp0, tmp0);
114463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
114563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm5 = src.y */
114663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.y * src.y */
11472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Y);
11482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
114990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = tmp1;
115063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
115190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
115290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
115363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm6 = src.z */
115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.z * src.z */
11562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Z);
11572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
115890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = tmp1;
115963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
116090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
116190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
116263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            if (dims == 4) {
116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm7 = src.w */
116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm0 = xmm0 + src.w * src.w */
11662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               tmp1 = emit_fetch(bld, inst, 0, CHAN_W);
11672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) {
116890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca                  tmp7 = tmp1;
116963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
117090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
117190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
117263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm1 = 1 / sqrt(xmm0) */
117590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_rsqrt( &bld->base, tmp0);
117663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.x = xmm1 * src.x */
11782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
117990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = lp_build_mul( &bld->base, tmp4, tmp1);
11802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_X, tmp4);
118163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
118263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.y = xmm1 * src.y */
11842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
118590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = lp_build_mul( &bld->base, tmp5, tmp1);
11862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_Y, tmp5);
118763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.z = xmm1 * src.z */
11902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
119190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = lp_build_mul( &bld->base, tmp6, tmp1);
11922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_Z, tmp6);
119363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
119463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.w = xmm1 * src.w */
11962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) {
119790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp7 = lp_build_mul( &bld->base, tmp7, tmp1);
11982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_W, tmp7);
119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
120063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
120163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
120263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* dst0.w = 1.0 */
12032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) {
120490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = bld->base.one;
12052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store(bld, inst, 0, CHAN_W, tmp0);
120663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
120763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
120863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DIV:
121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
121263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
121363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2:
12152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
12162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
121790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
12182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
12192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
122090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
122190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
12222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);  /* dest[ch] = xmm0 */
122463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
122563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXL:
122863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE );
122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXP:
123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, FALSE, TRUE );
123363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRK:
123663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
123763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_IF:
124063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
124163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOOP:
124463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
124563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_REP:
124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ELSE:
125263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
125363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDIF:
125663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
125763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDLOOP:
126063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
126163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDREP:
126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
126563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
126663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PUSHA:
126863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
126963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POPA:
127263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
127363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CEIL:
127663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
127763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_I2F:
128063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
128163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NOT:
128463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TRUNC:
12892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
129163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
129263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_i2f( bld, 0 );
12932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif
129763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHL:
129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHR:
130363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
130463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_AND:
130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
130863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_OR:
131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOD:
131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XOR:
131963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
132063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SAD:
132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXF:
132763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
132863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXQ:
133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
133263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CONT:
133563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EMIT:
133963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
134063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
134163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
134263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDPRIM:
134363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
134463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
134563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
134663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
134763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
134863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return 1;
135163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
135263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
135363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_declaration(
135563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
135663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_full_declaration *decl )
135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
135863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if( decl->Declaration.File == TGSI_FILE_INPUT ) {
135995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca      LLVMBuilderRef builder = bld->base.builder;
136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned first, last, mask;
136195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca      unsigned attrib, chan;
136263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      first = decl->DeclarationRange.First;
136463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      last = decl->DeclarationRange.Last;
136563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      mask = decl->Declaration.UsageMask;
136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca      for( attrib = first; attrib <= last; attrib++ ) {
136895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca         for( chan = 0; chan < NUM_CHANNELS; chan++ ) {
136995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca            LLVMValueRef input = bld->base.undef;
137063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca            if( mask & (1 << chan) ) {
13727c2dc3faa8e8ba99e29fcc09e7db39fc49d73200José Fonseca               LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), (1 + attrib)*NUM_CHANNELS + chan, 0);
137395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               LLVMValueRef a0;
137495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               LLVMValueRef dadx;
137595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               LLVMValueRef dady;
137663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
137795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               switch( decl->Declaration.Interpolate ) {
137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               case TGSI_INTERPOLATE_PERSPECTIVE:
13795999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca                  /* fall-through */
13805999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca
138195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               case TGSI_INTERPOLATE_LINEAR: {
138295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef dadx_ptr = LLVMBuildGEP(builder, bld->dadx_ptr, &index, 1, "");
138395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef dady_ptr = LLVMBuildGEP(builder, bld->dady_ptr, &index, 1, "");
1384b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  dadx = LLVMBuildLoad(builder, dadx_ptr, "");
1385b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  dady = LLVMBuildLoad(builder, dady_ptr, "");
1386b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  dadx = lp_build_broadcast_scalar(&bld->base, dadx);
1387b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  dady = lp_build_broadcast_scalar(&bld->base, dady);
13885999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca                  lp_build_name(dadx, "dadx_%u.%c", attrib, "xyzw"[chan]);
13895999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca                  lp_build_name(dady, "dady_%u.%c", attrib, "xyzw"[chan]);
13905999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca                  /* fall-through */
139195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               }
139295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
139395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               case TGSI_INTERPOLATE_CONSTANT: {
139495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef a0_ptr = LLVMBuildGEP(builder, bld->a0_ptr, &index, 1, "");
1395b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  a0 = LLVMBuildLoad(builder, a0_ptr, "");
1396b6f43b445b43188b10cb57e4cff0190ae2cee789José Fonseca                  a0 = lp_build_broadcast_scalar(&bld->base, a0);
13975999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca                  lp_build_name(a0, "a0_%u.%c", attrib, "xyzw"[chan]);
139863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  break;
139995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               }
140063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
140163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               default:
140295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  assert(0);
140395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  break;
140495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               }
140595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
140695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               input = a0;
140795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
140895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               if (decl->Declaration.Interpolate != TGSI_INTERPOLATE_CONSTANT) {
140995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  input = lp_build_add(&bld->base, input, lp_build_mul(&bld->base, bld->x, dadx));
141095f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  input = lp_build_add(&bld->base, input, lp_build_mul(&bld->base, bld->y, dady));
141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
141295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
141395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               if (decl->Declaration.Interpolate == TGSI_INTERPOLATE_PERSPECTIVE) {
141495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  if(!bld->oow)
141595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                     bld->oow = lp_build_rcp(&bld->base, bld->w);
141695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  input = lp_build_mul(&bld->base, input, bld->oow);
141795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca               }
141895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
14195999ebfb69a47fa12d1f534871ea01a3f889f62fJosé Fonseca               lp_build_name(input, "input%u.%c", attrib, "xyzw"[chan]);
142063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
142195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca
142295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca            bld->inputs[attrib][chan] = input;
142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
142663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
142763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1428c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca
1429c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid
143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder,
143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  const struct tgsi_token *tokens,
143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  union lp_type type,
14333d7a88674f9eb3320eeff511968f041426e25023José Fonseca                  struct lp_build_mask_context *mask,
143495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef *pos,
143595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef a0_ptr,
143695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef dadx_ptr,
143795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca                  LLVMValueRef dady_ptr,
143863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef consts_ptr,
143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef (*outputs)[4],
144063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef samplers_ptr)
144163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
144263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context bld;
144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_parse_context parse;
144463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint num_immediates = 0;
144563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
144663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
144763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* Setup build context */
144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   memset(&bld, 0, sizeof bld);
144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_context_init(&bld.base, builder, type);
1450c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca   bld.mask = mask;
145195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.x = pos[0];
145295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.y = pos[1];
145395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.w = pos[3];
145495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.a0_ptr = a0_ptr;
145595f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.dadx_ptr = dadx_ptr;
145695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   bld.dady_ptr = dady_ptr;
145763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.outputs = outputs;
145863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.consts_ptr = consts_ptr;
145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.samplers_ptr = samplers_ptr;
146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_init( &parse, tokens );
146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   while( !tgsi_parse_end_of_tokens( &parse ) ) {
146463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      tgsi_parse_token( &parse );
146563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch( parse.FullToken.Token.Type ) {
146763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_DECLARATION:
146863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if (parse.FullHeader.Processor.Processor == TGSI_PROCESSOR_FRAGMENT) {
146963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            emit_declaration( &bld, &parse.FullToken.FullDeclaration );
147063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
147163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
147263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
147363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_INSTRUCTION:
147463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if (!emit_instruction( &bld, &parse.FullToken.FullInstruction )) {
14752c90652ed9e119f09af6757c59d10273894ba590José Fonseca            unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
14762c90652ed9e119f09af6757c59d10273894ba590José Fonseca            const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode);
14772c90652ed9e119f09af6757c59d10273894ba590José Fonseca	    _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n",
14782c90652ed9e119f09af6757c59d10273894ba590José Fonseca	                  info ? info->mnemonic : "<invalid>");
147963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca	 }
148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
148163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
148263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_IMMEDIATE:
148363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* simply copy the immediate values into the next immediates[] slot */
148463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         {
148563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
148663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(size <= 4);
148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(num_immediates < LP_MAX_IMMEDIATES);
148863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = 0; i < size; ++i )
148963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] =
149063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  lp_build_const_uni(type, parse.FullToken.FullImmediate.u[i].Float);
149163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = size; i < 4; ++i )
149263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] = bld.base.undef;
149363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            num_immediates++;
149463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
149563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
149963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
150063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
150163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_free( &parse );
150363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1505