lp_bld_tgsi_soa.c revision 873773ee2b034e8df72ddfacc764915b8a76ebe2
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
8663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef consts_ptr;
87f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef *pos;
88f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   const LLVMValueRef (*inputs)[NUM_CHANNELS];
8995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef (*outputs)[NUM_CHANNELS];
90c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca
918be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   struct lp_build_sampler_soa *sampler;
9263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
9395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS];
9495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca   LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS];
951929057eac0c3351e0810612bdae56331a235736José Fonseca
963d7a88674f9eb3320eeff511968f041426e25023José Fonseca   struct lp_build_mask_context *mask;
9763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca};
9863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
9963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
10063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
10163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch.
10263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
10363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef
10463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch(
10563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
1062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst,
1072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
10863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const unsigned chan_index )
10963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
1102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_src_register *reg = &inst->FullSrcRegisters[index];
11163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned swizzle = tgsi_util_get_full_src_register_extswizzle( reg, chan_index );
11263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef res;
11363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
11463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (swizzle) {
11563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_X:
11663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_Y:
11763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_Z:
11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_W:
11963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
12063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch (reg->SrcRegister.File) {
12163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_CONSTANT: {
12263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->SrcRegister.Index*4 + swizzle, 0);
12363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, "");
12463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, "");
12563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = lp_build_broadcast_scalar(&bld->base, scalar);
12663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
12763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
12863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
12963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_IMMEDIATE:
13063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = bld->immediates[reg->SrcRegister.Index][swizzle];
13163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
13263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
13363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
13463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_INPUT:
13563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = bld->inputs[reg->SrcRegister.Index][swizzle];
13663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert(res);
13763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
13863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
13963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_FILE_TEMPORARY:
14063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         res = bld->temps[reg->SrcRegister.Index][swizzle];
14163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if(!res)
14263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            return bld->base.undef;
14363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
14463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
14563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
14663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
1474d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca         return bld->base.undef;
14863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
14963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
15063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
15163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_ZERO:
15263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = bld->base.zero;
15363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
15463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
15563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_EXTSWIZZLE_ONE:
15663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = bld->base.one;
15763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
15863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
15963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
16063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
1614d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca      return bld->base.undef;
16263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
16363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) {
16563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_CLEAR:
16663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
16763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
16863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
16963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_SET:
1701fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* TODO: Use bitwese OR for floating point */
17163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = lp_build_abs( &bld->base, res );
17263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
17363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
17463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
17563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_TOGGLE:
17663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      res = LLVMBuildNeg( bld->base.builder, res, "" );
17763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
17863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
17963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_UTIL_SIGN_KEEP:
18063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
18163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
18263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return res;
18463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
18563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
18763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
18863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store.
18963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
19063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
19163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store(
19263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
19363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const struct tgsi_full_instruction *inst,
1942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   unsigned index,
19563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index,
19663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef value)
19763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
1982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_dst_register *reg = &inst->FullDstRegisters[index];
1992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca
20063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( inst->Instruction.Saturate ) {
20163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_NONE:
20263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
20363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
20463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_ZERO_ONE:
2057926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_max(&bld->base, value, bld->base.zero);
2067926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
20763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
20863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
20963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_SAT_MINUS_PLUS_ONE:
21077b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca      value = lp_build_max(&bld->base, value, lp_build_const_scalar(bld->base.type, -1.0));
2117926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      value = lp_build_min(&bld->base, value, bld->base.one);
21263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
2137926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca
2147926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca   default:
2157926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca      assert(0);
21663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
21763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
21863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch( reg->DstRegister.File ) {
21963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_OUTPUT:
22063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      bld->outputs[reg->DstRegister.Index][chan_index] = value;
22163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
22263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
22363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_TEMPORARY:
22463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      bld->temps[reg->DstRegister.Index][chan_index] = value;
22563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
22663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
22763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_FILE_ADDRESS:
22863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* FIXME */
22963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
23063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
23163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
23263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
23363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert( 0 );
23463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
23563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
23663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
23763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
23863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
23963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators.
24063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
24163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
24263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
24363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld,
24463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          const struct tgsi_full_instruction *inst,
24563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          boolean apply_lodbias,
24663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          boolean projected)
24763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
24863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   const uint unit = inst->FullSrcRegisters[1].SrcRegister.Index;
24963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef lodbias;
25063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   LLVMValueRef oow;
251c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   LLVMValueRef coords[3];
252c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   LLVMValueRef texel[4];
253c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   unsigned num_coords;
25463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
25563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
25663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->InstructionExtTexture.Texture) {
25763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_1D:
258c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 1;
25963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
26063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_2D:
26163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_RECT:
262c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 2;
26363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
264f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW1D:
265f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOW2D:
266f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_TEXTURE_SHADOWRECT:
26763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_3D:
26863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_TEXTURE_CUBE:
269c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      num_coords = 3;
27063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
27163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
27263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      assert(0);
27363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return;
27463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
27563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
27663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if(apply_lodbias)
2772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      lodbias = emit_fetch( bld, inst, 0, 3 );
27863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   else
27963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      lodbias = bld->base.zero;
28063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
28163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (projected) {
2822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      oow = emit_fetch( bld, inst, 0, 3 );
28363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      oow = lp_build_rcp(&bld->base, oow);
28463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
28563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
286c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca   for (i = 0; i < num_coords; i++) {
287c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      coords[i] = emit_fetch( bld, inst, 0, i );
28863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (projected)
289c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca         coords[i] = lp_build_mul(&bld->base, coords[i], oow);
29063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
29163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
2928be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld->sampler->emit_fetch_texel(bld->sampler,
2938be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.builder,
2948be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  bld->base.type,
2958be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  unit, num_coords, coords, lodbias,
2968be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                                  texel);
29763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
2982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   FOR_EACH_DST0_ENABLED_CHANNEL( inst, i ) {
299c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca      emit_store( bld, inst, 0, i, texel[i] );
30063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
30163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
30263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
30363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
30463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void
30563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil(
30663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
3072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_instruction *inst )
30863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
3092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca   const struct tgsi_full_src_register *reg = &inst->FullSrcRegisters[0];
3107821664b15501b173b2304bbada758c33c5ff972José Fonseca   LLVMValueRef terms[NUM_CHANNELS];
3113d7a88674f9eb3320eeff511968f041426e25023José Fonseca   LLVMValueRef mask;
31263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
31363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3147821664b15501b173b2304bbada758c33c5ff972José Fonseca   memset(&terms, 0, sizeof terms);
31563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
31663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   FOR_EACH_CHANNEL( chan_index ) {
31763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      unsigned swizzle;
31863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3197821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Unswizzle channel */
3207821664b15501b173b2304bbada758c33c5ff972José Fonseca      swizzle = tgsi_util_get_full_src_register_extswizzle( reg, chan_index );
32163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3227821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Note that we test if the value is less than zero, so 1.0 and 0.0 need
3237821664b15501b173b2304bbada758c33c5ff972José Fonseca       * not to be tested. */
3247821664b15501b173b2304bbada758c33c5ff972José Fonseca      if(swizzle == TGSI_EXTSWIZZLE_ZERO || swizzle == TGSI_EXTSWIZZLE_ONE)
3257821664b15501b173b2304bbada758c33c5ff972José Fonseca         continue;
32663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3277821664b15501b173b2304bbada758c33c5ff972José Fonseca      /* Check if the component has not been already tested. */
3287821664b15501b173b2304bbada758c33c5ff972José Fonseca      assert(swizzle < NUM_CHANNELS);
3297821664b15501b173b2304bbada758c33c5ff972José Fonseca      if( !terms[swizzle] )
3307821664b15501b173b2304bbada758c33c5ff972José Fonseca         /* TODO: change the comparison operator instead of setting the sign */
3312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         terms[swizzle] =  emit_fetch(bld, inst, 0, chan_index );
33263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
33363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
3343d7a88674f9eb3320eeff511968f041426e25023José Fonseca   mask = NULL;
3357821664b15501b173b2304bbada758c33c5ff972José Fonseca   FOR_EACH_CHANNEL( chan_index ) {
336aede39efd86d200ffbace8fc012104e31f673973José Fonseca      if(terms[chan_index]) {
3373d7a88674f9eb3320eeff511968f041426e25023José Fonseca         LLVMValueRef chan_mask;
338aede39efd86d200ffbace8fc012104e31f673973José Fonseca
3393d7a88674f9eb3320eeff511968f041426e25023José Fonseca         chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero);
340aede39efd86d200ffbace8fc012104e31f673973José Fonseca
3413d7a88674f9eb3320eeff511968f041426e25023José Fonseca         if(mask)
3423d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, "");
3433d7a88674f9eb3320eeff511968f041426e25023José Fonseca         else
3443d7a88674f9eb3320eeff511968f041426e25023José Fonseca            mask = chan_mask;
345aede39efd86d200ffbace8fc012104e31f673973José Fonseca      }
34663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
3473d7a88674f9eb3320eeff511968f041426e25023José Fonseca
3483d7a88674f9eb3320eeff511968f041426e25023José Fonseca   if(mask)
3493d7a88674f9eb3320eeff511968f041426e25023José Fonseca      lp_build_mask_update(bld->mask, mask);
35063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
35163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
35263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
35363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/**
35463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Check if inst src/dest regs use indirect addressing into temporary
35563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * register file.
35663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */
35763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic boolean
35863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaindirect_temp_reference(const struct tgsi_full_instruction *inst)
35963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
36063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint i;
36163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumSrcRegs; i++) {
36263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      const struct tgsi_full_src_register *reg = &inst->FullSrcRegisters[i];
36363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (reg->SrcRegister.File == TGSI_FILE_TEMPORARY &&
36463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          reg->SrcRegister.Indirect)
36563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
36663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
36763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   for (i = 0; i < inst->Instruction.NumDstRegs; i++) {
36863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      const struct tgsi_full_dst_register *reg = &inst->FullDstRegisters[i];
36963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      if (reg->DstRegister.File == TGSI_FILE_TEMPORARY &&
37063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca          reg->DstRegister.Indirect)
37163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         return TRUE;
37263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
37363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return FALSE;
37463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
37563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
37663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
37763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic int
37863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction(
37963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context *bld,
38063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_full_instruction *inst )
38163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
38263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned chan_index;
38390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef src0, src1, src2;
38490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7;
38590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   LLVMValueRef dst0;
38663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
38763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* we can't handle indirect addressing into temp register file yet */
38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   if (indirect_temp_reference(inst))
38963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return FALSE;
39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
39163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   switch (inst->Instruction.Opcode) {
39263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0
39363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARL:
3941fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* FIXME */
3952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
3962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
39763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_flr(bld, 0, 0);
39863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
3992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
40063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
40163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
40263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif
40363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
40463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOV:
40563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SWZ:
4062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
4072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
4082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
40963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
41063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
41163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
41263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LIT:
4132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) {
4142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, bld->base.one);
41563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
4162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
4172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
418c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         dst0 = lp_build_max( &bld->base, src0, bld->base.zero);
4192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, dst0);
420ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca      }
4212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
422ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = SrcReg[0].yyyy */
4232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
424ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[1] = max(XMM[1], 0) */
425ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero);
426ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         /* XMM[2] = SrcReg[0].wwww */
4272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 0, CHAN_W );
428ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp1 = lp_build_pow( &bld->base, tmp1, tmp2);
4292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
430c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero);
431c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca         dst0 = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero);
4322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, dst0);
433c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca      }
4342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) {
4352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, bld->base.one);
43663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
43763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
43863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
43963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCP:
44063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIP */
4412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
44290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      dst0 = lp_build_rcp(&bld->base, src0);
4432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
4442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
44563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
44763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
44863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RSQ:
44963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_RECIPSQRT */
4502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
45190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      src0 = lp_build_abs(&bld->base, src0);
45290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      dst0 = lp_build_rsqrt(&bld->base, src0);
4532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
4542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
45563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
45663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
45763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
45863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EXP:
4592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
4602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
4612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
46257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2_int_part = NULL;
46357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_frac_part = NULL;
46457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp2 = NULL;
46557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
4662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
46757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
4682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
46957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2_int_part = &tmp0;
4702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
47157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_frac_part = &tmp1;
4722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
47357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp2 = &tmp2;
47457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
47557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2);
47657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
4772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
4782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_X, tmp0);
4792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
4802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Y, tmp1);
4812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
4822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Z, tmp2);
48363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
4852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
48690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = bld->base.one;
4872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
48863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
48963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
49063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
49163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LOG:
4922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
4932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
4942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) {
49557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_floor_log2;
49657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_exp;
49757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         LLVMValueRef *p_log2;
49857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
4992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, CHAN_X );
50057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         src0 = lp_build_abs( &bld->base, src0 );
50157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
5022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
50357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_floor_log2 = &tmp0;
5042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ))
50557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_exp = &tmp1;
5062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
50757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            p_log2 = &tmp2;
50857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
50957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2);
51057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca
51157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.x = floor(lg2(abs(src.x))) */
5122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ))
5132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_X, tmp0);
51457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */
5152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) {
51657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca            tmp1 = lp_build_div( &bld->base, src0, tmp1);
5172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Y, tmp1);
51863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
51957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         /* dst.z = lg2(abs(src.x)) */
5202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ))
5212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store( bld, inst, 0, CHAN_Z, tmp2);
52263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
52363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* dst.w = 1.0 */
5242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) {
52557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca         tmp0 = bld->base.one;
5262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
52763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
52863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
52963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
53063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MUL:
5312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
5322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
5332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
53490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_mul(&bld->base, src0, src1);
5352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
53663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
53763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
53863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
53963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ADD:
5402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
5412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
5422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
54390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_add(&bld->base, src0, src1);
5442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
54563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
54663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
54763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
54863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP3:
54963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT3 */
5502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
5512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
55290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
5532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
5542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
55590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
55690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
5572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
5582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
55990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
56090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
5612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
5622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
56363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
56463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
56563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
56663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP4:
56763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_DOT4 */
5682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
5692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
57090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
5712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
5722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
57390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
57490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
5752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
5762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
57790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
57890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
5792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_W );
5802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_W );
58190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
58290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
5832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
5842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
58563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
58663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
58763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
58863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DST:
5892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
590ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp0 = bld->base.one;
5912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, tmp0);
59263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
5932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
5942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
5952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Y );
59690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
5972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, tmp0);
59863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
5992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
6002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Z );
6012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, tmp0);
60263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
6032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
6042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 1, CHAN_W );
6052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
60663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
60763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
60863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
60963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MIN:
6102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
61390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_min( &bld->base, src0, src1 );
6142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
61563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
61663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
61763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
61863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAX:
6192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
62290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_max( &bld->base, src0, src1 );
6232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
62463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
62563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
62663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
62763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLT:
62863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETLT */
6292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
6321aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 );
6331aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
6342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
6351aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
63663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGE:
63963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SETGE */
6402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
6431aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 );
6441aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
6452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
6461aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
64763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
64863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
64963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MAD:
65063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_MADD */
6512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
6532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
6542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 2, chan_index );
65590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
65690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_add( &bld->base, tmp0, tmp2);
6572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
65863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
65963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
66063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
66163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SUB:
6622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
6642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, chan_index );
66590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, tmp0, tmp1);
6662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
66763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
66863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
66963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
67063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LRP:
6712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
6722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
6732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
6742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
67590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sub( &bld->base, src1, src2 );
67690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, src0, tmp0 );
67790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         dst0 = lp_build_add( &bld->base, tmp0, src2 );
6782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
67963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
68063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
68163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
68263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CND:
683873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
684873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
685873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
686873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
687873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp1 = lp_build_const_scalar(bld->base.type, 0.5);
688873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1);
689873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, src0, src1 );
690873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
691873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
69263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
69463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2A:
6952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
6962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
69790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
6982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
6992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
70090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
70190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
7022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 2, CHAN_X );  /* xmm1 = src[2].x */
70390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
7042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);  /* dest[ch] = xmm0 */
70663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
70763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
70863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
70963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FRC:
7102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
711873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
712873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_floor(&bld->base, src0);
713873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_sub(&bld->base, tmp0, src0);
7142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
71563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
71663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
71763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
71863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CLAMP:
719873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
720873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
721873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
722873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
723873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_max(&bld->base, tmp0, src1);
724873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_min(&bld->base, tmp0, src2);
725873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
726873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
72763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
72863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
72963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_FLR:
7302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
732873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_floor(&bld->base, tmp0);
7332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
73463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
73563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
73663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
73763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ROUND:
7382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
740873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_round(&bld->base, tmp0);
7412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
74263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
74363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
74590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   case TGSI_OPCODE_EX2: {
7462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
74790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_exp2( &bld->base, tmp0);
7482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
75063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
75163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
75290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca   }
75363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
75463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_LG2:
7552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
75690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_log2( &bld->base, tmp0);
7572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
75963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
76063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
76163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
76263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POW:
7632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src0 = emit_fetch( bld, inst, 0, CHAN_X );
7642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      src1 = emit_fetch( bld, inst, 1, CHAN_X );
76590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      dst0 = lp_build_pow( &bld->base, src0, src1 );
7662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
7672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0 );
76863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
76963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
77063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
77163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XPD:
7722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
7732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) {
7742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp1 = emit_fetch( bld, inst, 1, CHAN_Z );
7752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp3 = emit_fetch( bld, inst, 0, CHAN_Z );
77663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
7772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ||
7782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
7792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_Y );
7802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp4 = emit_fetch( bld, inst, 1, CHAN_Y );
78163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
7822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
78390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = tmp0;
78490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_mul( &bld->base, tmp2, tmp1);
78590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = tmp3;
78690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
78790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp2 = lp_build_sub( &bld->base, tmp2, tmp5);
7882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, tmp2);
78963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
7902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ||
7912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca          IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) {
7922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp2 = emit_fetch( bld, inst, 1, CHAN_X );
7932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp5 = emit_fetch( bld, inst, 0, CHAN_X );
79463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
7952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
79690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_mul( &bld->base, tmp3, tmp2);
79790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp1 = lp_build_mul( &bld->base, tmp1, tmp5);
79890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp3 = lp_build_sub( &bld->base, tmp3, tmp1);
7992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, tmp3);
80063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
80290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_mul( &bld->base, tmp5, tmp4);
80390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_mul( &bld->base, tmp0, tmp2);
80490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp5 = lp_build_sub( &bld->base, tmp5, tmp0);
8052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, tmp5);
80663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
8072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
80890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = bld->base.one;
8092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
81163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
81263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
81363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ABS:
8142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
81690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_abs( &bld->base, tmp0 ) ;
8172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
81963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RCC:
822873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
823873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
82463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
82563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
82663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DPH:
8272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
8282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );
82990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);
8302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );
8312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );
83290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
83390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
8342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Z );
8352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Z );
83690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);
83790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
8382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_W );
83990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
8402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
84263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
84363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
84463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
84563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_COS:
8462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
84790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_cos( &bld->base, tmp0 );
8482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
85063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
85163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
85263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
85363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDX:
854873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
85563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
85663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
85763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
85863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DDY:
859873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
86063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
86163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
86263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
86363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KILP:
86463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* predicated kill */
8651fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      /* FIXME */
8661fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca      return 0;
86763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
86863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
86963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_KIL:
87063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* conditional kill */
8712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      emit_kil( bld, inst );
87263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
87363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
87463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2H:
87563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
87663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
87763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
87863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK2US:
87963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
88063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
88163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
88263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4B:
88363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
88463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
88563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
88663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PK4UB:
88763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
88863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
88963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
89063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RFL:
89163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
89263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
89363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
89463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SEQ:
8952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
8962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
8972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
8981aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 );
8991aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9011aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
90263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
90363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
90463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SFL:
905873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
906873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         dst0 = bld->base.zero;
907873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
908873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
90963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
91063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
91163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SGT:
9122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9151aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 );
9161aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9181aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
91963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
92063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
92163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SIN:
9222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
92390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_sin( &bld->base, tmp0 );
9242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
92663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
92763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
92863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
92963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SLE:
9302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9331aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 );
9341aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9361aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
93763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
93863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
93963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SNE:
9402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
9412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
9422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
9431aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 );
9441aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero );
9452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
9461aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
94763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
94863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
94963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_STR:
950873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
951873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         dst0 = bld->base.one;
952873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
953873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
95463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
95563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
95663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TEX:
95763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, FALSE, FALSE );
95863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
95963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
96063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXD:
961873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
96263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
96363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
96463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
96563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2H:
966873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
967873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert (0);
96863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
96963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
97063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
97163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP2US:
972873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
973873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
97463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
97563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
97663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
97763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4B:
978873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
979873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
98063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
98163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
98263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_UP4UB:
984873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
985873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
98663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
98763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
98863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
98963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_X2D:
990873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
991873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
99263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
99363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
99463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
99563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARA:
996873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
997873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
99863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
99963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
100063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
100190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0
100263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ARR:
1003873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
10042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
100663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_rnd( bld, 0, 0 );
100763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         emit_f2it( bld, 0 );
10082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
100963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
101063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif
101263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
101363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRA:
1014873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1015873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
101663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
101763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
101963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CAL:
1020873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
102163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
102263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_RET:
1025873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
1026873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      return 0;
102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
102963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_END:
103063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
103163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
103263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SSG:
103363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* TGSI_OPCODE_SGN */
10342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1036873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
1037873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_sgn( &bld->base, tmp0 );
10382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
104063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
104163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
104263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CMP:
10432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
10442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src0 = emit_fetch( bld, inst, 0, chan_index );
10452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src1 = emit_fetch( bld, inst, 1, chan_index );
10462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         src2 = emit_fetch( bld, inst, 2, chan_index );
10471aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero );
10481aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca         dst0 = lp_build_select( &bld->base, tmp0, src1, src2);
10492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, dst0);
10501aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca      }
105163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
105263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
105363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SCS:
10542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) {
10552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
105690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_cos( &bld->base, tmp0 );
10572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_X, tmp0);
105863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) {
10602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, CHAN_X );
106190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca         tmp0 = lp_build_sin( &bld->base, tmp0 );
10622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Y, tmp0);
106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) {
1065ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp0 = bld->base.zero;
10662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_Z, tmp0);
106763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
10682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) {
1069ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca         tmp0 = bld->base.one;
10702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, CHAN_W, tmp0);
107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXB:
107563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE );
107663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
107763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
107863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM:
107963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* fall-through */
108063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NRM4:
108163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      /* 3 or 4-component normalization */
108263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      {
108363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4;
108463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
10852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) ||
10862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) ||
10872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) ||
10882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca             (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) {
108963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
109063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */
109163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
109263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm4 = src.x */
109363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = src.x * src.x */
10942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp0 = emit_fetch(bld, inst, 0, CHAN_X);
10952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
109690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = tmp0;
109763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
109890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_mul( &bld->base, tmp0, tmp0);
109963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm5 = src.y */
110163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.y * src.y */
11022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Y);
11032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
110490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = tmp1;
110563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
110690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
110790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
110963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm6 = src.z */
111063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm0 = xmm0 + src.z * src.z */
11112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            tmp1 = emit_fetch(bld, inst, 0, CHAN_Z);
11122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
111390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = tmp1;
111463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
111590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
111690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
111763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
111863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            if (dims == 4) {
111963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm7 = src.w */
112063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               /* xmm0 = xmm0 + src.w * src.w */
11212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               tmp1 = emit_fetch(bld, inst, 0, CHAN_W);
11222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) {
112390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca                  tmp7 = tmp1;
112463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               }
112590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp1 = lp_build_mul( &bld->base, tmp1, tmp1);
112690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp0 = lp_build_add( &bld->base, tmp0, tmp1);
112763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
112863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
112963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* xmm1 = 1 / sqrt(xmm0) */
113090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp1 = lp_build_rsqrt( &bld->base, tmp0);
113163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.x = xmm1 * src.x */
11332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) {
113490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp4 = lp_build_mul( &bld->base, tmp4, tmp1);
11352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_X, tmp4);
113663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
113763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
113863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.y = xmm1 * src.y */
11392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) {
114090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp5 = lp_build_mul( &bld->base, tmp5, tmp1);
11412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_Y, tmp5);
114263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
114463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.z = xmm1 * src.z */
11452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) {
114690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp6 = lp_build_mul( &bld->base, tmp6, tmp1);
11472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_Z, tmp6);
114863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
114963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
115063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            /* dst.w = xmm1 * src.w */
11512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) {
115290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca               tmp7 = lp_build_mul( &bld->base, tmp7, tmp1);
11532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca               emit_store(bld, inst, 0, CHAN_W, tmp7);
115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            }
115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
115663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
115763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* dst0.w = 1.0 */
11582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) {
115990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca            tmp0 = bld->base.one;
11602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca            emit_store(bld, inst, 0, CHAN_W, tmp0);
116163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
116263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
116363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DIV:
1166873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1167873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert( 0 );
116863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
116963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
117163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_DP2:
11722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp0 = emit_fetch( bld, inst, 0, CHAN_X );  /* xmm0 = src[0].x */
11732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 1, CHAN_X );  /* xmm1 = src[1].x */
117490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_mul( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 * xmm1 */
11752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp1 = emit_fetch( bld, inst, 0, CHAN_Y );  /* xmm1 = src[0].y */
11762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      tmp2 = emit_fetch( bld, inst, 1, CHAN_Y );  /* xmm2 = src[1].y */
117790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp1 = lp_build_mul( &bld->base, tmp1, tmp2);              /* xmm1 = xmm1 * xmm2 */
117890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca      tmp0 = lp_build_add( &bld->base, tmp0, tmp1);              /* xmm0 = xmm0 + xmm1 */
11792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
11802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);  /* dest[ch] = xmm0 */
118163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
118263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
118363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXL:
118563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, TRUE, FALSE );
118663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
118763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXP:
118963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      emit_tex( bld, inst, FALSE, TRUE );
119063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_BRK:
1193873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
119463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
119563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
119663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_IF:
1198873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
120063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
120163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1202f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_OPCODE_BGNFOR:
1203873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1204873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
120563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
120663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
120763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
120863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_REP:
1209873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1210873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
121263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
121363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ELSE:
1215873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
121663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
121763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
121863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
121963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDIF:
1220873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* FIXME */
122163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
122263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1224f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca   case TGSI_OPCODE_ENDFOR:
1225873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1226873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
122863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDREP:
1231873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated */
1232873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
123363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
123463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
123563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
123663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_PUSHA:
1237873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1238873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
124063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_POPA:
1243873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1244873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
124563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CEIL:
1249873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1250873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1251873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_ceil(&bld->base, tmp0);
1252873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
1253873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
125663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_I2F:
1257873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1258873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
125963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
126063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
126163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_NOT:
1263873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1264873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
126563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
126663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
126763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
126863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TRUNC:
12692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
12702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         tmp0 = emit_fetch( bld, inst, 0, chan_index );
1271873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = lp_build_trunc(&bld->base, tmp0);
12722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
127363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
127463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
127563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
127663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHL:
1277873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1278873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
128063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SHR:
1283873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1284873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
128763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_AND:
1289873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1290873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
129163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
129263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_OR:
1295873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1296873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
129763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
129863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_MOD:
1301873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1302873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
130363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
130463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_XOR:
1307873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1308873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
130963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
131063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_SAD:
1313873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1314873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXF:
1319873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1320873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
132163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
132263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_TXQ:
1325873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1326873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
132763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
132863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_CONT:
1331873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      /* deprecated? */
1332873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      assert(0);
133363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
133463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_EMIT:
133763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
133863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
133963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
134063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   case TGSI_OPCODE_ENDPRIM:
134163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
134263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      break;
134363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1344873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOISE1:
1345873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOISE2:
1346873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOISE3:
1347873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOISE4:
1348873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) {
1349873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         tmp0 = bld->base.zero;
1350873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca         emit_store( bld, inst, 0, chan_index, tmp0);
1351873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      }
1352873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      break;
1353873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca
1354873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca   case TGSI_OPCODE_NOP:
1355873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca      break;
1356873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca
135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   default:
135863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      return 0;
135963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   return 1;
136263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
136363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1364c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca
1365c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid
136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder,
136763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  const struct tgsi_token *tokens,
136863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  union lp_type type,
13693d7a88674f9eb3320eeff511968f041426e25023José Fonseca                  struct lp_build_mask_context *mask,
137063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca                  LLVMValueRef consts_ptr,
1371f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef *pos,
1372f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  const LLVMValueRef (*inputs)[NUM_CHANNELS],
1373f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca                  LLVMValueRef (*outputs)[NUM_CHANNELS],
13748be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca                  struct lp_build_sampler_soa *sampler)
137563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{
137663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct lp_build_tgsi_soa_context bld;
137763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   struct tgsi_parse_context parse;
137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   uint num_immediates = 0;
137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   unsigned i;
138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
138163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   /* Setup build context */
138263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   memset(&bld, 0, sizeof bld);
138363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   lp_build_context_init(&bld.base, builder, type);
1384c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca   bld.mask = mask;
1385f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.pos = pos;
1386f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca   bld.inputs = inputs;
138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.outputs = outputs;
138863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   bld.consts_ptr = consts_ptr;
13898be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca   bld.sampler = sampler;
139063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
139163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_init( &parse, tokens );
139263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
139363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   while( !tgsi_parse_end_of_tokens( &parse ) ) {
139463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      tgsi_parse_token( &parse );
139563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
139663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      switch( parse.FullToken.Token.Type ) {
139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_DECLARATION:
13981fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca         /* Inputs already interpolated */
139963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
140063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
140163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_INSTRUCTION:
140263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         if (!emit_instruction( &bld, &parse.FullToken.FullInstruction )) {
14032c90652ed9e119f09af6757c59d10273894ba590José Fonseca            unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode;
14042c90652ed9e119f09af6757c59d10273894ba590José Fonseca            const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode);
14052c90652ed9e119f09af6757c59d10273894ba590José Fonseca	    _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n",
14062c90652ed9e119f09af6757c59d10273894ba590José Fonseca	                  info ? info->mnemonic : "<invalid>");
140763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca	 }
140863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
140963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
141063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      case TGSI_TOKEN_TYPE_IMMEDIATE:
141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         /* simply copy the immediate values into the next immediates[] slot */
141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         {
141363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1;
141463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(size <= 4);
141563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            assert(num_immediates < LP_MAX_IMMEDIATES);
141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = 0; i < size; ++i )
141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] =
141877b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca                  lp_build_const_scalar(type, parse.FullToken.FullImmediate.u[i].Float);
141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            for( i = size; i < 4; ++i )
142063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca               bld.immediates[num_immediates][i] = bld.base.undef;
142163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca            num_immediates++;
142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         }
142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         break;
142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      default:
142663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca         assert( 0 );
142763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca      }
142863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   }
142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca   tgsi_parse_free( &parse );
143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}
143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca
1433