lp_bld_tgsi_soa.c revision 4363d4d0b945c4ca6c303fb337e1fac39e6e1ad6
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" 48021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin#include "tgsi/tgsi_scan.h" 4963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h" 5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h" 5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h" 524363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul#include "lp_bld_gather.h" 537821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h" 5463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h" 553d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h" 56ef81779850d1343b3ae284eb9beabeaf11934d4aJosé Fonseca#include "lp_bld_quad.h" 5763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h" 586c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca#include "lp_bld_limits.h" 5980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h" 6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\ 6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++) 6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 665b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN))) 6763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( INST, CHAN )) 7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\ 7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( CHAN )\ 7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN ) 7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0 7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1 7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2 7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3 795a916204179c6787157af3f3be758dc36162ab20Keith Whitwell#define NUM_CHANNELS 4 8063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 810b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin#define LP_MAX_INSTRUCTIONS 256 820b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 8380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 8480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstruct lp_exec_mask { 8580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_build_context *bld; 8680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 8780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin boolean has_mask; 8880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMTypeRef int_vec_type; 9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 916c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef cond_stack[LP_MAX_TGSI_NESTING]; 9280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin int cond_stack_size; 9380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef cond_mask; 9480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 952d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMBasicBlockRef loop_block; 9618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef cont_mask; 972d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef break_mask; 982d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef break_var; 992d91903882e399e8ea7306fd37d5d214907247e6José Fonseca struct { 1002d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMBasicBlockRef loop_block; 1012d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef cont_mask; 1022d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef break_mask; 1032d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef break_var; 1042d91903882e399e8ea7306fd37d5d214907247e6José Fonseca } loop_stack[LP_MAX_TGSI_NESTING]; 10518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int loop_stack_size; 10618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 10732a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca LLVMValueRef ret_mask; 1080b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin struct { 1090b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin int pc; 1100b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin LLVMValueRef ret_mask; 1110b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin } call_stack[LP_MAX_TGSI_NESTING]; 1120b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin int call_stack_size; 1130b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 11480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef exec_mask; 11580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}; 11663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context 11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 11963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_context base; 12063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 121ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* Builder for integer masks and indices */ 122ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca struct lp_build_context int_bld; 123ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 12463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr; 125f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos; 126263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS]; 127263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS]; 128c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca 1293f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul const struct lp_build_sampler_soa *sampler; 13063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1316c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef immediates[LP_MAX_TGSI_IMMEDIATES][NUM_CHANNELS]; 1326c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef temps[LP_MAX_TGSI_TEMPS][NUM_CHANNELS]; 1336c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef addr[LP_MAX_TGSI_ADDRS][NUM_CHANNELS]; 134ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef preds[LP_MAX_TGSI_PREDS][NUM_CHANNELS]; 1351929057eac0c3351e0810612bdae56331a235736José Fonseca 136263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca /* we allocate an array of temps if we have indirect 137021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin * addressing and then the temps above is unused */ 138021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temps_array; 139021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin boolean has_indirect_addressing; 140021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin 1413d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask; 14280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_exec_mask exec_mask; 1430b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 1440b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin struct tgsi_full_instruction *instructions; 1450b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin uint max_instructions; 14663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}; 14763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 14880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld) 14980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 15080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->bld = bld; 15180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->has_mask = FALSE; 15280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack_size = 0; 15318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack_size = 0; 1540b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->call_stack_size = 0; 15580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 15680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->int_vec_type = lp_build_int_vec_type(mask->bld->type); 15732a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->exec_mask = mask->ret_mask = mask->break_mask = mask->cont_mask = mask->cond_mask = 1582d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMConstAllOnes(mask->int_vec_type); 15980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 16080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 16180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask) 16280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 16318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->loop_stack_size) { 16418a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin /*for loops we need to update the entire mask at runtime */ 16518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef tmp; 1667fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul assert(mask->break_mask); 16718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp = LLVMBuildAnd(mask->bld->builder, 16818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask, 16918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask, 17018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskcb"); 17118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = LLVMBuildAnd(mask->bld->builder, 17218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cond_mask, 17318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp, 17418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskfull"); 17518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } else 17618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = mask->cond_mask; 17718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 17832a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca if (mask->call_stack_size) { 1790b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->exec_mask = LLVMBuildAnd(mask->bld->builder, 1800b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->exec_mask, 18132a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->ret_mask, 1820b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin "callmask"); 18332a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca } 18418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 18518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->has_mask = (mask->cond_stack_size > 0 || 1860b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->loop_stack_size > 0 || 1870b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->call_stack_size > 0); 18880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 18980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 19080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask, 19180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val) 19280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 1936c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(mask->cond_stack_size < LP_MAX_TGSI_NESTING); 1942d91903882e399e8ea7306fd37d5d214907247e6José Fonseca if (mask->cond_stack_size == 0) { 1952d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cond_mask == LLVMConstAllOnes(mask->int_vec_type)); 1962d91903882e399e8ea7306fd37d5d214907247e6José Fonseca } 19780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask; 1982d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(LLVMTypeOf(val) == mask->int_vec_type); 1992d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->cond_mask = val; 20080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 20180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 20280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 20380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 20480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask) 20580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 2062d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef prev_mask; 2072d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef inv_mask; 2082d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 2092d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cond_stack_size); 2102d91903882e399e8ea7306fd37d5d214907247e6José Fonseca prev_mask = mask->cond_stack[mask->cond_stack_size - 1]; 2112d91903882e399e8ea7306fd37d5d214907247e6José Fonseca if (mask->cond_stack_size == 1) { 2122d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(prev_mask == LLVMConstAllOnes(mask->int_vec_type)); 213faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin } 214faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 2152d91903882e399e8ea7306fd37d5d214907247e6José Fonseca inv_mask = LLVMBuildNot(mask->bld->builder, mask->cond_mask, ""); 2162d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 21780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = LLVMBuildAnd(mask->bld->builder, 21880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin inv_mask, 21980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin prev_mask, ""); 22080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 22180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 22280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 22380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask) 22480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 2252d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cond_stack_size); 22680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = mask->cond_stack[--mask->cond_stack_size]; 22780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 22880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 22980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 23018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_bgnloop(struct lp_exec_mask *mask) 23118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 2322d91903882e399e8ea7306fd37d5d214907247e6José Fonseca if (mask->loop_stack_size == 0) { 2332d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_block == NULL); 2342d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cont_mask == LLVMConstAllOnes(mask->int_vec_type)); 2352d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->break_mask == LLVMConstAllOnes(mask->int_vec_type)); 2362d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->break_var == NULL); 2372d91903882e399e8ea7306fd37d5d214907247e6José Fonseca } 2382d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 2392d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_stack_size < LP_MAX_TGSI_NESTING); 24018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 2412d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].loop_block = mask->loop_block; 2422d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].cont_mask = mask->cont_mask; 2432d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].break_mask = mask->break_mask; 2442d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].break_var = mask->break_var; 2452d91903882e399e8ea7306fd37d5d214907247e6José Fonseca ++mask->loop_stack_size; 2463a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin 2472d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_var = lp_build_alloca(mask->bld->builder, mask->int_vec_type, ""); 2482d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMBuildStore(mask->bld->builder, mask->break_mask, mask->break_var); 2496c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca 25018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_block = lp_build_insert_new_block(mask->bld->builder, "bgnloop"); 25118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBuildBr(mask->bld->builder, mask->loop_block); 25218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMPositionBuilderAtEnd(mask->bld->builder, mask->loop_block); 25318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 2542d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_mask = LLVMBuildLoad(mask->bld->builder, mask->break_var, ""); 2552d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 25618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 25718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 25818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 25918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_break(struct lp_exec_mask *mask) 26018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 26118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder, 26218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 26318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "break"); 26418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 265d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->break_mask = LLVMBuildAnd(mask->bld->builder, 266d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->break_mask, 267d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin exec_mask, "break_full"); 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 278d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->cont_mask = LLVMBuildAnd(mask->bld->builder, 279d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->cont_mask, 280d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin exec_mask, ""); 28118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 28218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 28318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 28418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 28518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 28618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_endloop(struct lp_exec_mask *mask) 28718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 28818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef endloop; 289d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMTypeRef reg_type = LLVMIntType(mask->bld->type.width* 290d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca mask->bld->type.length); 2917fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul LLVMValueRef i1cond; 2927fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul 2937fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul assert(mask->break_mask); 2947fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul 2952d91903882e399e8ea7306fd37d5d214907247e6José Fonseca /* 2962d91903882e399e8ea7306fd37d5d214907247e6José Fonseca * Restore the cont_mask, but don't pop 2972d91903882e399e8ea7306fd37d5d214907247e6José Fonseca */ 2982d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_stack_size); 2992d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->cont_mask = mask->loop_stack[mask->loop_stack_size - 1].cont_mask; 3002d91903882e399e8ea7306fd37d5d214907247e6José Fonseca lp_exec_mask_update(mask); 3012d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 3022d91903882e399e8ea7306fd37d5d214907247e6José Fonseca /* 3032d91903882e399e8ea7306fd37d5d214907247e6José Fonseca * Unlike the continue mask, the break_mask must be preserved across loop 3042d91903882e399e8ea7306fd37d5d214907247e6José Fonseca * iterations 3052d91903882e399e8ea7306fd37d5d214907247e6José Fonseca */ 3062d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMBuildStore(mask->bld->builder, mask->break_mask, mask->break_var); 3072d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 308d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca /* i1cond = (mask == 0) */ 3097fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul i1cond = LLVMBuildICmp( 310d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca mask->bld->builder, 311d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMIntNE, 3122d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMBuildBitCast(mask->bld->builder, mask->exec_mask, reg_type, ""), 313d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMConstNull(reg_type), ""); 31418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 31518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin endloop = lp_build_insert_new_block(mask->bld->builder, "endloop"); 31618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 31718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBuildCondBr(mask->bld->builder, 318ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin i1cond, mask->loop_block, endloop); 31918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 32018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMPositionBuilderAtEnd(mask->bld->builder, endloop); 32118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 3222d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_stack_size); 3232d91903882e399e8ea7306fd37d5d214907247e6José Fonseca --mask->loop_stack_size; 3242d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_block = mask->loop_stack[mask->loop_stack_size].loop_block; 3252d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->cont_mask = mask->loop_stack[mask->loop_stack_size].cont_mask; 3262d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_mask = mask->loop_stack[mask->loop_stack_size].break_mask; 3272d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_var = mask->loop_stack[mask->loop_stack_size].break_var; 32818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 32918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 33018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 33118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 33218a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin/* stores val into an address pointed to by dst. 33318a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * mask->exec_mask is used to figure out which bits of val 33418a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * should be stored into the address 33518a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * (0 means don't store this bit, 1 means do store). 33618a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin */ 33780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask, 338ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef pred, 33980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val, 34080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef dst) 34180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 342ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* Mix the predicate and execution mask */ 34380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin if (mask->has_mask) { 344ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (pred) { 34554b94ee96a6d750d57d99ae9819fcf8206d4680dJosé Fonseca pred = LLVMBuildAnd(mask->bld->builder, pred, mask->exec_mask, ""); 346ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } else { 347ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred = mask->exec_mask; 348ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 349ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 350ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 351ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (pred) { 35280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef real_val, dst_val; 35380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 35480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin dst_val = LLVMBuildLoad(mask->bld->builder, dst, ""); 35580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin real_val = lp_build_select(mask->bld, 356ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred, 35780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin val, dst_val); 35880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 35980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, real_val, dst); 36080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin } else 36180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, val, dst); 36280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 36380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 3640b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusinstatic void lp_exec_mask_call(struct lp_exec_mask *mask, 3650b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin int func, 3660b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin int *pc) 3670b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin{ 36832a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca assert(mask->call_stack_size < LP_MAX_TGSI_NESTING); 3690b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->call_stack[mask->call_stack_size].pc = *pc; 37032a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->call_stack[mask->call_stack_size].ret_mask = mask->ret_mask; 37132a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->call_stack_size++; 3720b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin *pc = func; 3730b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin} 3740b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 3750b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusinstatic void lp_exec_mask_ret(struct lp_exec_mask *mask, int *pc) 3760b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin{ 3770b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin LLVMValueRef exec_mask; 37832a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca 3790b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin if (mask->call_stack_size == 0) { 3800b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin /* returning from main() */ 3810b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin *pc = -1; 3820b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin return; 3830b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin } 3840b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin exec_mask = LLVMBuildNot(mask->bld->builder, 3850b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->exec_mask, 3860b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin "ret"); 3870b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 38832a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->ret_mask = LLVMBuildAnd(mask->bld->builder, 38932a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->ret_mask, 39032a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca exec_mask, "ret_full"); 3910b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 3920b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin lp_exec_mask_update(mask); 3930b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin} 3940b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 3950b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusinstatic void lp_exec_mask_bgnsub(struct lp_exec_mask *mask) 3960b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin{ 3970b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin} 3980b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 3990b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusinstatic void lp_exec_mask_endsub(struct lp_exec_mask *mask, int *pc) 4000b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin{ 40132a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca assert(mask->call_stack_size); 4020b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin mask->call_stack_size--; 4030b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin *pc = mask->call_stack[mask->call_stack_size].pc; 40432a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca mask->ret_mask = mask->call_stack[mask->call_stack_size].ret_mask; 40532a7209c0a0d5ae63f12056ed969087d942c6298José Fonseca lp_exec_mask_update(mask); 4060b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin} 40786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 40886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 409263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonsecaget_temp_ptr(struct lp_build_tgsi_soa_context *bld, 410263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca unsigned index, 411263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca unsigned chan, 412263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca boolean is_indirect, 413263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca LLVMValueRef addr) 414263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca{ 415263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca assert(chan < 4); 416263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca if (!bld->has_indirect_addressing) { 417263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca return bld->temps[index][chan]; 418263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca } else { 419263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca LLVMValueRef lindex = 420263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca LLVMConstInt(LLVMInt32Type(), index * 4 + chan, 0); 421263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca if (is_indirect) 422263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca lindex = lp_build_add(&bld->base, lindex, addr); 423263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca return LLVMBuildGEP(bld->base.builder, bld->temps_array, &lindex, 1, ""); 424263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca } 425263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca} 426263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca 4274363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4284363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul/** 4294363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul * Gather vector. 4304363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul * XXX the lp_build_gather() function should be capable of doing this 4314363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul * with a little work. 4324363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul */ 4334363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paulstatic LLVMValueRef 4344363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paulbuild_gather(struct lp_build_tgsi_soa_context *bld, 4354363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef base_ptr, 4364363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef indexes) 4374363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul{ 4384363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef res = bld->base.undef; 4394363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul unsigned i; 4404363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4414363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul /* 4424363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul * Loop over elements of index_vec, load scalar value, insert it into 'res'. 4434363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul */ 4444363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul for (i = 0; i < bld->base.type.length; i++) { 4454363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef ii = LLVMConstInt(LLVMInt32Type(), i, 0); 4464363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef index = LLVMBuildExtractElement(bld->base.builder, 4474363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul indexes, ii, ""); 4484363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, base_ptr, 4494363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul &index, 1, ""); 4504363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, ""); 4514363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4524363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul res = LLVMBuildInsertElement(bld->base.builder, res, scalar, ii, ""); 4534363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul } 4544363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4554363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul return res; 4564363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul} 4574363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4584363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch. 46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef 46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch( 46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 4652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst, 4662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 46763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const unsigned chan_index ) 46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 4697d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[index]; 47085c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul const unsigned swizzle = 47185c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul tgsi_util_get_full_src_register_swizzle(reg, chan_index); 47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef res; 4734363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef addr_vec = NULL; 47463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 47585c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul if (swizzle > 3) { 47685c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul assert(0 && "invalid swizzle in emit_fetch()"); 47785c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul return bld->base.undef; 47885c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul } 47985c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul 48085c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul if (reg->Register.Indirect) { 48185c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type); 48285c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul unsigned swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect, chan_index ); 4834363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4844363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef vec4 = lp_build_const_int_vec(bld->int_bld.type, 4); 4854363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4864363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul assert(bld->has_indirect_addressing); 4874363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4884363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul addr_vec = LLVMBuildLoad(bld->base.builder, 4894363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul bld->addr[reg->Indirect.Index][swizzle], 4904363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul "load addr"); 4914363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 49285c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul /* for indexing we want integers */ 4934363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul addr_vec = LLVMBuildFPToSI(bld->base.builder, addr_vec, 4944363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul int_vec_type, ""); 4954363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 4964363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul /* addr_vec = addr_vec * 4 */ 4974363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul addr_vec = lp_build_mul(&bld->base, addr_vec, vec4); 49885c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul } 499ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 50085c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul switch (reg->Register.File) { 50185c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul case TGSI_FILE_CONSTANT: 50285c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul { 503ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin if (reg->Register.Indirect) { 5044363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef index_vec; /* index into the const buffer */ 5054363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 5064363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul /* index_vec = broadcast(reg->Register.Index * 4 + swizzle) */ 5074363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul index_vec = lp_build_const_int_vec(bld->int_bld.type, 5084363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul reg->Register.Index * 4 + swizzle); 5094363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 5104363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul /* index_vec = index_vec + addr_vec */ 5114363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul index_vec = lp_build_add(&bld->base, index_vec, addr_vec); 5124363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 5134363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul /* Gather values from the constant buffer */ 5144363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul res = build_gather(bld, bld->consts_ptr, index_vec); 515ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin } 5164363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul else { 5174363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef index; /* index into the const buffer */ 5184363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef scalar, scalar_ptr; 519ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 5204363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul index = lp_build_const_int32(reg->Register.Index*4 + swizzle); 5214363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 5224363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, 5234363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul &index, 1, ""); 5244363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, ""); 5254363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 5264363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul res = lp_build_broadcast_scalar(&bld->base, scalar); 5274363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul } 52863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 52985c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul break; 53063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 53185c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul case TGSI_FILE_IMMEDIATE: 532263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca res = bld->immediates[reg->Register.Index][swizzle]; 53385c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul assert(res); 53485c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul break; 53563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 53685c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul case TGSI_FILE_INPUT: 537263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca res = bld->inputs[reg->Register.Index][swizzle]; 53885c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul assert(res); 53985c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul break; 54063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 54185c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul case TGSI_FILE_TEMPORARY: 54285c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul { 5434363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef addr = NULL; 5444363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef temp_ptr; 5454363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 5464363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul if (reg->Register.Indirect) { 5474363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul LLVMValueRef zero = lp_build_const_int32(0); 5484363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul addr = LLVMBuildExtractElement(bld->base.builder, 5494363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul addr_vec, zero, ""); 5504363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul } 5514363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul 5524363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul temp_ptr = get_temp_ptr(bld, reg->Register.Index, 5534363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul swizzle, 5544363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul reg->Register.Indirect, 5554363d4d0b945c4ca6c303fb337e1fac39e6e1ad6Brian Paul addr); 556021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin res = LLVMBuildLoad(bld->base.builder, temp_ptr, ""); 55763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(!res) 55863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return bld->base.undef; 55963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 56063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 56163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 56263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 56385c6799f6e2645e708eb03201e91f3285de7d9e1Brian Paul assert(0 && "invalid src register in emit_fetch()"); 5644d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 56563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 56663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 56763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) { 56863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_CLEAR: 56963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 57063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 57163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 57263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_SET: 5731fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* TODO: Use bitwese OR for floating point */ 57463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 57563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 57663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 57763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 57863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_TOGGLE: 57963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 58063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 58163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 58263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_KEEP: 58363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 58463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 58563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 58663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return res; 58763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 58863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 58963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 59063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 59186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives. 59286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */ 59386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void 59486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv( 59586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca struct lp_build_tgsi_soa_context *bld, 59686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const struct tgsi_full_instruction *inst, 59786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca unsigned index, 59886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const unsigned chan_index, 59986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *res, 60086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddx, 60186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddy) 60286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 60386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src; 60486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 60586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca src = emit_fetch(bld, inst, index, chan_index); 60686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 60786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(res) 60886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *res = src; 60986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 61086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca /* TODO: use interpolation coeffs for inputs */ 61186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 61286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddx) 613ef81779850d1343b3ae284eb9beabeaf11934d4aJosé Fonseca *ddx = lp_build_ddx(&bld->base, src); 61486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 61586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddy) 616ef81779850d1343b3ae284eb9beabeaf11934d4aJosé Fonseca *ddy = lp_build_ddy(&bld->base, src); 61786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 61886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 61986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 62086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/** 621ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * Predicate. 622ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca */ 623ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonsecastatic void 624ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonsecaemit_fetch_predicate( 625ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca struct lp_build_tgsi_soa_context *bld, 626ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca const struct tgsi_full_instruction *inst, 627ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef *pred) 628ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca{ 629ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned index; 630ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned char swizzles[4]; 631ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef unswizzled[4] = {NULL, NULL, NULL, NULL}; 632ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef value; 633ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned chan; 634ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 635ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (!inst->Instruction.Predicate) { 636ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca FOR_EACH_CHANNEL( chan ) { 637ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred[chan] = NULL; 638ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 639ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca return; 640ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 641ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 642ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[0] = inst->Predicate.SwizzleX; 643ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[1] = inst->Predicate.SwizzleY; 644ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[2] = inst->Predicate.SwizzleZ; 645ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[3] = inst->Predicate.SwizzleW; 646ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 647ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca index = inst->Predicate.Index; 648ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca assert(index < LP_MAX_TGSI_PREDS); 649ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 650ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca FOR_EACH_CHANNEL( chan ) { 651ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned swizzle = swizzles[chan]; 652ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 653ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* 654ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * Only fetch the predicate register channels that are actually listed 655ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * in the swizzles 656ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca */ 657ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (!unswizzled[swizzle]) { 658ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value = LLVMBuildLoad(bld->base.builder, 659263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca bld->preds[index][swizzle], ""); 660ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 661ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* 662ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * Convert the value to an integer mask. 663ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * 664ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * TODO: Short-circuit this comparison -- a D3D setp_xx instructions 665ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * is needlessly causing two comparisons due to storing the intermediate 666ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * result as float vector instead of an integer mask vector. 667ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca */ 668ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value = lp_build_compare(bld->base.builder, 669ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca bld->base.type, 670ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca PIPE_FUNC_NOTEQUAL, 671ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value, 672ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca bld->base.zero); 673ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (inst->Predicate.Negate) { 674ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value = LLVMBuildNot(bld->base.builder, value, ""); 675ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 676ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 677ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unswizzled[swizzle] = value; 678ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } else { 679ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value = unswizzled[swizzle]; 680ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 681ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 682ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred[chan] = value; 683ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 684ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca} 685ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 686ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 687ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca/** 68863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store. 68963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 69063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 69163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store( 69263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 6942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 69563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index, 696ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef pred, 69763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef value) 69863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 6997d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[index]; 700415c40735dfd110bf902ce43968c8d7bd23ff111Brian Paul LLVMValueRef addr = NULL; 7012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca 70263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( inst->Instruction.Saturate ) { 70363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_NONE: 70463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 70563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 70663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_ZERO_ONE: 7077926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_max(&bld->base, value, bld->base.zero); 7087926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 70963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 71063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 71163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_MINUS_PLUS_ONE: 712185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul value = lp_build_max(&bld->base, value, lp_build_const_vec(bld->base.type, -1.0)); 7137926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 71463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 7157926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca 7167926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca default: 7177926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca assert(0); 71863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 71963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 720021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (reg->Register.Indirect) { 721021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type); 722021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin unsigned swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect, chan_index ); 723021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildLoad(bld->base.builder, 724263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca bld->addr[reg->Indirect.Index][swizzle], 725021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin ""); 726021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin /* for indexing we want integers */ 727021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildFPToSI(bld->base.builder, addr, 728021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin int_vec_type, ""); 729021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildExtractElement(bld->base.builder, 730021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr, LLVMConstInt(LLVMInt32Type(), 0, 0), 731021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin ""); 732021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0)); 733021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 734021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin 7355b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch( reg->Register.File ) { 73663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_OUTPUT: 737ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca lp_exec_mask_store(&bld->exec_mask, pred, value, 738263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca bld->outputs[reg->Register.Index][chan_index]); 73963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 74063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 741021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin case TGSI_FILE_TEMPORARY: { 742021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index, 743021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin chan_index, 744021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin reg->Register.Indirect, 745021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr); 746ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca lp_exec_mask_store(&bld->exec_mask, pred, value, temp_ptr); 74763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 748021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 74963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 75063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_ADDRESS: 751ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca lp_exec_mask_store(&bld->exec_mask, pred, value, 752263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca bld->addr[reg->Indirect.Index][chan_index]); 75363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 75463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 755ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca case TGSI_FILE_PREDICATE: 756ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca lp_exec_mask_store(&bld->exec_mask, pred, value, 757263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca bld->preds[index][chan_index]); 758ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca break; 759ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca 76063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 76163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 76263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 76363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 76463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 76563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 76663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 76763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators. 76863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 76963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 770962558daaed43b0111cd062e32821aad106869d7José Fonsecaenum tex_modifier { 771962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_NONE = 0, 772962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_PROJECTED, 773962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_LOD_BIAS, 774962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_EXPLICIT_LOD, 775962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_EXPLICIT_DERIV 776962558daaed43b0111cd062e32821aad106869d7José Fonseca}; 77786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 77863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 77963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld, 78063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 781962558daaed43b0111cd062e32821aad106869d7José Fonseca enum tex_modifier modifier, 782faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef *texel) 78363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 784962558daaed43b0111cd062e32821aad106869d7José Fonseca unsigned unit; 785ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca LLVMValueRef lod_bias, explicit_lod; 78631d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee LLVMValueRef oow = NULL; 787c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca LLVMValueRef coords[3]; 788962558daaed43b0111cd062e32821aad106869d7José Fonseca LLVMValueRef ddx[3]; 789962558daaed43b0111cd062e32821aad106869d7José Fonseca LLVMValueRef ddy[3]; 790c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca unsigned num_coords; 79163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 79263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7939db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca if (!bld->sampler) { 7949db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca _debug_printf("warning: found texture instruction but no sampler generator supplied\n"); 7959db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca for (i = 0; i < 4; i++) { 7969db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca texel[i] = bld->base.undef; 7979db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca } 7989db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca return; 7999db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca } 8009db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca 8017d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell switch (inst->Texture.Texture) { 80263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_1D: 803c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 1; 80463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 80563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_2D: 80663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_RECT: 807c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 2; 80863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 809f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW1D: 810f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW2D: 811f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOWRECT: 81263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_3D: 81363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_CUBE: 814c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 3; 81563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 81663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 81763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return; 81963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 821ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca if (modifier == TEX_MODIFIER_LOD_BIAS) { 822ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias = emit_fetch( bld, inst, 0, 3 ); 823ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca explicit_lod = NULL; 824ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca } 825ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca else if (modifier == TEX_MODIFIER_EXPLICIT_LOD) { 826ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias = NULL; 827ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca explicit_lod = emit_fetch( bld, inst, 0, 3 ); 828ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca } 829ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca else { 830ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias = NULL; 831ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca explicit_lod = NULL; 832ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca } 83363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 834962558daaed43b0111cd062e32821aad106869d7José Fonseca if (modifier == TEX_MODIFIER_PROJECTED) { 8352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca oow = emit_fetch( bld, inst, 0, 3 ); 83663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca oow = lp_build_rcp(&bld->base, oow); 83763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 83863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 839c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca for (i = 0; i < num_coords; i++) { 840c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = emit_fetch( bld, inst, 0, i ); 841962558daaed43b0111cd062e32821aad106869d7José Fonseca if (modifier == TEX_MODIFIER_PROJECTED) 842c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = lp_build_mul(&bld->base, coords[i], oow); 84363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 844ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca for (i = num_coords; i < 3; i++) { 845ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca coords[i] = bld->base.undef; 846ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca } 84763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 848962558daaed43b0111cd062e32821aad106869d7José Fonseca if (modifier == TEX_MODIFIER_EXPLICIT_DERIV) { 849962558daaed43b0111cd062e32821aad106869d7José Fonseca for (i = 0; i < num_coords; i++) { 850962558daaed43b0111cd062e32821aad106869d7José Fonseca ddx[i] = emit_fetch( bld, inst, 1, i ); 851962558daaed43b0111cd062e32821aad106869d7José Fonseca ddy[i] = emit_fetch( bld, inst, 2, i ); 852962558daaed43b0111cd062e32821aad106869d7José Fonseca } 853962558daaed43b0111cd062e32821aad106869d7José Fonseca unit = inst->Src[3].Register.Index; 854962558daaed43b0111cd062e32821aad106869d7José Fonseca } else { 855962558daaed43b0111cd062e32821aad106869d7José Fonseca for (i = 0; i < num_coords; i++) { 856ef81779850d1343b3ae284eb9beabeaf11934d4aJosé Fonseca ddx[i] = lp_build_ddx( &bld->base, coords[i] ); 857ef81779850d1343b3ae284eb9beabeaf11934d4aJosé Fonseca ddy[i] = lp_build_ddy( &bld->base, coords[i] ); 858962558daaed43b0111cd062e32821aad106869d7José Fonseca } 859962558daaed43b0111cd062e32821aad106869d7José Fonseca unit = inst->Src[1].Register.Index; 860962558daaed43b0111cd062e32821aad106869d7José Fonseca } 8614554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca for (i = num_coords; i < 3; i++) { 8624554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca ddx[i] = bld->base.undef; 8634554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca ddy[i] = bld->base.undef; 8644554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca } 865962558daaed43b0111cd062e32821aad106869d7José Fonseca 8668be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->sampler->emit_fetch_texel(bld->sampler, 8678be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.builder, 8688be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.type, 869962558daaed43b0111cd062e32821aad106869d7José Fonseca unit, num_coords, coords, 870ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca ddx, ddy, 871ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias, explicit_lod, 8728be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca texel); 87363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 87463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 87563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 876feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/** 877feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Kill fragment if any of the src register values are negative. 878feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 87963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 88063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil( 88163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 8822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst ) 88363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 8847d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[0]; 8857821664b15501b173b2304bbada758c33c5ff972José Fonseca LLVMValueRef terms[NUM_CHANNELS]; 8863d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef mask; 88763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 88863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8897821664b15501b173b2304bbada758c33c5ff972José Fonseca memset(&terms, 0, sizeof terms); 89063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 89163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( chan_index ) { 89263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned swizzle; 89363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8947821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Unswizzle channel */ 895b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 89663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8977821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Check if the component has not been already tested. */ 8987821664b15501b173b2304bbada758c33c5ff972José Fonseca assert(swizzle < NUM_CHANNELS); 8997821664b15501b173b2304bbada758c33c5ff972José Fonseca if( !terms[swizzle] ) 9007821664b15501b173b2304bbada758c33c5ff972José Fonseca /* TODO: change the comparison operator instead of setting the sign */ 9012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca terms[swizzle] = emit_fetch(bld, inst, 0, chan_index ); 90263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 90363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 9043d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = NULL; 9057821664b15501b173b2304bbada758c33c5ff972José Fonseca FOR_EACH_CHANNEL( chan_index ) { 906aede39efd86d200ffbace8fc012104e31f673973José Fonseca if(terms[chan_index]) { 9073d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef chan_mask; 908aede39efd86d200ffbace8fc012104e31f673973José Fonseca 909feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* 910feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * If term < 0 then mask = 0 else mask = ~0. 911feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 9123d7a88674f9eb3320eeff511968f041426e25023José Fonseca chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero); 913aede39efd86d200ffbace8fc012104e31f673973José Fonseca 9143d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 9153d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, ""); 9163d7a88674f9eb3320eeff511968f041426e25023José Fonseca else 9173d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = chan_mask; 918aede39efd86d200ffbace8fc012104e31f673973José Fonseca } 91963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9203d7a88674f9eb3320eeff511968f041426e25023José Fonseca 9213d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 9223d7a88674f9eb3320eeff511968f041426e25023José Fonseca lp_build_mask_update(bld->mask, mask); 92363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 92463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 92563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 92663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 927feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Predicated fragment kill. 928feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * XXX Actually, we do an unconditional kill (as in tgsi_exec.c). 929feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * The only predication is the execution mask which will apply if 930feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * we're inside a loop or conditional. 931feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 932feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulstatic void 933feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulemit_kilp(struct lp_build_tgsi_soa_context *bld, 934feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul const struct tgsi_full_instruction *inst) 935feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul{ 936feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul LLVMValueRef mask; 937feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 938feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* For those channels which are "alive", disable fragment shader 939feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * execution. 940feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 941feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul if (bld->exec_mask.has_mask) { 942feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul mask = LLVMBuildNot(bld->base.builder, bld->exec_mask.exec_mask, "kilp"); 943feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 944feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul else { 945feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul mask = bld->base.zero; 946feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 947feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 948feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul lp_build_mask_update(bld->mask, mask); 949feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul} 950feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 951e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonsecastatic void 95285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration( 95385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin struct lp_build_tgsi_soa_context *bld, 95485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin const struct tgsi_full_declaration *decl) 95585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{ 956a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca LLVMTypeRef vec_type = lp_build_vec_type(bld->base.type); 957a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca 95885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned first = decl->Range.First; 95985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned last = decl->Range.Last; 96085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned idx, i; 96185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 96285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (idx = first; idx <= last; ++idx) { 96385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin switch (decl->Declaration.File) { 96485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_TEMPORARY: 9656c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(idx < LP_MAX_TGSI_TEMPS); 966263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca if (bld->has_indirect_addressing) { 967846b2fccc2a67b08acc6da51f4970fe66ed4559bBrian Paul LLVMValueRef array_size = LLVMConstInt(LLVMInt32Type(), 968846b2fccc2a67b08acc6da51f4970fe66ed4559bBrian Paul last*4 + 4, 0); 969263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca bld->temps_array = lp_build_array_alloca(bld->base.builder, 970846b2fccc2a67b08acc6da51f4970fe66ed4559bBrian Paul vec_type, array_size, ""); 971263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca } else { 972021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin for (i = 0; i < NUM_CHANNELS; i++) 973a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca bld->temps[idx][i] = lp_build_alloca(bld->base.builder, 974a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca vec_type, ""); 975021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 97685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 97785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 97885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_OUTPUT: 979263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca for (i = 0; i < NUM_CHANNELS; i++) 980263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca bld->outputs[idx][i] = lp_build_alloca(bld->base.builder, 981263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca vec_type, ""); 98285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 98385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 984ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin case TGSI_FILE_ADDRESS: 9856c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(idx < LP_MAX_TGSI_ADDRS); 986263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca for (i = 0; i < NUM_CHANNELS; i++) 987263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca bld->addr[idx][i] = lp_build_alloca(bld->base.builder, 988263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca vec_type, ""); 989ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin break; 990ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 991e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca case TGSI_FILE_PREDICATE: 992ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca assert(idx < LP_MAX_TGSI_PREDS); 993263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca for (i = 0; i < NUM_CHANNELS; i++) 994263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca bld->preds[idx][i] = lp_build_alloca(bld->base.builder, 995263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca vec_type, ""); 996e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca break; 997e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca 99885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin default: 99985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin /* don't need to declare other vars */ 1000dc886ba1391d7d890bd1f5532bc14553e883a418Zack Rusin break; 1001012fabca722494162c244a367913562b8cfa4677Zack Rusin } 100285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 100385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin} 100463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1005fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul 1006fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul/** 1007fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * Emit LLVM for one TGSI instruction. 1008fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * \param return TRUE for success, FALSE otherwise 1009fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul */ 1010fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paulstatic boolean 101163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction( 101263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 1013faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_full_instruction *inst, 10140b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin const struct tgsi_opcode_info *info, 10150b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin int *pc) 101663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 101763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 101890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca LLVMValueRef src0, src1, src2; 1019e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp0, tmp1, tmp2; 1020e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp3 = NULL; 1021e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp4 = NULL; 1022e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp5 = NULL; 1023e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp6 = NULL; 1024e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp7 = NULL; 1025faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef res; 1026faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef dst0[NUM_CHANNELS]; 102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 102889258652b6a1d282bed14549907892bdfda752f0José Fonseca /* 102989258652b6a1d282bed14549907892bdfda752f0José Fonseca * Stores and write masks are handled in a general fashion after the long 103089258652b6a1d282bed14549907892bdfda752f0José Fonseca * instruction opcode switch statement. 103189258652b6a1d282bed14549907892bdfda752f0José Fonseca * 103289258652b6a1d282bed14549907892bdfda752f0José Fonseca * Although not stricitly necessary, we avoid generating instructions for 103389258652b6a1d282bed14549907892bdfda752f0José Fonseca * channels which won't be stored, in cases where's that easy. For some 103489258652b6a1d282bed14549907892bdfda752f0José Fonseca * complex instructions, like texture sampling, it is more convenient to 103589258652b6a1d282bed14549907892bdfda752f0José Fonseca * assume a full writemask and then let LLVM optimization passes eliminate 103689258652b6a1d282bed14549907892bdfda752f0José Fonseca * redundant code. 103789258652b6a1d282bed14549907892bdfda752f0José Fonseca */ 103889258652b6a1d282bed14549907892bdfda752f0José Fonseca 10390b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin (*pc)++; 10400b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 1041faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca assert(info->num_dst <= 1); 1042ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (info->num_dst) { 1043faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1044faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.undef; 1045faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1046faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1047faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 104863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (inst->Instruction.Opcode) { 104963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARL: 10502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1052ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin tmp0 = lp_build_floor(&bld->base, tmp0); 1053faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 105463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 105763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOV: 10582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1059faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index ); 106063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 106163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LIT: 10642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) { 1065faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 106663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 10672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 10682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 1069faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero); 1070ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca } 10712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 1072ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = SrcReg[0].yyyy */ 10732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 1074ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = max(XMM[1], 0) */ 1075ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero); 1076ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[2] = SrcReg[0].wwww */ 10772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 0, CHAN_W ); 1078ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_pow( &bld->base, tmp1, tmp2); 10792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1080c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero); 1081faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero); 1082c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca } 10832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) { 1084faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 108563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 108663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 108763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 108863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCP: 108963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIP */ 10902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 1091faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rcp(&bld->base, src0); 10922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1093faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 109463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 109563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 109663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 109763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RSQ: 109863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIPSQRT */ 10992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 110090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca src0 = lp_build_abs(&bld->base, src0); 1101faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rsqrt(&bld->base, src0); 11022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1103faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 110463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 110563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 110663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EXP: 11082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 11092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 11102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 111157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2_int_part = NULL; 111257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_frac_part = NULL; 111357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2 = NULL; 111457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 11152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 111657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 11172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 111857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2_int_part = &tmp0; 11192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 112057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_frac_part = &tmp1; 11212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 112257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2 = &tmp2; 112357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 112457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2); 112557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 11262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 1127faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 11282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 1129faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp1; 11302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 1131faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 113363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 11342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 1135faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 113663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 113763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 113863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LOG: 11402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 11412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 11422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 1143add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_floor_log2 = NULL; 1144add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_exp = NULL; 1145add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_log2 = NULL; 114657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 11472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 114857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca src0 = lp_build_abs( &bld->base, src0 ); 114957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 11502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 115157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_floor_log2 = &tmp0; 11522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 115357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp = &tmp1; 11542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 115557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_log2 = &tmp2; 115657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 115757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2); 115857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 115957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.x = floor(lg2(abs(src.x))) */ 11602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 1161faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 116257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */ 11632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) { 1164faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1); 116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 116657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.z = lg2(abs(src.x)) */ 11672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 1168faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 116963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 11712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 1172faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 117463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 117563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MUL: 11772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1180faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_mul(&bld->base, src0, src1); 118163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 118263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 118363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 118463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ADD: 11852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1188faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add(&bld->base, src0, src1); 118963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 119063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 119263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP3: 119363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT3 */ 11942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 11952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 119690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 11972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 11982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 119990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 120090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 12022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 120390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 120490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1206faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 120763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 120863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP4: 121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT4 */ 12122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 121490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 12152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 12162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 121790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 121890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 12202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 122190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 122290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_W ); 12242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_W ); 122590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 122690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1228faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 123063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 123163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DST: 12332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 1234faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 123563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 12372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 12382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Y ); 1239faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1); 124063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1242faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z ); 124363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1245faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W ); 124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MIN: 12502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1253faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_min( &bld->base, src0, src1 ); 125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 125663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 125763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAX: 12582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1261faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_max( &bld->base, src0, src1 ); 126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 126563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLT: 126663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETLT */ 12672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 12701aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 ); 1271faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 12721aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 127363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 127463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 127563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGE: 127663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETGE */ 12772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 12801aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 ); 1281faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 12821aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 128363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 128463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAD: 128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_MADD */ 12872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 12892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 12902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 2, chan_index ); 129190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 129290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp2); 1293faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 129663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 129763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SUB: 12982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 13002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 1301faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1); 130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 130363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 130463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LRP: 13062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 13082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 13092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 131090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sub( &bld->base, src1, src2 ); 131190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, src0, tmp0 ); 1312faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 ); 131363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CND: 1317873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1318873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 1319873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1320873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 1321185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul tmp1 = lp_build_const_vec(bld->base.type, 0.5); 1322873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1); 1323faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 ); 1324873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 132663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 132763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2A: 13282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 13292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 133090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 13312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 13322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 133390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 133490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 13352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 2, CHAN_X ); /* xmm1 = src[2].x */ 133690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 13372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1338faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 133963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 134063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 134163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 134263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FRC: 13432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1344873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 1345873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_floor(&bld->base, src0); 1346f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul tmp0 = lp_build_sub(&bld->base, src0, tmp0); 1347faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 134863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 135063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 135163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CLAMP: 1352873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1353873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1354873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1355873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 1356873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_max(&bld->base, tmp0, src1); 1357873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_min(&bld->base, tmp0, src2); 1358faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 1359873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FLR: 13632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1365faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_floor(&bld->base, tmp0); 136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 136763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ROUND: 13702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1372faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_round(&bld->base, tmp0); 137363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca case TGSI_OPCODE_EX2: { 13772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 137890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_exp2( &bld->base, tmp0); 13792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1380faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 138163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 138263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca } 138463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 138563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LG2: 13862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 138790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_log2( &bld->base, tmp0); 13882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1389faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 139063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 139163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 139363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POW: 13942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 13952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, CHAN_X ); 1396faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_pow( &bld->base, src0, src1 ); 13972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1398faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 139963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 140063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 140163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 140263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XPD: 14032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 14042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 14052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Z ); 14062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp3 = emit_fetch( bld, inst, 0, CHAN_Z ); 140763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 14092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 14102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 14112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp4 = emit_fetch( bld, inst, 1, CHAN_Y ); 141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 141490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = tmp0; 141590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_mul( &bld->base, tmp2, tmp1); 141690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp3; 141790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 141890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_sub( &bld->base, tmp2, tmp5); 1419faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp2; 142063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 14222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 14232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_X ); 14242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp5 = emit_fetch( bld, inst, 0, CHAN_X ); 142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 142790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_mul( &bld->base, tmp3, tmp2); 142890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp5); 142990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_sub( &bld->base, tmp3, tmp1); 1430faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp3; 143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 143390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 143490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp2); 143590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_sub( &bld->base, tmp5, tmp0); 1436faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp5; 143763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1439faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 144063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 144163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ABS: 14442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1446faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_abs( &bld->base, tmp0 ); 144763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCC: 1451873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1452873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1453fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DPH: 14562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 14572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 145890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 14592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 14602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 146190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 146290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 14632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 14642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 146590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 146690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 14672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_W ); 146890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 14692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1470faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 147163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 147263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 147363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 147463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_COS: 14752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 147690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_cos( &bld->base, tmp0 ); 14772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1478faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 147963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 148163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDX: 148386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 148486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL); 148586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 148663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDY: 148986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 149086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]); 149186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 149263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KILP: 149563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* predicated kill */ 1496feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul emit_kilp( bld, inst ); 149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KIL: 150063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* conditional kill */ 15012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca emit_kil( bld, inst ); 150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 150363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2H: 1505fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 150663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 150763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 150863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2US: 1509fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 151063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 151163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 151263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4B: 1513fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 151463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 151563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 151663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4UB: 1517fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 151863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 151963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 152063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RFL: 1521fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 152263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 152363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 152463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SEQ: 15252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 15262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 15272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 15281aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 ); 1529faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 15301aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 153163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 153263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 153363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SFL: 1534873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1535faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.zero; 1536873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 153763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 153863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 153963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGT: 15402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 15412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 15422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 15431aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 ); 1544faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 15451aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 154663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 154763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SIN: 15492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 155090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sin( &bld->base, tmp0 ); 15512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1552faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 155363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 155463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 155563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLE: 15572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 15582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 15592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 15601aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 ); 1561faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 15621aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 156363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 156463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 156563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SNE: 15662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 15672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 15682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 15691aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 ); 1570faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 15711aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 157263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 157363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 157463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_STR: 1575873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1576faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.one; 1577873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 157863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 157963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 158063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TEX: 1581962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_NONE, dst0 ); 158263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 158363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 158463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXD: 1585962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_EXPLICIT_DERIV, dst0 ); 158663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 158763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 158863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2H: 1589873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1590873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert (0); 1591fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 159263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 159363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 159463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2US: 1595873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1596873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1597fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 159863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 159963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 160063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4B: 1601873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1602873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1603fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 160463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 160563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 160663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4UB: 1607873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1608873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1609fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 161063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 161163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 161263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_X2D: 1613873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1614873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1615fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 161663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 161763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 161863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARA: 1619873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1620873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1621fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 162263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 162363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 162463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARR: 16252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 16262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1627ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin tmp0 = lp_build_round(&bld->base, tmp0); 1628faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 162963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 163063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 163163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 163263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRA: 1633873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1634873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1635fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 163663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 163763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1638263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca case TGSI_OPCODE_CAL: 16390b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin lp_exec_mask_call(&bld->exec_mask, 16400b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin inst->Label.Label, 16410b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin pc); 16420b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 164363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 164463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 164563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RET: 16460b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin lp_exec_mask_ret(&bld->exec_mask, pc); 164763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 164863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 164963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_END: 16500b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin *pc = -1; 165163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 165263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 165363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SSG: 165463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SGN */ 16552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 16562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1657faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 ); 165863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 165963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 166063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 166163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CMP: 16622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 16632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 16642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 16652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 16661aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero ); 1667faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2); 16681aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 166963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 167063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 167163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SCS: 16722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 16732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1674faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 ); 167563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 16762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 16772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1678faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 ); 167963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 16802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1681faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = bld->base.zero; 168263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 16832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1684faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 168563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 168663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 168763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 168863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXB: 1689962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_LOD_BIAS, dst0 ); 169063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 169163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 169263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM: 169363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* fall-through */ 169463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM4: 169563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* 3 or 4-component normalization */ 169663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 169763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4; 169863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 16992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) || 17002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) || 17012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) || 17022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) { 170363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 170463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */ 170563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 170663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm4 = src.x */ 170763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = src.x * src.x */ 17082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 17092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 171090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp4 = tmp0; 171163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 171290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp0); 171363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 171463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm5 = src.y */ 171563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.y * src.y */ 17162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Y); 17172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 171890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp1; 171963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 172090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 172190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 172263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 172363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm6 = src.z */ 172463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.z * src.z */ 17252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Z); 17262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 172790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp6 = tmp1; 172863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 172990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 173090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 173163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 173263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (dims == 4) { 173363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm7 = src.w */ 173463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.w * src.w */ 17352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_W); 17362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) { 173790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp7 = tmp1; 173863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 173990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 174090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 174163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 174263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 174363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm1 = 1 / sqrt(xmm0) */ 174490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_rsqrt( &bld->base, tmp0); 174563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 174663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.x = xmm1 * src.x */ 17472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 1748faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1); 174963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 175063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 175163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.y = xmm1 * src.y */ 17522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 1753faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1); 175463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 175563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 175663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.z = xmm1 * src.z */ 17572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 1758faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1); 175963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 176063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 176163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = xmm1 * src.w */ 17622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) { 1763faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1); 176463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 176563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 176663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1767faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca /* dst.w = 1.0 */ 17682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) { 1769faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 177063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 177163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 177263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 177363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 177463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DIV: 1775873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1776873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert( 0 ); 1777fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 177863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 177963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 178063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2: 17812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 17822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 178390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 17842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 17852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 178690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 178790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 17882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1789faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 179063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 179163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 179263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 179363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXL: 1794962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_EXPLICIT_LOD, dst0 ); 179563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 179663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 179763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXP: 1798962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_PROJECTED, dst0 ); 179963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 180018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 180163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRK: 180218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_break(&bld->exec_mask); 180363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 180463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 180563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_IF: 180680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 1807ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin tmp0 = lp_build_cmp(&bld->base, PIPE_FUNC_NOTEQUAL, 1808ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin tmp0, bld->base.zero); 180980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_push(&bld->exec_mask, tmp0); 181063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 181163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 181218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin case TGSI_OPCODE_BGNLOOP: 181318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_bgnloop(&bld->exec_mask); 181418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin break; 181518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 18160b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin case TGSI_OPCODE_BGNSUB: 18170b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin lp_exec_mask_bgnsub(&bld->exec_mask); 18180b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin break; 18190b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 182063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ELSE: 182180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_invert(&bld->exec_mask); 182263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 182363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 182463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDIF: 182580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_pop(&bld->exec_mask); 182663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 182763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 182818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin case TGSI_OPCODE_ENDLOOP: 182918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_endloop(&bld->exec_mask); 183018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin break; 183118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 18320b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin case TGSI_OPCODE_ENDSUB: 18330b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin lp_exec_mask_endsub(&bld->exec_mask, pc); 18340b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin break; 18350b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 183663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PUSHA: 1837873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1838873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1839fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 184063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 184163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 184263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POPA: 1843873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1844873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1845fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 184663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 184763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 184863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CEIL: 1849873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1850873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1851faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_ceil(&bld->base, tmp0); 1852873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 185363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 185463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 185563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_I2F: 1856873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1857873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1858fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 185963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 186063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 186163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NOT: 1862873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1863873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1864fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 186563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 186663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 186763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TRUNC: 18682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 18692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1870faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_trunc(&bld->base, tmp0); 187163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 187263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 187363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 187463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SHL: 1875873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1876873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1877fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 187863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 187963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 18802c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol case TGSI_OPCODE_ISHR: 1881873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1882873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1883fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 188463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 188563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 188663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_AND: 1887873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1888873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1889fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 189063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 189163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 189263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_OR: 1893873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1894873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1895fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 189663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 189763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 189863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOD: 1899873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1900873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1901fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 190263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 190363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 190463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XOR: 1905873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1906873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1907fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 190863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 190963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 191063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SAD: 1911873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1912873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1913fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 191463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 191563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 191663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXF: 1917873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1918873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1919fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 192063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 192163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 192263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXQ: 1923873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1924873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1925fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 192663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 192763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 192863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CONT: 192918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_continue(&bld->exec_mask); 193063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 193163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 193263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EMIT: 1933fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 193463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 193563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 193663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDPRIM: 1937fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 193863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 193963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1940873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca case TGSI_OPCODE_NOP: 1941873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca break; 1942873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca 194363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 1944fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 194563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 194663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1947faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 1948ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef pred[NUM_CHANNELS]; 1949ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 1950ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca emit_fetch_predicate( bld, inst, pred ); 1951ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 1952faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1953ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca emit_store( bld, inst, 0, chan_index, pred[chan_index], dst0[chan_index]); 1954faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1955faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1956faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 1957fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return TRUE; 195863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 195963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1960c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca 1961c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid 196263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder, 196363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_token *tokens, 1964b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 19653d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask, 196663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr, 1967f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos, 1968f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS], 1969f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS], 1970021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin struct lp_build_sampler_soa *sampler, 19713f6dc8e79d918283a6dfcf9c8937a6d52f3bb4f5Brian Paul const struct tgsi_shader_info *info) 197263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 197363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context bld; 197463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct tgsi_parse_context parse; 197563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint num_immediates = 0; 19760b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin uint num_instructions = 0; 197763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 19780b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin int pc = 0; 197963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 198063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* Setup build context */ 198163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca memset(&bld, 0, sizeof bld); 198263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lp_build_context_init(&bld.base, builder, type); 1983ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca lp_build_context_init(&bld.int_bld, builder, lp_int_type(type)); 1984c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca bld.mask = mask; 1985f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.pos = pos; 1986f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.inputs = inputs; 198763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.outputs = outputs; 198863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.consts_ptr = consts_ptr; 19898be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld.sampler = sampler; 1990021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin bld.has_indirect_addressing = info->opcode_count[TGSI_OPCODE_ARR] > 0 || 1991021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin info->opcode_count[TGSI_OPCODE_ARL] > 0; 19920b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin bld.instructions = (struct tgsi_full_instruction *) 19930b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin MALLOC( LP_MAX_INSTRUCTIONS * sizeof(struct tgsi_full_instruction) ); 19940b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin bld.max_instructions = LP_MAX_INSTRUCTIONS; 19950b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 19960b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin if (!bld.instructions) { 19970b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin return; 19980b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin } 199963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 200080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_init(&bld.exec_mask, &bld.base); 200180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 200263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_init( &parse, tokens ); 200363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 200463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca while( !tgsi_parse_end_of_tokens( &parse ) ) { 200563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_token( &parse ); 200663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 200763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( parse.FullToken.Token.Type ) { 200863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_DECLARATION: 20091fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* Inputs already interpolated */ 2010e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca emit_declaration( &bld, &parse.FullToken.FullDeclaration ); 201163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 201263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 201363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_INSTRUCTION: 2014faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca { 20150b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin /* save expanded instruction */ 20160b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin if (num_instructions == bld.max_instructions) { 20170b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin bld.instructions = REALLOC(bld.instructions, 20180b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin bld.max_instructions 20190b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin * sizeof(struct tgsi_full_instruction), 20200b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin (bld.max_instructions + LP_MAX_INSTRUCTIONS) 20210b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin * sizeof(struct tgsi_full_instruction)); 20220b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin bld.max_instructions += LP_MAX_INSTRUCTIONS; 20230b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin } 20240b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 20250b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin memcpy(bld.instructions + num_instructions, 20260b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin &parse.FullToken.FullInstruction, 20270b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin sizeof(bld.instructions[0])); 20280b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 20290b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin num_instructions++; 2030faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 2031faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 203263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 203363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 203463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_IMMEDIATE: 203563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* simply copy the immediate values into the next immediates[] slot */ 203663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 203763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1; 203863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(size <= 4); 20396c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(num_immediates < LP_MAX_TGSI_IMMEDIATES); 204063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = 0; i < size; ++i ) 204163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = 2042185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul lp_build_const_vec(type, parse.FullToken.FullImmediate.u[i].Float); 204363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = size; i < 4; ++i ) 204463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = bld.base.undef; 204563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca num_immediates++; 204663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 204763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 204863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 20499381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca case TGSI_TOKEN_TYPE_PROPERTY: 20509381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca break; 20519381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca 205263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 205363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 205463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 205563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 20560b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 20570b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin while (pc != -1) { 20580b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin struct tgsi_full_instruction *instr = bld.instructions + pc; 20590b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin const struct tgsi_opcode_info *opcode_info = 20600b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin tgsi_get_opcode_info(instr->Instruction.Opcode); 20610b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin if (!emit_instruction( &bld, instr, opcode_info, &pc )) 20620b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n", 20630b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin opcode_info->mnemonic); 20640b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin } 20650b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 206618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (0) { 206718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef block = LLVMGetInsertBlock(builder); 206818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef function = LLVMGetBasicBlockParent(block); 2069263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca debug_printf("11111111111111111111111111111 \n"); 207018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tgsi_dump(tokens, 0); 20718ad3e0b55df50beac8ba3c5cafa0be79641a4977José Fonseca lp_debug_dump_value(function); 2072263e038431f24f24aaec252e135ffc9f2f09640eJosé Fonseca debug_printf("2222222222222222222222222222 \n"); 207318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 207463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_free( &parse ); 20750b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 20760b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin if (0) { 20770b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin LLVMModuleRef module = LLVMGetGlobalParent( 20780b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin LLVMGetBasicBlockParent(LLVMGetInsertBlock(bld.base.builder))); 20790b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin LLVMDumpModule(module); 20800b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 20810b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin } 20820b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin 20830b7ca2f8fcb187fb3aa37e0b6dc4b0a84101478fZack Rusin FREE( bld.instructions ); 208463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 208563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 2086