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