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