lp_bld_tgsi_action.c revision a206c4cd69a881bf3f8d960607d604b6d53e3a26
1bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/************************************************************************** 2bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * 3bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * Copyright 2011-2012 Advanced Micro Devices, Inc. 4bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * Copyright 2009 VMware, Inc. 5bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 6bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * All Rights Reserved. 7bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * 8bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * Permission is hereby granted, free of charge, to any person obtaining a 9bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * copy of this software and associated documentation files (the 10bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * "Software"), to deal in the Software without restriction, including 11bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * without limitation the rights to use, copy, modify, merge, publish, 12bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * distribute, sub license, and/or sell copies of the Software, and to 13bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * permit persons to whom the Software is furnished to do so, subject to 14bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * the following conditions: 15bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * 16bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * The above copyright notice and this permission notice (including the 17bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * next paragraph) shall be included in all copies or substantial portions 18bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * of the Software. 19bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * 20bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 21bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 23bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 24bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 25bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 26bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 27bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * 28bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard **************************************************************************/ 29bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 30bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/** 31bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * @file 32bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * TGSI to LLVM IR translation. 33bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * 34bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * @author Jose Fonseca <jfonseca@vmware.com> 35bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * @author Tom Stellard <thomas.stellard@amd.com> 36bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * 37bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell, 38bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * Brian Paul, and others. 39bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard */ 40bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 41bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 42bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "lp_bld_tgsi_action.h" 43bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 44bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "lp_bld_tgsi.h" 45bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "lp_bld_arit.h" 46bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "lp_bld_const.h" 47bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "lp_bld_gather.h" 48bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "lp_bld_logic.h" 49bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 50bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "tgsi/tgsi_exec.h" 51bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 52bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* XXX: The CPU only defaults should be repaced by generic ones. In most 53bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * cases, the CPU defaults are just wrappers around a function in 54bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * lp_build_arit.c and these functions should be inlined here and the CPU 55bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * generic code should be removed and placed elsewhere. 56bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard */ 57bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 58bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* Default actions */ 59bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 60bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* Generic fetch_arg functions */ 61bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 62bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void scalar_unary_fetch_args( 63bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 64bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 65bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 66bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.x */ 67bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, 0); 68bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->arg_count = 1; 69bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->dst_type = LLVMTypeOf(emit_data->args[0]); 70bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 71bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 72bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void scalar_binary_fetch_args( 73bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 74bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 75bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 76bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.x */ 77bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 78bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_X); 79bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src1.x */ 80bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 81bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1, TGSI_CHAN_X); 82bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->arg_count = 2; 83bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->dst_type = LLVMTypeOf(emit_data->args[0]); 84bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 85bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 86bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_ADD */ 87bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 88bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardadd_emit( 89bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 90bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 91bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 92bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 93bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = LLVMBuildFAdd( 94bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.gallivm->builder, 95bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1], ""); 96bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 97bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 98bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_ARR */ 99bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 100bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardarr_emit( 101bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 102bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 103bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 104bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 105a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca LLVMValueRef tmp = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ROUND, emit_data->args[0]); 106a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca emit_data->output[emit_data->chan] = LLVMBuildFPToSI(bld_base->base.gallivm->builder, tmp, 107a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca bld_base->uint_bld.vec_type, ""); 108bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 109bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 110bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_CLAMP */ 111bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 112bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardclamp_emit( 113bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 114bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 115bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 116bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 117bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 118bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MAX, 119bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], 120bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1]); 121bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 122bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_MIN, tmp, emit_data->args[2]); 123bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 124bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 125bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* DP* Helper */ 126bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 127bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 128bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp_fetch_args( 129bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 130bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data, 131bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard unsigned dp_components) 132bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 133bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard unsigned chan, src; 134bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (src = 0; src < 2; src++) { 135bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (chan = 0; chan < dp_components; chan++) { 136bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[(src * dp_components) + chan] = 137bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_emit_fetch(bld_base, emit_data->inst, src, chan); 138bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 139bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 140bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->dst_type = bld_base->base.elem_type; 141bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 142bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 143bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DP2 */ 144bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 145bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp2_fetch_args( 146bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 147bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 148bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 149bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 2); 150bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 151bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 152bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 153bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp2_emit( 154bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 155bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 156bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 157bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 158bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp0, tmp1; 159bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 160bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */, 161bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] /* src1.x */); 162bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 163bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] /* src0.y */, 164bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] /* src1.y */); 165bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 166bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_ADD, tmp0, tmp1); 167bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 168bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 169bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action dp2_action = { 170647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp2_fetch_args, /* fetch_args */ 171647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp2_emit /* emit */ 172bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 173bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 174bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DP2A */ 175bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 176bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp2a_fetch_args( 177bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 178bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 179bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 180bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 2); 181bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[5] = lp_build_emit_fetch(bld_base, emit_data->inst, 182bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 2, TGSI_CHAN_X); 183bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 184bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 185bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 186bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp2a_emit( 187bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 188bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 189bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 190bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 191bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 192bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_emit_llvm(bld_base, TGSI_OPCODE_DP2, emit_data); 193bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, 194bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[5], tmp); 195bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 196bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 197bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action dp2a_action = { 198647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp2a_fetch_args, /* fetch_args */ 199647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp2a_emit /* emit */ 200bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 201bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 202bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DP3 */ 203bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 204bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp3_fetch_args( 205bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 206bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 207bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 208bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 3); 209bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 210bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 211bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 212bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp3_emit( 213bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 214bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 215bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 216bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 217bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp0, tmp1; 218bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 219bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */, 220bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] /* src1.x */); 221bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 222bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] /* src0.y */, 223bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[4] /* src1.y */); 224bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp1, tmp0); 225bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 226bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] /* src0.z */, 227bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[5] /* src1.z */); 228bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 229bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_ADD, tmp0, tmp1); 230bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 231bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 232bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action dp3_action = { 233647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp3_fetch_args, /* fetch_args */ 234647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp3_emit /* emit */ 235bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 236bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 237bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODDE_DP4 */ 238bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 239bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 240bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp4_fetch_args( 241bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 242bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 243bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 244bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 4); 245bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 246bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 247bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 248bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp4_emit( 249bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 250bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 251bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 252bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 253bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp0, tmp1; 254bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 255bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */, 256bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[4] /* src1.x */); 257bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 258bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] /* src0.y */, 259bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[5] /* src1.y */); 260bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp0, tmp1); 261bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 262bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] /* src0.z */, 263bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[6] /* src1.z */); 264bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp0, tmp1); 265bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 266bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] /* src0.w */, 267bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[7] /* src1.w */); 268bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 269bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_ADD, tmp0, tmp1); 270bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 271bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 272bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action dp4_action = { 273647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp4_fetch_args, /* fetch_args */ 274647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp4_emit /* emit */ 275bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 276bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 277bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DPH */ 278bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 279bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddph_fetch_args( 280bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 281bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 282bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 283bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 4); 284bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.w */ 285bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] = bld_base->base.one; 286bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 287bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 288bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardconst struct lp_build_tgsi_action dph_action = { 289647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dph_fetch_args, /* fetch_args */ 290647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp4_emit /* emit */ 291bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 292bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 293bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DST */ 294bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 295bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddst_fetch_args( 296bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 297bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 298bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 299bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.y */ 300bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 301bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_Y); 302bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.z */ 303bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 304bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_Z); 305bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src1.y */ 306bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 307bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1, TGSI_CHAN_Y); 308bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src1.w */ 309bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] = lp_build_emit_fetch(bld_base, emit_data->inst, 310bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1, TGSI_CHAN_W); 311bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 312bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 313bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 314bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddst_emit( 315bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 316bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 317bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 318bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 319bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x */ 320bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = bld_base->base.one; 321bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 322bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.y */ 323bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 324bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_MUL, 325bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.y */, 326bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] /* src1.y */); 327bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.z */ 328bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = emit_data->args[1]; /* src0.z */ 329bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 330bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.w */ 331bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = emit_data->args[3]; /* src1.w */ 332bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 333bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 334bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action dst_action = { 335647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dst_fetch_args, /* fetch_args */ 336647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dst_emit /* emit */ 337bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 338bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 339bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_END */ 340bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 341bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardend_emit( 342bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 343bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 344bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 345bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 346bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->pc = -1; 347bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 348bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 349bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_EXP */ 350bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 351bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 352bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardexp_emit( 353bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 354bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 355bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 356bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 357bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef floor_x; 358bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 359bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* floor( src0.x ) */ 360bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard floor_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR, 361bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 362bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 363bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* 2 ^ floor( src0.x ) */ 364bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = lp_build_emit_llvm_unary(bld_base, 365bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_EX2, floor_x); 366bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 367bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.x - floor( src0.x ) */ 368bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 369bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_SUB, emit_data->args[0] /* src0.x */, floor_x); 370bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 371bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* 2 ^ src0.x */ 372bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = lp_build_emit_llvm_unary(bld_base, 373bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_EX2, emit_data->args[0] /* src0.x */); 374bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 375bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 376bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 377bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 378bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardconst struct lp_build_tgsi_action exp_action = { 379647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scalar_unary_fetch_args, /* fetch_args */ 380647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca exp_emit /* emit */ 381bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 382bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 383bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_FRC */ 384bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 385bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 386bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardfrc_emit( 387bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 388bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 389bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 390bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 391bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 392bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR, 393bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 394bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 395bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_SUB, emit_data->args[0], tmp); 396bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 397bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 398bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_KIL */ 399bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 400bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 401bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardkil_fetch_args( 402bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 403bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 404bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 405bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.x */ 406bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 407bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_X); 408bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.y */ 409bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 410bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_Y); 411bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.z */ 412bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 413bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_Z); 414bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.w */ 415bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] = lp_build_emit_fetch(bld_base, emit_data->inst, 416bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_W); 417bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->arg_count = 4; 418bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->dst_type = LLVMVoidTypeInContext(bld_base->base.gallivm->context); 419bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 420bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 421bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_KILP */ 422bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 423bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 424bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardkilp_fetch_args( 425bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 426bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 427bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 428bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->dst_type = LLVMVoidTypeInContext(bld_base->base.gallivm->context); 429bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 430bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 431bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_LIT */ 432bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 433bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 434bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlit_fetch_args( 435bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 436bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 437bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 438bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.x */ 439bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_X); 440bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.y */ 441bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_Y); 442bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.w */ 443bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_W); 444bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->arg_count = 3; 445bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 446bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 447bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 448bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlit_emit( 449bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 450bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 451bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 452bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 453dde807b9dc038266fbe594c1a700283df007bf5eJosé Fonseca LLVMValueRef tmp0, tmp1, tmp2; 454bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 455bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x */ 456bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = bld_base->base.one; 457bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 458bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst. y */ 459bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 460bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_MAX, 461bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */, 462bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.zero); 463bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 464bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.z */ 465bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* XMM[1] = SrcReg[0].yyyy */ 466dde807b9dc038266fbe594c1a700283df007bf5eJosé Fonseca tmp1 = emit_data->args[1]; 467bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* XMM[1] = max(XMM[1], 0) */ 468bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MAX, 469bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1, bld_base->base.zero); 470bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* XMM[2] = SrcReg[0].wwww */ 471bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp2 = emit_data->args[2]; 472bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_POW, 473bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1, tmp2); 474bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = emit_data->args[0]; 475bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = lp_build_emit_llvm_ternary(bld_base, 476bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_CMP, 477bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0, bld_base->base.zero, tmp1); 478bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.w */ 479bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 480bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 481bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 482bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action lit_action = { 483647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca lit_fetch_args, /* fetch_args */ 484647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca lit_emit /* emit */ 485bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 486bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 487bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_LOG */ 488bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 489bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 490bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlog_emit( 491bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 492bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 493bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 494bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 495bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 496bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef abs_x, log_abs_x, flr_log_abs_x, ex2_flr_log_abs_x; 497bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 498bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* abs( src0.x) */ 499bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS, 500bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */); 501bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 502bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* log( abs( src0.x ) ) */ 503bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_LG2, 504bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard abs_x); 505bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 506bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* floor( log( abs( src0.x ) ) ) */ 507bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard flr_log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR, 508bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard log_abs_x); 509bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x */ 510bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = flr_log_abs_x; 511bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 512bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.y */ 513bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard ex2_flr_log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_EX2, 514bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard flr_log_abs_x); 515bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 516bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */ 517bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 518bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_DIV, abs_x, ex2_flr_log_abs_x); 519bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 520bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x */ 521bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = log_abs_x; 522bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 523bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.w */ 524bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 525bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 526bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 527bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action log_action = { 528647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scalar_unary_fetch_args, /* fetch_args */ 529647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca log_emit /* emit */ 530bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 531bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 532bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_LRP */ 533bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 534bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 535bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlrp_emit( 536bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 537bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 538bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 539bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 540bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 541bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_SUB, 542bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1], 543bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2]); 544bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_ternary(bld_base, 545bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_MAD, emit_data->args[0], tmp, emit_data->args[2]); 546bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 547bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 548bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_MAD */ 549bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 550bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 551bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardmad_emit( 552bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 553bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 554bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 555bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 556bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 557bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 558bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], 559bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1]); 560bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 561bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_ADD, tmp, emit_data->args[2]); 562bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 563bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 564bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_MOV */ 565bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 566bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 567bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardmov_emit( 568bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 569bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 570bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 571bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 572bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = emit_data->args[0]; 573bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 574bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 575bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_MUL */ 576bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 577bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardmul_emit( 578bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 579bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 580bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 581bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 582bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_mul(&bld_base->base, 583bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 584bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 585bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 586bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_POW */ 587bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 588bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 589bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardpow_emit( 590bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 591bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 592bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 593bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 594bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_pow(&bld_base->base, 595bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 596bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 597bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 598bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action pow_action = { 599647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scalar_binary_fetch_args, /* fetch_args */ 600647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca pow_emit /* emit */ 601bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 602bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 603bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_RSQ */ 604bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 605bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 606bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardrsq_emit( 607bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 608bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 609bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 610bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 611bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS, 612bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 613bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (bld_base->rsq_action.emit) { 614bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->rsq_action.emit(&bld_base->rsq_action, bld_base, emit_data); 615bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } else { 616bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = bld_base->base.undef; 617bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 618bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 619bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 620bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardconst struct lp_build_tgsi_action rsq_action = { 621647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scalar_unary_fetch_args, /* fetch_args */ 622647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca rsq_emit /* emit */ 623bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 624bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 625bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 626bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SCS */ 627bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 628bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardscs_emit( 629bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 630bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 631bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 632bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 633bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x */ 634bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = lp_build_emit_llvm_unary(bld_base, 635bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_COS, emit_data->args[0]); 636bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.y */ 637bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_unary(bld_base, 638bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_SIN, emit_data->args[0]); 639bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.z */ 640bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = bld_base->base.zero; 641bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 642bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.w */ 643bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 644bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 645bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 646bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardconst struct lp_build_tgsi_action scs_action = { 647647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scalar_unary_fetch_args, /* fetch_args */ 648647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scs_emit /* emit */ 649bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 650bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 651bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SFL */ 652bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 653bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 654bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsfl_emit( 655bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 656bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 657bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 658bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 659bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = bld_base->base.zero; 660bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 661bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 662bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_STR */ 663bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 664bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 665bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstr_emit( 666bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 667bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 668bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 669bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 670bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = bld_base->base.one; 671bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 672bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 673bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SUB */ 674bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 675bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsub_emit( 676bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 677bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 678bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 679bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 680bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = LLVMBuildFSub( 681bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.gallivm->builder, 682bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], 683bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1], ""); 684bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 685bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 686bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_XPD */ 687bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 688bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 689bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardxpd_fetch_args( 690bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 691bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 692bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 693bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 3); 694bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 695bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 696bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/** 697bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * (a * b) - (c * d) 698bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard */ 699bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic LLVMValueRef 700bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardxpd_helper( 701bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 702bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef a, 703bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef b, 704bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef c, 705bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef d) 706bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 707bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp0, tmp1; 708bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 709bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, a, b); 710bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, c, d); 711bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 712bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard return lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_SUB, tmp0, tmp1); 713bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 714bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 715bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 716bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardxpd_emit( 717bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 718bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 719bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 720bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 721bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = xpd_helper(bld_base, 722bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] /* src0.y */, emit_data->args[5] /* src1.z */, 723bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[4] /* src1.y */, emit_data->args[2] /* src0.z */); 724bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 725bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = xpd_helper(bld_base, 726bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] /* src0.z */, emit_data->args[3] /* src1.x */, 727bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[5] /* src1.z */, emit_data->args[0] /* src0.x */); 728bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 729bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = xpd_helper(bld_base, 730bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */, emit_data->args[4] /* src1.y */, 731bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] /* src1.x */, emit_data->args[1] /* src0.y */); 732bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 733bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 734bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 735bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 736bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardconst struct lp_build_tgsi_action xpd_action = { 737647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca xpd_fetch_args, /* fetch_args */ 738647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca xpd_emit /* emit */ 739bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 740bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 741bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardvoid 742bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlp_set_default_actions(struct lp_build_tgsi_context * bld_base) 743bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 744bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DP2] = dp2_action; 745bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DP3] = dp3_action; 746bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DP4] = dp4_action; 747bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DP2A] = dp2a_action; 748bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DPH] = dph_action; 749bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DST] = dst_action; 750bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_EXP] = exp_action; 751bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LIT] = lit_action; 752bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LOG] = log_action; 753bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_RSQ] = rsq_action; 754bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_POW] = pow_action; 755bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SCS] = scs_action; 756bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_XPD] = xpd_action; 757bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 758bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_COS].fetch_args = scalar_unary_fetch_args; 759bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_EX2].fetch_args = scalar_unary_fetch_args; 760bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_IF].fetch_args = scalar_unary_fetch_args; 761bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_KIL].fetch_args = kil_fetch_args; 762bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_KILP].fetch_args = kilp_fetch_args; 763bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_RCP].fetch_args = scalar_unary_fetch_args; 764bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SIN].fetch_args = scalar_unary_fetch_args; 765bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LG2].fetch_args = scalar_unary_fetch_args; 766bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 767bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_ADD].emit = add_emit; 768bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_ARR].emit = arr_emit; 769bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_CLAMP].emit = clamp_emit; 770bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_END].emit = end_emit; 771bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_FRC].emit = frc_emit; 772bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LRP].emit = lrp_emit; 773bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_MAD].emit = mad_emit; 774bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_MOV].emit = mov_emit; 775bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_MUL].emit = mul_emit; 776bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SFL].emit = sfl_emit; 777bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_STR].emit = str_emit; 778bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SUB].emit = sub_emit; 779bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 780bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 781bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* CPU Only default actions */ 782bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 783bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* These actions are CPU only, because they could potentially output SSE 784bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * intrinsics. 785bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard */ 786bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 787bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_ABS (CPU Only)*/ 788bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 789bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 790bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardabs_emit_cpu( 791bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 792bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 793bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 794bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 795bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->base, 796bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 797bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 798bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 799bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_ADD (CPU Only) */ 800bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 801bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardadd_emit_cpu( 802bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 803bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 804bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 805bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 806bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_add(&bld_base->base, 807bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 808bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 809bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 810117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie/* TGSI_OPCODE_ARL (CPU Only) */ 811117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airliestatic void 812117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airliearl_emit_cpu( 813117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie const struct lp_build_tgsi_action * action, 814117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie struct lp_build_tgsi_context * bld_base, 815117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie struct lp_build_emit_data * emit_data) 816117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie{ 817117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie LLVMValueRef tmp; 818117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie tmp = lp_build_floor(&bld_base->base, 819117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie emit_data->args[0]); 820117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie emit_data->output[emit_data->chan] = LLVMBuildFPToSI(bld_base->base.gallivm->builder, tmp, 821117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie bld_base->uint_bld.vec_type, ""); 822117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie} 823117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie 824a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca/* TGSI_OPCODE_ARR (CPU Only) */ 825a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonsecastatic void 826a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonsecaarr_emit_cpu( 827a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca const struct lp_build_tgsi_action * action, 828a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca struct lp_build_tgsi_context * bld_base, 829a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca struct lp_build_emit_data * emit_data) 830a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca{ 831a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca emit_data->output[emit_data->chan] = lp_build_iround(&bld_base->base, emit_data->args[0]); 832a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca} 833a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca 834bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_CEIL (CPU Only) */ 835bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 836bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardceil_emit_cpu( 837bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 838bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 839bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 840bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 841bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_trunc(&bld_base->base, 842bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 843bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 844bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 845bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_CMP (CPU Only) */ 846bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 847bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardcmp_emit_cpu( 848bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 849bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 850bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 851bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 852bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef cond = lp_build_cmp(&bld_base->base, PIPE_FUNC_LESS, 853bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], bld_base->base.zero); 854bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base, 855bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard cond, emit_data->args[1], emit_data->args[2]); 856bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 857bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 858bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_CND (CPU Only) */ 859bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 860bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardcnd_emit_cpu( 861bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 862bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 863bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 864bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 865bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef half, tmp; 866bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard half = lp_build_const_vec(bld_base->base.gallivm, bld_base->base.type, 0.5); 867bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_cmp(&bld_base->base, PIPE_FUNC_GREATER, 868bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2], half); 869bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base, 870bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp, 871bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], 872bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1]); 873bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 874bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 875bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_COS (CPU Only) */ 876bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 877bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardcos_emit_cpu( 878bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 879bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 880bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 881bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 882bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_cos(&bld_base->base, 883bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 884bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 885bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 886bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DIV (CPU Only) */ 887bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 888bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddiv_emit_cpu( 889bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 890bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 891bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 892bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 893bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_div(&bld_base->base, 894bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 895bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 896bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 897bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_EX2 (CPU Only) */ 898bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 899bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardex2_emit_cpu( 900bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 901bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 902bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 903bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 904bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_exp2(&bld_base->base, 905bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 906bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 907bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 908bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_EXP (CPU Only) */ 909bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 910bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardexp_emit_cpu( 911bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 912bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 913bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 914bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 915bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_exp2_approx(&bld_base->base, emit_data->args[0], 916bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &emit_data->output[TGSI_CHAN_X], 917bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &emit_data->output[TGSI_CHAN_Y], 918bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &emit_data->output[TGSI_CHAN_Z]); 919bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 920bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 921bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 922bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_FLR (CPU Only) */ 923bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 924bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 925bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardflr_emit_cpu( 926bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 927bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 928bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 929bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 930bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_floor(&bld_base->base, 931bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 932bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 933bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 934bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_LG2 (CPU Only) */ 935bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 936bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlg2_emit_cpu( 937bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 938bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 939bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 940bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 941bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_log2(&bld_base->base, 942bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 943bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 944bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 945bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_LOG (CPU Only) */ 946bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 947bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlog_emit_cpu( 948bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 949bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 950bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 951bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 952bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef p_floor_log2; 953bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef p_exp; 954bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef p_log2; 955bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef src0 = emit_data->args[0]; 956bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 957bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_log2_approx(&bld_base->base, src0, 958bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &p_exp, &p_floor_log2, &p_log2); 959bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 960bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = p_floor_log2; 961bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 962bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 963bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_DIV, 964bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard src0, p_exp); 965bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = p_log2; 966bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 967bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 968bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 969bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 970bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 971bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_MAX (CPU Only) */ 972bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 973bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 974bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardmax_emit_cpu( 975bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 976bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 977bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 978bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 979bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_max(&bld_base->base, 980bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 981bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 982bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 983bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_MIN (CPU Only) */ 984bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 985bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardmin_emit_cpu( 986bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 987bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 988bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 989bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 990bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_min(&bld_base->base, 991bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 992bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 993bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 994bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_POW (CPU Only) */ 995bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 996bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardpow_emit_cpu( 997bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 998bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 999bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1000bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1001bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_pow(&bld_base->base, 1002bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 1003bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1004bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1005bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1006bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_RCP (CPU Only) */ 1007bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1008bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1009bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardrcp_emit_cpu( 1010bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1011bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1012bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1013bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1014bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_rcp(&bld_base->base, 1015bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1016bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1017bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1018bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* Reciprical squareroot (CPU Only) */ 1019bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1020bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* This is not the same as TGSI_OPCODE_RSQ, which requres the argument to be 1021bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * greater than or equal to 0 */ 1022bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1023bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardrecip_sqrt_emit_cpu( 1024bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1025bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1026bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1027bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1028bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_rsqrt(&bld_base->base, 1029bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1030bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1031bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1032bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_ROUND (CPU Only) */ 1033bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1034bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardround_emit_cpu( 1035bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1036bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1037bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1038bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1039bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_round(&bld_base->base, 1040bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1041bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1042bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1043bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SET Helper (CPU Only) */ 1044bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1045bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1046bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardset_emit_cpu( 1047bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1048bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1049bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data, 1050bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard unsigned pipe_func) 1051bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1052bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef cond = lp_build_cmp(&bld_base->base, pipe_func, 1053bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 1054bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base, 1055bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard cond, 1056bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.one, 1057bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.zero); 1058bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1059bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1060bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SEQ (CPU Only) */ 1061bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1062bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1063bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardseq_emit_cpu( 1064bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1065bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1066bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1067bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1068bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL); 1069bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1070bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1071bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SGE (CPU Only) */ 1072bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1073bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsge_emit_cpu( 1074bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1075bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1076bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1077bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1078bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL); 1079bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1080bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1081bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SGT (CPU Only)*/ 1082bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1083bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1084bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsgt_emit_cpu( 1085bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1086bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1087bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1088bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1089bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GREATER); 1090bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1091bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1092bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SIN (CPU Only) */ 1093bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1094bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsin_emit_cpu( 1095bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1096bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1097bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1098bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1099bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_sin(&bld_base->base, 1100bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1101bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1102bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1103bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SLE (CPU Only) */ 1104bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1105bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsle_emit_cpu( 1106bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1107bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1108bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1109bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1110bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LEQUAL); 1111bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1112bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1113bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SLT (CPU Only) */ 1114bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1115bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1116bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardslt_emit_cpu( 1117bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1118bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1119bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1120bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1121bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS); 1122bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1123bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1124bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SNE (CPU Only) */ 1125bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1126bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1127bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsne_emit_cpu( 1128bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1129bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1130bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1131bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1132bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL); 1133bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1134bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1135bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SSG (CPU Only) */ 1136bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1137bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1138bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardssg_emit_cpu( 1139bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1140bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1141bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1142bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1143bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->base, 1144bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1145bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1146bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1147bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SUB (CPU Only) */ 1148bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1149bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1150bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsub_emit_cpu( 1151bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1152bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1153bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1154bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1155bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->base, 1156bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], 1157bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1]); 1158bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1159bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1160bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_TRUNC (CPU Only) */ 1161bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1162bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1163bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardtrunc_emit_cpu( 1164bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1165bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1166bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1167bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1168bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_trunc(&bld_base->base, 1169bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1170bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1171bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1172bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardvoid 1173bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlp_set_default_actions_cpu( 1174bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base) 1175bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1176bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_set_default_actions(bld_base); 1177bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_ABS].emit = abs_emit_cpu; 1178bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_ADD].emit = add_emit_cpu; 1179117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie bld_base->op_actions[TGSI_OPCODE_ARL].emit = arl_emit_cpu; 1180a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca bld_base->op_actions[TGSI_OPCODE_ARR].emit = arr_emit_cpu; 1181bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_CEIL].emit = ceil_emit_cpu; 1182bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_CND].emit = cnd_emit_cpu; 1183bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_COS].emit = cos_emit_cpu; 1184bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_CMP].emit = cmp_emit_cpu; 1185bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DIV].emit = div_emit_cpu; 1186bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_EX2].emit = ex2_emit_cpu; 1187bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_EXP].emit = exp_emit_cpu; 1188bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_FLR].emit = flr_emit_cpu; 1189bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LG2].emit = lg2_emit_cpu; 1190bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LOG].emit = log_emit_cpu; 1191bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_MAX].emit = max_emit_cpu; 1192bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_MIN].emit = min_emit_cpu; 1193bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_POW].emit = pow_emit_cpu; 1194bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_RCP].emit = rcp_emit_cpu; 1195bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_ROUND].emit = round_emit_cpu; 1196bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SEQ].emit = seq_emit_cpu; 1197bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SGE].emit = sge_emit_cpu; 1198bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SGT].emit = sgt_emit_cpu; 1199bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SIN].emit = sin_emit_cpu; 1200bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SLE].emit = sle_emit_cpu; 1201bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SLT].emit = slt_emit_cpu; 1202bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SNE].emit = sne_emit_cpu; 1203bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SSG].emit = ssg_emit_cpu; 1204bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SUB].emit = sub_emit_cpu; 1205bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_TRUNC].emit = trunc_emit_cpu; 1206bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1207bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->rsq_action.emit = recip_sqrt_emit_cpu; 1208bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1209