lp_bld_tgsi_soa.c revision faf8215bae70f020420242dc812ef141fdcf5417
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 38763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 38863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 38963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 39063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 39163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 39263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 39363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 39463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * High-level instruction translators. 39563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 39663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 39786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca 39863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 39963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_tex( struct lp_build_tgsi_soa_context *bld, 40063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_full_instruction *inst, 40163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca boolean apply_lodbias, 402faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca boolean projected, 403faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef *texel) 40463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 40591a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell const uint unit = inst->Src[1].Register.Index; 40663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef lodbias; 40731d1822473bf9d4105bb82b67572cfeea53aaf94Vinson Lee LLVMValueRef oow = NULL; 408c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca LLVMValueRef coords[3]; 409c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca unsigned num_coords; 41063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 41163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4127d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell switch (inst->Texture.Texture) { 41363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_1D: 414c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 1; 41563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 41663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_2D: 41763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_RECT: 418c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 2; 41963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 420f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW1D: 421f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOW2D: 422f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_TEXTURE_SHADOWRECT: 42363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_3D: 42463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TEXTURE_CUBE: 425c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca num_coords = 3; 42663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 42763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 42863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(0); 42963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return; 43063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 43163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 43263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if(apply_lodbias) 4332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca lodbias = emit_fetch( bld, inst, 0, 3 ); 43463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca else 43563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lodbias = bld->base.zero; 43663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 43763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (projected) { 4382fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca oow = emit_fetch( bld, inst, 0, 3 ); 43963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca oow = lp_build_rcp(&bld->base, oow); 44063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 44163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 442c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca for (i = 0; i < num_coords; i++) { 443c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = emit_fetch( bld, inst, 0, i ); 44463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (projected) 445c40eddd294abfe8af3619d08ccd7e9c8f1660fcbJosé Fonseca coords[i] = lp_build_mul(&bld->base, coords[i], oow); 44663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 447ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca for (i = num_coords; i < 3; i++) { 448ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca coords[i] = bld->base.undef; 449ba33ef00118d1c6017585af1498b89e99fe045beJosé Fonseca } 45063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4518be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->sampler->emit_fetch_texel(bld->sampler, 4528be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.builder, 4538be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld->base.type, 4548be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca unit, num_coords, coords, lodbias, 4558be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca texel); 45663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 45763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 45863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 45963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic void 46063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_kil( 46163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 4622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca const struct tgsi_full_instruction *inst ) 46363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 4647d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[0]; 4657821664b15501b173b2304bbada758c33c5ff972José Fonseca LLVMValueRef terms[NUM_CHANNELS]; 4663d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef mask; 46763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 46863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4697821664b15501b173b2304bbada758c33c5ff972José Fonseca memset(&terms, 0, sizeof terms); 47063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 47163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca FOR_EACH_CHANNEL( chan_index ) { 47263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned swizzle; 47363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4747821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Unswizzle channel */ 475b9cb74c7f826dfd320f5e5b54aa933898f7ddd3dKeith Whitwell swizzle = tgsi_util_get_full_src_register_swizzle( reg, chan_index ); 47663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4777821664b15501b173b2304bbada758c33c5ff972José Fonseca /* Check if the component has not been already tested. */ 4787821664b15501b173b2304bbada758c33c5ff972José Fonseca assert(swizzle < NUM_CHANNELS); 4797821664b15501b173b2304bbada758c33c5ff972José Fonseca if( !terms[swizzle] ) 4807821664b15501b173b2304bbada758c33c5ff972José Fonseca /* TODO: change the comparison operator instead of setting the sign */ 4812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca terms[swizzle] = emit_fetch(bld, inst, 0, chan_index ); 48263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 48363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 4843d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = NULL; 4857821664b15501b173b2304bbada758c33c5ff972José Fonseca FOR_EACH_CHANNEL( chan_index ) { 486aede39efd86d200ffbace8fc012104e31f673973José Fonseca if(terms[chan_index]) { 4873d7a88674f9eb3320eeff511968f041426e25023José Fonseca LLVMValueRef chan_mask; 488aede39efd86d200ffbace8fc012104e31f673973José Fonseca 4893d7a88674f9eb3320eeff511968f041426e25023José Fonseca chan_mask = lp_build_cmp(&bld->base, PIPE_FUNC_GEQUAL, terms[chan_index], bld->base.zero); 490aede39efd86d200ffbace8fc012104e31f673973José Fonseca 4913d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 4923d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = LLVMBuildAnd(bld->base.builder, mask, chan_mask, ""); 4933d7a88674f9eb3320eeff511968f041426e25023José Fonseca else 4943d7a88674f9eb3320eeff511968f041426e25023José Fonseca mask = chan_mask; 495aede39efd86d200ffbace8fc012104e31f673973José Fonseca } 49663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 4973d7a88674f9eb3320eeff511968f041426e25023José Fonseca 4983d7a88674f9eb3320eeff511968f041426e25023José Fonseca if(mask) 4993d7a88674f9eb3320eeff511968f041426e25023José Fonseca lp_build_mask_update(bld->mask, mask); 50063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 50163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 50263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 50363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca/** 50463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * Check if inst src/dest regs use indirect addressing into temporary 50563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca * register file. 50663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca */ 50763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic boolean 50863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaindirect_temp_reference(const struct tgsi_full_instruction *inst) 50963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 51063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint i; 51163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (i = 0; i < inst->Instruction.NumSrcRegs; i++) { 5127d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_src_register *reg = &inst->Src[i]; 51391a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell if (reg->Register.File == TGSI_FILE_TEMPORARY && 51491a4e6d53f83c45c1da9240b6325011d96b61386Keith Whitwell reg->Register.Indirect) 51563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return TRUE; 51663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 51763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for (i = 0; i < inst->Instruction.NumDstRegs; i++) { 5187d6c8f980d1e23ad6f557d650e89c715861a3b0cKeith Whitwell const struct tgsi_full_dst_register *reg = &inst->Dst[i]; 5195b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell if (reg->Register.File == TGSI_FILE_TEMPORARY && 5205b0824dfe5eaf59fa87134e7482b3d147b262901Keith Whitwell reg->Register.Indirect) 52163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return TRUE; 52263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 52363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return FALSE; 52463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 52563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 52685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinstatic int 52785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusinemit_declaration( 52885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin struct lp_build_tgsi_soa_context *bld, 52985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin const struct tgsi_full_declaration *decl) 53085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin{ 53185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned first = decl->Range.First; 53285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned last = decl->Range.Last; 53385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin unsigned idx, i; 53485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 53585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (idx = first; idx <= last; ++idx) { 53685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin boolean ok; 53785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 53885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin switch (decl->Declaration.File) { 53985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_TEMPORARY: 54085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 54185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin bld->temps[idx][i] = lp_build_alloca(&bld->base); 54285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin ok = TRUE; 54385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 54485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 54585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin case TGSI_FILE_OUTPUT: 54685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin for (i = 0; i < NUM_CHANNELS; i++) 54785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin bld->outputs[idx][i] = lp_build_alloca(&bld->base); 54885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin ok = TRUE; 54985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin break; 55085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 55185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin default: 55285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin /* don't need to declare other vars */ 55385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin ok = TRUE; 55485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 55585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 55685c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin if (!ok) 55785c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin return FALSE; 55885c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 55985c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin 56085c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin return TRUE; 56185c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin} 56263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 56363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecastatic int 56463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecaemit_instruction( 56563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context *bld, 566faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_full_instruction *inst, 567faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca const struct tgsi_opcode_info *info) 56863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 56963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned chan_index; 57090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca LLVMValueRef src0, src1, src2; 571e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp0, tmp1, tmp2; 572e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp3 = NULL; 573e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp4 = NULL; 574e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp5 = NULL; 575e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp6 = NULL; 576e049ddb7549a45adde521d6f2899c2b74b4ff972Vinson Lee LLVMValueRef tmp7 = NULL; 577faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef res; 578faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca LLVMValueRef dst0[NUM_CHANNELS]; 57963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 58063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* we can't handle indirect addressing into temp register file yet */ 58163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (indirect_temp_reference(inst)) 58263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return FALSE; 58363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 584faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca assert(info->num_dst <= 1); 585faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 586faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 587faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.undef; 588faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 589faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 590faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 59163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch (inst->Instruction.Opcode) { 59263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#if 0 59363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARL: 5941fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* FIXME */ 5952fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 5962fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 59763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_flr(bld, 0, 0); 59863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_f2it( bld, 0 ); 599faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 60063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 60163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 60263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca#endif 60363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 60463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOV: 6052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 606faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = emit_fetch( bld, inst, 0, chan_index ); 60763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 60863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 60963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 61063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LIT: 6112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) ) { 612faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 61363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 6142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 6152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 616faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_max( &bld->base, src0, bld->base.zero); 617ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca } 6182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 619ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = SrcReg[0].yyyy */ 6202fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 621ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[1] = max(XMM[1], 0) */ 622ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_max( &bld->base, tmp1, bld->base.zero); 623ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca /* XMM[2] = SrcReg[0].wwww */ 6242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 0, CHAN_W ); 625ef1fddb36a91a3b272a3c74d104033cd99556cfaJosé Fonseca tmp1 = lp_build_pow( &bld->base, tmp1, tmp2); 6262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 627c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca tmp2 = lp_build_cmp(&bld->base, PIPE_FUNC_GREATER, tmp0, bld->base.zero); 628faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_select(&bld->base, tmp2, tmp1, bld->base.zero); 629c5abcac7ef7ebd0167093285b5fc9cf3829c1febJosé Fonseca } 6302fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) ) { 631faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 63263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 63363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 63463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 63563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCP: 63663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIP */ 6372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 638faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rcp(&bld->base, src0); 6392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 640faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 64163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 64263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 64363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 64463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RSQ: 64563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_RECIPSQRT */ 6462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 64790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca src0 = lp_build_abs(&bld->base, src0); 648faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_rsqrt(&bld->base, src0); 6492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 650faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 65163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 65263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 65363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 65463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EXP: 6552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 6562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 6572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 65857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2_int_part = NULL; 65957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_frac_part = NULL; 66057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca LLVMValueRef *p_exp2 = NULL; 66157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 6622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 66357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 6642fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 66557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2_int_part = &tmp0; 6662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 66757907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_frac_part = &tmp1; 6682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 66957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp2 = &tmp2; 67057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 67157907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_exp2_approx(&bld->base, src0, p_exp2_int_part, p_frac_part, p_exp2); 67257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 6732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 674faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 6752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 676faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp1; 6772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 678faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 67963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 68063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 6812fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 682faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 68363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 68463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 68563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 68663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LOG: 6872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 6882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 6892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) { 690add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_floor_log2 = NULL; 691add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_exp = NULL; 692add6dfbba64260c9b314b4a95c8def084e05bd3bVinson Lee LLVMValueRef *p_log2 = NULL; 69357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 6942fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 69557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca src0 = lp_build_abs( &bld->base, src0 ); 69657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 6972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 69857907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_floor_log2 = &tmp0; 6992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) 70057907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_exp = &tmp1; 7012fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 70257907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca p_log2 = &tmp2; 70357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 70457907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca lp_build_log2_approx(&bld->base, src0, p_exp, p_floor_log2, p_log2); 70557907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca 70657907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.x = floor(lg2(abs(src.x))) */ 7072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_X )) 708faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp0; 70957907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.y = abs(src)/ex2(floor(lg2(abs(src.x)))) */ 7102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y )) { 711faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_div( &bld->base, src0, tmp1); 71263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 71357907e7fd9fc63b9023d0e2b08934c2d0acf2953José Fonseca /* dst.z = lg2(abs(src.x)) */ 7142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z )) 715faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp2; 71663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 71763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = 1.0 */ 7182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED( inst, CHAN_W )) { 719faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 72063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 72163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 72263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 72363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MUL: 7242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 7262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 727faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_mul(&bld->base, src0, src1); 72863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 72963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 73063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 73163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ADD: 7322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 7342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 735faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add(&bld->base, src0, src1); 73663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 73763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 73863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 73963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP3: 74063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT3 */ 7412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 7422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 74390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 7442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 7452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 74690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 74790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 7482fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 7492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 75090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 75190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 7522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 753faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 75463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 75563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 75663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 75763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP4: 75863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_DOT4 */ 7592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 7602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 76190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 7622fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 7632fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 76490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 76590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 7662fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 7672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 76890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 76990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 7702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_W ); 7712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_W ); 77290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 77390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 7742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 775faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 77663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 77763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 77863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 77963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DST: 7802fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 781faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = bld->base.one; 78263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 7832fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 7842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 7852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Y ); 786faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp0, tmp1); 78763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 7882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 789faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = emit_fetch( bld, inst, 0, CHAN_Z ); 79063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 7912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 792faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = emit_fetch( bld, inst, 1, CHAN_W ); 79363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 79463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 79563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 79663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MIN: 7972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 7982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 7992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 800faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_min( &bld->base, src0, src1 ); 80163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 80263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 80363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 80463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAX: 8052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 8072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 808faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_max( &bld->base, src0, src1 ); 80963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 81063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 81163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 81263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLT: 81363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETLT */ 8142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 8162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 8171aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, src1 ); 818faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 8191aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 82063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 82163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 82263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGE: 82363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SETGE */ 8242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8252fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 8262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 8271aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GEQUAL, src0, src1 ); 828faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 8291aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 83063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 83163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 83263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MAD: 83363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_MADD */ 8342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 8362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 8372fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 2, chan_index ); 83890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 83990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp2); 840faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 84163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 84263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 84363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 84463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SUB: 8452fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8462fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 8472fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, chan_index ); 848faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sub( &bld->base, tmp0, tmp1); 84963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 85063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 85163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 85263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LRP: 8532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 8542fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 8552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 8562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 85790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sub( &bld->base, src1, src2 ); 85890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, src0, tmp0 ); 859faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_add( &bld->base, tmp0, src2 ); 86063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 86163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 86263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 86363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CND: 864873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 865873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 866873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 867873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 868873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp1 = lp_build_const_scalar(bld->base.type, 0.5); 869873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src2, tmp1); 870faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src0, src1 ); 871873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 87263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 87363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 87463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2A: 8752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 8762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 87790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 8782fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 8792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 88090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 88190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 8822fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 2, CHAN_X ); /* xmm1 = src[2].x */ 88390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 8842fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 885faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 88663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 88763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 88863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 88963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FRC: 8902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 891873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 892873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_floor(&bld->base, src0); 893f1f49bd465b899d1c85aa07650ca5b62a50303b0Brian Paul tmp0 = lp_build_sub(&bld->base, src0, tmp0); 894faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 89563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 89663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 89763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 89863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CLAMP: 899873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 900873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 901873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 902873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 903873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_max(&bld->base, tmp0, src1); 904873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = lp_build_min(&bld->base, tmp0, src2); 905faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 906873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 90763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 90863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 90963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_FLR: 9102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 912faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_floor(&bld->base, tmp0); 91363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 91463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 91563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 91663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ROUND: 9172fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9182fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 919faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_round(&bld->base, tmp0); 92063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 92163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 92263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 92390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca case TGSI_OPCODE_EX2: { 9242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 92590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_exp2( &bld->base, tmp0); 9262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 927faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 92863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 92963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 93090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca } 93163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 93263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_LG2: 9332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 93490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_log2( &bld->base, tmp0); 9352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 936faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 93763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 93863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 93963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 94063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POW: 9412fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, CHAN_X ); 9422fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, CHAN_X ); 943faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca res = lp_build_pow( &bld->base, src0, src1 ); 9442fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 945faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = res; 94663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 94763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 94863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 94963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XPD: 9502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 9512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) ) { 9522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_Z ); 9532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp3 = emit_fetch( bld, inst, 0, CHAN_Z ); 95463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9552fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) || 9562fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 9572fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_Y ); 9582fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp4 = emit_fetch( bld, inst, 1, CHAN_Y ); 95963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 96190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = tmp0; 96290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_mul( &bld->base, tmp2, tmp1); 96390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp3; 96490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 96590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp2 = lp_build_sub( &bld->base, tmp2, tmp5); 966faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = tmp2; 96763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if( IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) || 9692fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) ) { 9702fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_X ); 9712fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp5 = emit_fetch( bld, inst, 0, CHAN_X ); 97263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 97490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_mul( &bld->base, tmp3, tmp2); 97590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp5); 97690e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp3 = lp_build_sub( &bld->base, tmp3, tmp1); 977faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = tmp3; 97863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9792fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 98090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_mul( &bld->base, tmp5, tmp4); 98190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp2); 98290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = lp_build_sub( &bld->base, tmp5, tmp0); 983faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = tmp5; 98463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 9852fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 986faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 98763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 98863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 98963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 99063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ABS: 9912fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 9922fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 993faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_abs( &bld->base, tmp0 ); 99463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 99563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 99663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 99763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RCC: 998873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 999873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 100063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 100163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 100263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DPH: 10032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 10042fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); 100590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); 10062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); 10072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); 100890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 100990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10102fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Z ); 10112fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Z ); 101290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); 101390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_W ); 101590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 10162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1017faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 101863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 101963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 102063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 102163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_COS: 10222fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 102390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_cos( &bld->base, tmp0 ); 10242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1025faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 102663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 102763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 102863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 102963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDX: 103086226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 103186226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, &dst0[chan_index], NULL); 103286226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 103363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 103463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 103563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DDY: 103686226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 103786226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca emit_fetch_deriv( bld, inst, 0, chan_index, NULL, NULL, &dst0[chan_index]); 103886226d5ea186d3fc6013bc40a341e0c0a891de39José Fonseca } 103963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 104063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 104163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KILP: 104263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* predicated kill */ 10431fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* FIXME */ 10441fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca return 0; 104563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 104663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 104763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_KIL: 104863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* conditional kill */ 10492fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca emit_kil( bld, inst ); 105063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 105163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 105263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2H: 105363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 105463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 105563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 105663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK2US: 105763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 105863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 105963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4B: 106163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 106263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PK4UB: 106563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 106663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 106763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 106863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RFL: 106963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 107063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 107163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 107263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SEQ: 10732fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10742fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10752fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10761aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_EQUAL, src0, src1 ); 1077faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 10781aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 107963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 108063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 108163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SFL: 1082873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1083faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.zero; 1084873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 108563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 108663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 108763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SGT: 10882fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 10892fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 10902fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 10911aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_GREATER, src0, src1 ); 1092faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 10931aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 109463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 109563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 109663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SIN: 10972fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 109890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_sin( &bld->base, tmp0 ); 10992fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1100faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 110163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 110263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 110363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 110463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SLE: 11052fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 11081aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LEQUAL, src0, src1 ); 1109faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 11101aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 111163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 111263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 111363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SNE: 11142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 11162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 11171aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_NOTEQUAL, src0, src1 ); 1118faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, bld->base.one, bld->base.zero ); 11191aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 112063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 112163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 112263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_STR: 1123873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1124faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = bld->base.one; 1125873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 112663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 112763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 112863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TEX: 1129faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, FALSE, FALSE, dst0 ); 113063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 113163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXD: 1133873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 113463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 113563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 113663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 113763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2H: 1138873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1139873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert (0); 114063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 114163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 114263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 114363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP2US: 1144873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1145873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 114663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 114763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 114863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 114963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4B: 1150873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1151873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 115263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 115363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 115463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 115563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_UP4UB: 1156873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1157873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 115863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 115963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 116063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 116163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_X2D: 1162873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1163873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 116463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 116563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 116663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 116763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARA: 1168873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1169873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 117063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 117163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 117263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 117390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#if 0 117463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ARR: 1175873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 11762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 11772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 117863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_rnd( bld, 0, 0 ); 117963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca emit_f2it( bld, 0 ); 1180faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; 118163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 118263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 118390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca#endif 118463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 118563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRA: 1186873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1187873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 118863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 118963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 119063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 119163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CAL: 1192873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 119363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 119463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 119563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 119663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_RET: 1197873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 1198873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca return 0; 119963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 120063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 120163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_END: 120263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 120363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 120463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SSG: 120563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* TGSI_OPCODE_SGN */ 12062fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12072fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1208faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_sgn( &bld->base, tmp0 ); 120963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 121063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 121163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 121263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CMP: 12132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 12142fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src0 = emit_fetch( bld, inst, 0, chan_index ); 12152fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src1 = emit_fetch( bld, inst, 1, chan_index ); 12162fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca src2 = emit_fetch( bld, inst, 2, chan_index ); 12171aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca tmp0 = lp_build_cmp( &bld->base, PIPE_FUNC_LESS, src0, bld->base.zero ); 1218faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_select( &bld->base, tmp0, src1, src2); 12191aae039ee279f8ad300919d8af0fc4691ca2f514José Fonseca } 122063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 122163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 122263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SCS: 12232fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_X ) { 12242fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1225faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_cos( &bld->base, tmp0 ); 122663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Y ) { 12282fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); 1229faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_sin( &bld->base, tmp0 ); 123063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12312fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_Z ) { 1232faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = bld->base.zero; 123363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 12342fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IF_IS_DST0_CHANNEL_ENABLED( inst, CHAN_W ) { 1235faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 123663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 123763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 123863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 123963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXB: 1240faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, TRUE, FALSE, dst0 ); 124163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 124263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 124363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM: 124463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* fall-through */ 124563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NRM4: 124663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* 3 or 4-component normalization */ 124763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 124863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint dims = (inst->Instruction.Opcode == TGSI_OPCODE_NRM) ? 3 : 4; 124963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 12502fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) || 12512fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y) || 12522fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z) || 12532fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 4)) { 125463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 125563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* NOTE: Cannot use xmm regs 2/3 here (see emit_rsqrt() above). */ 125663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 125763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm4 = src.x */ 125863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = src.x * src.x */ 12592fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 12602fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 126190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp4 = tmp0; 126263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 126390e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp0); 126463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 126563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm5 = src.y */ 126663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.y * src.y */ 12672fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Y); 12682fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 126990e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp5 = tmp1; 127063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 127190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 127290e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 127363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 127463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm6 = src.z */ 127563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.z * src.z */ 12762fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_Z); 12772fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 127890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp6 = tmp1; 127963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 128090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 128190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 128263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 128363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca if (dims == 4) { 128463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm7 = src.w */ 128563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm0 = xmm0 + src.w * src.w */ 12862fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch(bld, inst, 0, CHAN_W); 12872fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W)) { 128890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp7 = tmp1; 128963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 129090e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp1); 129190e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); 129263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 129363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 129463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* xmm1 = 1 / sqrt(xmm0) */ 129590e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_rsqrt( &bld->base, tmp0); 129663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 129763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.x = xmm1 * src.x */ 12982fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X)) { 1299faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_X] = lp_build_mul( &bld->base, tmp4, tmp1); 130063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 130163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.y = xmm1 * src.y */ 13032fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Y)) { 1304faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Y] = lp_build_mul( &bld->base, tmp5, tmp1); 130563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 130663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 130763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.z = xmm1 * src.z */ 13082fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_Z)) { 1309faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_Z] = lp_build_mul( &bld->base, tmp6, tmp1); 131063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 131163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 131263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* dst.w = xmm1 * src.w */ 13132fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_X) && dims == 4) { 1314faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = lp_build_mul( &bld->base, tmp7, tmp1); 131563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 131663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 131763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1318faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca /* dst.w = 1.0 */ 13192fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca if (IS_DST0_CHANNEL_ENABLED(inst, CHAN_W) && dims == 3) { 1320faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[CHAN_W] = bld->base.one; 132163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 132263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 132363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 132463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 132563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DIV: 1326873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1327873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert( 0 ); 132863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 132963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 133063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 133163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_DP2: 13322fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, CHAN_X ); /* xmm0 = src[0].x */ 13332fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 1, CHAN_X ); /* xmm1 = src[1].x */ 133490e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_mul( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 * xmm1 */ 13352fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp1 = emit_fetch( bld, inst, 0, CHAN_Y ); /* xmm1 = src[0].y */ 13362fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp2 = emit_fetch( bld, inst, 1, CHAN_Y ); /* xmm2 = src[1].y */ 133790e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp1 = lp_build_mul( &bld->base, tmp1, tmp2); /* xmm1 = xmm1 * xmm2 */ 133890e9a4d4f99e722d8f0f2050e134a3c69863541bJosé Fonseca tmp0 = lp_build_add( &bld->base, tmp0, tmp1); /* xmm0 = xmm0 + xmm1 */ 13392fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1340faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = tmp0; /* dest[ch] = xmm0 */ 134163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 134263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 134363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 134463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXL: 1345faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, TRUE, FALSE, dst0 ); 134663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 134763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 134863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXP: 1349faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_tex( bld, inst, FALSE, TRUE, dst0 ); 135063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 135163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 135263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_BRK: 1353873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* FIXME */ 135463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 135563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 135663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 135763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_IF: 135880f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin tmp0 = emit_fetch(bld, inst, 0, CHAN_X); 135980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_push(&bld->exec_mask, tmp0); 136063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1362f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_OPCODE_BGNFOR: 1363873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1364873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 136563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 136663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 136763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 136863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_REP: 1369873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1370873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 137163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 137263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ELSE: 137580f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_invert(&bld->exec_mask); 137663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 137763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 137863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDIF: 137980f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_cond_pop(&bld->exec_mask); 138063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1382f04ce6276b64f24cf26ca522f012a1e1a28937feJosé Fonseca case TGSI_OPCODE_ENDFOR: 1383873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1384873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 138563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 138663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 138763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 138863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDREP: 1389873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated */ 1390873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 139163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 139263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 139463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_PUSHA: 1395873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1396873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 139763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 139863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 139963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 140063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_POPA: 1401873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1402873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 140363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 140463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 140563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 140663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CEIL: 1407873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1408873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1409faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_ceil(&bld->base, tmp0); 1410873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca } 141163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_I2F: 1414873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1415873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 141663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 141763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 141863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 141963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_NOT: 1420873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1421873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 142263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 142363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 142463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 142563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TRUNC: 14262fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 14272fef9b3369d1b017a5360d53a75286234ace2c9dJosé Fonseca tmp0 = emit_fetch( bld, inst, 0, chan_index ); 1428faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca dst0[chan_index] = lp_build_trunc(&bld->base, tmp0); 142963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 143063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 143263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SHL: 1433873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1434873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 143563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 143663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 143763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 14382c046034dc5c95dd2fe84d0b4fd44f25235480b9Michal Krol case TGSI_OPCODE_ISHR: 1439873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1440873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 144163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 144263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 144463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_AND: 1445873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1446873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 144763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 144863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 144963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_OR: 1451873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1452873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 145363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 145463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 145563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 145663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_MOD: 1457873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1458873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 145963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 146063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 146163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_XOR: 1463873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1464873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 146563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 146663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 146763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 146863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_SAD: 1469873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1470873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 147163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 147263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 147363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 147463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXF: 1475873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1476873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 147763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 147863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 147963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_TXQ: 1481873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca /* deprecated? */ 1482873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca assert(0); 148363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 148463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 148563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 148663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_CONT: 1487128d93a009c493c65f0fa5d220fac3098a54fa14José Fonseca /* FIXME */ 148863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 148963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_EMIT: 149263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 149363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 149563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_OPCODE_ENDPRIM: 149663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 149763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 149863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1499873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca case TGSI_OPCODE_NOP: 1500873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca break; 1501873773ee2b034e8df72ddfacc764915b8a76ebe2José Fonseca 150263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 150363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 0; 150463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 150563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1506faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if(info->num_dst) { 1507faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca FOR_EACH_DST0_ENABLED_CHANNEL( inst, chan_index ) { 1508faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca emit_store( bld, inst, 0, chan_index, dst0[chan_index]); 1509faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1510faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1511faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 151263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca return 1; 151363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 151463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1515c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca 1516c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonsecavoid 151763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonsecalp_build_tgsi_soa(LLVMBuilderRef builder, 151863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const struct tgsi_token *tokens, 1519b4835ea03d64261da5a892f9590c9977b06920e8José Fonseca struct lp_type type, 15203d7a88674f9eb3320eeff511968f041426e25023José Fonseca struct lp_build_mask_context *mask, 152163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca LLVMValueRef consts_ptr, 1522f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef *pos, 1523f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca const LLVMValueRef (*inputs)[NUM_CHANNELS], 1524f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca LLVMValueRef (*outputs)[NUM_CHANNELS], 15258be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca struct lp_build_sampler_soa *sampler) 152663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca{ 152763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct lp_build_tgsi_soa_context bld; 152863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca struct tgsi_parse_context parse; 152963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca uint num_immediates = 0; 153063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca unsigned i; 153163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 153263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* Setup build context */ 153363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca memset(&bld, 0, sizeof bld); 153463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca lp_build_context_init(&bld.base, builder, type); 1535c0472f9c34da78bccecb2c790b54b9dd9712a0b9José Fonseca bld.mask = mask; 1536f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.pos = pos; 1537f85c5f8621382ba1c8baa1582d87b46b388258d2José Fonseca bld.inputs = inputs; 153863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.outputs = outputs; 153963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.consts_ptr = consts_ptr; 15408be72bb7646d430e66cb36e09c13c13bee030d53José Fonseca bld.sampler = sampler; 154163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154280f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin lp_exec_mask_init(&bld.exec_mask, &bld.base); 154380f3cc36c511f62666162bca1d88c7746b98a27dZack Rusin 154463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_init( &parse, tokens ); 154563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca while( !tgsi_parse_end_of_tokens( &parse ) ) { 154763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_token( &parse ); 154863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 154963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca switch( parse.FullToken.Token.Type ) { 155063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_DECLARATION: 15511fc41002252419f4688c24ea8c3814553b3d76adJosé Fonseca /* Inputs already interpolated */ 155285c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin { 155385c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin if (!emit_declaration( &bld, &parse.FullToken.FullDeclaration )) 155485c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin _debug_printf("warning: failed to define LLVM variable\n"); 155585c7ec70ad41c8ada75a4cbace83d16815d3e2c5Zack Rusin } 155663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 155763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 155863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_INSTRUCTION: 1559faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca { 15602c90652ed9e119f09af6757c59d10273894ba590José Fonseca unsigned opcode = parse.FullToken.FullInstruction.Instruction.Opcode; 15612c90652ed9e119f09af6757c59d10273894ba590José Fonseca const struct tgsi_opcode_info *info = tgsi_get_opcode_info(opcode); 1562faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca if (!emit_instruction( &bld, &parse.FullToken.FullInstruction, info )) 1563faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca _debug_printf("warning: failed to translate tgsi opcode %s to LLVM\n", 1564faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca info ? info->mnemonic : "<invalid>"); 1565faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca } 1566faec23387e035bcdd413b7364933d36a8ec22dbaJosé Fonseca 156763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 156863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 156963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca case TGSI_TOKEN_TYPE_IMMEDIATE: 157063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca /* simply copy the immediate values into the next immediates[] slot */ 157163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca { 157263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca const uint size = parse.FullToken.FullImmediate.Immediate.NrTokens - 1; 157363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(size <= 4); 157463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert(num_immediates < LP_MAX_IMMEDIATES); 157563b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = 0; i < size; ++i ) 157663b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = 157777b35dc179473afbbd8c709c9f32c0f537c90776José Fonseca lp_build_const_scalar(type, parse.FullToken.FullImmediate.u[i].Float); 157863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca for( i = size; i < 4; ++i ) 157963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca bld.immediates[num_immediates][i] = bld.base.undef; 158063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca num_immediates++; 158163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 158263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca break; 158363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 15849381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca case TGSI_TOKEN_TYPE_PROPERTY: 15859381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca break; 15869381dd590f2e45acb8fbb0aa5503c917b832204dJosé Fonseca 158763b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca default: 158863b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca assert( 0 ); 158963b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 159063b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca } 159163b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 159263b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca tgsi_parse_free( &parse ); 159363b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca} 159463b07618b3e4034e11968f1c5323445dc4a0377fJosé Fonseca 1595