lp_bld_tgsi_soa.c revision ccf57af93f7118a044fa21e874847fa3ed555bca
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" 447821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "tgsi/tgsi_info.h" 4563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_parse.h" 4663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_util.h" 4763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "tgsi/tgsi_exec.h" 4863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_type.h" 4963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_const.h" 5063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_arit.h" 517821664b15501b173b2304bbada758c33c5ff972José Fonseca#include "lp_bld_logic.h" 5263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_swizzle.h" 533d7a88674f9eb3320eeff511968f041426e25023José Fonseca#include "lp_bld_flow.h" 5463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#include "lp_bld_tgsi.h" 5580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#include "lp_bld_debug.h" 5663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 5763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 5863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_TEMPS 256 5963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define LP_MAX_IMMEDIATES 256 6063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_CHANNEL( CHAN )\ 6363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (CHAN = 0; CHAN < NUM_CHANNELS; CHAN++) 6463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 665b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell ((INST)->Dst[0].Register.WriteMask & (1 << (CHAN))) 6763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 6863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN )\ 6963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( INST, CHAN )) 7063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define FOR_EACH_DST0_ENABLED_CHANNEL( INST, CHAN )\ 7263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( CHAN )\ 7363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( INST, CHAN ) 7463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 7563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_X 0 7663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Y 1 7763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_Z 2 7863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#define CHAN_W 3 7963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 8086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_LEFT 0 8186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_TOP_RIGHT 1 8286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_LEFT 2 8386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca#define QUAD_BOTTOM_RIGHT 3 8486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 8580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin#define LP_TGSI_MAX_NESTING 16 8680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 8780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstruct lp_exec_mask { 8880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_build_context *bld; 8980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin boolean has_mask; 9180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMTypeRef int_vec_type; 9380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef cond_stack[LP_TGSI_MAX_NESTING]; 9580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin int cond_stack_size; 9680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef cond_mask; 9780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 9880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef exec_mask; 9980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin}; 10063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 10163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastruct lp_build_tgsi_soa_context 10263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 10363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_context base; 10463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 10563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr; 106f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos; 107f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS]; 10895f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS]; 109c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca 1108be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca struct lp_build_sampler_soa *sampler; 11163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11295f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef immediates[LP_MAX_IMMEDIATES][NUM_CHANNELS]; 11395f38dd67c7dfeb3172ef9723c6f8e4c33de0754José Fonseca LLVMValueRef temps[LP_MAX_TEMPS][NUM_CHANNELS]; 1141929057eac0c3351e0810612bdae56331a235736José Fonseca 1153d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask; 11680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin struct lp_exec_mask exec_mask; 11763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca}; 11863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 11986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 12086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_left[4] = { 12186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_LEFT, 12286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_LEFT 12386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 12486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 12586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 12686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_right[4] = { 12786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_RIGHT, QUAD_TOP_RIGHT, 12886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_RIGHT, QUAD_BOTTOM_RIGHT 12986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 13086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 13186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 13286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_top[4] = { 13386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT, 13486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_TOP_LEFT, QUAD_TOP_RIGHT 13586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 13686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 13786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic const unsigned char 13886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaswizzle_bottom[4] = { 13986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT, 14086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca QUAD_BOTTOM_LEFT, QUAD_BOTTOM_RIGHT 14186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca}; 14286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 14380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_init(struct lp_exec_mask *mask, struct lp_build_context *bld) 14480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 14580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->bld = bld; 14680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->has_mask = FALSE; 14780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack_size = 0; 14880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 14980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->int_vec_type = lp_build_int_vec_type(mask->bld->type); 15080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 15180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 15280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_update(struct lp_exec_mask *mask) 15380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 15480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->exec_mask = mask->cond_mask; 15580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin if (mask->cond_stack_size > 0) 15680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->has_mask = TRUE; 15780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 15880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 15980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_push(struct lp_exec_mask *mask, 16080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val) 16180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 16280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_stack[mask->cond_stack_size++] = mask->cond_mask; 16380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = LLVMBuildBitCast(mask->bld->builder, val, 16480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->int_vec_type, ""); 16580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 16680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 16780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 16880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 16980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_invert(struct lp_exec_mask *mask) 17080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 17180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef prev_mask = mask->cond_stack[mask->cond_stack_size - 1]; 172faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin LLVMValueRef inv_mask = LLVMBuildNot(mask->bld->builder, 173faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin mask->cond_mask, ""); 174faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 175faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin /* means that we didn't have any mask before and that 176faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin * we were fully enabled */ 177faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin if (mask->cond_stack_size <= 1) { 178faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin prev_mask = LLVMConstAllOnes(mask->int_vec_type); 179faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin } 180faf8215bae70f020420242dc812ef141fdcf5417Zack Rusin 18180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = LLVMBuildAnd(mask->bld->builder, 18280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin inv_mask, 18380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin prev_mask, ""); 18480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 18580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 18680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 18780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_cond_pop(struct lp_exec_mask *mask) 18880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 18980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->cond_mask = mask->cond_stack[--mask->cond_stack_size]; 19080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_update(mask); 19180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 19280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 19380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusinstatic void lp_exec_mask_store(struct lp_exec_mask *mask, 19480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef val, 19580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef dst) 19680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin{ 19780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin if (mask->has_mask) { 19880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMValueRef real_val, dst_val; 19980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 20080f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin dst_val = LLVMBuildLoad(mask->bld->builder, dst, ""); 20180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin real_val = lp_build_select(mask->bld, 20280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin mask->exec_mask, 20380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin val, dst_val); 20480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 20580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, real_val, dst); 20680f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin } else 20780f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin LLVMBuildStore(mask->bld->builder, val, dst); 20880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin} 20980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 21086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 21186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 21286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddx(struct lp_build_tgsi_soa_context *bld, 21386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 21486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 21586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_left = lp_build_swizzle1_aos(&bld->base, src, swizzle_left); 21686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_right = lp_build_swizzle1_aos(&bld->base, src, swizzle_right); 21786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_right, src_left); 21886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 21986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 22086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 22186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic LLVMValueRef 22286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_ddy(struct lp_build_tgsi_soa_context *bld, 22386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src) 22486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 22586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_top = lp_build_swizzle1_aos(&bld->base, src, swizzle_top); 22686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src_bottom = lp_build_swizzle1_aos(&bld->base, src, swizzle_bottom); 22786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca return lp_build_sub(&bld->base, src_top, src_bottom); 22886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 22986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 23086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 23163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 23263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register fetch. 23363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 23463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic LLVMValueRef 23563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_fetch( 23663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 2372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst, 2382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 23963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const unsigned chan_index ) 24063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 2417d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[index]; 242b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell unsigned swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 24363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef res; 24463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 24563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (swizzle) { 246b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_X: 247b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Y: 248b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_Z: 249b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell case TGSI_SWIZZLE_W: 25063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 25191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell switch (reg->Register.File) { 25263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_CONSTANT: { 25391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell LLVMValueRef index = LLVMConstInt(LLVMInt32Type(), reg->Register.Index*4 + swizzle, 0); 25463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef scalar_ptr = LLVMBuildGEP(bld->base.builder, bld->consts_ptr, &index, 1, ""); 25563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef scalar = LLVMBuildLoad(bld->base.builder, scalar_ptr, ""); 25663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_broadcast_scalar(&bld->base, scalar); 25763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 25863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 25963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 26063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_IMMEDIATE: 26191a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->immediates[reg->Register.Index][swizzle]; 26263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 26363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 26463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 26563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_INPUT: 26691a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell res = bld->inputs[reg->Register.Index][swizzle]; 26763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(res); 26863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 26963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 27063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_TEMPORARY: 27185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin res = LLVMBuildLoad(bld->base.builder, bld->temps[reg->Register.Index][swizzle], ""); 27263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(!res) 27363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return bld->base.undef; 27463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 27563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 27663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 27763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 2784d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 27963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 28063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 28163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 28263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 28363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 2844d7a8194c5763f70ba559f32f58dfda36237b666José Fonseca return bld->base.undef; 28563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 28663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 28763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( tgsi_util_get_full_src_register_sign_mode( reg, chan_index ) ) { 28863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_CLEAR: 28963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 29063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 29163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 29263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_SET: 2931fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* TODO: Use bitwese OR for floating point */ 29463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = lp_build_abs( &bld->base, res ); 29563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 29663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 29763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 29863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_TOGGLE: 29963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca res = LLVMBuildNeg( bld->base.builder, res, "" ); 30063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 30163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 30263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_UTIL_SIGN_KEEP: 30363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 30463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 30563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 30663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return res; 30763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 30863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 30963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 31063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 31186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca * Register fetch with derivatives. 31286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca */ 31386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecastatic void 31486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonsecaemit_fetch_deriv( 31586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca struct lp_build_tgsi_soa_context *bld, 31686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const struct tgsi_full_instruction *inst, 31786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca unsigned index, 31886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca const unsigned chan_index, 31986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *res, 32086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddx, 32186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef *ddy) 32286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca{ 32386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca LLVMValueRef src; 32486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 32586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca src = emit_fetch(bld, inst, index, chan_index); 32686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 32786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(res) 32886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *res = src; 32986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 33086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca /* TODO: use interpolation coeffs for inputs */ 33186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 33286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddx) 33386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddx = emit_ddx(bld, src); 33486226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 33586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca if(ddy) 33686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca *ddy = emit_ddy(bld, src); 33786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca} 33886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 33986226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 34086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca/** 34163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Register store. 34263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 34363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 34463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_store( 34563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 34663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 3472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca unsigned index, 34863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index, 34963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef value) 35063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 3517d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[index]; 3522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca 35363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( inst->Instruction.Saturate ) { 35463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_NONE: 35563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 35663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 35763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_ZERO_ONE: 3587926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_max(&bld->base, value, bld->base.zero); 3597926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 36063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 36163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 36263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_SAT_MINUS_PLUS_ONE: 36377b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca value = lp_build_max(&bld->base, value, lp_build_const_scalar(bld->base.type, -1.0)); 3647926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca value = lp_build_min(&bld->base, value, bld->base.one); 36563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 3667926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca 3677926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca default: 3687926b42d41058e5d2b99ba0e8810f93bc7c12d36José Fonseca assert(0); 36963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 37063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 3715b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell switch( reg->Register.File ) { 37263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_OUTPUT: 37380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_store(&bld->exec_mask, value, 37480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin bld->outputs[reg->Register.Index][chan_index]); 37563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 37663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 37763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_TEMPORARY: 37880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_store(&bld->exec_mask, value, 37980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin bld->temps[reg->Register.Index][chan_index]); 38063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 38163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 38263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_FILE_ADDRESS: 38363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* FIXME */ 38463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 38563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 38663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 387ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca case TGSI_FILE_PREDICATE: 388ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca /* FIXME */ 389ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca assert(0); 390ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca break; 391ccf57af93f7118a044fa21e874847fa3ed555bcaJosé Fonseca 39263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 39363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 39463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 39563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 39663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 39763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 39863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 39963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators. 40063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 40163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 40286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 40363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 40463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld, 40563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 40663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca boolean apply_lodbias, 407faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca boolean projected, 408faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef *texel) 40963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 41091a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell const uint unit = inst->Src[1].Register.Index; 41163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef lodbias; 41231d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee LLVMValueRef oow = NULL; 413c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca LLVMValueRef coords[3]; 414c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca unsigned num_coords; 41563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 41663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4177d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell switch (inst->Texture.Texture) { 41863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_1D: 419c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 1; 42063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 42163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_2D: 42263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_RECT: 423c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 2; 42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 425f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW1D: 426f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW2D: 427f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOWRECT: 42863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_3D: 42963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_CUBE: 430c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 3; 43163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 43263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 43363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return; 43563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 43663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 43763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(apply_lodbias) 4382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca lodbias = emit_fetch( bld, inst, 0, 3 ); 43963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca else 44063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lodbias = bld->base.zero; 44163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 44263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (projected) { 4432fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca oow = emit_fetch( bld, inst, 0, 3 ); 44463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca oow = lp_build_rcp(&bld->base, oow); 44563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 447c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca for (i = 0; i < num_coords; i++) { 448c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = emit_fetch( bld, inst, 0, i ); 44963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (projected) 450c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = lp_build_mul(&bld->base, coords[i], oow); 45163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 452ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca for (i = num_coords; i < 3; i++) { 453ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca coords[i] = bld->base.undef; 454ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca } 45563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4568be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->sampler->emit_fetch_texel(bld->sampler, 4578be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.builder, 4588be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.type, 4598be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca unit, num_coords, coords, lodbias, 4608be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca texel); 46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 46263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 46463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 46563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil( 46663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 4672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst ) 46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 4697d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[0]; 4707821664b15501b173b2304bbada758c33c5ff972José Fonseca LLVMValueRef terms[NUM_CHANNELS]; 4713d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef mask; 47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 47363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4747821664b15501b173b2304bbada758c33c5ff972José Fonseca memset(&terms, 0, sizeof terms); 47563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 47663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( chan_index ) { 47763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned swizzle; 47863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4797821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Unswizzle channel */ 480b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 48163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4827821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Check if the component has not been already tested. */ 4837821664b15501b173b2304bbada758c33c5ff972José Fonseca assert(swizzle < NUM_CHANNELS); 4847821664b15501b173b2304bbada758c33c5ff972José Fonseca if( !terms[swizzle] ) 4857821664b15501b173b2304bbada758c33c5ff972José Fonseca /* TODO: change the comparison operator instead of setting the sign */ 4862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca terms[swizzle] = emit_fetch(bld, inst, 0, chan_index ); 48763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 48863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4893d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = NULL; 4907821664b15501b173b2304bbada758c33c5ff972José Fonseca FOR_EACH_CHANNEL( chan_index ) { 491aede39efd86d200ffbace8fc012104e31f673973José Fonseca if(terms[chan_index]) { 4923d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef chan_mask; 493aede39efd86d200ffbace8fc012104e31f673973José Fonseca 4943d7a88674f9eb3320eeff511968f041426e25023José Fonseca chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero); 495aede39efd86d200ffbace8fc012104e31f673973José Fonseca 4963d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 4973d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, ""); 4983d7a88674f9eb3320eeff511968f041426e25023José Fonseca else 4993d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = chan_mask; 500aede39efd86d200ffbace8fc012104e31f673973José Fonseca } 50163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 5023d7a88674f9eb3320eeff511968f041426e25023José Fonseca 5033d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 5043d7a88674f9eb3320eeff511968f041426e25023José Fonseca lp_build_mask_update(bld->mask, mask); 50563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 50663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 50763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 50863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 50963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Check if inst src/dest regs use indirect addressing into temporary 51063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * register file. 51163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 51263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic boolean 51363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaindirect_temp_reference(const struct tgsi_full_instruction *inst) 51463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint i; 51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 5177d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[i]; 51891a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (reg->Register.File == TGSI_FILE_TEMPORARY && 51991a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell reg->Register.Indirect) 52063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return TRUE; 52163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 52263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (i = 0; i < inst->Instruction.NumDstRegs; i++) { 5237d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[i]; 5245b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell if (reg->Register.File == TGSI_FILE_TEMPORARY && 5255b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell reg->Register.Indirect) 52663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return TRUE; 52763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 52863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return FALSE; 52963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 53063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 53185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinstatic int 53285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration( 53385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin struct lp_build_tgsi_soa_context *bld, 53485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin const struct tgsi_full_declaration *decl) 53585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{ 53685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned first = decl->Range.First; 53785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned last = decl->Range.Last; 53885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned idx, i; 53985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 54085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (idx = first; idx <= last; ++idx) { 54185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin boolean ok; 54285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 54385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin switch (decl->Declaration.File) { 54485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_TEMPORARY: 54585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 54685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin bld->temps[idx][i] = lp_build_alloca(&bld->base); 54785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin ok = TRUE; 54885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 54985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 55085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_OUTPUT: 55185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 55285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin bld->outputs[idx][i] = lp_build_alloca(&bld->base); 55385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin ok = TRUE; 55485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 55585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 55685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin default: 55785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin /* don't need to declare other vars */ 55885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin ok = TRUE; 55985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 56085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 56185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin if (!ok) 56285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin return FALSE; 56385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 56485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 56585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin return TRUE; 56685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin} 56763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 56863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic int 56963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction( 57063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 571faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_full_instruction *inst, 572faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_opcode_info *info) 57363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 57463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 57590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca LLVMValueRef src0, src1, src2; 576e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp0, tmp1, tmp2; 577e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp3 = NULL; 578e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp4 = NULL; 579e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp5 = NULL; 580e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp6 = NULL; 581e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp7 = NULL; 582faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef res; 583faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef dst0[NUM_CHANNELS]; 58463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 58563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* we can't handle indirect addressing into temp register file yet */ 58663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (indirect_temp_reference(inst)) 58763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return FALSE; 58863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 589faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca assert(info->num_dst <= 1); 590faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 591faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 592faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.undef; 593faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 594faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 595faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 59663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (inst->Instruction.Opcode) { 59763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0 59863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARL: 5991fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* FIXME */ 6002fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 6012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 60263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_flr(bld, 0, 0); 60363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_f2it( bld, 0 ); 604faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 60563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 60663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 60763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif 60863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 60963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOV: 6102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 611faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index ); 61263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 61363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 61463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 61563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LIT: 6162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) { 617faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 61863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 6192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 6202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 621faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero); 622ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca } 6232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 624ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = SrcReg[0].yyyy */ 6252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 626ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = max(XMM[1], 0) */ 627ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero); 628ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[2] = SrcReg[0].wwww */ 6292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 0, CHAN_W ); 630ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_pow( &bld->base, tmp1, tmp2); 6312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 632c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero); 633faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero); 634c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca } 6352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) { 636faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 63763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 63863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 63963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 64063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCP: 64163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIP */ 6422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 643faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rcp(&bld->base, src0); 6442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 645faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 64663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 64763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 64863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 64963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RSQ: 65063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIPSQRT */ 6512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 65290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca src0 = lp_build_abs(&bld->base, src0); 653faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rsqrt(&bld->base, src0); 6542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 655faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 65663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 65763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 65863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 65963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EXP: 6602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 6612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 6622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 66357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2_int_part = NULL; 66457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_frac_part = NULL; 66557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2 = NULL; 66657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 6672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 66857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 6692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 67057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2_int_part = &tmp0; 6712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 67257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_frac_part = &tmp1; 6732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 67457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2 = &tmp2; 67557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 67657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2); 67757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 6782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 679faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 6802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 681faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp1; 6822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 683faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 68463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 68563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 6862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 687faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 68863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 68963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 69063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 69163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LOG: 6922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 6932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 6942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 695add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_floor_log2 = NULL; 696add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_exp = NULL; 697add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_log2 = NULL; 69857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 6992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 70057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca src0 = lp_build_abs( &bld->base, src0 ); 70157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 7022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 70357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_floor_log2 = &tmp0; 7042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 70557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp = &tmp1; 7062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 70757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_log2 = &tmp2; 70857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 70957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2); 71057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 71157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.x = floor(lg2(abs(src.x))) */ 7122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 713faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 71457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */ 7152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) { 716faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1); 71763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 71857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.z = lg2(abs(src.x)) */ 7192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 720faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 72163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 72263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 7232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 724faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 72563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 72663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 72763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 72863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MUL: 7292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 7312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 732faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_mul(&bld->base, src0, src1); 73363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 73463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 73563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 73663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ADD: 7372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 7392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 740faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add(&bld->base, src0, src1); 74163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 74263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 74363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 74463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP3: 74563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT3 */ 7462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 7472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 74890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 7492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 7502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 75190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 75290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 7532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 7542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 75590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 75690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 7572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 758faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 75963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 76063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 76163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 76263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP4: 76363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT4 */ 7642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 7652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 76690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 7672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 7682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 76990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 77090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 7712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 7722fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 77390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 77490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 7752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_W ); 7762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_W ); 77790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 77890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 7792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 780faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 78163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 78263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 78363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 78463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DST: 7852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 786faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 78763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 7882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 7892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 7902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Y ); 791faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1); 79263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 7932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 794faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z ); 79563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 7962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 797faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W ); 79863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 79963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 80063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 80163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MIN: 8022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 8042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 805faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_min( &bld->base, src0, src1 ); 80663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 80763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 80863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 80963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAX: 8102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 8122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 813faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_max( &bld->base, src0, src1 ); 81463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 81563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 81663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 81763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLT: 81863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETLT */ 8192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 8212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 8221aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 ); 823faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 8241aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 82563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 82663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 82763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGE: 82863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETGE */ 8292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 8312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 8321aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 ); 833faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 8341aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 83563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 83663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 83763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAD: 83863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_MADD */ 8392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 8412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 8422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 2, chan_index ); 84390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 84490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp2); 845faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 84663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 84763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 84863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 84963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SUB: 8502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 8522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 853faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1); 85463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 85563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 85663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 85763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LRP: 8582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 8602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 8612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 86290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sub( &bld->base, src1, src2 ); 86390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, src0, tmp0 ); 864faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 ); 86563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 86663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 86763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 86863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CND: 869873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 870873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 871873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 872873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 873873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp1 = lp_build_const_scalar(bld->base.type, 0.5); 874873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1); 875faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 ); 876873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 87763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 87863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 87963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2A: 8802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 8812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 88290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 8832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 88590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 88690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 8872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 2, CHAN_X ); /* xmm1 = src[2].x */ 88890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 8892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 890faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 89163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 89263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 89363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 89463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FRC: 8952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 896873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 897873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_floor(&bld->base, src0); 898f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul tmp0 = lp_build_sub(&bld->base, src0, tmp0); 899faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 90063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 90163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 90263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 90363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CLAMP: 904873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 905873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 906873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 907873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 908873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_max(&bld->base, tmp0, src1); 909873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_min(&bld->base, tmp0, src2); 910faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 911873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 91263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 91363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 91463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FLR: 9152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 917faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_floor(&bld->base, tmp0); 91863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 91963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 92063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 92163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ROUND: 9222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 924faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_round(&bld->base, tmp0); 92563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 92663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 92763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 92890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca case TGSI_OPCODE_EX2: { 9292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 93090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_exp2( &bld->base, tmp0); 9312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 932faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 93363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 93463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 93590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca } 93663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 93763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LG2: 9382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 93990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_log2( &bld->base, tmp0); 9402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 941faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 94263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 94363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 94463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 94563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POW: 9462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 9472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, CHAN_X ); 948faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_pow( &bld->base, src0, src1 ); 9492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 950faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 95163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 95263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 95363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 95463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XPD: 9552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 9562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 9572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Z ); 9582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp3 = emit_fetch( bld, inst, 0, CHAN_Z ); 95963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 9612fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 9622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 9632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp4 = emit_fetch( bld, inst, 1, CHAN_Y ); 96463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 96690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = tmp0; 96790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_mul( &bld->base, tmp2, tmp1); 96890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp3; 96990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 97090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_sub( &bld->base, tmp2, tmp5); 971faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp2; 97263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 9742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 9752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_X ); 9762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp5 = emit_fetch( bld, inst, 0, CHAN_X ); 97763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 97990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_mul( &bld->base, tmp3, tmp2); 98090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp5); 98190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_sub( &bld->base, tmp3, tmp1); 982faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp3; 98363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 98590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 98690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp2); 98790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_sub( &bld->base, tmp5, tmp0); 988faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp5; 98963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 991faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 99263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 99363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 99463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 99563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ABS: 9962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 998faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_abs( &bld->base, tmp0 ); 99963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 100063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 100163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 100263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCC: 1003873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1004873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 100563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 100663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 100763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DPH: 10082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 10092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 101090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 10112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 10122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 101390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 101490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 10162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 101790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 101890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_W ); 102090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1022faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 102363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 102463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 102563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 102663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_COS: 10272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 102890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_cos( &bld->base, tmp0 ); 10292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1030faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 103163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 103263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 103363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 103463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDX: 103586226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 103686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL); 103786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 103863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 104063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDY: 104186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 104286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]); 104386226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 104463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 104563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 104663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KILP: 104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* predicated kill */ 10481fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* FIXME */ 10491fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca return 0; 105063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 105163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 105263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KIL: 105363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* conditional kill */ 10542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca emit_kil( bld, inst ); 105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 105763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2H: 105863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 105963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2US: 106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4B: 106663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 106763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4UB: 107063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 107363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RFL: 107463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 107563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 107663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 107763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SEQ: 10782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10811aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 ); 1082faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 10831aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 108463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 108563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 108663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SFL: 1087873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1088faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.zero; 1089873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 109063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 109163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 109263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGT: 10932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10961aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 ); 1097faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 10981aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 109963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 110063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 110163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SIN: 11022fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 110390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sin( &bld->base, tmp0 ); 11042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1105faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 110663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 110763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 110863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 110963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLE: 11102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 11131aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 ); 1114faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 11151aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 111663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 111763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 111863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SNE: 11192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 11221aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 ); 1123faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 11241aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 112563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 112663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 112763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_STR: 1128873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1129faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.one; 1130873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 113163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TEX: 113471c05689528d7987bfb99c3afe04e456887bc7b7Brian Paul /* XXX what about dst0 writemask? */ 1135faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, FALSE, FALSE, dst0 ); 113663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 113763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXD: 1139873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 114063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 114163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 114263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2H: 1144873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1145873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert (0); 114663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 114763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 114863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 114963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2US: 1150873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1151873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 115263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 115363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4B: 1156873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1157873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 115863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 115963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 116063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 116163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4UB: 1162873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1163873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 116663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_X2D: 1168873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1169873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 117163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 117263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARA: 1174873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1175873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 117663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 117763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 117863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0 118063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARR: 1181873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 11822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 118463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_rnd( bld, 0, 0 ); 118563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_f2it( bld, 0 ); 1186faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 118763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 118990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif 119063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRA: 1192873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1193873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 119463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 119563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 119663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 119763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CAL: 1198873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 120063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 120163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 120263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RET: 1203873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1204873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca return 0; 120563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 120663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 120763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_END: 120863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SSG: 121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SGN */ 12122fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1214faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 ); 121563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 121663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 121763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 121863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CMP: 12192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12212fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 12222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 12231aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero ); 1224faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2); 12251aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 122663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 122763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 122863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SCS: 12292fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 12302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1231faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 ); 123263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 12342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1235faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 ); 123663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1238faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = bld->base.zero; 123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12402fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1241faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 124363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 124463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 124563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXB: 1246faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, TRUE, FALSE, dst0 ); 124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM: 125063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* fall-through */ 125163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM4: 125263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* 3 or 4-component normalization */ 125363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4; 125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 12562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) || 12572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) || 12582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) || 12592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) { 126063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 126163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */ 126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 126363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm4 = src.x */ 126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = src.x * src.x */ 12652fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 12662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 126790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp4 = tmp0; 126863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 126990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp0); 127063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 127163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm5 = src.y */ 127263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.y * src.y */ 12732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Y); 12742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 127590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp1; 127663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 127790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 127890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm6 = src.z */ 128163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.z * src.z */ 12822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Z); 12832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 128490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp6 = tmp1; 128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 128690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 128790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 128863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (dims == 4) { 129063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm7 = src.w */ 129163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.w * src.w */ 12922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_W); 12932fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) { 129490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp7 = tmp1; 129563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 129690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 129790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 129863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 129963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm1 = 1 / sqrt(xmm0) */ 130190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_rsqrt( &bld->base, tmp0); 130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.x = xmm1 * src.x */ 13042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 1305faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1); 130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.y = xmm1 * src.y */ 13092fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 1310faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1); 131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.z = xmm1 * src.z */ 13142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 1315faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1); 131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = xmm1 * src.w */ 13192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) { 1320faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1); 132163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 132263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1324faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca /* dst.w = 1.0 */ 13252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) { 1326faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 132763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 132863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DIV: 1332873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1333873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert( 0 ); 133463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 133563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 133663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 133763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2: 13382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 13392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 134090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 13412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 13422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 134390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 134490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 13452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1346faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 134763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 134863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 134963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 135063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXL: 1351faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, TRUE, FALSE, dst0 ); 135263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 135363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXP: 1355faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, FALSE, TRUE, dst0 ); 135663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 135863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRK: 1359873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_IF: 136480f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 136580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_push(&bld->exec_mask, tmp0); 136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1368f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_OPCODE_BGNFOR: 1369873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1370873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_REP: 1375873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1376873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 137763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ELSE: 138180f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_invert(&bld->exec_mask); 138263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 138463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDIF: 138580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_pop(&bld->exec_mask); 138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1388f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_OPCODE_ENDFOR: 1389873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1390873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 139163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 139263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 139463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDREP: 1395873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1396873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 139863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 140063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PUSHA: 1401873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1402873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 140363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 140463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 140663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POPA: 1407873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1408873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 140963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 141063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CEIL: 1413873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1414873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1415faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_ceil(&bld->base, tmp0); 1416873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_I2F: 1420873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1421873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NOT: 1426873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1427873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 142863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TRUNC: 14322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1434faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_trunc(&bld->base, tmp0); 143563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SHL: 1439873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1440873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 144163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 144263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 14442c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol case TGSI_OPCODE_ISHR: 1445873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1446873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 144763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_AND: 1451873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1452873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 145363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 145563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_OR: 1457873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1458873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOD: 1463873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1464873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 146563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 146763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XOR: 1469873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1470873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 147163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 147263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 147363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 147463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SAD: 1475873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1476873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 147763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 147863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 147963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXF: 1481873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1482873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 148363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 148463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 148563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXQ: 1487873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1488873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 148963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 149063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CONT: 1493128d93a009c493c65f0fa5d220fac3098a54fa14José Fonseca /* FIXME */ 149463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 149563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EMIT: 149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 149963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 150063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 150163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDPRIM: 150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 150363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1505873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca case TGSI_OPCODE_NOP: 1506873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca break; 1507873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca 150863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 150963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 151063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 151163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1512faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 1513faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1514faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_store( bld, inst, 0, chan_index, dst0[chan_index]); 1515faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1516faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1517faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 151863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 1; 151963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 152063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1521c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca 1522c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid 152363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder, 152463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_token *tokens, 1525b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 15263d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask, 152763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr, 1528f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos, 1529f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS], 1530f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS], 15318be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca struct lp_build_sampler_soa *sampler) 153263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 153363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context bld; 153463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct tgsi_parse_context parse; 153563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint num_immediates = 0; 153663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 153763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 153863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* Setup build context */ 153963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca memset(&bld, 0, sizeof bld); 154063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lp_build_context_init(&bld.base, builder, type); 1541c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca bld.mask = mask; 1542f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.pos = pos; 1543f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.inputs = inputs; 154463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.outputs = outputs; 154563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.consts_ptr = consts_ptr; 15468be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld.sampler = sampler; 154763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_init(&bld.exec_mask, &bld.base); 154980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 155063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_init( &parse, tokens ); 155163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 155263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca while( !tgsi_parse_end_of_tokens( &parse ) ) { 155363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_token( &parse ); 155463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 155563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( parse.FullToken.Token.Type ) { 155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_DECLARATION: 15571fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* Inputs already interpolated */ 155885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin { 155985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin if (!emit_declaration( &bld, &parse.FullToken.FullDeclaration )) 156085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin _debug_printf("warning: failed to define LLVM variable\n"); 156185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 156263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 156363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 156463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_INSTRUCTION: 1565faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca { 15662c90652ed9e119f09af6757c59d10273894ba590José Fonseca unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode; 15672c90652ed9e119f09af6757c59d10273894ba590José Fonseca const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode); 1568faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, info )) 1569faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n", 1570faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca info ? info->mnemonic : "<invalid>"); 1571faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1572faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 157363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 157463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 157563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_IMMEDIATE: 157663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* simply copy the immediate values into the next immediates[] slot */ 157763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 157863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1; 157963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(size <= 4); 158063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(num_immediates < LP_MAX_IMMEDIATES); 158163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = 0; i < size; ++i ) 158263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = 158377b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca lp_build_const_scalar(type, parse.FullToken.FullImmediate.u[i].Float); 158463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = size; i < 4; ++i ) 158563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = bld.base.undef; 158663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca num_immediates++; 158763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 158863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 158963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 15909381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca case TGSI_TOKEN_TYPE_PROPERTY: 15919381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca break; 15929381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca 159363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 159463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 159563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 159663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 159763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 159863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_free( &parse ); 159963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 160063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1601