lp_bld_tgsi_soa.c revision ba33ef00118d1c6017585af1498b89e99fe045be
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 )\ 675b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell ((INST)->Dst[0].Register.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 8186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT 0 8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT 1 8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT 2 8486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3 8586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 8663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context 8863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 8963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_context base; 9063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 9163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr; 92f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos; 93f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS]; 9495f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS]; 95c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca 968be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca struct lp_build_sampler_soa *sampler; 9763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 9895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS]; 9995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS]; 1001929057eac0c3351e0810612bdae56331a235736José Fonseca 1013d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask; 10263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}; 10363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 10463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 10586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 10686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = { 10786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_LEFT, 10886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_LEFT 10986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 11086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 11186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 11286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = { 11386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_RIGHT, QUAD_TOP_RIGHT, 11486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT 11586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 11686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 11786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 11886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = { 11986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT, 12086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT 12186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 12286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 12386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 12486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = { 12586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT, 12686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT 12786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 12886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 12986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 13086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 13186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld, 13286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 13386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 13486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_left = lp_build_swizzle1_aos(&bld->base, src, swizzle_left); 13586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right); 13686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_right, src_left); 13786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 13886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 13986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld, 14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 14386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 14486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_top = lp_build_swizzle1_aos(&bld->base, src, swizzle_top); 14586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom); 14686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_top, src_bottom); 14786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 14886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 14986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 15063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 15163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch. 15263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 15363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef 15463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch( 15563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 1562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst, 1572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 15863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const unsigned chan_index ) 15963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 1607d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[index]; 161b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 16263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef res; 16363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 16463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (swizzle) { 165b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_X: 166b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Y: 167b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Z: 168b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_W: 16963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 17091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell switch (reg->Register.File) { 17163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_CONSTANT: { 17291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0); 17363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, ""); 17463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, ""); 17563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_broadcast_scalar(&bld->base, scalar); 17663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 17763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 17863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 17963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_IMMEDIATE: 18091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->immediates[reg->Register.Index][swizzle]; 18163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 18263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 18363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 18463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_INPUT: 18591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->inputs[reg->Register.Index][swizzle]; 18663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 18763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 18863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 18963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_TEMPORARY: 19091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->temps[reg->Register.Index][swizzle]; 19163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(!res) 19263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return bld->base.undef; 19363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 19463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 19563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 19663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 1974d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 19863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 19963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 20063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 20163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 20263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 2034d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 20463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 20563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 20663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) { 20763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_CLEAR: 20863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 20963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 21063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 21163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_SET: 2121fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* TODO: Use bitwese OR for floating point */ 21363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 21463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 21563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 21663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 21763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_TOGGLE: 21863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 21963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 22063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 22163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_KEEP: 22263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 22363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 22463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 22563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return res; 22663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 22763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 22863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 22963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 23086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives. 23186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */ 23286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void 23386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv( 23486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca struct lp_build_tgsi_soa_context *bld, 23586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const struct tgsi_full_instruction *inst, 23686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca unsigned index, 23786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const unsigned chan_index, 23886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *res, 23986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddx, 24086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddy) 24186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 24286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src; 24386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 24486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca src = emit_fetch(bld, inst, index, chan_index); 24586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 24686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(res) 24786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *res = src; 24886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 24986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca /* TODO: use interpolation coeffs for inputs */ 25086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 25186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddx) 25286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddx = emit_ddx(bld, src); 25386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 25486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddy) 25586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddy = emit_ddy(bld, src); 25686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 25786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 25886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 25986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/** 26063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store. 26163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 26263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 26363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store( 26463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 26563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 2662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 26763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index, 26863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef value) 26963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 2707d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[index]; 2712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca 27263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( inst->Instruction.Saturate ) { 27363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_NONE: 27463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 27563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 27663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_ZERO_ONE: 2777926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_max(&bld->base, value, bld->base.zero); 2787926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 27963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 28063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 28163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_MINUS_PLUS_ONE: 28277b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca value = lp_build_max(&bld->base, value, lp_build_const_scalar(bld->base.type, -1.0)); 2837926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 28463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 2857926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca 2867926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca default: 2877926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca assert(0); 28863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 28963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 2905b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch( reg->Register.File ) { 29163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_OUTPUT: 2925b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell bld->outputs[reg->Register.Index][chan_index] = value; 29363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 29463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 29563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_TEMPORARY: 2965b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell bld->temps[reg->Register.Index][chan_index] = value; 29763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 29863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 29963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_ADDRESS: 30063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* FIXME */ 30163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 30263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 30363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 30463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 30563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 30663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 30763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 30863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 30963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 31063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 31163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators. 31263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 31363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 31486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 31563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 31663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld, 31763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 31863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca boolean apply_lodbias, 319faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca boolean projected, 320faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef *texel) 32163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 32291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell const uint unit = inst->Src[1].Register.Index; 32363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef lodbias; 32431d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee LLVMValueRef oow = NULL; 325c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca LLVMValueRef coords[3]; 326c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca unsigned num_coords; 32763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 32863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 3297d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell switch (inst->Texture.Texture) { 33063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_1D: 331c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 1; 33263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 33363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_2D: 33463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_RECT: 335c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 2; 33663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 337f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW1D: 338f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW2D: 339f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOWRECT: 34063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_3D: 34163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_CUBE: 342c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 3; 34363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 34463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 34563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 34663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return; 34763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 34863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 34963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(apply_lodbias) 3502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca lodbias = emit_fetch( bld, inst, 0, 3 ); 35163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca else 35263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lodbias = bld->base.zero; 35363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 35463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (projected) { 3552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca oow = emit_fetch( bld, inst, 0, 3 ); 35663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca oow = lp_build_rcp(&bld->base, oow); 35763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 35863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 359c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca for (i = 0; i < num_coords; i++) { 360c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = emit_fetch( bld, inst, 0, i ); 36163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (projected) 362c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = lp_build_mul(&bld->base, coords[i], oow); 36363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 364ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca for (i = num_coords; i < 3; i++) { 365ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca coords[i] = bld->base.undef; 366ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca } 36763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 3688be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->sampler->emit_fetch_texel(bld->sampler, 3698be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.builder, 3708be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.type, 3718be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca unit, num_coords, coords, lodbias, 3728be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca texel); 37363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 37463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 37563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 37663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 37763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil( 37863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 3792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst ) 38063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 3817d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[0]; 3827821664b15501b173b2304bbada758c33c5ff972José Fonseca LLVMValueRef terms[NUM_CHANNELS]; 3833d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef mask; 38463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 3867821664b15501b173b2304bbada758c33c5ff972José Fonseca memset(&terms, 0, sizeof terms); 38763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( chan_index ) { 38963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned swizzle; 39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 3917821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Unswizzle channel */ 392b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 39363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 3947821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Check if the component has not been already tested. */ 3957821664b15501b173b2304bbada758c33c5ff972José Fonseca assert(swizzle < NUM_CHANNELS); 3967821664b15501b173b2304bbada758c33c5ff972José Fonseca if( !terms[swizzle] ) 3977821664b15501b173b2304bbada758c33c5ff972José Fonseca /* TODO: change the comparison operator instead of setting the sign */ 3982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca terms[swizzle] = emit_fetch(bld, inst, 0, chan_index ); 39963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 40063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4013d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = NULL; 4027821664b15501b173b2304bbada758c33c5ff972José Fonseca FOR_EACH_CHANNEL( chan_index ) { 403aede39efd86d200ffbace8fc012104e31f673973José Fonseca if(terms[chan_index]) { 4043d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef chan_mask; 405aede39efd86d200ffbace8fc012104e31f673973José Fonseca 4063d7a88674f9eb3320eeff511968f041426e25023José Fonseca chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero); 407aede39efd86d200ffbace8fc012104e31f673973José Fonseca 4083d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 4093d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, ""); 4103d7a88674f9eb3320eeff511968f041426e25023José Fonseca else 4113d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = chan_mask; 412aede39efd86d200ffbace8fc012104e31f673973José Fonseca } 41363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 4143d7a88674f9eb3320eeff511968f041426e25023José Fonseca 4153d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 4163d7a88674f9eb3320eeff511968f041426e25023José Fonseca lp_build_mask_update(bld->mask, mask); 41763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 41863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 41963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 42063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 42163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Check if inst src/dest regs use indirect addressing into temporary 42263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * register file. 42363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic boolean 42563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaindirect_temp_reference(const struct tgsi_full_instruction *inst) 42663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 42763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint i; 42863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 4297d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[i]; 43091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (reg->Register.File == TGSI_FILE_TEMPORARY && 43191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell reg->Register.Indirect) 43263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return TRUE; 43363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (i = 0; i < inst->Instruction.NumDstRegs; i++) { 4357d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[i]; 4365b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell if (reg->Register.File == TGSI_FILE_TEMPORARY && 4375b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell reg->Register.Indirect) 43863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return TRUE; 43963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 44063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return FALSE; 44163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 44263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 44363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 44463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic int 44563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction( 44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 447faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_full_instruction *inst, 448faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_opcode_info *info) 44963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 45063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 45190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca LLVMValueRef src0, src1, src2; 452e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp0, tmp1, tmp2; 453e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp3 = NULL; 454e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp4 = NULL; 455e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp5 = NULL; 456e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp6 = NULL; 457e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp7 = NULL; 458faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef res; 459faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef dst0[NUM_CHANNELS]; 46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* we can't handle indirect addressing into temp register file yet */ 46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (indirect_temp_reference(inst)) 46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return FALSE; 46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 465faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca assert(info->num_dst <= 1); 466faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 467faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 468faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.undef; 469faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 470faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 471faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (inst->Instruction.Opcode) { 47363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0 47463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARL: 4751fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* FIXME */ 4762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 4772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_flr(bld, 0, 0); 47963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_f2it( bld, 0 ); 480faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 48163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 48263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 48363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif 48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 48563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOV: 4862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 487faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index ); 48863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 48963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 49063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 49163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LIT: 4922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) { 493faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 49463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 4952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 4962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 497faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero); 498ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca } 4992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 500ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = SrcReg[0].yyyy */ 5012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 502ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = max(XMM[1], 0) */ 503ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero); 504ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[2] = SrcReg[0].wwww */ 5052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 0, CHAN_W ); 506ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_pow( &bld->base, tmp1, tmp2); 5072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 508c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero); 509faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero); 510c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca } 5112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) { 512faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[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 ); 519faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rcp(&bld->base, src0); 5202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 521faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 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); 529faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rsqrt(&bld->base, src0); 5302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 531faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 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 )) 555faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 5562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 557faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp1; 5582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 559faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 56063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 56163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 5622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 563faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 56463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 56563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 56663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 56763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LOG: 5682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 5692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 5702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 571add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_floor_log2 = NULL; 572add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_exp = NULL; 573add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_log2 = NULL; 57457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 5752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 57657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca src0 = lp_build_abs( &bld->base, src0 ); 57757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 5782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 57957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_floor_log2 = &tmp0; 5802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 58157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp = &tmp1; 5822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 58357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_log2 = &tmp2; 58457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 58557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2); 58657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 58757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.x = floor(lg2(abs(src.x))) */ 5882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 589faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 59057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */ 5912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) { 592faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1); 59363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 59457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.z = lg2(abs(src.x)) */ 5952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 596faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 59763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 59863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 5992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 600faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 60163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 60263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 60363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 60463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MUL: 6052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 6062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 6072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 608faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_mul(&bld->base, src0, src1); 60963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 61063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 61163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 61263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ADD: 6132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 6142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 6152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 616faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add(&bld->base, src0, src1); 61763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 61863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 61963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 62063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP3: 62163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT3 */ 6222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 6232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 62490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 6252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 6262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 62790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 62890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 6292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 6302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 63190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 63290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 6332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 634faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 63563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 63663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP4: 63963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT4 */ 6402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 6412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 64290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 6432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 6442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 64590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 64690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 6472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 6482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 64990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 65090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 6512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_W ); 6522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_W ); 65390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 65490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 6552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 656faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 65763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 65863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 65963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 66063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DST: 6612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 662faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 66363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 6642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 6652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 6662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Y ); 667faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1); 66863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 6692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 670faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z ); 67163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 6722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 673faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W ); 67463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 67563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 67663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 67763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MIN: 6782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 6792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 6802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 681faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_min( &bld->base, src0, src1 ); 68263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 68363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 68463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 68563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAX: 6862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 6872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 6882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 689faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_max( &bld->base, src0, src1 ); 69063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 69163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 69263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLT: 69463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETLT */ 6952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 6962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 6972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 6981aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 ); 699faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 7001aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 70163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 70263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 70363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGE: 70463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETGE */ 7052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 7072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 7081aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 ); 709faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 7101aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 71163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 71263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 71363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAD: 71463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_MADD */ 7152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 7172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 7182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 2, chan_index ); 71990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 72090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp2); 721faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 72263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 72363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 72463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 72563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SUB: 7262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 7282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 729faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1); 73063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 73163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 73263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 73363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LRP: 7342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 7362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 7372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 73890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sub( &bld->base, src1, src2 ); 73990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, src0, tmp0 ); 740faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 ); 74163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 74263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 74363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CND: 745873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 746873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 747873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 748873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 749873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp1 = lp_build_const_scalar(bld->base.type, 0.5); 750873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1); 751faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 ); 752873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 75363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 75463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 75563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2A: 7562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 7572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 75890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 7592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 7602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 76190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 76290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 7632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 2, CHAN_X ); /* xmm1 = src[2].x */ 76490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 7652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 766faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 76763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 76863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 76963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 77063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FRC: 7712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 772873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 773873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_floor(&bld->base, src0); 774f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul tmp0 = lp_build_sub(&bld->base, src0, tmp0); 775faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 77663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 77763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 77863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 77963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CLAMP: 780873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 781873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 782873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 783873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 784873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_max(&bld->base, tmp0, src1); 785873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_min(&bld->base, tmp0, src2); 786faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 787873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 78863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 78963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 79063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FLR: 7912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 793faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_floor(&bld->base, tmp0); 79463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 79563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 79663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 79763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ROUND: 7982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 800faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_round(&bld->base, tmp0); 80163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 80263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 80363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 80490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca case TGSI_OPCODE_EX2: { 8052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 80690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_exp2( &bld->base, tmp0); 8072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 808faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 80963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 81190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca } 81263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 81363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LG2: 8142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 81590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_log2( &bld->base, tmp0); 8162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 817faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 81963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POW: 8222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 8232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, CHAN_X ); 824faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_pow( &bld->base, src0, src1 ); 8252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 826faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 82763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 82863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 82963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 83063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XPD: 8312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 8322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 8332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Z ); 8342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp3 = emit_fetch( bld, inst, 0, CHAN_Z ); 83563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 8362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 8372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 8382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 8392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp4 = emit_fetch( bld, inst, 1, CHAN_Y ); 84063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 8412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 84290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = tmp0; 84390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_mul( &bld->base, tmp2, tmp1); 84490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp3; 84590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 84690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_sub( &bld->base, tmp2, tmp5); 847faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp2; 84863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 8492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 8502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 8512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_X ); 8522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp5 = emit_fetch( bld, inst, 0, CHAN_X ); 85363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 8542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 85590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_mul( &bld->base, tmp3, tmp2); 85690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp5); 85790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_sub( &bld->base, tmp3, tmp1); 858faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp3; 85963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 8602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 86190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 86290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp2); 86390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_sub( &bld->base, tmp5, tmp0); 864faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp5; 86563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 8662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 867faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 86863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 86963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 87063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 87163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ABS: 8722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 874faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_abs( &bld->base, tmp0 ); 87563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 87663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 87763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 87863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCC: 879873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 880873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 88163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 88263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 88363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DPH: 8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 8852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 88690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 8872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 8882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 88990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 89090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 8912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 8922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 89390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 89490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 8952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_W ); 89690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 8972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 898faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 89963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 90063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 90163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 90263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_COS: 9032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 90490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_cos( &bld->base, tmp0 ); 9052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 906faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 90763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 90863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 90963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 91063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDX: 91186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 91286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL); 91386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 91463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 91563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 91663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDY: 91786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 91886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]); 91986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 92063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 92163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 92263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KILP: 92363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* predicated kill */ 9241fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* FIXME */ 9251fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca return 0; 92663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 92763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 92863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KIL: 92963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* conditional kill */ 9302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca emit_kil( bld, inst ); 93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 93263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 93363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2H: 93463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 93563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 93663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 93763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2US: 93863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 93963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 94063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 94163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4B: 94263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 94363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 94463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 94563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4UB: 94663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 94763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 94863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 94963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RFL: 95063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 95163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 95263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 95363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SEQ: 9542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 9571aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 ); 958faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 9591aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 96063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 96163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 96263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SFL: 963873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 964faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.zero; 965873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 96663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 96763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 96863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGT: 9692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 9721aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 ); 973faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 9741aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 97563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 97663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 97763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SIN: 9782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 97990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sin( &bld->base, tmp0 ); 9802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 981faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 98263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 98363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 98463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 98563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLE: 9862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 9891aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 ); 990faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 9911aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 99263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 99363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 99463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SNE: 9952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 9981aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 ); 999faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 10001aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 100163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 100263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 100363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_STR: 1004873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1005faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.one; 1006873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 100763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 100863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 100963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TEX: 1010faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, FALSE, FALSE, dst0 ); 101163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 101263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 101363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXD: 1014873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 101563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 101663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 101763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2H: 1019873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1020873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert (0); 102163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 102263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 102363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 102463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2US: 1025873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1026873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 102963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 103063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4B: 1031873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1032873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 103363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 103463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 103563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 103663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4UB: 1037873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1038873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 104063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 104163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 104263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_X2D: 1043873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1044873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 104563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 104663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 104863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARA: 1049873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1050873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 105163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 105263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 105363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 105490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0 105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARR: 1056873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 10572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 105963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_rnd( bld, 0, 0 ); 106063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_f2it( bld, 0 ); 1061faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif 106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRA: 1067873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1068873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 106963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 107063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CAL: 1073873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 107463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 107563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 107663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 107763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RET: 1078873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1079873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca return 0; 108063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 108163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 108263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_END: 108363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 108463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 108563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SSG: 108663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SGN */ 10872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1089faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 ); 109063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 109163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 109263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 109363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CMP: 10942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 10981aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero ); 1099faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2); 11001aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 110163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 110263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 110363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SCS: 11042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 11052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1106faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 ); 110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 11092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1110faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 ); 111163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1113faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = bld->base.zero; 111463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1116faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 111763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 111863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 111963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 112063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXB: 1121faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, TRUE, FALSE, dst0 ); 112263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 112363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 112463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM: 112563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* fall-through */ 112663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM4: 112763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* 3 or 4-component normalization */ 112863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 112963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4; 113063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) || 11322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) || 11332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) || 11342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) { 113563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */ 113763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm4 = src.x */ 113963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = src.x * src.x */ 11402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 11412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 114290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp4 = tmp0; 114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 114490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp0); 114563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 114663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm5 = src.y */ 114763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.y * src.y */ 11482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Y); 11492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 115090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp1; 115163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 115290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 115390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm6 = src.z */ 115663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.z * src.z */ 11572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Z); 11582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 115990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp6 = tmp1; 116063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 116190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 116290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 116363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (dims == 4) { 116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm7 = src.w */ 116663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.w * src.w */ 11672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_W); 11682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) { 116990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp7 = tmp1; 117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 117190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 117290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 117463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm1 = 1 / sqrt(xmm0) */ 117690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_rsqrt( &bld->base, tmp0); 117763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.x = xmm1 * src.x */ 11792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 1180faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1); 118163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 118263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 118363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.y = xmm1 * src.y */ 11842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 1185faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1); 118663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 118763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.z = xmm1 * src.z */ 11892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 1190faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1); 119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 119263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 119363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = xmm1 * src.w */ 11942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) { 1195faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1); 119663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 119863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1199faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca /* dst.w = 1.0 */ 12002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) { 1201faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 120263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 120363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 120463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 120563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 120663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DIV: 1207873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1208873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert( 0 ); 120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 121263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2: 12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 12142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 121590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 12162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 12172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 121890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 121990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 12202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1221faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 122263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 122363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 122463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 122563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXL: 1226faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, TRUE, FALSE, dst0 ); 122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 122863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXP: 1230faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, FALSE, TRUE, dst0 ); 123163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 123363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRK: 1234873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 123563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 123663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 123763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_IF: 1239873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 124063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 124163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1243f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_OPCODE_BGNFOR: 1244873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1245873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_REP: 1250873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1251873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 125263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 125363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ELSE: 1256873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 125763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 125863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 125963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 126063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDIF: 1261873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1265f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_OPCODE_ENDFOR: 1266873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1267873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 126863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 126963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 127063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 127163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDREP: 1272873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1273873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 127463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 127563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 127663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 127763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PUSHA: 1278873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1279873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 128063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 128163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 128263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POPA: 1284873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1285873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 128763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CEIL: 1290873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1291873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1292faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_ceil(&bld->base, tmp0); 1293873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 129663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_I2F: 1297873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1298873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 130163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NOT: 1303873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1304873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TRUNC: 13092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1311faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_trunc(&bld->base, tmp0); 131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 131363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SHL: 1316873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1317873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 131963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 132063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 13212c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol case TGSI_OPCODE_ISHR: 1322873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1323873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 132663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 132763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_AND: 1328873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1329873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 133263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 133363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_OR: 1334873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1335873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 133763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 133863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 133963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOD: 1340873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1341873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 134263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 134363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 134463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 134563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XOR: 1346873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1347873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 134863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 135063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 135163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SAD: 1352873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1353873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 135563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 135663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXF: 1358873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1359873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXQ: 1364873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1365873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 136763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CONT: 1370873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1371873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 137363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EMIT: 137663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 137763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDPRIM: 138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 138163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1383873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca case TGSI_OPCODE_NOP: 1384873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca break; 1385873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca 138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 138863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 138963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1390faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 1391faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1392faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_store( bld, inst, 0, chan_index, dst0[chan_index]); 1393faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1394faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1395faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 139663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 1; 139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 139863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1399c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca 1400c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid 140163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder, 140263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_token *tokens, 1403b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 14043d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask, 140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr, 1406f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos, 1407f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS], 1408f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS], 14098be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca struct lp_build_sampler_soa *sampler) 141063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context bld; 141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct tgsi_parse_context parse; 141363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint num_immediates = 0; 141463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 141563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* Setup build context */ 141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca memset(&bld, 0, sizeof bld); 141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lp_build_context_init(&bld.base, builder, type); 1419c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca bld.mask = mask; 1420f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.pos = pos; 1421f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.inputs = inputs; 142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.outputs = outputs; 142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.consts_ptr = consts_ptr; 14248be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld.sampler = sampler; 142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 142663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_init( &parse, tokens ); 142763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 142863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca while( !tgsi_parse_end_of_tokens( &parse ) ) { 142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_token( &parse ); 143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( parse.FullToken.Token.Type ) { 143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_DECLARATION: 14331fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* Inputs already interpolated */ 143463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_INSTRUCTION: 1437faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca { 14382c90652ed9e119f09af6757c59d10273894ba590José Fonseca unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode; 14392c90652ed9e119f09af6757c59d10273894ba590José Fonseca const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode); 1440faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, info )) 1441faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n", 1442faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca info ? info->mnemonic : "<invalid>"); 1443faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1444faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 144563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_IMMEDIATE: 144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* simply copy the immediate values into the next immediates[] slot */ 144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1; 145163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(size <= 4); 145263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(num_immediates < LP_MAX_IMMEDIATES); 145363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = 0; i < size; ++i ) 145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = 145577b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca lp_build_const_scalar(type, parse.FullToken.FullImmediate.u[i].Float); 145663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = size; i < 4; ++i ) 145763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = bld.base.undef; 145863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca num_immediates++; 145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 146363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 146463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 146563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_free( &parse ); 146863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 146963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1470