lp_bld_tgsi_soa.c revision fc9b8cd9dda946d8415732aeeed1eff5541cd1ee
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" 4963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h" 5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h" 5163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h" 527821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h" 5363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h" 543d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h" 5563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h" 5680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h" 5763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 5863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_TEMPS 256 6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_IMMEDIATES 256 6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\ 6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++) 6563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 675b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN))) 6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( INST, CHAN )) 7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\ 7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( CHAN )\ 7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN ) 7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0 7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1 7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2 7963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3 8063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT 0 8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT 1 8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT 2 8486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3 8586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 8680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#define LP_TGSI_MAX_NESTING 16 8780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 8880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstruct lp_exec_mask { 8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_build_context *bld; 9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin boolean has_mask; 9280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMTypeRef int_vec_type; 9480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef cond_stack[LP_TGSI_MAX_NESTING]; 9680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin int cond_stack_size; 9780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef cond_mask; 9880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef break_stack[LP_TGSI_MAX_NESTING]; 10018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int break_stack_size; 10118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef break_mask; 10218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 10318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef cont_stack[LP_TGSI_MAX_NESTING]; 10418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int cont_stack_size; 10518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef cont_mask; 10618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 10718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef loop_stack[LP_TGSI_MAX_NESTING]; 10818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin int loop_stack_size; 10918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef loop_block; 11018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 11118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 11280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef exec_mask; 11380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}; 11463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context 11663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 11763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_context base; 11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr; 120f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos; 121f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS]; 12295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS]; 123c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca 1248be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca struct lp_build_sampler_soa *sampler; 12563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 12695f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS]; 12795f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS]; 1281929057eac0c3351e0810612bdae56331a235736José Fonseca 1293d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask; 13080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_exec_mask exec_mask; 13163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}; 13263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 13386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 13486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = { 13586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_LEFT, 13686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_LEFT 13786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 13886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 13986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = { 14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_RIGHT, QUAD_TOP_RIGHT, 14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT 14386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 14486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 14586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 14686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = { 14786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT, 14886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT 14986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 15086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 15186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 15286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = { 15386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT, 15486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT 15586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 15686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 15780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld) 15880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 15980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->bld = bld; 16080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->has_mask = FALSE; 16180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack_size = 0; 16218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack_size = 0; 16318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_stack_size = 0; 16418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_stack_size = 0; 16580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 16680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->int_vec_type = lp_build_int_vec_type(mask->bld->type); 16780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 16880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 16980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask) 17080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 17118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->loop_stack_size) { 17218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin /*for loops we need to update the entire mask at 17318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin * runtime */ 17418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef tmp; 17518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp = LLVMBuildAnd(mask->bld->builder, 17618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask, 17718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask, 17818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskcb"); 17918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = LLVMBuildAnd(mask->bld->builder, 18018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cond_mask, 18118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tmp, 18218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "maskfull"); 18318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } else 18418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask = mask->cond_mask; 18518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 18618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 18718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->has_mask = (mask->cond_stack_size > 0 || 18818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack_size > 0); 18980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 19080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 19180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask, 19280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val) 19380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 19480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask; 19580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = LLVMBuildBitCast(mask->bld->builder, val, 19680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->int_vec_type, ""); 19780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 19880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 19980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 20080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 20180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask) 20280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 20380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef prev_mask = mask->cond_stack[mask->cond_stack_size - 1]; 204faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin LLVMValueRef inv_mask = LLVMBuildNot(mask->bld->builder, 205faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin mask->cond_mask, ""); 206faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 207faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin /* means that we didn't have any mask before and that 208faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin * we were fully enabled */ 209faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin if (mask->cond_stack_size <= 1) { 210faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin prev_mask = LLVMConstAllOnes(mask->int_vec_type); 211faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin } 212faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 21380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = LLVMBuildAnd(mask->bld->builder, 21480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin inv_mask, 21580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin prev_mask, ""); 21680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 21780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 21880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 21980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask) 22080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 22180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = mask->cond_stack[--mask->cond_stack_size]; 22280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 22380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 22480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 22518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_bgnloop(struct lp_exec_mask *mask) 22618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 22718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 22818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cont_stack_size == 0) 22918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask = LLVMConstAllOnes(mask->int_vec_type); 23018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cont_stack_size == 0) 23118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask = LLVMConstAllOnes(mask->int_vec_type); 23218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cond_stack_size == 0) 23318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cond_mask = LLVMConstAllOnes(mask->int_vec_type); 23418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_stack[mask->loop_stack_size++] = mask->loop_block; 23518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_block = lp_build_insert_new_block(mask->bld->builder, "bgnloop"); 23618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBuildBr(mask->bld->builder, mask->loop_block); 23718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMPositionBuilderAtEnd(mask->bld->builder, mask->loop_block); 23818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 23918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 24018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 24118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 24218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_break(struct lp_exec_mask *mask) 24318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 24418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder, 24518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 24618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin "break"); 24718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 24818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_stack[mask->break_stack_size++] = mask->break_mask; 24918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->break_stack_size > 1) { 25018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask = LLVMBuildAnd(mask->bld->builder, 25118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask, 25218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin exec_mask, "break_full"); 25318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } else 25418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask = exec_mask; 25518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 25618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 25718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 25818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 25918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_continue(struct lp_exec_mask *mask) 26018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 26118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef exec_mask = LLVMBuildNot(mask->bld->builder, 26218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->exec_mask, 26318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin ""); 26418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 26518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_stack[mask->cont_stack_size++] = mask->cont_mask; 26618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cont_stack_size > 1) { 26718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask = LLVMBuildAnd(mask->bld->builder, 26818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask, 26918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin exec_mask, ""); 27018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } else 27118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask = exec_mask; 27218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 27318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 27418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 27518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 27618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 27718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusinstatic void lp_exec_endloop(struct lp_exec_mask *mask) 27818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin{ 27918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef endloop; 280d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMTypeRef reg_type = LLVMIntType(mask->bld->type.width* 281d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca mask->bld->type.length); 282d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca /* i1cond = (mask == 0) */ 283d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMValueRef i1cond = LLVMBuildICmp( 284d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca mask->bld->builder, 285d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMIntNE, 286d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMBuildBitCast(mask->bld->builder, mask->break_mask, reg_type, ""), 287d42229707ad4be9be5a8e122354be7102d6ec348Jose Fonseca LLVMConstNull(reg_type), ""); 28818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 28918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin endloop = lp_build_insert_new_block(mask->bld->builder, "endloop"); 29018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 29118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBuildCondBr(mask->bld->builder, 292ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin i1cond, mask->loop_block, endloop); 29318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 29418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMPositionBuilderAtEnd(mask->bld->builder, endloop); 29518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 29618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->loop_block = mask->loop_stack[--mask->loop_stack_size]; 29718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin /* pop the break mask */ 29818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->cont_stack_size) { 29918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->cont_mask = mask->cont_stack[--mask->cont_stack_size]; 30018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 30118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (mask->break_stack_size) { 30218d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin mask->break_mask = mask->cont_stack[--mask->break_stack_size]; 30318d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 30418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 30518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_mask_update(mask); 30618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin} 30718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 30880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask, 30980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val, 31080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef dst) 31180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 31280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin if (mask->has_mask) { 31380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef real_val, dst_val; 31480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 31580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin dst_val = LLVMBuildLoad(mask->bld->builder, dst, ""); 31680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin real_val = lp_build_select(mask->bld, 31780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->exec_mask, 31880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin val, dst_val); 31980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 32080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, real_val, dst); 32180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin } else 32280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, val, dst); 32380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 32480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 32586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 32686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 32786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld, 32886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 32986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 33086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_left = lp_build_swizzle1_aos(&bld->base, src, swizzle_left); 33186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right); 33286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_right, src_left); 33386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 33486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 33586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 33686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 33786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld, 33886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 33986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 34086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_top = lp_build_swizzle1_aos(&bld->base, src, swizzle_top); 34186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom); 34286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_top, src_bottom); 34386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 34486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 34586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 34663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 34763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch. 34863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 34963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef 35063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch( 35163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 3522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst, 3532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 35463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const unsigned chan_index ) 35563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 3567d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[index]; 357b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 35863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef res; 35963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 36063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (swizzle) { 361b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_X: 362b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Y: 363b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Z: 364b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_W: 36563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 36691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell switch (reg->Register.File) { 36763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_CONSTANT: { 36891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0); 36963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, ""); 37063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, ""); 37163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_broadcast_scalar(&bld->base, scalar); 37263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 37363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 37463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 37563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_IMMEDIATE: 37691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->immediates[reg->Register.Index][swizzle]; 37763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 37863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 37963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 38063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_INPUT: 38191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->inputs[reg->Register.Index][swizzle]; 38263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 38363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 38463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_TEMPORARY: 38685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin res = LLVMBuildLoad(bld->base.builder, bld->temps[reg->Register.Index][swizzle], ""); 38763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(!res) 38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return bld->base.undef; 38963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 39163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 39263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 3934d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 39463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 39563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 39663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 39763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 39863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 3994d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 40063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 40163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 40263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) { 40363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_CLEAR: 40463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 40563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 40663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 40763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_SET: 4081fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* TODO: Use bitwese OR for floating point */ 40963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 41063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 41163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 41263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 41363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_TOGGLE: 41463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 41563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 41663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 41763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_KEEP: 41863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 41963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 42063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 42163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return res; 42263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 42363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 42563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 42686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives. 42786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */ 42886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void 42986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv( 43086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca struct lp_build_tgsi_soa_context *bld, 43186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const struct tgsi_full_instruction *inst, 43286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca unsigned index, 43386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const unsigned chan_index, 43486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *res, 43586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddx, 43686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddy) 43786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 43886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src; 43986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 44086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca src = emit_fetch(bld, inst, index, chan_index); 44186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 44286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(res) 44386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *res = src; 44486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 44586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca /* TODO: use interpolation coeffs for inputs */ 44686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 44786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddx) 44886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddx = emit_ddx(bld, src); 44986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 45086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddy) 45186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddy = emit_ddy(bld, src); 45286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 45386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 45486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 45586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/** 45663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store. 45763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 45863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store( 46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 4622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index, 46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef value) 46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 4667d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[index]; 4672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca 46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( inst->Instruction.Saturate ) { 46963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_NONE: 47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_ZERO_ONE: 4737926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_max(&bld->base, value, bld->base.zero); 4747926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 47563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 47663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 47763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_MINUS_PLUS_ONE: 478185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul value = lp_build_max(&bld->base, value, lp_build_const_vec(bld->base.type, -1.0)); 4797926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 48063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 4817926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca 4827926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca default: 4837926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca assert(0); 48463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 48563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4865b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch( reg->Register.File ) { 48763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_OUTPUT: 48880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_store(&bld->exec_mask, value, 48980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin bld->outputs[reg->Register.Index][chan_index]); 49063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 49163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 49263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_TEMPORARY: 49380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_store(&bld->exec_mask, value, 49480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin bld->temps[reg->Register.Index][chan_index]); 49563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 49663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 49763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_ADDRESS: 49863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* FIXME */ 49963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 50063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 50163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 502ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca case TGSI_FILE_PREDICATE: 503ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca /* FIXME */ 504ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca assert(0); 505ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca break; 506ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca 50763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 50863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 50963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 51063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 51163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 51263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 51363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 51463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators. 51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 51786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 51863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 51963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld, 52063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 52163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca boolean apply_lodbias, 522faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca boolean projected, 523faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef *texel) 52463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 52591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell const uint unit = inst->Src[1].Register.Index; 52663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef lodbias; 52731d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee LLVMValueRef oow = NULL; 528c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca LLVMValueRef coords[3]; 529c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca unsigned num_coords; 53063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 53163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 5327d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell switch (inst->Texture.Texture) { 53363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_1D: 534c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 1; 53563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 53663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_2D: 53763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_RECT: 538c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 2; 53963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 540f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW1D: 541f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW2D: 542f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOWRECT: 54363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_3D: 54463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_CUBE: 545c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 3; 54663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 54763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 54863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 54963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return; 55063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 55163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 55263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(apply_lodbias) 5532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca lodbias = emit_fetch( bld, inst, 0, 3 ); 55463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca else 55563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lodbias = bld->base.zero; 55663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 55763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (projected) { 5582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca oow = emit_fetch( bld, inst, 0, 3 ); 55963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca oow = lp_build_rcp(&bld->base, oow); 56063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 56163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 562c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca for (i = 0; i < num_coords; i++) { 563c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = emit_fetch( bld, inst, 0, i ); 56463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (projected) 565c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = lp_build_mul(&bld->base, coords[i], oow); 56663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 567ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca for (i = num_coords; i < 3; i++) { 568ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca coords[i] = bld->base.undef; 569ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca } 57063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 5718be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->sampler->emit_fetch_texel(bld->sampler, 5728be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.builder, 5738be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.type, 5748be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca unit, num_coords, coords, lodbias, 5758be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca texel); 57663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 57763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 57863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 579feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/** 580feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Kill fragment if any of the src register values are negative. 581feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 58263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 58363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil( 58463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 5852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst ) 58663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 5877d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[0]; 5887821664b15501b173b2304bbada758c33c5ff972José Fonseca LLVMValueRef terms[NUM_CHANNELS]; 5893d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef mask; 59063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 59163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 5927821664b15501b173b2304bbada758c33c5ff972José Fonseca memset(&terms, 0, sizeof terms); 59363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 59463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( chan_index ) { 59563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned swizzle; 59663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 5977821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Unswizzle channel */ 598b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 59963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6007821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Check if the component has not been already tested. */ 6017821664b15501b173b2304bbada758c33c5ff972José Fonseca assert(swizzle < NUM_CHANNELS); 6027821664b15501b173b2304bbada758c33c5ff972José Fonseca if( !terms[swizzle] ) 6037821664b15501b173b2304bbada758c33c5ff972José Fonseca /* TODO: change the comparison operator instead of setting the sign */ 6042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca terms[swizzle] = emit_fetch(bld, inst, 0, chan_index ); 60563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 60663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6073d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = NULL; 6087821664b15501b173b2304bbada758c33c5ff972José Fonseca FOR_EACH_CHANNEL( chan_index ) { 609aede39efd86d200ffbace8fc012104e31f673973José Fonseca if(terms[chan_index]) { 6103d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef chan_mask; 611aede39efd86d200ffbace8fc012104e31f673973José Fonseca 612feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* 613feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * If term < 0 then mask = 0 else mask = ~0. 614feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 6153d7a88674f9eb3320eeff511968f041426e25023José Fonseca chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero); 616aede39efd86d200ffbace8fc012104e31f673973José Fonseca 6173d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 6183d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, ""); 6193d7a88674f9eb3320eeff511968f041426e25023José Fonseca else 6203d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = chan_mask; 621aede39efd86d200ffbace8fc012104e31f673973José Fonseca } 62263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 6233d7a88674f9eb3320eeff511968f041426e25023José Fonseca 6243d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 6253d7a88674f9eb3320eeff511968f041426e25023José Fonseca lp_build_mask_update(bld->mask, mask); 62663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 62763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 62863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 62963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 630feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * Predicated fragment kill. 631feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * XXX Actually, we do an unconditional kill (as in tgsi_exec.c). 632feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * The only predication is the execution mask which will apply if 633feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * we're inside a loop or conditional. 634feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 635feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulstatic void 636feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paulemit_kilp(struct lp_build_tgsi_soa_context *bld, 637feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul const struct tgsi_full_instruction *inst) 638feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul{ 639feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul LLVMValueRef mask; 640feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 641feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul /* For those channels which are "alive", disable fragment shader 642feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul * execution. 643feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul */ 644feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul if (bld->exec_mask.has_mask) { 645feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul mask = LLVMBuildNot(bld->base.builder, bld->exec_mask.exec_mask, "kilp"); 646feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 647feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul else { 648feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul mask = bld->base.zero; 649feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul } 650feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 651feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul lp_build_mask_update(bld->mask, mask); 652feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul} 653feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 654feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul 655feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul/** 65663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Check if inst src/dest regs use indirect addressing into temporary 65763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * register file. 65863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 65963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic boolean 66063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaindirect_temp_reference(const struct tgsi_full_instruction *inst) 66163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 66263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint i; 66363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 6647d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[i]; 66591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (reg->Register.File == TGSI_FILE_TEMPORARY && 66691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell reg->Register.Indirect) 66763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return TRUE; 66863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 66963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (i = 0; i < inst->Instruction.NumDstRegs; i++) { 6707d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[i]; 6715b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell if (reg->Register.File == TGSI_FILE_TEMPORARY && 6725b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell reg->Register.Indirect) 67363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return TRUE; 67463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 67563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return FALSE; 67663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 67763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 67885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinstatic int 67985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration( 68085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin struct lp_build_tgsi_soa_context *bld, 68185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin const struct tgsi_full_declaration *decl) 68285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{ 68385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned first = decl->Range.First; 68485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned last = decl->Range.Last; 68585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned idx, i; 686012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMBasicBlockRef current_block = 687012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMGetInsertBlock(bld->base.builder); 688012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMBasicBlockRef first_block = 689012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMGetEntryBasicBlock( 690012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMGetBasicBlockParent(current_block)); 691012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMValueRef first_inst = 692012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMGetFirstInstruction(first_block); 693012fabca722494162c244a367913562b8cfa4677Zack Rusin 694012fabca722494162c244a367913562b8cfa4677Zack Rusin /* we want alloca's to be the first instruction 695012fabca722494162c244a367913562b8cfa4677Zack Rusin * in the function so we need to rewind the builder 696012fabca722494162c244a367913562b8cfa4677Zack Rusin * to the very beginning */ 697012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMPositionBuilderBefore(bld->base.builder, 698012fabca722494162c244a367913562b8cfa4677Zack Rusin first_inst); 69985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 70085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (idx = first; idx <= last; ++idx) { 70185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin switch (decl->Declaration.File) { 70285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_TEMPORARY: 70385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 70485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin bld->temps[idx][i] = lp_build_alloca(&bld->base); 70585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 70685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 70785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_OUTPUT: 70885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 70985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin bld->outputs[idx][i] = lp_build_alloca(&bld->base); 71085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 71185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 71285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin default: 71385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin /* don't need to declare other vars */ 714dc886ba1391d7d890bd1f5532bc14553e883a418Zack Rusin break; 715012fabca722494162c244a367913562b8cfa4677Zack Rusin } 71685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 71785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 718012fabca722494162c244a367913562b8cfa4677Zack Rusin LLVMPositionBuilderAtEnd(bld->base.builder, 719012fabca722494162c244a367913562b8cfa4677Zack Rusin current_block); 72085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin return TRUE; 72185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin} 72263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 723fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul 724fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul/** 725fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * Emit LLVM for one TGSI instruction. 726fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul * \param return TRUE for success, FALSE otherwise 727fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul */ 728fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paulstatic boolean 72963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction( 73063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 731faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_full_instruction *inst, 732faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_opcode_info *info) 73363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 73463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 73590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca LLVMValueRef src0, src1, src2; 736e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp0, tmp1, tmp2; 737e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp3 = NULL; 738e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp4 = NULL; 739e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp5 = NULL; 740e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp6 = NULL; 741e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp7 = NULL; 742faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef res; 743faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef dst0[NUM_CHANNELS]; 74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 74563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* we can't handle indirect addressing into temp register file yet */ 74663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (indirect_temp_reference(inst)) 74763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return FALSE; 74863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 74989258652b6a1d282bed14549907892bdfda752f0José Fonseca /* 75089258652b6a1d282bed14549907892bdfda752f0José Fonseca * Stores and write masks are handled in a general fashion after the long 75189258652b6a1d282bed14549907892bdfda752f0José Fonseca * instruction opcode switch statement. 75289258652b6a1d282bed14549907892bdfda752f0José Fonseca * 75389258652b6a1d282bed14549907892bdfda752f0José Fonseca * Although not stricitly necessary, we avoid generating instructions for 75489258652b6a1d282bed14549907892bdfda752f0José Fonseca * channels which won't be stored, in cases where's that easy. For some 75589258652b6a1d282bed14549907892bdfda752f0José Fonseca * complex instructions, like texture sampling, it is more convenient to 75689258652b6a1d282bed14549907892bdfda752f0José Fonseca * assume a full writemask and then let LLVM optimization passes eliminate 75789258652b6a1d282bed14549907892bdfda752f0José Fonseca * redundant code. 75889258652b6a1d282bed14549907892bdfda752f0José Fonseca */ 75989258652b6a1d282bed14549907892bdfda752f0José Fonseca 760faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca assert(info->num_dst <= 1); 761faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 762faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 763faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.undef; 764faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 765faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 766faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 76763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (inst->Instruction.Opcode) { 76863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0 76963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARL: 7701fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* FIXME */ 7712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 77363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_flr(bld, 0, 0); 77463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_f2it( bld, 0 ); 775faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 77663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 77763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 77863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif 77963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 78063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOV: 7812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 782faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index ); 78363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 78463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 78563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 78663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LIT: 7872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) { 788faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 78963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 7902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 7912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 792faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero); 793ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca } 7942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 795ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = SrcReg[0].yyyy */ 7962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 797ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = max(XMM[1], 0) */ 798ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero); 799ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[2] = SrcReg[0].wwww */ 8002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 0, CHAN_W ); 801ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_pow( &bld->base, tmp1, tmp2); 8022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 803c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero); 804faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero); 805c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca } 8062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) { 807faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 80863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 80963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 81163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCP: 81263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIP */ 8132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 814faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rcp(&bld->base, src0); 8152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 816faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 81763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 81963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RSQ: 82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIPSQRT */ 8222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 82390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca src0 = lp_build_abs(&bld->base, src0); 824faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rsqrt(&bld->base, src0); 8252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 826faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 82763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 82863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 82963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 83063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EXP: 8312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 8322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 8332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 83457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2_int_part = NULL; 83557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_frac_part = NULL; 83657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2 = NULL; 83757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 8382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 83957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 8402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 84157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2_int_part = &tmp0; 8422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 84357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_frac_part = &tmp1; 8442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 84557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2 = &tmp2; 84657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 84757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2); 84857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 8492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 850faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 8512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 852faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp1; 8532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 854faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 85563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 85663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 8572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 858faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 85963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 86063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 86163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 86263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LOG: 8632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 8642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 8652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 866add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_floor_log2 = NULL; 867add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_exp = NULL; 868add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_log2 = NULL; 86957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 8702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 87157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca src0 = lp_build_abs( &bld->base, src0 ); 87257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 8732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 87457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_floor_log2 = &tmp0; 8752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 87657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp = &tmp1; 8772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 87857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_log2 = &tmp2; 87957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 88057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2); 88157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 88257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.x = floor(lg2(abs(src.x))) */ 8832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 884faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 88557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */ 8862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) { 887faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1); 88863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 88957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.z = lg2(abs(src.x)) */ 8902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 891faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 89263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 89363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 8942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 895faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 89663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 89763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 89863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 89963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MUL: 9002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 903faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_mul(&bld->base, src0, src1); 90463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 90563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 90663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 90763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ADD: 9082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 911faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add(&bld->base, src0, src1); 91263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 91363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 91463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 91563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP3: 91663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT3 */ 9172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 9182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 91990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 9202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 9212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 92290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 92390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 9242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 9252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 92690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 92790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 9282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 929faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 93063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 93263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 93363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP4: 93463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT4 */ 9352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 9362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 93790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 9382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 9392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 94090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 94190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 9422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 9432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 94490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 94590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 9462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_W ); 9472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_W ); 94890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 94990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 9502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 951faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 95263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 95363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 95463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 95563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DST: 9562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 957faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 95863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 9602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 9612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Y ); 962faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1); 96363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 965faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z ); 96663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 968faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W ); 96963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 97063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 97163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 97263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MIN: 9732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 976faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_min( &bld->base, src0, src1 ); 97763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 97863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 97963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 98063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAX: 9812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 984faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_max( &bld->base, src0, src1 ); 98563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 98663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 98763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 98863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLT: 98963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETLT */ 9902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 9922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 9931aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 ); 994faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 9951aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 99663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 99763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 99863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGE: 99963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETGE */ 10002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10031aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 ); 1004faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 10051aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 100663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 100763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 100863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAD: 100963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_MADD */ 10102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 10122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 10132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 2, chan_index ); 101490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 101590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp2); 1016faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 101763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 101963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 102063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SUB: 10212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 10232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 1024faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1); 102563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 102663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LRP: 10292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 103390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sub( &bld->base, src1, src2 ); 103490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, src0, tmp0 ); 1035faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 ); 103663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 103763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 103863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CND: 1040873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1041873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 1042873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1043873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 1044185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul tmp1 = lp_build_const_vec(bld->base.type, 0.5); 1045873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1); 1046faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 ); 1047873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 104863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 104963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 105063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2A: 10512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 10522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 105390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 10542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 10552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 105690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 105790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 10582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 2, CHAN_X ); /* xmm1 = src[2].x */ 105990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 10602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1061faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FRC: 10662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1067873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 1068873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_floor(&bld->base, src0); 1069f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul tmp0 = lp_build_sub(&bld->base, src0, tmp0); 1070faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 107363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 107463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CLAMP: 1075873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1076873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1077873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 1078873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 1079873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_max(&bld->base, tmp0, src1); 1080873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_min(&bld->base, tmp0, src2); 1081faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 1082873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 108363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 108463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 108563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FLR: 10862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1088faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_floor(&bld->base, tmp0); 108963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 109063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 109163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 109263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ROUND: 10932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1095faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_round(&bld->base, tmp0); 109663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 109763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 109863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 109990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca case TGSI_OPCODE_EX2: { 11002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 110190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_exp2( &bld->base, tmp0); 11022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1103faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 110463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 110563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 110690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca } 110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LG2: 11092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 111090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_log2( &bld->base, tmp0); 11112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1112faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 111363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 111463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 111563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 111663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POW: 11172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 11182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, CHAN_X ); 1119faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_pow( &bld->base, src0, src1 ); 11202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1121faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 112263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 112363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 112463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 112563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XPD: 11262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 11272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 11282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Z ); 11292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp3 = emit_fetch( bld, inst, 0, CHAN_Z ); 113063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 11322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 11332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 11342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp4 = emit_fetch( bld, inst, 1, CHAN_Y ); 113563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 113790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = tmp0; 113890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_mul( &bld->base, tmp2, tmp1); 113990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp3; 114090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 114190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_sub( &bld->base, tmp2, tmp5); 1142faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp2; 114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 11452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 11462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_X ); 11472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp5 = emit_fetch( bld, inst, 0, CHAN_X ); 114863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 115090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_mul( &bld->base, tmp3, tmp2); 115190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp5); 115290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_sub( &bld->base, tmp3, tmp1); 1153faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp3; 115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 115690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 115790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp2); 115890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_sub( &bld->base, tmp5, tmp0); 1159faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp5; 116063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 11612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1162faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 116363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 116663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ABS: 11672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1169faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_abs( &bld->base, tmp0 ); 117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 117163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 117263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCC: 1174873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1175873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1176fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 117763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DPH: 11792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 11802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 118190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 11822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 11832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 118490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 118590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 11862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 11872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 118890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 118990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 11902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_W ); 119190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 11922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1193faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 119463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 119563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 119663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_COS: 11982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 119990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_cos( &bld->base, tmp0 ); 12002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1201faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 120263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 120363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 120463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 120563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDX: 120686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 120786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL); 120886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDY: 121286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 121386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]); 121486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 121563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 121663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 121763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KILP: 121863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* predicated kill */ 1219feffd259da5f2655222a2f26e2e5665a9e28173fBrian Paul emit_kilp( bld, inst ); 122063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 122163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 122263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KIL: 122363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* conditional kill */ 12242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca emit_kil( bld, inst ); 122563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 122663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2H: 1228fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 122963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 123063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 123163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2US: 1232fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 123363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 123463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 123563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4B: 1236fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 123763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4UB: 1240fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 124163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 124363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RFL: 1244fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 124563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SEQ: 12482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 12511aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 ); 1252faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 12531aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 125663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SFL: 1257873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1258faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.zero; 1259873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 126063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 126163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGT: 12632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 12661aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 ); 1267faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 12681aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 126963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 127063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 127163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SIN: 12722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 127390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sin( &bld->base, tmp0 ); 12742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1275faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 127663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 127763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 127863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLE: 12802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 12831aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 ); 1284faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 12851aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 128663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 128763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SNE: 12892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 12921aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 ); 1293faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 12941aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 129663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 129763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_STR: 1298873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1299faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.one; 1300873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 130163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TEX: 1304faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, FALSE, FALSE, dst0 ); 130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXD: 1308873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1309fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 131063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2H: 1313873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1314873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert (0); 1315fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2US: 1319873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1320873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1321fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 132263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4B: 1325873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1326873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1327fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 132863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4UB: 1331873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1332873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1333fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 133463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 133563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_X2D: 1337873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1338873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1339fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 134063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 134163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 134263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARA: 1343873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1344873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1345fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 134663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 134763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 134890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0 134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARR: 1350873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 13512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 135363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_rnd( bld, 0, 0 ); 135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_f2it( bld, 0 ); 1355faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 135663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 135890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif 135963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRA: 1361873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1362873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1363fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 136463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CAL: 1367873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1368fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 136963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RET: 1372873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1373fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_END: 137763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SSG: 138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SGN */ 13812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1383faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 ); 138463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 138563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CMP: 13882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 13892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 13902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 13912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 13921aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero ); 1393faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2); 13941aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 139563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SCS: 13982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 13992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1400faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 ); 140163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 14032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1404faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 ); 140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1407faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = bld->base.zero; 140863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 14092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1410faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXB: 1415faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, TRUE, FALSE, dst0 ); 141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM: 141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* fall-through */ 142063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM4: 142163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* 3 or 4-component normalization */ 142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4; 142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 14252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) || 14262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) || 14272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) || 14282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) { 142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */ 143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm4 = src.x */ 143363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = src.x * src.x */ 14342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 14352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 143690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp4 = tmp0; 143763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 143890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp0); 143963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm5 = src.y */ 144163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.y * src.y */ 14422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Y); 14432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 144490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp1; 144563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 144690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 144790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm6 = src.z */ 145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.z * src.z */ 14512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Z); 14522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 145390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp6 = tmp1; 145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 145590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 145690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 145763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (dims == 4) { 145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm7 = src.w */ 146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.w * src.w */ 14612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_W); 14622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) { 146390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp7 = tmp1; 146463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 146590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 146690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 146763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 146863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm1 = 1 / sqrt(xmm0) */ 147090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_rsqrt( &bld->base, tmp0); 147163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 147263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.x = xmm1 * src.x */ 14732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 1474faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1); 147563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 147663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 147763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.y = xmm1 * src.y */ 14782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 1479faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1); 148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 148163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.z = xmm1 * src.z */ 14832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 1484faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1); 148563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 148663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = xmm1 * src.w */ 14882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) { 1489faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1); 149063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 149163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 149263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1493faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca /* dst.w = 1.0 */ 14942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) { 1495faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 150063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DIV: 1501873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1502873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert( 0 ); 1503fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 150563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 150663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2: 15072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 15082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 150990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 15102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 15112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 151290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 151390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 15142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1515faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 151663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 151763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 151863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 151963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXL: 1520faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, TRUE, FALSE, dst0 ); 152163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 152263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 152363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXP: 1524faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, FALSE, TRUE, dst0 ); 152563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 152618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 152763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRK: 152818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_break(&bld->exec_mask); 152963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 153063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 153163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_IF: 153280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 1533ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin tmp0 = lp_build_cmp(&bld->base, PIPE_FUNC_NOTEQUAL, 1534ac33e7752d22f03db84e6a4c822b3a3f41d05f77Zack Rusin tmp0, bld->base.zero); 153580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_push(&bld->exec_mask, tmp0); 153663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 153763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1538f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_OPCODE_BGNFOR: 1539873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1540873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1541fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 154263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 154363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin case TGSI_OPCODE_BGNLOOP: 154518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_bgnloop(&bld->exec_mask); 154618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin break; 154718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 154863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_REP: 1549873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1550873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1551fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 155263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 155363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 155463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ELSE: 155580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_invert(&bld->exec_mask); 155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 155763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 155863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDIF: 155980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_pop(&bld->exec_mask); 156063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 156163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1562f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_OPCODE_ENDFOR: 1563873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1564873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1565fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 156663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 156763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 156818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin case TGSI_OPCODE_ENDLOOP: 156918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_endloop(&bld->exec_mask); 157018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin break; 157118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin 157263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDREP: 1573873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1574873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1575fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 157663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 157763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 157863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PUSHA: 1579873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1580873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1581fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 158263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 158363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 158463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POPA: 1585873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1586873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1587fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 158863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 158963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 159063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CEIL: 1591873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1592873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1593faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_ceil(&bld->base, tmp0); 1594873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 159563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 159663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 159763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_I2F: 1598873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1599873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1600fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 160163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 160263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 160363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NOT: 1604873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1605873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1606fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 160763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 160863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 160963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TRUNC: 16102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 16112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1612faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_trunc(&bld->base, tmp0); 161363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 161463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 161563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 161663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SHL: 1617873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1618873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1619fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 162063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 162163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 16222c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol case TGSI_OPCODE_ISHR: 1623873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1624873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1625fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 162663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 162763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 162863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_AND: 1629873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1630873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1631fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 163263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 163363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 163463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_OR: 1635873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1636873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1637fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 163863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 163963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 164063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOD: 1641873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1642873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1643fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 164463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 164563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 164663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XOR: 1647873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1648873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1649fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 165063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 165163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 165263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SAD: 1653873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1654873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1655fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 165663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 165763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 165863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXF: 1659873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1660873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1661fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 166263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 166363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 166463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXQ: 1665873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1666873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 1667fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 166863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 166963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 167063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CONT: 167118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin lp_exec_continue(&bld->exec_mask); 167263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 167363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 167463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EMIT: 1675fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 167663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 167763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 167863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDPRIM: 1679fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 168063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 168163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1682873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca case TGSI_OPCODE_NOP: 1683873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca break; 1684873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca 168563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 1686fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return FALSE; 168763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 168863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1689faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 1690faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1691faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_store( bld, inst, 0, chan_index, dst0[chan_index]); 1692faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1693faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1694faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 1695fc9b8cd9dda946d8415732aeeed1eff5541cd1eeBrian Paul return TRUE; 169663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 169763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1698c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca 1699c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid 170063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder, 170163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_token *tokens, 1702b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 17033d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask, 170463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr, 1705f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos, 1706f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS], 1707f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS], 17088be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca struct lp_build_sampler_soa *sampler) 170963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 171063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context bld; 171163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct tgsi_parse_context parse; 171263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint num_immediates = 0; 171363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 171463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 171563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* Setup build context */ 171663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca memset(&bld, 0, sizeof bld); 171763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lp_build_context_init(&bld.base, builder, type); 1718c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca bld.mask = mask; 1719f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.pos = pos; 1720f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.inputs = inputs; 172163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.outputs = outputs; 172263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.consts_ptr = consts_ptr; 17238be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld.sampler = sampler; 172463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 172580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_init(&bld.exec_mask, &bld.base); 172680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 172763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_init( &parse, tokens ); 172863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 172963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca while( !tgsi_parse_end_of_tokens( &parse ) ) { 173063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_token( &parse ); 173163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 173263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( parse.FullToken.Token.Type ) { 173363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_DECLARATION: 17341fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* Inputs already interpolated */ 173585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin { 173685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin if (!emit_declaration( &bld, &parse.FullToken.FullDeclaration )) 173785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin _debug_printf("warning: failed to define LLVM variable\n"); 173885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 173963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 174063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 174163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_INSTRUCTION: 1742faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca { 17432c90652ed9e119f09af6757c59d10273894ba590José Fonseca unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode; 17442c90652ed9e119f09af6757c59d10273894ba590José Fonseca const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode); 1745faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, info )) 1746faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n", 1747faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca info ? info->mnemonic : "<invalid>"); 1748faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1749faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 175063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 175163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 175263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_IMMEDIATE: 175363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* simply copy the immediate values into the next immediates[] slot */ 175463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 175563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1; 175663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(size <= 4); 175763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(num_immediates < LP_MAX_IMMEDIATES); 175863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = 0; i < size; ++i ) 175963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = 1760185be3a87a5b38e8821a560c073975c11dcbd3e9Brian Paul lp_build_const_vec(type, parse.FullToken.FullImmediate.u[i].Float); 176163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = size; i < 4; ++i ) 176263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = bld.base.undef; 176363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca num_immediates++; 176463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 176563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 176663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 17679381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca case TGSI_TOKEN_TYPE_PROPERTY: 17689381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca break; 17699381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca 177063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 177163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 177263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 177363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 177418d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin if (0) { 177518d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMBasicBlockRef block = LLVMGetInsertBlock(builder); 177618d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMValueRef function = LLVMGetBasicBlockParent(block); 177718d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin debug_printf("11111111111111111111111111111 \n"); 177818d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin tgsi_dump(tokens, 0); 177918d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin LLVMDumpValue(function); 178018d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin debug_printf("2222222222222222222222222222 \n"); 178118d406e8a8a838c82ee4ec5dbf244ab8bba0855eZack Rusin } 178263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_free( &parse ); 178363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 178463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1785