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