lp_bld_tgsi_soa.c revision 021e0dc78b15fab29e761012860276c2597c8d8f
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" 442410125d072faeb83c8373e676422f6c44c78febBrian Paul#include "tgsi/tgsi_dump.h" 457821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "tgsi/tgsi_info.h" 4663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_parse.h" 4763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_util.h" 4863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_exec.h" 49021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin#include "tgsi/tgsi_scan.h" 5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h" 5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h" 5263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h" 537821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h" 5463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h" 553d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h" 5663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h" 5780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h" 5863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_TEMPS 256 6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_IMMEDIATES 256 6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\ 6563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++) 6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 685b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN))) 6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( INST, CHAN )) 7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\ 7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( CHAN )\ 7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN ) 7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0 7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1 7963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2 8063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3 8163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT 0 8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT 1 8486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT 2 8586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3 8686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 8780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#define LP_TGSI_MAX_NESTING 16 8880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstruct lp_exec_mask { 9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_build_context *bld; 9180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin boolean has_mask; 9380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMTypeRef int_vec_type; 9580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef cond_stack[LP_TGSI_MAX_NESTING]; 9780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin int cond_stack_size; 9880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef cond_mask; 9980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 10018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef break_stack[LP_TGSI_MAX_NESTING]; 10118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int break_stack_size; 10218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef break_mask; 10318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 10418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef cont_stack[LP_TGSI_MAX_NESTING]; 10518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int cont_stack_size; 10618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef cont_mask; 10718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 10818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef loop_stack[LP_TGSI_MAX_NESTING]; 10918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int loop_stack_size; 11018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef loop_block; 11118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 11218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 11380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef exec_mask; 11480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}; 11563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context 11763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_context base; 11963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 12063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr; 121f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos; 122f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS]; 12395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS]; 124c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca 1258be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca struct lp_build_sampler_soa *sampler; 12663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 12795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS]; 12895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS]; 129ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin LLVMValueRef addr[LP_MAX_TEMPS][NUM_CHANNELS]; 1301929057eac0c3351e0810612bdae56331a235736José Fonseca 131021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin /* we allocate an array of temps if we have indirect 132021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin * addressing and then the temps above is unused */ 133021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temps_array; 134021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin boolean has_indirect_addressing; 135021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin 1363d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask; 13780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_exec_mask exec_mask; 13863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}; 13963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = { 14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_LEFT, 14386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_LEFT 14486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 14586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 14686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 14786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = { 14886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_RIGHT, QUAD_TOP_RIGHT, 14986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT 15086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 15186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 15286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 15386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = { 15486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT, 15586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT 15686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 15786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 15886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 15986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = { 16086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT, 16186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT 16286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 16386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 16480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld) 16580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 16680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->bld = bld; 16780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->has_mask = FALSE; 16880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack_size = 0; 16918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack_size = 0; 17018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_stack_size = 0; 17118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_stack_size = 0; 17280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 17380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->int_vec_type = lp_build_int_vec_type(mask->bld->type); 17480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 17580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 17680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask) 17780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 17818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->loop_stack_size) { 17918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin /*for loops we need to update the entire mask at runtime */ 18018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef tmp; 1817fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul assert(mask->break_mask); 18218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp = LLVMBuildAnd(mask->bld->builder, 18318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask, 18418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask, 18518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskcb"); 18618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = LLVMBuildAnd(mask->bld->builder, 18718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cond_mask, 18818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp, 18918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskfull"); 19018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } else 19118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = mask->cond_mask; 19218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 19318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 19418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->has_mask = (mask->cond_stack_size > 0 || 19518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack_size > 0); 19680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 19780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 19880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask, 19980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val) 20080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 20180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask; 20280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = LLVMBuildBitCast(mask->bld->builder, val, 20380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->int_vec_type, ""); 20480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 20580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 20680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 20780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 20880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask) 20980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 21080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef prev_mask = mask->cond_stack[mask->cond_stack_size - 1]; 211faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin LLVMValueRef inv_mask = LLVMBuildNot(mask->bld->builder, 212faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin mask->cond_mask, ""); 213faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 214faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin /* means that we didn't have any mask before and that 215faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin * we were fully enabled */ 216faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin if (mask->cond_stack_size <= 1) { 217faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin prev_mask = LLVMConstAllOnes(mask->int_vec_type); 218faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin } 219faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 22080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = LLVMBuildAnd(mask->bld->builder, 22180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin inv_mask, 22280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin prev_mask, ""); 22380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 22480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 22580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 22680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask) 22780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 22880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = mask->cond_stack[--mask->cond_stack_size]; 22980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 23080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 23180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 23218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_bgnloop(struct lp_exec_mask *mask) 23318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 23418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 23518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cont_stack_size == 0) 23618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask = LLVMConstAllOnes(mask->int_vec_type); 237bba6a196bb69afc72a9ec56740a312987e77afc2Brian Paul if (mask->break_stack_size == 0) 23818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask = LLVMConstAllOnes(mask->int_vec_type); 23918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cond_stack_size == 0) 24018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cond_mask = LLVMConstAllOnes(mask->int_vec_type); 2413a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin 2423a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin mask->break_stack[mask->break_stack_size++] = mask->break_mask; 2436d2e09fdc23e2573e9466f60db20ef4ac04b367dZack Rusin mask->cont_stack[mask->cont_stack_size++] = mask->cont_mask; 24418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack[mask->loop_stack_size++] = mask->loop_block; 24518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_block = lp_build_insert_new_block(mask->bld->builder, "bgnloop"); 24618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBuildBr(mask->bld->builder, mask->loop_block); 24718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMPositionBuilderAtEnd(mask->bld->builder, mask->loop_block); 24818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 24918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 25018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 25118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 25218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_break(struct lp_exec_mask *mask) 25318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 25418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder, 25518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 25618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "break"); 25718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 25818a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin /* mask->break_stack_size > 1 implies that we encountered a break 25918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * statemant already and if that's the case we want to make sure 26018a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * our mask is a combination of the previous break and the current 26118a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * execution mask */ 26218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->break_stack_size > 1) { 26318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask = LLVMBuildAnd(mask->bld->builder, 26418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask, 26518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin exec_mask, "break_full"); 26618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } else 26718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask = exec_mask; 26818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 26918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 27018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 27118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 27218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_continue(struct lp_exec_mask *mask) 27318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 27418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder, 27518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 27618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin ""); 27718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 27818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cont_stack_size > 1) { 27918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask = LLVMBuildAnd(mask->bld->builder, 28018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask, 28118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin exec_mask, ""); 28218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } else 28318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask = exec_mask; 28418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 28518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 28618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 28718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 28818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 28918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_endloop(struct lp_exec_mask *mask) 29018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 29118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef endloop; 292d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMTypeRef reg_type = LLVMIntType(mask->bld->type.width* 293d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca mask->bld->type.length); 2947fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul LLVMValueRef i1cond; 2957fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul 2967fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul assert(mask->break_mask); 2977fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul 298d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca /* i1cond = (mask == 0) */ 2997fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul i1cond = LLVMBuildICmp( 300d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca mask->bld->builder, 301d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMIntNE, 302d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMBuildBitCast(mask->bld->builder, mask->break_mask, reg_type, ""), 303d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMConstNull(reg_type), ""); 30418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 30518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin endloop = lp_build_insert_new_block(mask->bld->builder, "endloop"); 30618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 30718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBuildCondBr(mask->bld->builder, 308ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin i1cond, mask->loop_block, endloop); 30918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 31018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMPositionBuilderAtEnd(mask->bld->builder, endloop); 31118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 31218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_block = mask->loop_stack[--mask->loop_stack_size]; 31318a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin /* pop the cont mask */ 31418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cont_stack_size) { 31518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask = mask->cont_stack[--mask->cont_stack_size]; 31618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 31718a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin /* pop the break mask */ 31818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->break_stack_size) { 3193a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin mask->break_mask = mask->break_stack[--mask->break_stack_size]; 32018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 32118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 32218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 32318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 32418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 32518a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin/* stores val into an address pointed to by dst. 32618a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * mask->exec_mask is used to figure out which bits of val 32718a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * should be stored into the address 32818a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * (0 means don't store this bit, 1 means do store). 32918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin */ 33080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask, 33180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val, 33280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef dst) 33380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 33480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin if (mask->has_mask) { 33580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef real_val, dst_val; 33680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 33780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin dst_val = LLVMBuildLoad(mask->bld->builder, dst, ""); 33880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin real_val = lp_build_select(mask->bld, 33980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->exec_mask, 34080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin val, dst_val); 34180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 34280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, real_val, dst); 34380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin } else 34480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, val, dst); 34580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 34680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 34786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 34886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 34986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld, 35086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 35186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 35286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_left = lp_build_swizzle1_aos(&bld->base, src, swizzle_left); 35386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right); 35486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_right, src_left); 35586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 35686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 35786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 35886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 35986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld, 36086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 36186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 36286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_top = lp_build_swizzle1_aos(&bld->base, src, swizzle_top); 36386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom); 36486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_top, src_bottom); 36586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 36686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 367021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinstatic LLVMValueRef 368021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinget_temp_ptr(struct lp_build_tgsi_soa_context *bld, 369021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin unsigned index, 370021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin unsigned swizzle, 371021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin boolean is_indirect, 372021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef addr) 373021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin{ 374021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (!bld->has_indirect_addressing) { 375021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin return bld->temps[index][swizzle]; 376021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } else { 377021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef lindex = 378021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMConstInt(LLVMInt32Type(), index*4 + swizzle, 0); 379021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (is_indirect) 380021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin lindex = lp_build_add(&bld->base, lindex, addr); 381021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin return LLVMBuildGEP(bld->base.builder, bld->temps_array, &lindex, 1, ""); 382021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 383021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin} 38486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 38663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch. 38763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef 38963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch( 39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 3912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst, 3922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 39363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const unsigned chan_index ) 39463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 3957d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[index]; 396b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 39763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef res; 398ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin LLVMValueRef addr; 39963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 40063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (swizzle) { 401b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_X: 402b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Y: 403b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Z: 404b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_W: 40563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 406ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin if (reg->Register.Indirect) { 407ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type); 408ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin unsigned swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect, chan_index ); 409ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr = LLVMBuildLoad(bld->base.builder, 410ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin bld->addr[reg->Indirect.Index][swizzle], 411ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin ""); 412ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin /* for indexing we want integers */ 413ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr = LLVMBuildFPToSI(bld->base.builder, addr, 414ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin int_vec_type, ""); 415ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr = LLVMBuildExtractElement(bld->base.builder, 416ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr, LLVMConstInt(LLVMInt32Type(), 0, 0), 417ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin ""); 418021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0)); 419ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin } 420ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 42191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell switch (reg->Register.File) { 42263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_CONSTANT: { 42391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0); 424ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin LLVMValueRef scalar, scalar_ptr; 425ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 426ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin if (reg->Register.Indirect) { 427ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin /*lp_build_printf(bld->base.builder, 428ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin "\taddr = %d\n", addr);*/ 429ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin index = lp_build_add(&bld->base, index, addr); 430ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin } 431ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, ""); 432ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, ""); 433ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_broadcast_scalar(&bld->base, scalar); 43563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 43663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 43763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 43863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_IMMEDIATE: 43991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->immediates[reg->Register.Index][swizzle]; 44063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 44163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 44263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 44363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_INPUT: 44491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->inputs[reg->Register.Index][swizzle]; 44563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 44763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 448021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin case TGSI_FILE_TEMPORARY: { 449021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index, 450021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin swizzle, 451021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin reg->Register.Indirect, 452021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr); 453021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin res = LLVMBuildLoad(bld->base.builder, temp_ptr, ""); 45463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(!res) 45563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return bld->base.undef; 45663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 457021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 45863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 4614d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 46663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 4674d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 46963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) { 47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_CLEAR: 47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 47363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 47463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 47563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_SET: 4761fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* TODO: Use bitwese OR for floating point */ 47763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 47963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 48063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 48163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_TOGGLE: 48263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 48363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 48563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_KEEP: 48663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 48763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 48863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 48963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return res; 49063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 49163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 49263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 49363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 49486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives. 49586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */ 49686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void 49786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv( 49886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca struct lp_build_tgsi_soa_context *bld, 49986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const struct tgsi_full_instruction *inst, 50086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca unsigned index, 50186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const unsigned chan_index, 50286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *res, 50386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddx, 50486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddy) 50586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 50686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src; 50786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 50886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca src = emit_fetch(bld, inst, index, chan_index); 50986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 51086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(res) 51186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *res = src; 51286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 51386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca /* TODO: use interpolation coeffs for inputs */ 51486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 51586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddx) 51686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddx = emit_ddx(bld, src); 51786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 51886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddy) 51986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddy = emit_ddy(bld, src); 52086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 52186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 52286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 52386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/** 52463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store. 52563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 52663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 52763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store( 52863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 52963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 5302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 53163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index, 53263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef value) 53363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 5347d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[index]; 535021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef addr; 5362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca 53763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( inst->Instruction.Saturate ) { 53863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_NONE: 53963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 54063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 54163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_ZERO_ONE: 5427926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_max(&bld->base, value, bld->base.zero); 5437926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 54463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 54563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 54663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_MINUS_PLUS_ONE: 547185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul value = lp_build_max(&bld->base, value, lp_build_const_vec(bld->base.type, -1.0)); 5487926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 54963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 5507926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca 5517926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca default: 5527926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca assert(0); 55363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 55463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 555021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (reg->Register.Indirect) { 556021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type); 557021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin unsigned swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect, chan_index ); 558021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildLoad(bld->base.builder, 559021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin bld->addr[reg->Indirect.Index][swizzle], 560021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin ""); 561021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin /* for indexing we want integers */ 562021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildFPToSI(bld->base.builder, addr, 563021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin int_vec_type, ""); 564021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildExtractElement(bld->base.builder, 565021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr, LLVMConstInt(LLVMInt32Type(), 0, 0), 566021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin ""); 567021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0)); 568021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 569021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin 5705b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch( reg->Register.File ) { 57163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_OUTPUT: 57280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_store(&bld->exec_mask, value, 57380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin bld->outputs[reg->Register.Index][chan_index]); 57463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 57563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 576021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin case TGSI_FILE_TEMPORARY: { 577021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index, 578021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin chan_index, 579021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin reg->Register.Indirect, 580021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr); 581021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin lp_exec_mask_store(&bld->exec_mask, value, temp_ptr); 58263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 583021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 58463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 58563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_ADDRESS: 586ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin lp_exec_mask_store(&bld->exec_mask, value, 587ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin bld->addr[reg->Indirect.Index][chan_index]); 58863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 58963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 590ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca case TGSI_FILE_PREDICATE: 591ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca /* FIXME */ 592ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca assert(0); 593ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca break; 594ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca 59563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 59663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 59763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 59863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 59963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 60063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 60163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 60263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators. 60363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 60463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 60586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 60663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 60763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld, 60863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 60963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca boolean apply_lodbias, 610faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca boolean projected, 611faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef *texel) 61263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 61391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell const uint unit = inst->Src[1].Register.Index; 61463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef lodbias; 61531d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee LLVMValueRef oow = NULL; 616c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca LLVMValueRef coords[3]; 617c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca unsigned num_coords; 61863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 61963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6207d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell switch (inst->Texture.Texture) { 62163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_1D: 622c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 1; 62363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 62463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_2D: 62563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_RECT: 626c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 2; 62763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 628f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW1D: 629f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW2D: 630f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOWRECT: 63163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_3D: 63263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_CUBE: 633c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 3; 63463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 63563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 63663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return; 63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 63963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 64063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(apply_lodbias) 6412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca lodbias = emit_fetch( bld, inst, 0, 3 ); 64263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca else 64363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lodbias = bld->base.zero; 64463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 64563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (projected) { 6462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca oow = emit_fetch( bld, inst, 0, 3 ); 64763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca oow = lp_build_rcp(&bld->base, oow); 64863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 64963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 650c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca for (i = 0; i < num_coords; i++) { 651c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = emit_fetch( bld, inst, 0, i ); 65263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (projected) 653c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = lp_build_mul(&bld->base, coords[i], oow); 65463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 655ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca for (i = num_coords; i < 3; i++) { 656ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca coords[i] = bld->base.undef; 657ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca } 65863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6598be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->sampler->emit_fetch_texel(bld->sampler, 6608be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.builder, 6618be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.type, 6628be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca unit, num_coords, coords, lodbias, 6638be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca texel); 66463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 66563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 66663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 667feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/** 668feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Kill fragment if any of the src register values are negative. 669feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 67063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 67163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil( 67263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 6732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst ) 67463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 6757d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[0]; 6767821664b15501b173b2304bbada758c33c5ff972José Fonseca LLVMValueRef terms[NUM_CHANNELS]; 6773d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef mask; 67863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 67963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6807821664b15501b173b2304bbada758c33c5ff972José Fonseca memset(&terms, 0, sizeof terms); 68163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 68263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( chan_index ) { 68363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned swizzle; 68463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6857821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Unswizzle channel */ 686b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 68763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6887821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Check if the component has not been already tested. */ 6897821664b15501b173b2304bbada758c33c5ff972José Fonseca assert(swizzle < NUM_CHANNELS); 6907821664b15501b173b2304bbada758c33c5ff972José Fonseca if( !terms[swizzle] ) 6917821664b15501b173b2304bbada758c33c5ff972José Fonseca /* TODO: change the comparison operator instead of setting the sign */ 6922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca terms[swizzle] = emit_fetch(bld, inst, 0, chan_index ); 69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 69463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6953d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = NULL; 6967821664b15501b173b2304bbada758c33c5ff972José Fonseca FOR_EACH_CHANNEL( chan_index ) { 697aede39efd86d200ffbace8fc012104e31f673973José Fonseca if(terms[chan_index]) { 6983d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef chan_mask; 699aede39efd86d200ffbace8fc012104e31f673973José Fonseca 700feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* 701feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * If term < 0 then mask = 0 else mask = ~0. 702feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 7033d7a88674f9eb3320eeff511968f041426e25023José Fonseca chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero); 704aede39efd86d200ffbace8fc012104e31f673973José Fonseca 7053d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 7063d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, ""); 7073d7a88674f9eb3320eeff511968f041426e25023José Fonseca else 7083d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = chan_mask; 709aede39efd86d200ffbace8fc012104e31f673973José Fonseca } 71063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 7113d7a88674f9eb3320eeff511968f041426e25023José Fonseca 7123d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 7133d7a88674f9eb3320eeff511968f041426e25023José Fonseca lp_build_mask_update(bld->mask, mask); 71463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 71563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 71663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 71763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 718feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Predicated fragment kill. 719feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * XXX Actually, we do an unconditional kill (as in tgsi_exec.c). 720feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * The only predication is the execution mask which will apply if 721feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * we're inside a loop or conditional. 722feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 723feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulstatic void 724feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulemit_kilp(struct lp_build_tgsi_soa_context *bld, 725feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul const struct tgsi_full_instruction *inst) 726feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul{ 727feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul LLVMValueRef mask; 728feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 729feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* For those channels which are "alive", disable fragment shader 730feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * execution. 731feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 732feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul if (bld->exec_mask.has_mask) { 733feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul mask = LLVMBuildNot(bld->base.builder, bld->exec_mask.exec_mask, "kilp"); 734feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 735feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul else { 736feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul mask = bld->base.zero; 737feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 738feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 739feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul lp_build_mask_update(bld->mask, mask); 740feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul} 741feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 74285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinstatic int 74385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration( 74485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin struct lp_build_tgsi_soa_context *bld, 74585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin const struct tgsi_full_declaration *decl) 74685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{ 74785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned first = decl->Range.First; 74885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned last = decl->Range.Last; 74985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned idx, i; 750012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMBasicBlockRef current_block = 751012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMGetInsertBlock(bld->base.builder); 752012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMBasicBlockRef first_block = 753012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMGetEntryBasicBlock( 754012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMGetBasicBlockParent(current_block)); 755012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMValueRef first_inst = 756012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMGetFirstInstruction(first_block); 757012fabca722494162c244a367913562b8cfa4677Zack Rusin 758012fabca722494162c244a367913562b8cfa4677Zack Rusin /* we want alloca's to be the first instruction 759012fabca722494162c244a367913562b8cfa4677Zack Rusin * in the function so we need to rewind the builder 760012fabca722494162c244a367913562b8cfa4677Zack Rusin * to the very beginning */ 761012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMPositionBuilderBefore(bld->base.builder, 762012fabca722494162c244a367913562b8cfa4677Zack Rusin first_inst); 76385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 76485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (idx = first; idx <= last; ++idx) { 76585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin switch (decl->Declaration.File) { 76685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_TEMPORARY: 767021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (bld->has_indirect_addressing) { 768021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef val = LLVMConstInt(LLVMInt32Type(), 769021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin last*4 + 4, 0); 770021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin bld->temps_array = LLVMBuildArrayAlloca(bld->base.builder, 771021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin lp_build_vec_type(bld->base.type), 772021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin val, ""); 773021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } else { 774021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin for (i = 0; i < NUM_CHANNELS; i++) 775021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin bld->temps[idx][i] = lp_build_alloca(&bld->base); 776021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 77785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 77885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 77985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_OUTPUT: 78085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 78185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin bld->outputs[idx][i] = lp_build_alloca(&bld->base); 78285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 78385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 784ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin case TGSI_FILE_ADDRESS: 785ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 786ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin bld->addr[idx][i] = lp_build_alloca(&bld->base); 787ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin break; 788ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 78985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin default: 79085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin /* don't need to declare other vars */ 791dc886ba1391d7d890bd1f5532bc14553e883a418Zack Rusin break; 792012fabca722494162c244a367913562b8cfa4677Zack Rusin } 79385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 79485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 795012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMPositionBuilderAtEnd(bld->base.builder, 796012fabca722494162c244a367913562b8cfa4677Zack Rusin current_block); 79785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin return TRUE; 79885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin} 79963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 800fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul 801fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul/** 802fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * Emit LLVM for one TGSI instruction. 803fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * \param return TRUE for success, FALSE otherwise 804fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul */ 805fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paulstatic boolean 80663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction( 80763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 808faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_full_instruction *inst, 809faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_opcode_info *info) 81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 81163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 81290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca LLVMValueRef src0, src1, src2; 813e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp0, tmp1, tmp2; 814e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp3 = NULL; 815e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp4 = NULL; 816e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp5 = NULL; 817e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp6 = NULL; 818e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp7 = NULL; 819faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef res; 820faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef dst0[NUM_CHANNELS]; 82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 82289258652b6a1d282bed14549907892bdfda752f0José Fonseca /* 82389258652b6a1d282bed14549907892bdfda752f0José Fonseca * Stores and write masks are handled in a general fashion after the long 82489258652b6a1d282bed14549907892bdfda752f0José Fonseca * instruction opcode switch statement. 82589258652b6a1d282bed14549907892bdfda752f0José Fonseca * 82689258652b6a1d282bed14549907892bdfda752f0José Fonseca * Although not stricitly necessary, we avoid generating instructions for 82789258652b6a1d282bed14549907892bdfda752f0José Fonseca * channels which won't be stored, in cases where's that easy. For some 82889258652b6a1d282bed14549907892bdfda752f0José Fonseca * complex instructions, like texture sampling, it is more convenient to 82989258652b6a1d282bed14549907892bdfda752f0José Fonseca * assume a full writemask and then let LLVM optimization passes eliminate 83089258652b6a1d282bed14549907892bdfda752f0José Fonseca * redundant code. 83189258652b6a1d282bed14549907892bdfda752f0José Fonseca */ 83289258652b6a1d282bed14549907892bdfda752f0José Fonseca 833faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca assert(info->num_dst <= 1); 834faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 835faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 836faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.undef; 837faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 838faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 839faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 84063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (inst->Instruction.Opcode) { 84163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARL: 8422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 844ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin tmp0 = lp_build_floor(&bld->base, tmp0); 845faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 84663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 84763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 84863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 84963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOV: 8502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 851faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index ); 85263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 85363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 85463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 85563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LIT: 8562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) { 857faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 85863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 8592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 8602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 861faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero); 862ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca } 8632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 864ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = SrcReg[0].yyyy */ 8652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 866ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = max(XMM[1], 0) */ 867ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero); 868ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[2] = SrcReg[0].wwww */ 8692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 0, CHAN_W ); 870ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_pow( &bld->base, tmp1, tmp2); 8712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 872c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero); 873faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero); 874c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca } 8752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) { 876faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 87763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 87863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 87963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 88063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCP: 88163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIP */ 8822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 883faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rcp(&bld->base, src0); 8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 885faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 88663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 88763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 88863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 88963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RSQ: 89063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIPSQRT */ 8912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 89290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca src0 = lp_build_abs(&bld->base, src0); 893faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rsqrt(&bld->base, src0); 8942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 895faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 89663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 89763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 89863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 89963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EXP: 9002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 9012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 9022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 90357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2_int_part = NULL; 90457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_frac_part = NULL; 90557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2 = NULL; 90657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 9072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 90857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 9092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 91057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2_int_part = &tmp0; 9112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 91257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_frac_part = &tmp1; 9132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 91457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2 = &tmp2; 91557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 91657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2); 91757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 9182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 919faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 9202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 921faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp1; 9222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 923faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 92463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 92563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 9262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 927faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 92863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 92963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 93063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LOG: 9322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 9332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 9342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 935add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_floor_log2 = NULL; 936add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_exp = NULL; 937add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_log2 = NULL; 93857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 9392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 94057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca src0 = lp_build_abs( &bld->base, src0 ); 94157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 9422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 94357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_floor_log2 = &tmp0; 9442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 94557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp = &tmp1; 9462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 94757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_log2 = &tmp2; 94857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 94957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2); 95057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 95157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.x = floor(lg2(abs(src.x))) */ 9522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 953faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 95457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */ 9552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) { 956faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1); 95763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 95857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.z = lg2(abs(src.x)) */ 9592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 960faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 96163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 96263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 9632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 964faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 96563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 96663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 96763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 96863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MUL: 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 ); 972faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_mul(&bld->base, src0, src1); 97363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 97463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 97563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 97663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ADD: 9772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 980faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add(&bld->base, src0, src1); 98163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 98263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 98363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 98463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP3: 98563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT3 */ 9862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 9872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 98890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 9892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 9902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 99190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 99290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 9932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 9942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 99590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 99690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 9972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 998faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 99963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 100063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 100163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 100263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP4: 100363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT4 */ 10042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 10052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 100690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 10072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 10082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 100990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 101090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 10122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 101390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 101490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_W ); 10162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_W ); 101790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 101890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1020faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 102163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 102263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 102363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 102463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DST: 10252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 1026faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 10282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 10292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 10302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Y ); 1031faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1); 103263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 10332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1034faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z ); 103563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 10362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1037faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W ); 103863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 104063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 104163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MIN: 10422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1045faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_min( &bld->base, src0, src1 ); 104663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 104863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 104963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAX: 10502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1053faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_max( &bld->base, src0, src1 ); 105463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 105763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLT: 105863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETLT */ 10592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10621aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 ); 1063faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 10641aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGE: 106863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETGE */ 10692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10721aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 ); 1073faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 10741aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 107563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 107663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 107763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAD: 107863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_MADD */ 10792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 10812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 10822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 2, chan_index ); 108390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 108490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp2); 1085faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 108663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 108763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 108863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 108963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SUB: 10902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 10922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 1093faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1); 109463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 109563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 109663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 109763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LRP: 10982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 11012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 110290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sub( &bld->base, src1, src2 ); 110390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, src0, tmp0 ); 1104faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 ); 110563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 110663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CND: 1109873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1110873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 1111873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1112873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 1113185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul tmp1 = lp_build_const_vec(bld->base.type, 0.5); 1114873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1); 1115faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 ); 1116873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 111763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 111863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 111963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2A: 11202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 11212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 112290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 11232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 11242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 112590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 112690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 11272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 2, CHAN_X ); /* xmm1 = src[2].x */ 112890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 11292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1130faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 113163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 113363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FRC: 11352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1136873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 1137873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_floor(&bld->base, src0); 1138f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul tmp0 = lp_build_sub(&bld->base, src0, tmp0); 1139faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 114063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 114163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 114263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CLAMP: 1144873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1145873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1146873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1147873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 1148873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_max(&bld->base, tmp0, src1); 1149873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_min(&bld->base, tmp0, src2); 1150faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 1151873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 115263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 115363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FLR: 11552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1157faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_floor(&bld->base, tmp0); 115863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 115963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 116063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 116163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ROUND: 11622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1164faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_round(&bld->base, tmp0); 116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 116663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 116890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca case TGSI_OPCODE_EX2: { 11692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 117090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_exp2( &bld->base, tmp0); 11712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1172faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 117463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 117590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca } 117663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LG2: 11782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 117990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_log2( &bld->base, tmp0); 11802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1181faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 118263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 118363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 118463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 118563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POW: 11862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 11872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, CHAN_X ); 1188faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_pow( &bld->base, src0, src1 ); 11892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1190faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 119263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 119363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 119463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XPD: 11952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 11962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 11972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Z ); 11982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp3 = emit_fetch( bld, inst, 0, CHAN_Z ); 119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 12012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 12022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 12032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp4 = emit_fetch( bld, inst, 1, CHAN_Y ); 120463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 120690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = tmp0; 120790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_mul( &bld->base, tmp2, tmp1); 120890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp3; 120990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 121090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_sub( &bld->base, tmp2, tmp5); 1211faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp2; 121263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 12142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 12152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_X ); 12162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp5 = emit_fetch( bld, inst, 0, CHAN_X ); 121763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 121990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_mul( &bld->base, tmp3, tmp2); 122090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp5); 122190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_sub( &bld->base, tmp3, tmp1); 1222faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp3; 122363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 122590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 122690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp2); 122790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_sub( &bld->base, tmp5, tmp0); 1228faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp5; 122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1231faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 123363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 123463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 123563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ABS: 12362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1238faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_abs( &bld->base, tmp0 ); 123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 124063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 124163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCC: 1243873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1244873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1245fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DPH: 12482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 12492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 125090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 12512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 12522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 125390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 125490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 12562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 125790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 125890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_W ); 126090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1262faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 126563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 126663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_COS: 12672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 126890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_cos( &bld->base, tmp0 ); 12692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1270faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 127163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 127263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 127363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 127463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDX: 127586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 127686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL); 127786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 127863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDY: 128186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 128286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]); 128386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 128463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KILP: 128763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* predicated kill */ 1288feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul emit_kilp( bld, inst ); 128963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 129063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 129163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KIL: 129263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* conditional kill */ 12932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca emit_kil( bld, inst ); 129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 129663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2H: 1297fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 129863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2US: 1301fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 130363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4B: 1305fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4UB: 1309fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 131063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RFL: 1313fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SEQ: 13172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 13192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 13201aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 ); 1321faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 13221aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SFL: 1326873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1327faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.zero; 1328873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGT: 13322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 13342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 13351aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 ); 1336faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 13371aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 133863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 133963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 134063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SIN: 13412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 134290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sin( &bld->base, tmp0 ); 13432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1344faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 134563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 134663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 134763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 134863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLE: 13492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 13512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 13521aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 ); 1353faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 13541aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 135563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 135663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SNE: 13582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 13602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 13611aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 ); 1362faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 13631aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 136463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_STR: 1367873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1368faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.one; 1369873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 137063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TEX: 1373faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, FALSE, FALSE, dst0 ); 137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXD: 1377873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1378fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 138163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2H: 1382873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1383873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert (0); 1384fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 138563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2US: 1388873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1389873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1390fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 139163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 139363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4B: 1394873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1395873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1396fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 139963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4UB: 1400873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1401873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1402fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 140363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 140463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_X2D: 1406873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1407873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1408fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 140963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARA: 1412873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1413873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1414fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 141563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARR: 14182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1420ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin tmp0 = lp_build_round(&bld->base, tmp0); 1421faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRA: 1426873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1427873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1428fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CAL: 1432873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1433fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 143463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RET: 1437873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1438fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_END: 144263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SSG: 144563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SGN */ 14462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1448faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 ); 144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 145163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CMP: 14532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 14552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 14562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 14571aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero ); 1458faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2); 14591aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SCS: 14632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 14642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1465faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 ); 146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 14682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1469faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 ); 147063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1472faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = bld->base.zero; 147363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1475faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 147663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 147763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 147863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 147963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXB: 1480faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, TRUE, FALSE, dst0 ); 148163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 148263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM: 148463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* fall-through */ 148563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM4: 148663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* 3 or 4-component normalization */ 148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 148863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4; 148963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 14902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) || 14912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) || 14922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) || 14932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) { 149463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */ 149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm4 = src.x */ 149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = src.x * src.x */ 14992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 15002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 150190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp4 = tmp0; 150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 150390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp0); 150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 150563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm5 = src.y */ 150663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.y * src.y */ 15072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Y); 15082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 150990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp1; 151063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 151190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 151290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 151363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 151463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm6 = src.z */ 151563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.z * src.z */ 15162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Z); 15172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 151890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp6 = tmp1; 151963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 152090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 152190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 152263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 152363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (dims == 4) { 152463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm7 = src.w */ 152563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.w * src.w */ 15262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_W); 15272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) { 152890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp7 = tmp1; 152963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 153090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 153190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 153263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 153363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 153463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm1 = 1 / sqrt(xmm0) */ 153590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_rsqrt( &bld->base, tmp0); 153663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 153763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.x = xmm1 * src.x */ 15382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 1539faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1); 154063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 154163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.y = xmm1 * src.y */ 15432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 1544faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1); 154563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 154663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.z = xmm1 * src.z */ 15482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 1549faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1); 155063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 155163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 155263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = xmm1 * src.w */ 15532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) { 1554faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1); 155563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 155763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1558faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca /* dst.w = 1.0 */ 15592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) { 1560faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 156163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 156263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 156363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 156463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 156563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DIV: 1566873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1567873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert( 0 ); 1568fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 156963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 157063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 157163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2: 15722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 15732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 157490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 15752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 15762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 157790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 157890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 15792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1580faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 158163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 158263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 158363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 158463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXL: 1585faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, TRUE, FALSE, dst0 ); 158663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 158763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 158863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXP: 1589faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, FALSE, TRUE, dst0 ); 159063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 159118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 159263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRK: 159318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_break(&bld->exec_mask); 159463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 159563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 159663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_IF: 159780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 1598ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin tmp0 = lp_build_cmp(&bld->base, PIPE_FUNC_NOTEQUAL, 1599ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin tmp0, bld->base.zero); 160080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_push(&bld->exec_mask, tmp0); 160163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 160263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1603f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_OPCODE_BGNFOR: 1604873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1605873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1606fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 160763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 160863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 160918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin case TGSI_OPCODE_BGNLOOP: 161018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_bgnloop(&bld->exec_mask); 161118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin break; 161218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 161363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_REP: 1614873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1615873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1616fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 161763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 161863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 161963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ELSE: 162080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_invert(&bld->exec_mask); 162163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 162263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 162363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDIF: 162480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_pop(&bld->exec_mask); 162563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 162663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1627f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_OPCODE_ENDFOR: 1628873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1629873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1630fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 163163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 163263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 163318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin case TGSI_OPCODE_ENDLOOP: 163418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_endloop(&bld->exec_mask); 163518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin break; 163618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 163763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDREP: 1638873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1639873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1640fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 164163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 164263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 164363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PUSHA: 1644873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1645873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1646fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 164763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 164863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 164963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POPA: 1650873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1651873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1652fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 165363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 165463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 165563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CEIL: 1656873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1657873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1658faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_ceil(&bld->base, tmp0); 1659873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 166063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 166163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 166263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_I2F: 1663873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1664873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1665fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 166663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 166763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 166863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NOT: 1669873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1670873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1671fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 167263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 167363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 167463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TRUNC: 16752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 16762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1677faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_trunc(&bld->base, tmp0); 167863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 167963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 168063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 168163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SHL: 1682873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1683873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1684fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 168563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 168663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 16872c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol case TGSI_OPCODE_ISHR: 1688873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1689873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1690fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 169163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 169263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 169363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_AND: 1694873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1695873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1696fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 169763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 169863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 169963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_OR: 1700873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1701873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1702fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 170363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 170463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 170563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOD: 1706873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1707873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1708fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 170963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 171063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 171163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XOR: 1712873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1713873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1714fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 171563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 171663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 171763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SAD: 1718873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1719873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1720fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 172163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 172263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 172363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXF: 1724873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1725873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1726fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 172763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 172863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 172963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXQ: 1730873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1731873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1732fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 173363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 173463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 173563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CONT: 173618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_continue(&bld->exec_mask); 173763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 173863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 173963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EMIT: 1740fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 174163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 174263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 174363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDPRIM: 1744fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 174563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 174663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1747873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca case TGSI_OPCODE_NOP: 1748873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca break; 1749873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca 175063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 1751fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 175263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 175363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1754faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 1755faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1756faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_store( bld, inst, 0, chan_index, dst0[chan_index]); 1757faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1758faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1759faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 1760fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return TRUE; 176163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 176263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1763c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca 1764c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid 176563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder, 176663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_token *tokens, 1767b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 17683d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask, 176963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr, 1770f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos, 1771f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS], 1772f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS], 1773021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin struct lp_build_sampler_soa *sampler, 1774021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin struct tgsi_shader_info *info) 177563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 177663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context bld; 177763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct tgsi_parse_context parse; 177863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint num_immediates = 0; 177963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 178063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 178163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* Setup build context */ 178263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca memset(&bld, 0, sizeof bld); 178363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lp_build_context_init(&bld.base, builder, type); 1784c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca bld.mask = mask; 1785f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.pos = pos; 1786f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.inputs = inputs; 178763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.outputs = outputs; 178863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.consts_ptr = consts_ptr; 17898be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld.sampler = sampler; 1790021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin bld.has_indirect_addressing = info->opcode_count[TGSI_OPCODE_ARR] > 0 || 1791021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin info->opcode_count[TGSI_OPCODE_ARL] > 0; 179263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 179380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_init(&bld.exec_mask, &bld.base); 179480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 179563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_init( &parse, tokens ); 179663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 179763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca while( !tgsi_parse_end_of_tokens( &parse ) ) { 179863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_token( &parse ); 179963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 180063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( parse.FullToken.Token.Type ) { 180163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_DECLARATION: 18021fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* Inputs already interpolated */ 180385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin { 180485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin if (!emit_declaration( &bld, &parse.FullToken.FullDeclaration )) 180585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin _debug_printf("warning: failed to define LLVM variable\n"); 180685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 180763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 180863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 180963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_INSTRUCTION: 1810faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca { 18112c90652ed9e119f09af6757c59d10273894ba590José Fonseca unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode; 18122c90652ed9e119f09af6757c59d10273894ba590José Fonseca const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode); 1813faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, info )) 1814faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n", 1815faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca info ? info->mnemonic : "<invalid>"); 1816faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1817faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 181863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 181963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 182063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_IMMEDIATE: 182163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* simply copy the immediate values into the next immediates[] slot */ 182263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 182363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1; 182463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(size <= 4); 182563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(num_immediates < LP_MAX_IMMEDIATES); 182663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = 0; i < size; ++i ) 182763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = 1828185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul lp_build_const_vec(type, parse.FullToken.FullImmediate.u[i].Float); 182963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = size; i < 4; ++i ) 183063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = bld.base.undef; 183163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca num_immediates++; 183263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 183363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 183463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 18359381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca case TGSI_TOKEN_TYPE_PROPERTY: 18369381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca break; 18379381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca 183863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 183963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 184063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 184163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 184218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (0) { 184318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef block = LLVMGetInsertBlock(builder); 184418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef function = LLVMGetBasicBlockParent(block); 184518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin debug_printf("11111111111111111111111111111 \n"); 184618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tgsi_dump(tokens, 0); 184718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMDumpValue(function); 184818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin debug_printf("2222222222222222222222222222 \n"); 184918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 185063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_free( &parse ); 185163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 185263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1853