lp_bld_tgsi_soa.c revision 2d91903882e399e8ea7306fd37d5d214907247e6
163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/************************************************************************** 263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * 363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Copyright 2009 VMware, Inc. 463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * All Rights Reserved. 663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * 763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a 863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * copy of this software and associated documentation files (the 963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * "Software"), to deal in the Software without restriction, including 1063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish, 1163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to 1263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to 1363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * the following conditions: 1463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * 1563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * The above copyright notice and this permission notice (including the 1663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * next paragraph) shall be included in all copies or substantial portions 1763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * of the Software. 1863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * 1963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 2063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * 2763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca **************************************************************************/ 2863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 295811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca/** 305811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @file 315811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * TGSI to LLVM IR translation -- SoA. 325811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * 335811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * @author Jose Fonseca <jfonseca@vmware.com> 345811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * 355811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell, 365811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca * Brian Paul, and others. 375811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca */ 385811ed87d732101ab8cfbd087bc99d8c6c963f30José Fonseca 3963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_config.h" 4063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "pipe/p_shader_tokens.h" 4163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_debug.h" 4263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_math.h" 4363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "util/u_memory.h" 442410125d072faeb83c8373e676422f6c44c78febBrian Paul#include "tgsi/tgsi_dump.h" 457821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "tgsi/tgsi_info.h" 4663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_parse.h" 4763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_util.h" 4863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_exec.h" 49021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin#include "tgsi/tgsi_scan.h" 5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h" 5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h" 5263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h" 537821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h" 5463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h" 553d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h" 5663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h" 576c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca#include "lp_bld_limits.h" 5880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h" 5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\ 6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++) 6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 655b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN))) 6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( INST, CHAN )) 6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\ 7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( CHAN )\ 7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN ) 7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0 7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1 7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2 7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3 7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT 0 8086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT 1 8186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT 2 8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3 8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 8480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 8580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstruct lp_exec_mask { 8680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_build_context *bld; 8780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 8880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin boolean has_mask; 8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMTypeRef int_vec_type; 9180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 926c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef cond_stack[LP_MAX_TGSI_NESTING]; 9380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin int cond_stack_size; 9480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef cond_mask; 9580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 962d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMBasicBlockRef loop_block; 9718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef cont_mask; 982d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef break_mask; 992d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef break_var; 1002d91903882e399e8ea7306fd37d5d214907247e6José Fonseca struct { 1012d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMBasicBlockRef loop_block; 1022d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef cont_mask; 1032d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef break_mask; 1042d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef break_var; 1052d91903882e399e8ea7306fd37d5d214907247e6José Fonseca } loop_stack[LP_MAX_TGSI_NESTING]; 10618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int loop_stack_size; 10718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 10880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef exec_mask; 10980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}; 11063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context 11263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 11363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_context base; 11463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 115ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* Builder for integer masks and indices */ 116ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca struct lp_build_context int_bld; 117ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr; 119f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos; 120f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS]; 12195f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS]; 122c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca 1238be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca struct lp_build_sampler_soa *sampler; 12463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1256c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef immediates[LP_MAX_TGSI_IMMEDIATES][NUM_CHANNELS]; 1266c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef temps[LP_MAX_TGSI_TEMPS][NUM_CHANNELS]; 1276c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef addr[LP_MAX_TGSI_ADDRS][NUM_CHANNELS]; 128ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef preds[LP_MAX_TGSI_PREDS][NUM_CHANNELS]; 1291929057eac0c3351e0810612bdae56331a235736José Fonseca 130021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin /* we allocate an array of temps if we have indirect 131021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin * addressing and then the temps above is unused */ 132021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temps_array; 133021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin boolean has_indirect_addressing; 134021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin 1353d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask; 13680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_exec_mask exec_mask; 13763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}; 13863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 13986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = { 14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_LEFT, 14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_LEFT 14386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 14486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 14586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 14686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = { 14786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_RIGHT, QUAD_TOP_RIGHT, 14886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT 14986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 15086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 15186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 15286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = { 15386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT, 15486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT 15586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 15686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 15786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 15886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = { 15986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT, 16086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT 16186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 16286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 16380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld) 16480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 16580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->bld = bld; 16680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->has_mask = FALSE; 16780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack_size = 0; 16818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack_size = 0; 16980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 17080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->int_vec_type = lp_build_int_vec_type(mask->bld->type); 1712d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_mask = mask->cont_mask = mask->cond_mask = 1722d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMConstAllOnes(mask->int_vec_type); 17380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 17480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 17580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask) 17680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 17718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->loop_stack_size) { 17818a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin /*for loops we need to update the entire mask at runtime */ 17918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef tmp; 1807fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul assert(mask->break_mask); 18118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp = LLVMBuildAnd(mask->bld->builder, 18218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask, 18318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask, 18418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskcb"); 18518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = LLVMBuildAnd(mask->bld->builder, 18618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cond_mask, 18718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp, 18818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskfull"); 18918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } else 19018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = mask->cond_mask; 19118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 19218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 19318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->has_mask = (mask->cond_stack_size > 0 || 19418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack_size > 0); 19580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 19680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 19780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask, 19880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val) 19980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 2006c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(mask->cond_stack_size < LP_MAX_TGSI_NESTING); 2012d91903882e399e8ea7306fd37d5d214907247e6José Fonseca if (mask->cond_stack_size == 0) { 2022d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cond_mask == LLVMConstAllOnes(mask->int_vec_type)); 2032d91903882e399e8ea7306fd37d5d214907247e6José Fonseca } 20480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask; 2052d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(LLVMTypeOf(val) == mask->int_vec_type); 2062d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->cond_mask = val; 20780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 20880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 20980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 21080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 21180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask) 21280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 2132d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef prev_mask; 2142d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMValueRef inv_mask; 2152d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 2162d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cond_stack_size); 2172d91903882e399e8ea7306fd37d5d214907247e6José Fonseca prev_mask = mask->cond_stack[mask->cond_stack_size - 1]; 2182d91903882e399e8ea7306fd37d5d214907247e6José Fonseca if (mask->cond_stack_size == 1) { 2192d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(prev_mask == LLVMConstAllOnes(mask->int_vec_type)); 220faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin } 221faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 2222d91903882e399e8ea7306fd37d5d214907247e6José Fonseca inv_mask = LLVMBuildNot(mask->bld->builder, mask->cond_mask, ""); 2232d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 22480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = LLVMBuildAnd(mask->bld->builder, 22580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin inv_mask, 22680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin prev_mask, ""); 22780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 22880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 22980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 23080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask) 23180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 2322d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cond_stack_size); 23380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = mask->cond_stack[--mask->cond_stack_size]; 23480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 23580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 23680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 23718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_bgnloop(struct lp_exec_mask *mask) 23818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 2392d91903882e399e8ea7306fd37d5d214907247e6José Fonseca if (mask->loop_stack_size == 0) { 2402d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_block == NULL); 2412d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->cont_mask == LLVMConstAllOnes(mask->int_vec_type)); 2422d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->break_mask == LLVMConstAllOnes(mask->int_vec_type)); 2432d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->break_var == NULL); 2442d91903882e399e8ea7306fd37d5d214907247e6José Fonseca } 2452d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 2462d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_stack_size < LP_MAX_TGSI_NESTING); 24718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 2482d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].loop_block = mask->loop_block; 2492d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].cont_mask = mask->cont_mask; 2502d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].break_mask = mask->break_mask; 2512d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_stack[mask->loop_stack_size].break_var = mask->break_var; 2522d91903882e399e8ea7306fd37d5d214907247e6José Fonseca ++mask->loop_stack_size; 2533a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin 2542d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_var = lp_build_alloca(mask->bld->builder, mask->int_vec_type, ""); 2552d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMBuildStore(mask->bld->builder, mask->break_mask, mask->break_var); 2566c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca 25718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_block = lp_build_insert_new_block(mask->bld->builder, "bgnloop"); 25818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBuildBr(mask->bld->builder, mask->loop_block); 25918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMPositionBuilderAtEnd(mask->bld->builder, mask->loop_block); 26018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 2612d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_mask = LLVMBuildLoad(mask->bld->builder, mask->break_var, ""); 2622d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 26318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 26418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 26518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 26618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_break(struct lp_exec_mask *mask) 26718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 26818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder, 26918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 27018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "break"); 27118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 272d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->break_mask = LLVMBuildAnd(mask->bld->builder, 273d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->break_mask, 274d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin exec_mask, "break_full"); 27518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 27618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 27718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 27818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 27918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_continue(struct lp_exec_mask *mask) 28018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 28118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder, 28218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 28318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin ""); 28418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 285d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->cont_mask = LLVMBuildAnd(mask->bld->builder, 286d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->cont_mask, 287d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin exec_mask, ""); 28818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 28918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 29018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 29118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 29218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 29318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_endloop(struct lp_exec_mask *mask) 29418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 29518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef endloop; 296d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMTypeRef reg_type = LLVMIntType(mask->bld->type.width* 297d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca mask->bld->type.length); 2987fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul LLVMValueRef i1cond; 2997fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul 3007fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul assert(mask->break_mask); 3017fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul 3022d91903882e399e8ea7306fd37d5d214907247e6José Fonseca /* 3032d91903882e399e8ea7306fd37d5d214907247e6José Fonseca * Restore the cont_mask, but don't pop 3042d91903882e399e8ea7306fd37d5d214907247e6José Fonseca */ 3052d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_stack_size); 3062d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->cont_mask = mask->loop_stack[mask->loop_stack_size - 1].cont_mask; 3072d91903882e399e8ea7306fd37d5d214907247e6José Fonseca lp_exec_mask_update(mask); 3082d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 3092d91903882e399e8ea7306fd37d5d214907247e6José Fonseca /* 3102d91903882e399e8ea7306fd37d5d214907247e6José Fonseca * Unlike the continue mask, the break_mask must be preserved across loop 3112d91903882e399e8ea7306fd37d5d214907247e6José Fonseca * iterations 3122d91903882e399e8ea7306fd37d5d214907247e6José Fonseca */ 3132d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMBuildStore(mask->bld->builder, mask->break_mask, mask->break_var); 3142d91903882e399e8ea7306fd37d5d214907247e6José Fonseca 315d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca /* i1cond = (mask == 0) */ 3167fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul i1cond = LLVMBuildICmp( 317d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca mask->bld->builder, 318d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMIntNE, 3192d91903882e399e8ea7306fd37d5d214907247e6José Fonseca LLVMBuildBitCast(mask->bld->builder, mask->exec_mask, reg_type, ""), 320d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMConstNull(reg_type), ""); 32118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 32218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin endloop = lp_build_insert_new_block(mask->bld->builder, "endloop"); 32318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 32418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBuildCondBr(mask->bld->builder, 325ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin i1cond, mask->loop_block, endloop); 32618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 32718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMPositionBuilderAtEnd(mask->bld->builder, endloop); 32818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 3292d91903882e399e8ea7306fd37d5d214907247e6José Fonseca assert(mask->loop_stack_size); 3302d91903882e399e8ea7306fd37d5d214907247e6José Fonseca --mask->loop_stack_size; 3312d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->loop_block = mask->loop_stack[mask->loop_stack_size].loop_block; 3322d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->cont_mask = mask->loop_stack[mask->loop_stack_size].cont_mask; 3332d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_mask = mask->loop_stack[mask->loop_stack_size].break_mask; 3342d91903882e399e8ea7306fd37d5d214907247e6José Fonseca mask->break_var = mask->loop_stack[mask->loop_stack_size].break_var; 33518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 33618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 33718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 33818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 33918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin/* stores val into an address pointed to by dst. 34018a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * mask->exec_mask is used to figure out which bits of val 34118a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * should be stored into the address 34218a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * (0 means don't store this bit, 1 means do store). 34318a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin */ 34480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask, 345ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef pred, 34680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val, 34780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef dst) 34880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 349ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* Mix the predicate and execution mask */ 35080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin if (mask->has_mask) { 351ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (pred) { 352ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMBuildAnd(mask->bld->builder, pred, mask->exec_mask, ""); 353ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } else { 354ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred = mask->exec_mask; 355ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 356ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 357ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 358ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (pred) { 35980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef real_val, dst_val; 36080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 36180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin dst_val = LLVMBuildLoad(mask->bld->builder, dst, ""); 36280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin real_val = lp_build_select(mask->bld, 363ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred, 36480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin val, dst_val); 36580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 36680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, real_val, dst); 36780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin } else 36880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, val, dst); 36980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 37080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 37186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 37286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 37386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld, 37486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 37586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 37686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_left = lp_build_swizzle1_aos(&bld->base, src, swizzle_left); 37786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right); 37886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_right, src_left); 37986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 38086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 38186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 38286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 38386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld, 38486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 38586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 38686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_top = lp_build_swizzle1_aos(&bld->base, src, swizzle_top); 38786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom); 38886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_top, src_bottom); 38986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 39086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 391021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinstatic LLVMValueRef 392021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinget_temp_ptr(struct lp_build_tgsi_soa_context *bld, 393021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin unsigned index, 394021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin unsigned swizzle, 395021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin boolean is_indirect, 396021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef addr) 397021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin{ 398021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (!bld->has_indirect_addressing) { 399021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin return bld->temps[index][swizzle]; 400021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } else { 401021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef lindex = 402021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMConstInt(LLVMInt32Type(), index*4 + swizzle, 0); 403021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (is_indirect) 404021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin lindex = lp_build_add(&bld->base, lindex, addr); 405021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin return LLVMBuildGEP(bld->base.builder, bld->temps_array, &lindex, 1, ""); 406021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 407021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin} 40886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 40963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 41063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch. 41163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 41263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef 41363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch( 41463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 4152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst, 4162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 41763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const unsigned chan_index ) 41863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 4197d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[index]; 420b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 42163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef res; 422ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin LLVMValueRef addr; 42363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (swizzle) { 425b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_X: 426b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Y: 427b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Z: 428b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_W: 42963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 430ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin if (reg->Register.Indirect) { 431ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type); 432ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin unsigned swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect, chan_index ); 433ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr = LLVMBuildLoad(bld->base.builder, 434ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin bld->addr[reg->Indirect.Index][swizzle], 435ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin ""); 436ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin /* for indexing we want integers */ 437ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr = LLVMBuildFPToSI(bld->base.builder, addr, 438ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin int_vec_type, ""); 439ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr = LLVMBuildExtractElement(bld->base.builder, 440ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr, LLVMConstInt(LLVMInt32Type(), 0, 0), 441ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin ""); 442021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0)); 443ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin } 444ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 44591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell switch (reg->Register.File) { 44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_CONSTANT: { 44791a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0); 448ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin LLVMValueRef scalar, scalar_ptr; 449ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 450ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin if (reg->Register.Indirect) { 451ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin /*lp_build_printf(bld->base.builder, 452ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin "\taddr = %d\n", addr);*/ 453ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin index = lp_build_add(&bld->base, index, addr); 454ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin } 455ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, ""); 456ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, ""); 457ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 45863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_broadcast_scalar(&bld->base, scalar); 45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_IMMEDIATE: 46391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->immediates[reg->Register.Index][swizzle]; 46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 46663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 46763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_INPUT: 46891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->inputs[reg->Register.Index][swizzle]; 46963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 472021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin case TGSI_FILE_TEMPORARY: { 473021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index, 474021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin swizzle, 475021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin reg->Register.Indirect, 476021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr); 477021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin res = LLVMBuildLoad(bld->base.builder, temp_ptr, ""); 47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(!res) 47963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return bld->base.undef; 48063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 481021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 48263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 48363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 4854d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 48663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 48763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 48863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 48963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 49063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 4914d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 49263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 49363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 49463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) { 49563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_CLEAR: 49663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 49763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 49863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 49963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_SET: 5001fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* TODO: Use bitwese OR for floating point */ 50163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 50263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 50363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 50463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 50563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_TOGGLE: 50663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 50763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 50863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 50963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_KEEP: 51063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 51163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 51263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 51363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return res; 51463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 51763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 51886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives. 51986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */ 52086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void 52186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv( 52286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca struct lp_build_tgsi_soa_context *bld, 52386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const struct tgsi_full_instruction *inst, 52486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca unsigned index, 52586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const unsigned chan_index, 52686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *res, 52786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddx, 52886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddy) 52986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 53086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src; 53186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 53286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca src = emit_fetch(bld, inst, index, chan_index); 53386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 53486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(res) 53586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *res = src; 53686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 53786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca /* TODO: use interpolation coeffs for inputs */ 53886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 53986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddx) 54086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddx = emit_ddx(bld, src); 54186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 54286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddy) 54386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddy = emit_ddy(bld, src); 54486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 54586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 54686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 54786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/** 548ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * Predicate. 549ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca */ 550ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonsecastatic void 551ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonsecaemit_fetch_predicate( 552ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca struct lp_build_tgsi_soa_context *bld, 553ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca const struct tgsi_full_instruction *inst, 554ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef *pred) 555ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca{ 556ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned index; 557ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned char swizzles[4]; 558ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef unswizzled[4] = {NULL, NULL, NULL, NULL}; 559ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef value; 560ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned chan; 561ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 562ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (!inst->Instruction.Predicate) { 563ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca FOR_EACH_CHANNEL( chan ) { 564ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred[chan] = NULL; 565ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 566ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca return; 567ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 568ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 569ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[0] = inst->Predicate.SwizzleX; 570ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[1] = inst->Predicate.SwizzleY; 571ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[2] = inst->Predicate.SwizzleZ; 572ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca swizzles[3] = inst->Predicate.SwizzleW; 573ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 574ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca index = inst->Predicate.Index; 575ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca assert(index < LP_MAX_TGSI_PREDS); 576ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 577ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca FOR_EACH_CHANNEL( chan ) { 578ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unsigned swizzle = swizzles[chan]; 579ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 580ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* 581ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * Only fetch the predicate register channels that are actually listed 582ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * in the swizzles 583ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca */ 584ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (!unswizzled[swizzle]) { 585ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value = LLVMBuildLoad(bld->base.builder, 586ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca bld->preds[index][swizzle], ""); 587ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 588ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca /* 589ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * Convert the value to an integer mask. 590ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * 591ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * TODO: Short-circuit this comparison -- a D3D setp_xx instructions 592ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * is needlessly causing two comparisons due to storing the intermediate 593ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca * result as float vector instead of an integer mask vector. 594ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca */ 595ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value = lp_build_compare(bld->base.builder, 596ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca bld->base.type, 597ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca PIPE_FUNC_NOTEQUAL, 598ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value, 599ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca bld->base.zero); 600ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (inst->Predicate.Negate) { 601ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value = LLVMBuildNot(bld->base.builder, value, ""); 602ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 603ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 604ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca unswizzled[swizzle] = value; 605ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } else { 606ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca value = unswizzled[swizzle]; 607ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 608ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 609ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca pred[chan] = value; 610ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca } 611ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca} 612ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 613ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 614ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca/** 61563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store. 61663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 61763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 61863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store( 61963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 62063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 6212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 62263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index, 623ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef pred, 62463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef value) 62563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 6267d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[index]; 627021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef addr; 6282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca 62963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( inst->Instruction.Saturate ) { 63063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_NONE: 63163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 63263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 63363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_ZERO_ONE: 6347926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_max(&bld->base, value, bld->base.zero); 6357926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 63663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_MINUS_PLUS_ONE: 639185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul value = lp_build_max(&bld->base, value, lp_build_const_vec(bld->base.type, -1.0)); 6407926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 64163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 6427926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca 6437926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca default: 6447926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca assert(0); 64563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 64663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 647021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (reg->Register.Indirect) { 648021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type); 649021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin unsigned swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect, chan_index ); 650021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildLoad(bld->base.builder, 651021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin bld->addr[reg->Indirect.Index][swizzle], 652021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin ""); 653021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin /* for indexing we want integers */ 654021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildFPToSI(bld->base.builder, addr, 655021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin int_vec_type, ""); 656021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildExtractElement(bld->base.builder, 657021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr, LLVMConstInt(LLVMInt32Type(), 0, 0), 658021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin ""); 659021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0)); 660021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 661021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin 6625b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch( reg->Register.File ) { 66363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_OUTPUT: 664ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca lp_exec_mask_store(&bld->exec_mask, pred, value, 66580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin bld->outputs[reg->Register.Index][chan_index]); 66663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 66763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 668021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin case TGSI_FILE_TEMPORARY: { 669021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index, 670021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin chan_index, 671021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin reg->Register.Indirect, 672021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr); 673ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca lp_exec_mask_store(&bld->exec_mask, pred, value, temp_ptr); 67463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 675021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 67663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 67763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_ADDRESS: 678ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca lp_exec_mask_store(&bld->exec_mask, pred, value, 679ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin bld->addr[reg->Indirect.Index][chan_index]); 68063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 68163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 682ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca case TGSI_FILE_PREDICATE: 683ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca lp_exec_mask_store(&bld->exec_mask, pred, value, 684ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca bld->preds[index][chan_index]); 685ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca break; 686ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca 68763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 68863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 68963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 69063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 69163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 69263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 69463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators. 69563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 69663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 697962558daaed43b0111cd062e32821aad106869d7José Fonsecaenum tex_modifier { 698962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_NONE = 0, 699962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_PROJECTED, 700962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_LOD_BIAS, 701962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_EXPLICIT_LOD, 702962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_EXPLICIT_DERIV 703962558daaed43b0111cd062e32821aad106869d7José Fonseca}; 70486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 70563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 70663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld, 70763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 708962558daaed43b0111cd062e32821aad106869d7José Fonseca enum tex_modifier modifier, 709faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef *texel) 71063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 711962558daaed43b0111cd062e32821aad106869d7José Fonseca unsigned unit; 712ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca LLVMValueRef lod_bias, explicit_lod; 71331d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee LLVMValueRef oow = NULL; 714c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca LLVMValueRef coords[3]; 715962558daaed43b0111cd062e32821aad106869d7José Fonseca LLVMValueRef ddx[3]; 716962558daaed43b0111cd062e32821aad106869d7José Fonseca LLVMValueRef ddy[3]; 717c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca unsigned num_coords; 71863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 71963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7209db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca if (!bld->sampler) { 7219db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca _debug_printf("warning: found texture instruction but no sampler generator supplied\n"); 7229db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca for (i = 0; i < 4; i++) { 7239db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca texel[i] = bld->base.undef; 7249db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca } 7259db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca return; 7269db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca } 7279db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca 7287d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell switch (inst->Texture.Texture) { 72963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_1D: 730c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 1; 73163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 73263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_2D: 73363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_RECT: 734c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 2; 73563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 736f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW1D: 737f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW2D: 738f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOWRECT: 73963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_3D: 74063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_CUBE: 741c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 3; 74263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 74363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 74563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return; 74663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 74763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 748ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca if (modifier == TEX_MODIFIER_LOD_BIAS) { 749ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias = emit_fetch( bld, inst, 0, 3 ); 750ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca explicit_lod = NULL; 751ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca } 752ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca else if (modifier == TEX_MODIFIER_EXPLICIT_LOD) { 753ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias = NULL; 754ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca explicit_lod = emit_fetch( bld, inst, 0, 3 ); 755ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca } 756ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca else { 757ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias = NULL; 758ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca explicit_lod = NULL; 759ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca } 76063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 761962558daaed43b0111cd062e32821aad106869d7José Fonseca if (modifier == TEX_MODIFIER_PROJECTED) { 7622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca oow = emit_fetch( bld, inst, 0, 3 ); 76363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca oow = lp_build_rcp(&bld->base, oow); 76463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 76563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 766c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca for (i = 0; i < num_coords; i++) { 767c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = emit_fetch( bld, inst, 0, i ); 768962558daaed43b0111cd062e32821aad106869d7José Fonseca if (modifier == TEX_MODIFIER_PROJECTED) 769c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = lp_build_mul(&bld->base, coords[i], oow); 77063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 771ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca for (i = num_coords; i < 3; i++) { 772ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca coords[i] = bld->base.undef; 773ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca } 77463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 775962558daaed43b0111cd062e32821aad106869d7José Fonseca if (modifier == TEX_MODIFIER_EXPLICIT_DERIV) { 776962558daaed43b0111cd062e32821aad106869d7José Fonseca for (i = 0; i < num_coords; i++) { 777962558daaed43b0111cd062e32821aad106869d7José Fonseca ddx[i] = emit_fetch( bld, inst, 1, i ); 778962558daaed43b0111cd062e32821aad106869d7José Fonseca ddy[i] = emit_fetch( bld, inst, 2, i ); 779962558daaed43b0111cd062e32821aad106869d7José Fonseca } 780962558daaed43b0111cd062e32821aad106869d7José Fonseca unit = inst->Src[3].Register.Index; 781962558daaed43b0111cd062e32821aad106869d7José Fonseca } else { 782962558daaed43b0111cd062e32821aad106869d7José Fonseca for (i = 0; i < num_coords; i++) { 783962558daaed43b0111cd062e32821aad106869d7José Fonseca ddx[i] = emit_ddx( bld, coords[i] ); 784962558daaed43b0111cd062e32821aad106869d7José Fonseca ddy[i] = emit_ddy( bld, coords[i] ); 785962558daaed43b0111cd062e32821aad106869d7José Fonseca } 786962558daaed43b0111cd062e32821aad106869d7José Fonseca unit = inst->Src[1].Register.Index; 787962558daaed43b0111cd062e32821aad106869d7José Fonseca } 7884554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca for (i = num_coords; i < 3; i++) { 7894554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca ddx[i] = bld->base.undef; 7904554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca ddy[i] = bld->base.undef; 7914554cdc289f1d97855825127c0bf8c0e7f6a2edaJosé Fonseca } 792962558daaed43b0111cd062e32821aad106869d7José Fonseca 7938be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->sampler->emit_fetch_texel(bld->sampler, 7948be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.builder, 7958be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.type, 796962558daaed43b0111cd062e32821aad106869d7José Fonseca unit, num_coords, coords, 797ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca ddx, ddy, 798ec43b2eb45a1b2e33f328f76624c987484e329f3José Fonseca lod_bias, explicit_lod, 7998be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca texel); 80063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 80163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 80263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 803feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/** 804feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Kill fragment if any of the src register values are negative. 805feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 80663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 80763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil( 80863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 8092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst ) 81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 8117d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[0]; 8127821664b15501b173b2304bbada758c33c5ff972José Fonseca LLVMValueRef terms[NUM_CHANNELS]; 8133d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef mask; 81463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 81563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8167821664b15501b173b2304bbada758c33c5ff972José Fonseca memset(&terms, 0, sizeof terms); 81763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( chan_index ) { 81963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned swizzle; 82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8217821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Unswizzle channel */ 822b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 82363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8247821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Check if the component has not been already tested. */ 8257821664b15501b173b2304bbada758c33c5ff972José Fonseca assert(swizzle < NUM_CHANNELS); 8267821664b15501b173b2304bbada758c33c5ff972José Fonseca if( !terms[swizzle] ) 8277821664b15501b173b2304bbada758c33c5ff972José Fonseca /* TODO: change the comparison operator instead of setting the sign */ 8282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca terms[swizzle] = emit_fetch(bld, inst, 0, chan_index ); 82963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 83063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8313d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = NULL; 8327821664b15501b173b2304bbada758c33c5ff972José Fonseca FOR_EACH_CHANNEL( chan_index ) { 833aede39efd86d200ffbace8fc012104e31f673973José Fonseca if(terms[chan_index]) { 8343d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef chan_mask; 835aede39efd86d200ffbace8fc012104e31f673973José Fonseca 836feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* 837feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * If term < 0 then mask = 0 else mask = ~0. 838feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 8393d7a88674f9eb3320eeff511968f041426e25023José Fonseca chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero); 840aede39efd86d200ffbace8fc012104e31f673973José Fonseca 8413d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 8423d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, ""); 8433d7a88674f9eb3320eeff511968f041426e25023José Fonseca else 8443d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = chan_mask; 845aede39efd86d200ffbace8fc012104e31f673973José Fonseca } 84663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 8473d7a88674f9eb3320eeff511968f041426e25023José Fonseca 8483d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 8493d7a88674f9eb3320eeff511968f041426e25023José Fonseca lp_build_mask_update(bld->mask, mask); 85063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 85163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 85263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 85363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 854feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Predicated fragment kill. 855feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * XXX Actually, we do an unconditional kill (as in tgsi_exec.c). 856feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * The only predication is the execution mask which will apply if 857feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * we're inside a loop or conditional. 858feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 859feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulstatic void 860feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulemit_kilp(struct lp_build_tgsi_soa_context *bld, 861feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul const struct tgsi_full_instruction *inst) 862feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul{ 863feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul LLVMValueRef mask; 864feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 865feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* For those channels which are "alive", disable fragment shader 866feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * execution. 867feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 868feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul if (bld->exec_mask.has_mask) { 869feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul mask = LLVMBuildNot(bld->base.builder, bld->exec_mask.exec_mask, "kilp"); 870feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 871feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul else { 872feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul mask = bld->base.zero; 873feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 874feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 875feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul lp_build_mask_update(bld->mask, mask); 876feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul} 877feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 878e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonsecastatic void 87985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration( 88085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin struct lp_build_tgsi_soa_context *bld, 88185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin const struct tgsi_full_declaration *decl) 88285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{ 883a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca LLVMTypeRef vec_type = lp_build_vec_type(bld->base.type); 884a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca 88585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned first = decl->Range.First; 88685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned last = decl->Range.Last; 88785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned idx, i; 88885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 88985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (idx = first; idx <= last; ++idx) { 89085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin switch (decl->Declaration.File) { 89185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_TEMPORARY: 8926c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(idx < LP_MAX_TGSI_TEMPS); 893021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (bld->has_indirect_addressing) { 894021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef val = LLVMConstInt(LLVMInt32Type(), 895021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin last*4 + 4, 0); 896a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca bld->temps_array = lp_build_array_alloca(bld->base.builder, 897a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca vec_type, val, ""); 898021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } else { 899021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin for (i = 0; i < NUM_CHANNELS; i++) 900a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca bld->temps[idx][i] = lp_build_alloca(bld->base.builder, 901a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca vec_type, ""); 902021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 90385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 90485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 90585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_OUTPUT: 90685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 907a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca bld->outputs[idx][i] = lp_build_alloca(bld->base.builder, 908a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca vec_type, ""); 90985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 91085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 911ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin case TGSI_FILE_ADDRESS: 9126c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(idx < LP_MAX_TGSI_ADDRS); 913ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 914a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca bld->addr[idx][i] = lp_build_alloca(bld->base.builder, 915a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca vec_type, ""); 916ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin break; 917ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 918e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca case TGSI_FILE_PREDICATE: 919ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca assert(idx < LP_MAX_TGSI_PREDS); 920ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca for (i = 0; i < NUM_CHANNELS; i++) 921ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca bld->preds[idx][i] = lp_build_alloca(bld->base.builder, 922ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca vec_type, ""); 923e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca break; 924e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca 92585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin default: 92685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin /* don't need to declare other vars */ 927dc886ba1391d7d890bd1f5532bc14553e883a418Zack Rusin break; 928012fabca722494162c244a367913562b8cfa4677Zack Rusin } 92985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 93085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin} 93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 932fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul 933fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul/** 934fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * Emit LLVM for one TGSI instruction. 935fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * \param return TRUE for success, FALSE otherwise 936fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul */ 937fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paulstatic boolean 93863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction( 93963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 940faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_full_instruction *inst, 941faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_opcode_info *info) 94263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 94363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 94490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca LLVMValueRef src0, src1, src2; 945e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp0, tmp1, tmp2; 946e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp3 = NULL; 947e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp4 = NULL; 948e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp5 = NULL; 949e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp6 = NULL; 950e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp7 = NULL; 951faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef res; 952faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef dst0[NUM_CHANNELS]; 95363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 95489258652b6a1d282bed14549907892bdfda752f0José Fonseca /* 95589258652b6a1d282bed14549907892bdfda752f0José Fonseca * Stores and write masks are handled in a general fashion after the long 95689258652b6a1d282bed14549907892bdfda752f0José Fonseca * instruction opcode switch statement. 95789258652b6a1d282bed14549907892bdfda752f0José Fonseca * 95889258652b6a1d282bed14549907892bdfda752f0José Fonseca * Although not stricitly necessary, we avoid generating instructions for 95989258652b6a1d282bed14549907892bdfda752f0José Fonseca * channels which won't be stored, in cases where's that easy. For some 96089258652b6a1d282bed14549907892bdfda752f0José Fonseca * complex instructions, like texture sampling, it is more convenient to 96189258652b6a1d282bed14549907892bdfda752f0José Fonseca * assume a full writemask and then let LLVM optimization passes eliminate 96289258652b6a1d282bed14549907892bdfda752f0José Fonseca * redundant code. 96389258652b6a1d282bed14549907892bdfda752f0José Fonseca */ 96489258652b6a1d282bed14549907892bdfda752f0José Fonseca 965faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca assert(info->num_dst <= 1); 966ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca if (info->num_dst) { 967faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 968faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.undef; 969faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 970faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 971faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 97263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (inst->Instruction.Opcode) { 97363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARL: 9742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 976ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin tmp0 = lp_build_floor(&bld->base, tmp0); 977faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 97863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 97963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 98063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 98163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOV: 9822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 983faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index ); 98463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 98563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 98663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 98763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LIT: 9882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) { 989faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 99063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 9922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 993faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero); 994ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca } 9952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 996ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = SrcReg[0].yyyy */ 9972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 998ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = max(XMM[1], 0) */ 999ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero); 1000ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[2] = SrcReg[0].wwww */ 10012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 0, CHAN_W ); 1002ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_pow( &bld->base, tmp1, tmp2); 10032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1004c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero); 1005faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero); 1006c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca } 10072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) { 1008faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 100963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 101063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 101163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 101263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCP: 101363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIP */ 10142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 1015faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rcp(&bld->base, src0); 10162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1017faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 101963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 102063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 102163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RSQ: 102263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIPSQRT */ 10232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 102490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca src0 = lp_build_abs(&bld->base, src0); 1025faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rsqrt(&bld->base, src0); 10262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1027faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 102963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 103063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 103163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EXP: 10322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 10332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 10342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 103557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2_int_part = NULL; 103657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_frac_part = NULL; 103757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2 = NULL; 103857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 10392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 104057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 10412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 104257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2_int_part = &tmp0; 10432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 104457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_frac_part = &tmp1; 10452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 104657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2 = &tmp2; 104757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 104857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2); 104957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 10502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 1051faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 10522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 1053faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp1; 10542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 1055faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 105763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 10582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 1059faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 106063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 106163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LOG: 10642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 10652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 10662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 1067add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_floor_log2 = NULL; 1068add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_exp = NULL; 1069add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_log2 = NULL; 107057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 10712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 107257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca src0 = lp_build_abs( &bld->base, src0 ); 107357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 10742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 107557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_floor_log2 = &tmp0; 10762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 107757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp = &tmp1; 10782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 107957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_log2 = &tmp2; 108057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 108157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2); 108257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 108357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.x = floor(lg2(abs(src.x))) */ 10842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 1085faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 108657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */ 10872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) { 1088faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1); 108963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 109057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.z = lg2(abs(src.x)) */ 10912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 1092faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 109363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 109463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 10952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 1096faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 109763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 109863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 109963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 110063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MUL: 11012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1104faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_mul(&bld->base, src0, src1); 110563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 110663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ADD: 11092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1112faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add(&bld->base, src0, src1); 111363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 111463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 111563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 111663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP3: 111763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT3 */ 11182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 11192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 112090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 11212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 11222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 112390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 112490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 11252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 11262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 112790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 112890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 11292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1130faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 113163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 113363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP4: 113563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT4 */ 11362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 11372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 113890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 11392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 11402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 114190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 114290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 11432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 11442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 114590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 114690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 11472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_W ); 11482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_W ); 114990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 115090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 11512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1152faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 115363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 115663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DST: 11572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 1158faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 115963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 11612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 11622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Y ); 1163faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1); 116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1166faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z ); 116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1169faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W ); 117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 117163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 117263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MIN: 11742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1177faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_min( &bld->base, src0, src1 ); 117863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 117963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 118063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 118163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAX: 11822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1185faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_max( &bld->base, src0, src1 ); 118663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 118763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 118963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLT: 119063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETLT */ 11912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 11941aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 ); 1195faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 11961aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 119863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGE: 120063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETGE */ 12012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 12041aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 ); 1205faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 12061aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 120763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 120863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAD: 121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_MADD */ 12112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 12142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 2, chan_index ); 121590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 121690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp2); 1217faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 121863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 121963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 122063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 122163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SUB: 12222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 12242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 1225faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1); 122663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 122863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LRP: 12302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 12332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 123490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sub( &bld->base, src1, src2 ); 123590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, src0, tmp0 ); 1236faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 ); 123763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 124063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CND: 1241873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1242873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 1243873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1244873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 1245185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul tmp1 = lp_build_const_vec(bld->base.type, 0.5); 1246873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1); 1247faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 ); 1248873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 125063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 125163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2A: 12522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 12532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 125490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 12552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 12562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 125790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 125890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 12592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 2, CHAN_X ); /* xmm1 = src[2].x */ 126090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 12612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1262faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 126563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 126663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FRC: 12672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1268873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 1269873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_floor(&bld->base, src0); 1270f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul tmp0 = lp_build_sub(&bld->base, src0, tmp0); 1271faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 127263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 127363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 127463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 127563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CLAMP: 1276873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1277873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1278873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1279873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 1280873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_max(&bld->base, tmp0, src1); 1281873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_min(&bld->base, tmp0, src2); 1282faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 1283873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 128463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FLR: 12872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1289faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_floor(&bld->base, tmp0); 129063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 129163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 129263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 129363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ROUND: 12942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1296faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_round(&bld->base, tmp0); 129763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 129863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca case TGSI_OPCODE_EX2: { 13012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 130290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_exp2( &bld->base, tmp0); 13032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1304faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 130790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca } 130863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LG2: 13102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 131190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_log2( &bld->base, tmp0); 13122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1313faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POW: 13182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 13192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, CHAN_X ); 1320faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_pow( &bld->base, src0, src1 ); 13212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1322faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 132663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XPD: 13272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 13282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 13292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Z ); 13302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp3 = emit_fetch( bld, inst, 0, CHAN_Z ); 133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 13322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 13332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 13342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 13352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp4 = emit_fetch( bld, inst, 1, CHAN_Y ); 133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 13372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 133890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = tmp0; 133990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_mul( &bld->base, tmp2, tmp1); 134090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp3; 134190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 134290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_sub( &bld->base, tmp2, tmp5); 1343faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp2; 134463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 13452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 13462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 13472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_X ); 13482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp5 = emit_fetch( bld, inst, 0, CHAN_X ); 134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 13502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 135190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_mul( &bld->base, tmp3, tmp2); 135290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp5); 135390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_sub( &bld->base, tmp3, tmp1); 1354faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp3; 135563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 13562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 135790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 135890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp2); 135990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_sub( &bld->base, tmp5, tmp0); 1360faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp5; 136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 13622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1363faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 136463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 136563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ABS: 13682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1370faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_abs( &bld->base, tmp0 ); 137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCC: 1375873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1376873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1377fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DPH: 13802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 13812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 138290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 13832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 13842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 138590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 138690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 13872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 13882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 138990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 139090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 13912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_W ); 139290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 13932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1394faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 139563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 139663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 139863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_COS: 13992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 140090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_cos( &bld->base, tmp0 ); 14012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1402faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 140363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 140463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 140663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDX: 140786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 140886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL); 140986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 141063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDY: 141386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 141486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]); 141586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KILP: 141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* predicated kill */ 1420feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul emit_kilp( bld, inst ); 142163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KIL: 142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* conditional kill */ 14252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca emit_kil( bld, inst ); 142663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 142763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 142863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2H: 1429fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2US: 1433fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 143463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4B: 1437fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 143863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4UB: 1441fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 144263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RFL: 1445fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 144663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SEQ: 14492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 14512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 14521aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 ); 1453faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 14541aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 145563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 145663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SFL: 1458873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1459faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.zero; 1460873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGT: 14642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 14662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 14671aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 ); 1468faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 14691aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 147063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 147163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 147263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SIN: 14732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 147490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sin( &bld->base, tmp0 ); 14752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1476faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 147763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 147863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 147963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLE: 14812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 14832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 14841aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 ); 1485faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 14861aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 148863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SNE: 14902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 14922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 14931aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 ); 1494faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 14951aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_STR: 1499873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1500faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.one; 1501873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 150363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TEX: 1505962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_NONE, dst0 ); 150663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 150763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 150863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXD: 1509962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_EXPLICIT_DERIV, dst0 ); 151063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 151163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 151263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2H: 1513873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1514873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert (0); 1515fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 151663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 151763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 151863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2US: 1519873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1520873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1521fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 152263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 152363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 152463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4B: 1525873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1526873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1527fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 152863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 152963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 153063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4UB: 1531873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1532873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1533fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 153463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 153563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 153663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_X2D: 1537873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1538873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1539fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 154063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 154163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARA: 1543873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1544873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1545fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 154663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 154763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARR: 15492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 15502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1551ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin tmp0 = lp_build_round(&bld->base, tmp0); 1552faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 155363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 155463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 155563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRA: 1557873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1558873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1559fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 156063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 156163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 156263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CAL: 1563873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1564fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 156563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 156663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 156763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RET: 1568873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1569fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 157063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 157163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 157263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_END: 157363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 157463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 157563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SSG: 157663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SGN */ 15772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 15782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1579faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 ); 158063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 158163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 158263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 158363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CMP: 15842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 15852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 15862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 15872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 15881aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero ); 1589faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2); 15901aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 159163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 159263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 159363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SCS: 15942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 15952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1596faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 ); 159763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 15982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 15992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1600faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 ); 160163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 16022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1603faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = bld->base.zero; 160463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 16052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1606faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 160763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 160863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 160963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 161063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXB: 1611962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_LOD_BIAS, dst0 ); 161263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 161363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 161463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM: 161563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* fall-through */ 161663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM4: 161763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* 3 or 4-component normalization */ 161863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 161963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4; 162063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 16212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) || 16222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) || 16232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) || 16242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) { 162563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 162663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */ 162763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 162863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm4 = src.x */ 162963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = src.x * src.x */ 16302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 16312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 163290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp4 = tmp0; 163363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 163490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp0); 163563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 163663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm5 = src.y */ 163763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.y * src.y */ 16382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Y); 16392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 164090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp1; 164163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 164290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 164390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 164463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 164563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm6 = src.z */ 164663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.z * src.z */ 16472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Z); 16482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 164990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp6 = tmp1; 165063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 165190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 165290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 165363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 165463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (dims == 4) { 165563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm7 = src.w */ 165663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.w * src.w */ 16572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_W); 16582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) { 165990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp7 = tmp1; 166063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 166190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 166290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 166363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 166463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 166563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm1 = 1 / sqrt(xmm0) */ 166690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_rsqrt( &bld->base, tmp0); 166763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 166863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.x = xmm1 * src.x */ 16692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 1670faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1); 167163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 167263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 167363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.y = xmm1 * src.y */ 16742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 1675faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1); 167663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 167763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 167863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.z = xmm1 * src.z */ 16792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 1680faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1); 168163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 168263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 168363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = xmm1 * src.w */ 16842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) { 1685faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1); 168663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 168763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 168863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1689faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca /* dst.w = 1.0 */ 16902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) { 1691faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 169263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 169363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 169463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 169563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 169663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DIV: 1697873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1698873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert( 0 ); 1699fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 170063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 170163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 170263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2: 17032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 17042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 170590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 17062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 17072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 170890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 170990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 17102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1711faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 171263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 171363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 171463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 171563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXL: 1716962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_EXPLICIT_LOD, dst0 ); 171763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 171863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 171963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXP: 1720962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_PROJECTED, dst0 ); 172163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 172218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 172363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRK: 172418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_break(&bld->exec_mask); 172563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 172663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 172763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_IF: 172880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 1729ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin tmp0 = lp_build_cmp(&bld->base, PIPE_FUNC_NOTEQUAL, 1730ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin tmp0, bld->base.zero); 173180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_push(&bld->exec_mask, tmp0); 173263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 173363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 173418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin case TGSI_OPCODE_BGNLOOP: 173518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_bgnloop(&bld->exec_mask); 173618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin break; 173718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 173863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ELSE: 173980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_invert(&bld->exec_mask); 174063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 174163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 174263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDIF: 174380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_pop(&bld->exec_mask); 174463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 174563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 174618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin case TGSI_OPCODE_ENDLOOP: 174718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_endloop(&bld->exec_mask); 174818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin break; 174918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 175063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PUSHA: 1751873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1752873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1753fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 175463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 175563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 175663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POPA: 1757873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1758873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1759fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 176063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 176163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 176263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CEIL: 1763873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1764873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1765faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_ceil(&bld->base, tmp0); 1766873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 176763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 176863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 176963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_I2F: 1770873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1771873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1772fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 177363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 177463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 177563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NOT: 1776873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1777873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1778fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 177963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 178063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 178163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TRUNC: 17822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 17832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1784faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_trunc(&bld->base, tmp0); 178563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 178663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 178763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 178863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SHL: 1789873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1790873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1791fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 179263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 179363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 17942c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol case TGSI_OPCODE_ISHR: 1795873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1796873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1797fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 179863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 179963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 180063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_AND: 1801873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1802873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1803fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 180463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 180563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 180663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_OR: 1807873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1808873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1809fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 181063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 181163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 181263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOD: 1813873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1814873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1815fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 181663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 181763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 181863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XOR: 1819873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1820873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1821fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 182263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 182363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 182463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SAD: 1825873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1826873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1827fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 182863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 182963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 183063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXF: 1831873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1832873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1833fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 183463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 183563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 183663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXQ: 1837873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1838873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1839fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 184063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 184163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 184263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CONT: 184318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_continue(&bld->exec_mask); 184463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 184563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 184663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EMIT: 1847fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 184863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 184963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 185063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDPRIM: 1851fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 185263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 185363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1854873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca case TGSI_OPCODE_NOP: 1855873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca break; 1856873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca 185763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 1858fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 185963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 186063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1861faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 1862ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca LLVMValueRef pred[NUM_CHANNELS]; 1863ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 1864ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca emit_fetch_predicate( bld, inst, pred ); 1865ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca 1866faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1867ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca emit_store( bld, inst, 0, chan_index, pred[chan_index], dst0[chan_index]); 1868faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1869faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1870faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 1871fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return TRUE; 187263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 187363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1874c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca 1875c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid 187663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder, 187763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_token *tokens, 1878b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 18793d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask, 188063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr, 1881f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos, 1882f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS], 1883f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS], 1884021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin struct lp_build_sampler_soa *sampler, 1885021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin struct tgsi_shader_info *info) 188663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 188763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context bld; 188863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct tgsi_parse_context parse; 188963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint num_immediates = 0; 189063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 189163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 189263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* Setup build context */ 189363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca memset(&bld, 0, sizeof bld); 189463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lp_build_context_init(&bld.base, builder, type); 1895ff6c78f44f2f741f4825b07dbc15b3a951fe9b2cJosé Fonseca lp_build_context_init(&bld.int_bld, builder, lp_int_type(type)); 1896c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca bld.mask = mask; 1897f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.pos = pos; 1898f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.inputs = inputs; 189963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.outputs = outputs; 190063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.consts_ptr = consts_ptr; 19018be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld.sampler = sampler; 1902021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin bld.has_indirect_addressing = info->opcode_count[TGSI_OPCODE_ARR] > 0 || 1903021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin info->opcode_count[TGSI_OPCODE_ARL] > 0; 190463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 190580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_init(&bld.exec_mask, &bld.base); 190680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 190763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_init( &parse, tokens ); 190863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 190963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca while( !tgsi_parse_end_of_tokens( &parse ) ) { 191063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_token( &parse ); 191163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 191263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( parse.FullToken.Token.Type ) { 191363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_DECLARATION: 19141fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* Inputs already interpolated */ 1915e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca emit_declaration( &bld, &parse.FullToken.FullDeclaration ); 191663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 191763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 191863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_INSTRUCTION: 1919faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca { 19202c90652ed9e119f09af6757c59d10273894ba590José Fonseca unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode; 19215d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee const struct tgsi_opcode_info *opcode_info = tgsi_get_opcode_info(opcode); 19225d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, opcode_info )) 1923faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n", 19245d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee opcode_info->mnemonic); 1925faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1926faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 192763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 192863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 192963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_IMMEDIATE: 193063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* simply copy the immediate values into the next immediates[] slot */ 193163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 193263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1; 193363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(size <= 4); 19346c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(num_immediates < LP_MAX_TGSI_IMMEDIATES); 193563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = 0; i < size; ++i ) 193663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = 1937185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul lp_build_const_vec(type, parse.FullToken.FullImmediate.u[i].Float); 193863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = size; i < 4; ++i ) 193963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = bld.base.undef; 194063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca num_immediates++; 194163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 194263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 194363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 19449381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca case TGSI_TOKEN_TYPE_PROPERTY: 19459381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca break; 19469381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca 194763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 194863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 194963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 195063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 195118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (0) { 195218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef block = LLVMGetInsertBlock(builder); 195318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef function = LLVMGetBasicBlockParent(block); 195418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin debug_printf("11111111111111111111111111111 \n"); 195518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tgsi_dump(tokens, 0); 195618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMDumpValue(function); 195718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin debug_printf("2222222222222222222222222222 \n"); 195818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 195963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_free( &parse ); 196063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 196163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1962