lp_bld_tgsi_soa.c revision 962558daaed43b0111cd062e32821aad106869d7
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 966c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef break_stack[LP_MAX_TGSI_NESTING]; 9718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int break_stack_size; 9818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef break_mask; 9918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 1006c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef cont_stack[LP_MAX_TGSI_NESTING]; 10118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int cont_stack_size; 10218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef cont_mask; 10318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 1046c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMBasicBlockRef loop_stack[LP_MAX_TGSI_NESTING]; 10518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int loop_stack_size; 10618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef loop_block; 10718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 10818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 10980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef exec_mask; 11080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}; 11163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context 11363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 11463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_context base; 11563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr; 117f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos; 118f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS]; 11995f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS]; 120c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca 1218be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca struct lp_build_sampler_soa *sampler; 12263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1236c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef immediates[LP_MAX_TGSI_IMMEDIATES][NUM_CHANNELS]; 1246c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef temps[LP_MAX_TGSI_TEMPS][NUM_CHANNELS]; 1256c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca LLVMValueRef addr[LP_MAX_TGSI_ADDRS][NUM_CHANNELS]; 1261929057eac0c3351e0810612bdae56331a235736José Fonseca 127021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin /* we allocate an array of temps if we have indirect 128021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin * addressing and then the temps above is unused */ 129021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temps_array; 130021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin boolean has_indirect_addressing; 131021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin 1323d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask; 13380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_exec_mask exec_mask; 13463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}; 13563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 13686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 13786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = { 13886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_LEFT, 13986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_LEFT 14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 14386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = { 14486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_RIGHT, QUAD_TOP_RIGHT, 14586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT 14686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 14786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 14886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 14986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = { 15086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT, 15186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT 15286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 15386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 15486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 15586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = { 15686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT, 15786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT 15886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 15986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 16080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld) 16180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 16280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->bld = bld; 16380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->has_mask = FALSE; 16480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack_size = 0; 16518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack_size = 0; 16618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_stack_size = 0; 16718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_stack_size = 0; 16880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 16980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->int_vec_type = lp_build_int_vec_type(mask->bld->type); 17080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 17180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 17280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask) 17380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 17418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->loop_stack_size) { 17518a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin /*for loops we need to update the entire mask at runtime */ 17618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef tmp; 1777fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul assert(mask->break_mask); 17818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp = LLVMBuildAnd(mask->bld->builder, 17918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask, 18018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask, 18118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskcb"); 18218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = LLVMBuildAnd(mask->bld->builder, 18318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cond_mask, 18418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp, 18518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskfull"); 18618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } else 18718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = mask->cond_mask; 18818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 18918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 19018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->has_mask = (mask->cond_stack_size > 0 || 19118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack_size > 0); 19280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 19380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 19480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask, 19580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val) 19680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 1976c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(mask->cond_stack_size < LP_MAX_TGSI_NESTING); 19880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask; 19980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = LLVMBuildBitCast(mask->bld->builder, val, 20080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->int_vec_type, ""); 20180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 20280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 20380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 20480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 20580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask) 20680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 20780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef prev_mask = mask->cond_stack[mask->cond_stack_size - 1]; 208faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin LLVMValueRef inv_mask = LLVMBuildNot(mask->bld->builder, 209faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin mask->cond_mask, ""); 210faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 211faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin /* means that we didn't have any mask before and that 212faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin * we were fully enabled */ 213faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin if (mask->cond_stack_size <= 1) { 214faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin prev_mask = LLVMConstAllOnes(mask->int_vec_type); 215faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin } 216faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 21780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = LLVMBuildAnd(mask->bld->builder, 21880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin inv_mask, 21980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin prev_mask, ""); 22080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 22180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 22280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 22380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask) 22480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 22580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = mask->cond_stack[--mask->cond_stack_size]; 22680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 22780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 22880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 22918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_bgnloop(struct lp_exec_mask *mask) 23018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 23118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 23218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cont_stack_size == 0) 23318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask = LLVMConstAllOnes(mask->int_vec_type); 234bba6a196bb69afc72a9ec56740a312987e77afc2Brian Paul if (mask->break_stack_size == 0) 23518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask = LLVMConstAllOnes(mask->int_vec_type); 23618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cond_stack_size == 0) 23718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cond_mask = LLVMConstAllOnes(mask->int_vec_type); 2383a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin 2396c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(mask->break_stack_size < LP_MAX_TGSI_NESTING); 2406c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(mask->cont_stack_size < LP_MAX_TGSI_NESTING); 2416c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(mask->break_stack_size < LP_MAX_TGSI_NESTING); 2426c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca 2433a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin mask->break_stack[mask->break_stack_size++] = mask->break_mask; 2446d2e09fdc23e2573e9466f60db20ef4ac04b367dZack Rusin mask->cont_stack[mask->cont_stack_size++] = mask->cont_mask; 24518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack[mask->loop_stack_size++] = mask->loop_block; 24618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_block = lp_build_insert_new_block(mask->bld->builder, "bgnloop"); 24718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBuildBr(mask->bld->builder, mask->loop_block); 24818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMPositionBuilderAtEnd(mask->bld->builder, mask->loop_block); 24918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 25018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 25118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 25218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 25318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_break(struct lp_exec_mask *mask) 25418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 25518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder, 25618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 25718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "break"); 25818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 259d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->break_mask = LLVMBuildAnd(mask->bld->builder, 260d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->break_mask, 261d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin exec_mask, "break_full"); 26218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 26318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 26418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 26518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 26618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_continue(struct lp_exec_mask *mask) 26718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 26818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder, 26918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 27018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin ""); 27118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 272d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->cont_mask = LLVMBuildAnd(mask->bld->builder, 273d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin mask->cont_mask, 274d2b6ed7c4daf094bfe3fa4e0318133d0a8ea3cf6Zack Rusin exec_mask, ""); 27518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 27618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 27718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 27818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 27918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 28018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_endloop(struct lp_exec_mask *mask) 28118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 28218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef endloop; 283d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMTypeRef reg_type = LLVMIntType(mask->bld->type.width* 284d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca mask->bld->type.length); 2857fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul LLVMValueRef i1cond; 2867fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul 2877fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul assert(mask->break_mask); 2887fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul 289d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca /* i1cond = (mask == 0) */ 2907fe93f831d74ce46a161c0b0c89f00b9c18caa2bBrian Paul i1cond = LLVMBuildICmp( 291d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca mask->bld->builder, 292d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMIntNE, 293d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMBuildBitCast(mask->bld->builder, mask->break_mask, reg_type, ""), 294d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMConstNull(reg_type), ""); 29518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 29618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin endloop = lp_build_insert_new_block(mask->bld->builder, "endloop"); 29718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 29818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBuildCondBr(mask->bld->builder, 299ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin i1cond, mask->loop_block, endloop); 30018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 30118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMPositionBuilderAtEnd(mask->bld->builder, endloop); 30218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 30318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_block = mask->loop_stack[--mask->loop_stack_size]; 30418a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin /* pop the cont mask */ 30518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cont_stack_size) { 30618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask = mask->cont_stack[--mask->cont_stack_size]; 30718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 30818a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin /* pop the break mask */ 30918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->break_stack_size) { 3103a423dcf9dfa725a4e5dca60f0f2b02599d2ed9bZack Rusin mask->break_mask = mask->break_stack[--mask->break_stack_size]; 31118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 31218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 31318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 31418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 31518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 31618a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin/* stores val into an address pointed to by dst. 31718a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * mask->exec_mask is used to figure out which bits of val 31818a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * should be stored into the address 31918a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin * (0 means don't store this bit, 1 means do store). 32018a4a83ddab7655253fdb71d37393a32adcda488Zack Rusin */ 32180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask, 32280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val, 32380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef dst) 32480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 32580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin if (mask->has_mask) { 32680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef real_val, dst_val; 32780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 32880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin dst_val = LLVMBuildLoad(mask->bld->builder, dst, ""); 32980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin real_val = lp_build_select(mask->bld, 33080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->exec_mask, 33180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin val, dst_val); 33280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 33380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, real_val, dst); 33480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin } else 33580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, val, dst); 33680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 33780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 33886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 33986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 34086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld, 34186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 34286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 34386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_left = lp_build_swizzle1_aos(&bld->base, src, swizzle_left); 34486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right); 34586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_right, src_left); 34686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 34786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 34886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 34986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 35086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld, 35186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 35286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 35386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_top = lp_build_swizzle1_aos(&bld->base, src, swizzle_top); 35486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom); 35586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_top, src_bottom); 35686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 35786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 358021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinstatic LLVMValueRef 359021e0dc78b15fab29e761012860276c2597c8d8fZack Rusinget_temp_ptr(struct lp_build_tgsi_soa_context *bld, 360021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin unsigned index, 361021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin unsigned swizzle, 362021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin boolean is_indirect, 363021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef addr) 364021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin{ 365021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (!bld->has_indirect_addressing) { 366021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin return bld->temps[index][swizzle]; 367021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } else { 368021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef lindex = 369021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMConstInt(LLVMInt32Type(), index*4 + swizzle, 0); 370021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (is_indirect) 371021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin lindex = lp_build_add(&bld->base, lindex, addr); 372021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin return LLVMBuildGEP(bld->base.builder, bld->temps_array, &lindex, 1, ""); 373021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 374021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin} 37586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 37663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 37763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch. 37863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 37963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef 38063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch( 38163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 3822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst, 3832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 38463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const unsigned chan_index ) 38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 3867d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[index]; 387b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef res; 389ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin LLVMValueRef addr; 39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 39163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (swizzle) { 392b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_X: 393b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Y: 394b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Z: 395b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_W: 39663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 397ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin if (reg->Register.Indirect) { 398ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type); 399ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin unsigned swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect, chan_index ); 400ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr = LLVMBuildLoad(bld->base.builder, 401ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin bld->addr[reg->Indirect.Index][swizzle], 402ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin ""); 403ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin /* for indexing we want integers */ 404ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr = LLVMBuildFPToSI(bld->base.builder, addr, 405ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin int_vec_type, ""); 406ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr = LLVMBuildExtractElement(bld->base.builder, 407ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin addr, LLVMConstInt(LLVMInt32Type(), 0, 0), 408ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin ""); 409021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0)); 410ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin } 411ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 41291a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell switch (reg->Register.File) { 41363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_CONSTANT: { 41491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0); 415ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin LLVMValueRef scalar, scalar_ptr; 416ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 417ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin if (reg->Register.Indirect) { 418ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin /*lp_build_printf(bld->base.builder, 419ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin "\taddr = %d\n", addr);*/ 420ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin index = lp_build_add(&bld->base, index, addr); 421ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin } 422ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, ""); 423ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, ""); 424ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 42563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_broadcast_scalar(&bld->base, scalar); 42663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 42763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 42863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 42963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_IMMEDIATE: 43091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->immediates[reg->Register.Index][swizzle]; 43163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 43263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 43363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_INPUT: 43591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->inputs[reg->Register.Index][swizzle]; 43663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 43763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 43863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 439021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin case TGSI_FILE_TEMPORARY: { 440021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index, 441021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin swizzle, 442021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin reg->Register.Indirect, 443021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr); 444021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin res = LLVMBuildLoad(bld->base.builder, temp_ptr, ""); 44563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(!res) 44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return bld->base.undef; 44763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 448021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 44963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 45063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 45163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 4524d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 45363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 45463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 45563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 45663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 45763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 4584d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) { 46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_CLEAR: 46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 46663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_SET: 4671fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* TODO: Use bitwese OR for floating point */ 46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 46963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_TOGGLE: 47363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 47463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 47563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 47663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_KEEP: 47763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 47963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 48063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return res; 48163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 48263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 48363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 48586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives. 48686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */ 48786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void 48886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv( 48986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca struct lp_build_tgsi_soa_context *bld, 49086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const struct tgsi_full_instruction *inst, 49186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca unsigned index, 49286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const unsigned chan_index, 49386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *res, 49486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddx, 49586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddy) 49686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 49786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src; 49886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 49986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca src = emit_fetch(bld, inst, index, chan_index); 50086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 50186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(res) 50286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *res = src; 50386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 50486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca /* TODO: use interpolation coeffs for inputs */ 50586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 50686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddx) 50786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddx = emit_ddx(bld, src); 50886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 50986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddy) 51086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddy = emit_ddy(bld, src); 51186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 51286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 51386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 51486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/** 51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store. 51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 51763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 51863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store( 51963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 52063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 5212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 52263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index, 52363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef value) 52463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 5257d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[index]; 526021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef addr; 5272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca 52863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( inst->Instruction.Saturate ) { 52963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_NONE: 53063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 53163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 53263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_ZERO_ONE: 5337926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_max(&bld->base, value, bld->base.zero); 5347926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 53563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 53663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 53763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_MINUS_PLUS_ONE: 538185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul value = lp_build_max(&bld->base, value, lp_build_const_vec(bld->base.type, -1.0)); 5397926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 54063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 5417926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca 5427926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca default: 5437926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca assert(0); 54463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 54563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 546021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (reg->Register.Indirect) { 547021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMTypeRef int_vec_type = lp_build_int_vec_type(bld->base.type); 548021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin unsigned swizzle = tgsi_util_get_src_register_swizzle( ®->Indirect, chan_index ); 549021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildLoad(bld->base.builder, 550021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin bld->addr[reg->Indirect.Index][swizzle], 551021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin ""); 552021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin /* for indexing we want integers */ 553021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildFPToSI(bld->base.builder, addr, 554021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin int_vec_type, ""); 555021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = LLVMBuildExtractElement(bld->base.builder, 556021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr, LLVMConstInt(LLVMInt32Type(), 0, 0), 557021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin ""); 558021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr = lp_build_mul(&bld->base, addr, LLVMConstInt(LLVMInt32Type(), 4, 0)); 559021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 560021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin 5615b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch( reg->Register.File ) { 56263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_OUTPUT: 56380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_store(&bld->exec_mask, value, 56480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin bld->outputs[reg->Register.Index][chan_index]); 56563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 56663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 567021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin case TGSI_FILE_TEMPORARY: { 568021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef temp_ptr = get_temp_ptr(bld, reg->Register.Index, 569021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin chan_index, 570021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin reg->Register.Indirect, 571021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin addr); 572021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin lp_exec_mask_store(&bld->exec_mask, value, temp_ptr); 57363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 574021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 57563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 57663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_ADDRESS: 577ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin lp_exec_mask_store(&bld->exec_mask, value, 578ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin bld->addr[reg->Indirect.Index][chan_index]); 57963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 58063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 581ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca case TGSI_FILE_PREDICATE: 582ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca /* FIXME */ 583ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca break; 584ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca 58563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 58663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 58763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 58863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 58963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 59063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 59163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 59263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators. 59363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 59463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 595962558daaed43b0111cd062e32821aad106869d7José Fonsecaenum tex_modifier { 596962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_NONE = 0, 597962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_PROJECTED, 598962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_LOD_BIAS, 599962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_EXPLICIT_LOD, 600962558daaed43b0111cd062e32821aad106869d7José Fonseca TEX_MODIFIER_EXPLICIT_DERIV 601962558daaed43b0111cd062e32821aad106869d7José Fonseca}; 60286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 60363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 60463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld, 60563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 606962558daaed43b0111cd062e32821aad106869d7José Fonseca enum tex_modifier modifier, 607faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef *texel) 60863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 609962558daaed43b0111cd062e32821aad106869d7José Fonseca unsigned unit; 61063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef lodbias; 61131d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee LLVMValueRef oow = NULL; 612c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca LLVMValueRef coords[3]; 613962558daaed43b0111cd062e32821aad106869d7José Fonseca LLVMValueRef ddx[3]; 614962558daaed43b0111cd062e32821aad106869d7José Fonseca LLVMValueRef ddy[3]; 615c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca unsigned num_coords; 61663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 61763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6189db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca if (!bld->sampler) { 6199db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca _debug_printf("warning: found texture instruction but no sampler generator supplied\n"); 6209db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca for (i = 0; i < 4; i++) { 6219db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca texel[i] = bld->base.undef; 6229db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca } 6239db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca return; 6249db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca } 6259db4a211e96356deb963223038eea074a5fe0edaJosé Fonseca 6267d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell switch (inst->Texture.Texture) { 62763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_1D: 628c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 1; 62963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 63063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_2D: 63163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_RECT: 632c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 2; 63363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 634f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW1D: 635f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW2D: 636f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOWRECT: 63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_3D: 63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_CUBE: 639c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 3; 64063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 64163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 64263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 64363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return; 64463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 64563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 646962558daaed43b0111cd062e32821aad106869d7José Fonseca /* FIXME: Treat TEX_MODIFIER_EXPLICIT_LOD correctly */ 647962558daaed43b0111cd062e32821aad106869d7José Fonseca if (modifier == TEX_MODIFIER_LOD_BIAS || TEX_MODIFIER_EXPLICIT_LOD) 6482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca lodbias = emit_fetch( bld, inst, 0, 3 ); 64963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca else 65063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lodbias = bld->base.zero; 65163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 652962558daaed43b0111cd062e32821aad106869d7José Fonseca if (modifier == TEX_MODIFIER_PROJECTED) { 6532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca oow = emit_fetch( bld, inst, 0, 3 ); 65463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca oow = lp_build_rcp(&bld->base, oow); 65563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 65663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 657c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca for (i = 0; i < num_coords; i++) { 658c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = emit_fetch( bld, inst, 0, i ); 659962558daaed43b0111cd062e32821aad106869d7José Fonseca if (modifier == TEX_MODIFIER_PROJECTED) 660c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = lp_build_mul(&bld->base, coords[i], oow); 66163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 662ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca for (i = num_coords; i < 3; i++) { 663ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca coords[i] = bld->base.undef; 664ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca } 66563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 666962558daaed43b0111cd062e32821aad106869d7José Fonseca if (modifier == TEX_MODIFIER_EXPLICIT_DERIV) { 667962558daaed43b0111cd062e32821aad106869d7José Fonseca for (i = 0; i < num_coords; i++) { 668962558daaed43b0111cd062e32821aad106869d7José Fonseca ddx[i] = emit_fetch( bld, inst, 1, i ); 669962558daaed43b0111cd062e32821aad106869d7José Fonseca ddy[i] = emit_fetch( bld, inst, 2, i ); 670962558daaed43b0111cd062e32821aad106869d7José Fonseca } 671962558daaed43b0111cd062e32821aad106869d7José Fonseca unit = inst->Src[3].Register.Index; 672962558daaed43b0111cd062e32821aad106869d7José Fonseca } else { 673962558daaed43b0111cd062e32821aad106869d7José Fonseca for (i = 0; i < num_coords; i++) { 674962558daaed43b0111cd062e32821aad106869d7José Fonseca ddx[i] = emit_ddx( bld, coords[i] ); 675962558daaed43b0111cd062e32821aad106869d7José Fonseca ddy[i] = emit_ddy( bld, coords[i] ); 676962558daaed43b0111cd062e32821aad106869d7José Fonseca } 677962558daaed43b0111cd062e32821aad106869d7José Fonseca unit = inst->Src[1].Register.Index; 678962558daaed43b0111cd062e32821aad106869d7José Fonseca } 679962558daaed43b0111cd062e32821aad106869d7José Fonseca 6808be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->sampler->emit_fetch_texel(bld->sampler, 6818be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.builder, 6828be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.type, 683962558daaed43b0111cd062e32821aad106869d7José Fonseca unit, num_coords, coords, 684962558daaed43b0111cd062e32821aad106869d7José Fonseca ddx, ddy, lodbias, 6858be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca texel); 68663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 68763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 68863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 689feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/** 690feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Kill fragment if any of the src register values are negative. 691feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 69263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 69363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil( 69463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 6952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst ) 69663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 6977d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[0]; 6987821664b15501b173b2304bbada758c33c5ff972José Fonseca LLVMValueRef terms[NUM_CHANNELS]; 6993d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef mask; 70063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 70163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7027821664b15501b173b2304bbada758c33c5ff972José Fonseca memset(&terms, 0, sizeof terms); 70363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 70463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( chan_index ) { 70563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned swizzle; 70663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7077821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Unswizzle channel */ 708b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 70963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7107821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Check if the component has not been already tested. */ 7117821664b15501b173b2304bbada758c33c5ff972José Fonseca assert(swizzle < NUM_CHANNELS); 7127821664b15501b173b2304bbada758c33c5ff972José Fonseca if( !terms[swizzle] ) 7137821664b15501b173b2304bbada758c33c5ff972José Fonseca /* TODO: change the comparison operator instead of setting the sign */ 7142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca terms[swizzle] = emit_fetch(bld, inst, 0, chan_index ); 71563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 71663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7173d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = NULL; 7187821664b15501b173b2304bbada758c33c5ff972José Fonseca FOR_EACH_CHANNEL( chan_index ) { 719aede39efd86d200ffbace8fc012104e31f673973José Fonseca if(terms[chan_index]) { 7203d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef chan_mask; 721aede39efd86d200ffbace8fc012104e31f673973José Fonseca 722feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* 723feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * If term < 0 then mask = 0 else mask = ~0. 724feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 7253d7a88674f9eb3320eeff511968f041426e25023José Fonseca chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero); 726aede39efd86d200ffbace8fc012104e31f673973José Fonseca 7273d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 7283d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, ""); 7293d7a88674f9eb3320eeff511968f041426e25023José Fonseca else 7303d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = chan_mask; 731aede39efd86d200ffbace8fc012104e31f673973José Fonseca } 73263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 7333d7a88674f9eb3320eeff511968f041426e25023José Fonseca 7343d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 7353d7a88674f9eb3320eeff511968f041426e25023José Fonseca lp_build_mask_update(bld->mask, mask); 73663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 73763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 73863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 73963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 740feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Predicated fragment kill. 741feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * XXX Actually, we do an unconditional kill (as in tgsi_exec.c). 742feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * The only predication is the execution mask which will apply if 743feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * we're inside a loop or conditional. 744feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 745feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulstatic void 746feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulemit_kilp(struct lp_build_tgsi_soa_context *bld, 747feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul const struct tgsi_full_instruction *inst) 748feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul{ 749feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul LLVMValueRef mask; 750feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 751feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* For those channels which are "alive", disable fragment shader 752feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * execution. 753feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 754feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul if (bld->exec_mask.has_mask) { 755feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul mask = LLVMBuildNot(bld->base.builder, bld->exec_mask.exec_mask, "kilp"); 756feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 757feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul else { 758feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul mask = bld->base.zero; 759feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 760feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 761feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul lp_build_mask_update(bld->mask, mask); 762feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul} 763feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 764e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonsecastatic void 76585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration( 76685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin struct lp_build_tgsi_soa_context *bld, 76785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin const struct tgsi_full_declaration *decl) 76885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{ 769a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca LLVMTypeRef vec_type = lp_build_vec_type(bld->base.type); 770a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca 77185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned first = decl->Range.First; 77285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned last = decl->Range.Last; 77385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned idx, i; 77485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 77585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (idx = first; idx <= last; ++idx) { 77685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin switch (decl->Declaration.File) { 77785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_TEMPORARY: 7786c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(idx < LP_MAX_TGSI_TEMPS); 779021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin if (bld->has_indirect_addressing) { 780021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin LLVMValueRef val = LLVMConstInt(LLVMInt32Type(), 781021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin last*4 + 4, 0); 782a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca bld->temps_array = lp_build_array_alloca(bld->base.builder, 783a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca vec_type, val, ""); 784021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } else { 785021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin for (i = 0; i < NUM_CHANNELS; i++) 786a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca bld->temps[idx][i] = lp_build_alloca(bld->base.builder, 787a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca vec_type, ""); 788021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin } 78985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 79085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 79185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_OUTPUT: 79285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 793a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca bld->outputs[idx][i] = lp_build_alloca(bld->base.builder, 794a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca vec_type, ""); 79585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 79685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 797ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin case TGSI_FILE_ADDRESS: 7986c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(idx < LP_MAX_TGSI_ADDRS); 799ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 800a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca bld->addr[idx][i] = lp_build_alloca(bld->base.builder, 801a18c210a95794c79c6f26dbf4c66d4a85e29169dJosé Fonseca vec_type, ""); 802ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin break; 803ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin 804e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca case TGSI_FILE_PREDICATE: 805e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca _debug_printf("warning: predicate registers not yet implemented\n"); 806e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca break; 807e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca 80885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin default: 80985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin /* don't need to declare other vars */ 810dc886ba1391d7d890bd1f5532bc14553e883a418Zack Rusin break; 811012fabca722494162c244a367913562b8cfa4677Zack Rusin } 81285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 81385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin} 81463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 815fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul 816fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul/** 817fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * Emit LLVM for one TGSI instruction. 818fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * \param return TRUE for success, FALSE otherwise 819fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul */ 820fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paulstatic boolean 82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction( 82263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 823faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_full_instruction *inst, 824faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_opcode_info *info) 82563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 82663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 82790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca LLVMValueRef src0, src1, src2; 828e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp0, tmp1, tmp2; 829e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp3 = NULL; 830e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp4 = NULL; 831e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp5 = NULL; 832e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp6 = NULL; 833e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp7 = NULL; 834faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef res; 835faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef dst0[NUM_CHANNELS]; 83663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 83789258652b6a1d282bed14549907892bdfda752f0José Fonseca /* 83889258652b6a1d282bed14549907892bdfda752f0José Fonseca * Stores and write masks are handled in a general fashion after the long 83989258652b6a1d282bed14549907892bdfda752f0José Fonseca * instruction opcode switch statement. 84089258652b6a1d282bed14549907892bdfda752f0José Fonseca * 84189258652b6a1d282bed14549907892bdfda752f0José Fonseca * Although not stricitly necessary, we avoid generating instructions for 84289258652b6a1d282bed14549907892bdfda752f0José Fonseca * channels which won't be stored, in cases where's that easy. For some 84389258652b6a1d282bed14549907892bdfda752f0José Fonseca * complex instructions, like texture sampling, it is more convenient to 84489258652b6a1d282bed14549907892bdfda752f0José Fonseca * assume a full writemask and then let LLVM optimization passes eliminate 84589258652b6a1d282bed14549907892bdfda752f0José Fonseca * redundant code. 84689258652b6a1d282bed14549907892bdfda752f0José Fonseca */ 84789258652b6a1d282bed14549907892bdfda752f0José Fonseca 848faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca assert(info->num_dst <= 1); 849faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 850faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 851faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.undef; 852faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 853faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 854faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 85563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (inst->Instruction.Opcode) { 85663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARL: 8572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 859ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin tmp0 = lp_build_floor(&bld->base, tmp0); 860faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 86163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 86263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 86363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 86463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOV: 8652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 866faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index ); 86763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 86863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 86963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 87063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LIT: 8712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) { 872faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 87363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 8742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 8752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 876faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero); 877ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca } 8782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 879ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = SrcReg[0].yyyy */ 8802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 881ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = max(XMM[1], 0) */ 882ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero); 883ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[2] = SrcReg[0].wwww */ 8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 0, CHAN_W ); 885ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_pow( &bld->base, tmp1, tmp2); 8862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 887c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero); 888faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero); 889c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca } 8902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) { 891faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 89263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 89363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 89463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 89563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCP: 89663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIP */ 8972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 898faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rcp(&bld->base, src0); 8992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 900faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 90163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 90263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 90363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 90463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RSQ: 90563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIPSQRT */ 9062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 90790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca src0 = lp_build_abs(&bld->base, src0); 908faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rsqrt(&bld->base, src0); 9092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 910faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 91163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 91263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 91363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 91463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EXP: 9152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 9162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 9172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 91857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2_int_part = NULL; 91957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_frac_part = NULL; 92057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2 = NULL; 92157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 9222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 92357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 9242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 92557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2_int_part = &tmp0; 9262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 92757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_frac_part = &tmp1; 9282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 92957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2 = &tmp2; 93057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 93157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2); 93257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 9332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 934faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 9352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 936faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp1; 9372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 938faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 93963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 94063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 9412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 942faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 94363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 94463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 94563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 94663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LOG: 9472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 9482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 9492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 950add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_floor_log2 = NULL; 951add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_exp = NULL; 952add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_log2 = NULL; 95357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 9542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 95557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca src0 = lp_build_abs( &bld->base, src0 ); 95657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 9572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 95857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_floor_log2 = &tmp0; 9592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 96057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp = &tmp1; 9612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 96257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_log2 = &tmp2; 96357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 96457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2); 96557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 96657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.x = floor(lg2(abs(src.x))) */ 9672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 968faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 96957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */ 9702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) { 971faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1); 97263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 97357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.z = lg2(abs(src.x)) */ 9742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 975faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 97663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 97763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 9782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 979faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 98063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 98163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 98263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 98363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MUL: 9842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 987faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_mul(&bld->base, src0, src1); 98863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 98963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 99063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 99163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ADD: 9922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 995faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add(&bld->base, src0, src1); 99663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 99763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 99863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 99963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP3: 100063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT3 */ 10012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 10022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 100390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 10042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 10052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 100690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 100790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 10092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 101090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 101190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1013faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 101463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 101563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 101663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 101763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP4: 101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT4 */ 10192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 10202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 102190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 10222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 10232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 102490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 102590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 10272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 102890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 102990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_W ); 10312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_W ); 103290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 103390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1035faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 103663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 103763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 103863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DST: 10402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 1041faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 104263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 10432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 10442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 10452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Y ); 1046faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1); 104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 10482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1049faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z ); 105063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 10512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1052faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W ); 105363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 105463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MIN: 10572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1060faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_min( &bld->base, src0, src1 ); 106163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAX: 10652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1068faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_max( &bld->base, src0, src1 ); 106963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 107063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLT: 107363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETLT */ 10742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10771aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 ); 1078faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 10791aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 108063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 108163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 108263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGE: 108363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETGE */ 10842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10871aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 ); 1088faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 10891aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 109063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 109163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 109263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAD: 109363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_MADD */ 10942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 10962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 10972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 2, chan_index ); 109890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 109990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp2); 1100faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 110163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 110263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 110363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 110463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SUB: 11052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 11072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 1108faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1); 110963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 111063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 111163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 111263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LRP: 11132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 11162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 111790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sub( &bld->base, src1, src2 ); 111890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, src0, tmp0 ); 1119faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 ); 112063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 112163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 112263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 112363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CND: 1124873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1125873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 1126873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1127873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 1128185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul tmp1 = lp_build_const_vec(bld->base.type, 0.5); 1129873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1); 1130faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 ); 1131873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 113363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2A: 11352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 11362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 113790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 11382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 11392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 114090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 114190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 11422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 2, CHAN_X ); /* xmm1 = src[2].x */ 114390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 11442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1145faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 114663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 114763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 114863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 114963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FRC: 11502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1151873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 1152873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_floor(&bld->base, src0); 1153f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul tmp0 = lp_build_sub(&bld->base, src0, tmp0); 1154faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 115663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 115763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 115863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CLAMP: 1159873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1160873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1161873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1162873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 1163873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_max(&bld->base, tmp0, src1); 1164873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_min(&bld->base, tmp0, src2); 1165faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 1166873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 116863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 116963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FLR: 11702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1172faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_floor(&bld->base, tmp0); 117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 117463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 117563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ROUND: 11772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1179faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_round(&bld->base, tmp0); 118063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 118163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 118263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 118390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca case TGSI_OPCODE_EX2: { 11842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 118590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_exp2( &bld->base, tmp0); 11862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1187faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 118963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 119090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca } 119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 119263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LG2: 11932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 119490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_log2( &bld->base, tmp0); 11952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1196faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 119863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 120063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POW: 12012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 12022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, CHAN_X ); 1203faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_pow( &bld->base, src0, src1 ); 12042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1205faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 120663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 120763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 120863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XPD: 12102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 12112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 12122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Z ); 12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp3 = emit_fetch( bld, inst, 0, CHAN_Z ); 121463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 12162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 12172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 12182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp4 = emit_fetch( bld, inst, 1, CHAN_Y ); 121963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 122190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = tmp0; 122290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_mul( &bld->base, tmp2, tmp1); 122390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp3; 122490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 122590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_sub( &bld->base, tmp2, tmp5); 1226faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp2; 122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 12292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 12302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_X ); 12312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp5 = emit_fetch( bld, inst, 0, CHAN_X ); 123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 123490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_mul( &bld->base, tmp3, tmp2); 123590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp5); 123690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_sub( &bld->base, tmp3, tmp1); 1237faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp3; 123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 124090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 124190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp2); 124290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_sub( &bld->base, tmp5, tmp0); 1243faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp5; 124463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1246faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 125063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ABS: 12512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1253faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_abs( &bld->base, tmp0 ); 125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 125663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 125763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCC: 1258873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1259873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1260fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 126163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DPH: 12632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 12642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 126590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 12662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 12672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 126890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 126990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 12712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 127290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 127390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_W ); 127590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 12762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1277faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 127863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 128063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_COS: 12822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 128390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_cos( &bld->base, tmp0 ); 12842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1285faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 128763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDX: 129086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 129186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL); 129286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 129363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDY: 129686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 129786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]); 129886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KILP: 130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* predicated kill */ 1303feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul emit_kilp( bld, inst ); 130463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KIL: 130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* conditional kill */ 13082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca emit_kil( bld, inst ); 130963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 131063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2H: 1312fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 131363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 131463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2US: 1316fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4B: 1320fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 132163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 132263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4UB: 1324fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 132663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 132763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RFL: 1328fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SEQ: 13322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 13342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 13351aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 ); 1336faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 13371aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 133863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 133963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 134063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SFL: 1341873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1342faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.zero; 1343873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 134463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 134563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 134663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGT: 13472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 13492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 13501aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 ); 1351faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 13521aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 135363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 135563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SIN: 13562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 135790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sin( &bld->base, tmp0 ); 13582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1359faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLE: 13642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 13662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 13671aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 ); 1368faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 13691aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 137063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SNE: 13732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 13752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 13761aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 ); 1377faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 13781aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 138163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_STR: 1382873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1383faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.one; 1384873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 138563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TEX: 1388962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_NONE, dst0 ); 138963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 139163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXD: 1392962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_EXPLICIT_DERIV, dst0 ); 139363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 139563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2H: 1396873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1397873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert (0); 1398fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 139963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 140063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 140163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2US: 1402873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1403873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1404fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 140663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 140763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4B: 1408873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1409873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1410fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4UB: 1414873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1415873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1416fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_X2D: 1420873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1421873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1422fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARA: 1426873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1427873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1428fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARR: 14322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1434ded2374e67bdc2c24e868775d2ff77b39b339d56Zack Rusin tmp0 = lp_build_round(&bld->base, tmp0); 1435faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 143763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRA: 1440873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1441873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1442fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CAL: 1446873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1447fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RET: 1451873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1452fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 145363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_END: 145663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 145763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SSG: 145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SGN */ 14602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1462faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 ); 146363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 146463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 146563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CMP: 14672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 14692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 14702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 14711aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero ); 1472faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2); 14731aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 147463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 147563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 147663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SCS: 14772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 14782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1479faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 ); 148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 14822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1483faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 ); 148463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1486faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = bld->base.zero; 148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1489faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 149063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 149163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXB: 1494962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_LOD_BIAS, dst0 ); 149563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM: 149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* fall-through */ 149963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM4: 150063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* 3 or 4-component normalization */ 150163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4; 150363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 15042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) || 15052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) || 15062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) || 15072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) { 150863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 150963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */ 151063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 151163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm4 = src.x */ 151263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = src.x * src.x */ 15132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 15142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 151590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp4 = tmp0; 151663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 151790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp0); 151863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 151963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm5 = src.y */ 152063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.y * src.y */ 15212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Y); 15222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 152390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp1; 152463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 152590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 152690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 152763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 152863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm6 = src.z */ 152963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.z * src.z */ 15302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Z); 15312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 153290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp6 = tmp1; 153363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 153490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 153590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 153663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 153763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (dims == 4) { 153863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm7 = src.w */ 153963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.w * src.w */ 15402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_W); 15412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) { 154290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp7 = tmp1; 154363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 154490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 154590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 154663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 154763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm1 = 1 / sqrt(xmm0) */ 154990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_rsqrt( &bld->base, tmp0); 155063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 155163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.x = xmm1 * src.x */ 15522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 1553faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1); 155463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 155563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.y = xmm1 * src.y */ 15572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 1558faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1); 155963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 156063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 156163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.z = xmm1 * src.z */ 15622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 1563faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1); 156463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 156563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 156663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = xmm1 * src.w */ 15672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) { 1568faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1); 156963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 157063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 157163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1572faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca /* dst.w = 1.0 */ 15732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) { 1574faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 157563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 157663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 157763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 157863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 157963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DIV: 1580873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1581873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert( 0 ); 1582fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 158363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 158463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 158563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2: 15862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 15872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 158890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 15892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 15902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 159190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 159290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 15932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1594faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 159563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 159663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 159763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 159863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXL: 1599962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_EXPLICIT_LOD, dst0 ); 160063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 160163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 160263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXP: 1603962558daaed43b0111cd062e32821aad106869d7José Fonseca emit_tex( bld, inst, TEX_MODIFIER_PROJECTED, dst0 ); 160463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 160518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 160663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRK: 160718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_break(&bld->exec_mask); 160863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 160963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 161063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_IF: 161180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 1612ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin tmp0 = lp_build_cmp(&bld->base, PIPE_FUNC_NOTEQUAL, 1613ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin tmp0, bld->base.zero); 161480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_push(&bld->exec_mask, tmp0); 161563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 161663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 161718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin case TGSI_OPCODE_BGNLOOP: 161818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_bgnloop(&bld->exec_mask); 161918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin break; 162018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 162163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ELSE: 162280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_invert(&bld->exec_mask); 162363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 162463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 162563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDIF: 162680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_pop(&bld->exec_mask); 162763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 162863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 162918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin case TGSI_OPCODE_ENDLOOP: 163018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_endloop(&bld->exec_mask); 163118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin break; 163218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 163363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PUSHA: 1634873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1635873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1636fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 163763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 163863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 163963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POPA: 1640873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1641873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1642fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 164363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 164463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 164563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CEIL: 1646873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1647873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1648faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_ceil(&bld->base, tmp0); 1649873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 165063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 165163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 165263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_I2F: 1653873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1654873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1655fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 165663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 165763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 165863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NOT: 1659873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1660873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1661fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 166263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 166363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 166463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TRUNC: 16652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 16662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1667faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_trunc(&bld->base, tmp0); 166863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 166963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 167063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 167163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SHL: 1672873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1673873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1674fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 167563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 167663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 16772c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol case TGSI_OPCODE_ISHR: 1678873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1679873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1680fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 168163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 168263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 168363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_AND: 1684873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1685873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1686fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 168763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 168863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 168963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_OR: 1690873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1691873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1692fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 169363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 169463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 169563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOD: 1696873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1697873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1698fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 169963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 170063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 170163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XOR: 1702873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1703873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1704fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 170563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 170663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 170763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SAD: 1708873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1709873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1710fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 171163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 171263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 171363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXF: 1714873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1715873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1716fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 171763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 171863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 171963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXQ: 1720873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1721873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1722fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 172363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 172463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 172563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CONT: 172618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_continue(&bld->exec_mask); 172763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 172863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 172963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EMIT: 1730fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 173163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 173263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 173363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDPRIM: 1734fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 173563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 173663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1737873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca case TGSI_OPCODE_NOP: 1738873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca break; 1739873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca 174063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 1741fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 174263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 174363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1744faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 1745faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1746faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_store( bld, inst, 0, chan_index, dst0[chan_index]); 1747faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1748faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1749faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 1750fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return TRUE; 175163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 175263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1753c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca 1754c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid 175563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder, 175663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_token *tokens, 1757b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 17583d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask, 175963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr, 1760f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos, 1761f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS], 1762f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS], 1763021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin struct lp_build_sampler_soa *sampler, 1764021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin struct tgsi_shader_info *info) 176563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 176663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context bld; 176763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct tgsi_parse_context parse; 176863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint num_immediates = 0; 176963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 177063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 177163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* Setup build context */ 177263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca memset(&bld, 0, sizeof bld); 177363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lp_build_context_init(&bld.base, builder, type); 1774c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca bld.mask = mask; 1775f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.pos = pos; 1776f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.inputs = inputs; 177763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.outputs = outputs; 177863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.consts_ptr = consts_ptr; 17798be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld.sampler = sampler; 1780021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin bld.has_indirect_addressing = info->opcode_count[TGSI_OPCODE_ARR] > 0 || 1781021e0dc78b15fab29e761012860276c2597c8d8fZack Rusin info->opcode_count[TGSI_OPCODE_ARL] > 0; 178263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 178380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_init(&bld.exec_mask, &bld.base); 178480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 178563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_init( &parse, tokens ); 178663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 178763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca while( !tgsi_parse_end_of_tokens( &parse ) ) { 178863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_token( &parse ); 178963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 179063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( parse.FullToken.Token.Type ) { 179163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_DECLARATION: 17921fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* Inputs already interpolated */ 1793e27983bc08d4eff5effbbcffbf5c9f5862fca2cfJosé Fonseca emit_declaration( &bld, &parse.FullToken.FullDeclaration ); 179463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 179563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 179663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_INSTRUCTION: 1797faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca { 17982c90652ed9e119f09af6757c59d10273894ba590José Fonseca unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode; 17995d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee const struct tgsi_opcode_info *opcode_info = tgsi_get_opcode_info(opcode); 18005d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, opcode_info )) 1801faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n", 18025d37cebc1b2f41ef68a5f8bb5ad66973ec2c1dd8Vinson Lee opcode_info->mnemonic); 1803faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1804faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 180563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 180663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 180763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_IMMEDIATE: 180863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* simply copy the immediate values into the next immediates[] slot */ 180963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 181063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1; 181163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(size <= 4); 18126c8c88f02f0dc9cf39ce51d068525a94fccd5dc7José Fonseca assert(num_immediates < LP_MAX_TGSI_IMMEDIATES); 181363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = 0; i < size; ++i ) 181463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = 1815185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul lp_build_const_vec(type, parse.FullToken.FullImmediate.u[i].Float); 181663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = size; i < 4; ++i ) 181763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = bld.base.undef; 181863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca num_immediates++; 181963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 182063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 182163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 18229381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca case TGSI_TOKEN_TYPE_PROPERTY: 18239381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca break; 18249381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca 182563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 182663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 182763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 182863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 182918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (0) { 183018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef block = LLVMGetInsertBlock(builder); 183118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef function = LLVMGetBasicBlockParent(block); 183218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin debug_printf("11111111111111111111111111111 \n"); 183318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tgsi_dump(tokens, 0); 183418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMDumpValue(function); 183518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin debug_printf("2222222222222222222222222222 \n"); 183618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 183763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_free( &parse ); 183863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 183963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1840