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" 46579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie#include "lp_bld_bitarit.h" 47bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "lp_bld_const.h" 48bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "lp_bld_gather.h" 49bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "lp_bld_logic.h" 50bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 51bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard#include "tgsi/tgsi_exec.h" 52bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 53bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* XXX: The CPU only defaults should be repaced by generic ones. In most 54bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * cases, the CPU defaults are just wrappers around a function in 55bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * lp_build_arit.c and these functions should be inlined here and the CPU 56bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * generic code should be removed and placed elsewhere. 57bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard */ 58bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 59bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* Default actions */ 60bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 61bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* Generic fetch_arg functions */ 62bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 63bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void scalar_unary_fetch_args( 64bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 65bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 66bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 67bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.x */ 68bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, 0); 69bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->arg_count = 1; 70bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->dst_type = LLVMTypeOf(emit_data->args[0]); 71bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 72bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 73bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void scalar_binary_fetch_args( 74bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 75bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 76bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 77bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.x */ 78bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 79bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_X); 80bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src1.x */ 81bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 82bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1, TGSI_CHAN_X); 83bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->arg_count = 2; 84bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->dst_type = LLVMTypeOf(emit_data->args[0]); 85bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 86bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 87bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_ADD */ 88bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 89bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardadd_emit( 90bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 91bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 92bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 93bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 94bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = LLVMBuildFAdd( 95bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.gallivm->builder, 96bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1], ""); 97bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 98bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 99bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_ARR */ 100bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 101bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardarr_emit( 102bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 103bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 104bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 105bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 106a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca LLVMValueRef tmp = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ROUND, emit_data->args[0]); 107a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca emit_data->output[emit_data->chan] = LLVMBuildFPToSI(bld_base->base.gallivm->builder, tmp, 108a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca bld_base->uint_bld.vec_type, ""); 109bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 110bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 111bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_CLAMP */ 112bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 113bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardclamp_emit( 114bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 115bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 116bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 117bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 118bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 119bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MAX, 120bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], 121bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1]); 122bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 123bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_MIN, tmp, emit_data->args[2]); 124bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 125bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 126bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* DP* Helper */ 127bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 128bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 129bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp_fetch_args( 130bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 131bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data, 132bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard unsigned dp_components) 133bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 134bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard unsigned chan, src; 135bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (src = 0; src < 2; src++) { 136bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard for (chan = 0; chan < dp_components; chan++) { 137bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[(src * dp_components) + chan] = 138bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_emit_fetch(bld_base, emit_data->inst, src, chan); 139bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 140bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 141bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->dst_type = bld_base->base.elem_type; 142bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 143bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 144bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DP2 */ 145bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 146bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp2_fetch_args( 147bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 148bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 149bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 150bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 2); 151bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 152bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 153bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 154bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp2_emit( 155bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 156bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 157bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 158bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 159bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp0, tmp1; 160bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 161bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */, 162bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] /* src1.x */); 163bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 164bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] /* src0.y */, 165bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] /* src1.y */); 166bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 167bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_ADD, tmp0, tmp1); 168bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 169bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 170bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action dp2_action = { 171647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp2_fetch_args, /* fetch_args */ 172647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp2_emit /* emit */ 173bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 174bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 175bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DP2A */ 176bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 177bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp2a_fetch_args( 178bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 179bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 180bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 181bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 2); 182bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[5] = lp_build_emit_fetch(bld_base, emit_data->inst, 183bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 2, TGSI_CHAN_X); 184bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 185bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 186bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 187bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp2a_emit( 188bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 189bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 190bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 191bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 192bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 193bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_emit_llvm(bld_base, TGSI_OPCODE_DP2, emit_data); 194bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, 195bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[5], tmp); 196bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 197bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 198bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action dp2a_action = { 199647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp2a_fetch_args, /* fetch_args */ 200647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp2a_emit /* emit */ 201bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 202bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 203bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DP3 */ 204bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 205bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp3_fetch_args( 206bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 207bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 208bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 209bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 3); 210bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 211bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 212bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 213bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp3_emit( 214bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 215bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 216bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 217bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 218bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp0, tmp1; 219bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 220bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */, 221bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] /* src1.x */); 222bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 223bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] /* src0.y */, 224bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[4] /* src1.y */); 225bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp1, tmp0); 226bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 227bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] /* src0.z */, 228bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[5] /* src1.z */); 229bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 230bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_ADD, tmp0, tmp1); 231bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 232bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 233bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action dp3_action = { 234647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp3_fetch_args, /* fetch_args */ 235647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp3_emit /* emit */ 236bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 237bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 238bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODDE_DP4 */ 239bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 240bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 241bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp4_fetch_args( 242bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 243bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 244bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 245bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 4); 246bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 247bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 248bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 249bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddp4_emit( 250bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 251bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 252bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 253bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 254bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp0, tmp1; 255bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 256bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */, 257bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[4] /* src1.x */); 258bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 259bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] /* src0.y */, 260bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[5] /* src1.y */); 261bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp0, tmp1); 262bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 263bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] /* src0.z */, 264bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[6] /* src1.z */); 265bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp0, tmp1); 266bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 267bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] /* src0.w */, 268bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[7] /* src1.w */); 269bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 270bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_ADD, tmp0, tmp1); 271bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 272bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 273bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action dp4_action = { 274647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp4_fetch_args, /* fetch_args */ 275647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp4_emit /* emit */ 276bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 277bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 278bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DPH */ 279bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 280bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddph_fetch_args( 281bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 282bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 283bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 284bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 4); 285bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.w */ 286bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] = bld_base->base.one; 287bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 288bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 289bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardconst struct lp_build_tgsi_action dph_action = { 290647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dph_fetch_args, /* fetch_args */ 291647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dp4_emit /* emit */ 292bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 293bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 294bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DST */ 295bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 296bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddst_fetch_args( 297bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 298bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 299bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 300bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.y */ 301bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 302bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_Y); 303bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.z */ 304bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 305bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_Z); 306bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src1.y */ 307bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 308bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1, TGSI_CHAN_Y); 309bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src1.w */ 310bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] = lp_build_emit_fetch(bld_base, emit_data->inst, 311bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1, TGSI_CHAN_W); 312bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 313bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 314bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 315bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddst_emit( 316bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 317bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 318bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 319bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 320bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x */ 321bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = bld_base->base.one; 322bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 323bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.y */ 324bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 325bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_MUL, 326bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.y */, 327bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] /* src1.y */); 328bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.z */ 329bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = emit_data->args[1]; /* src0.z */ 330bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 331bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.w */ 332bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = emit_data->args[3]; /* src1.w */ 333bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 334bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 335bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action dst_action = { 336647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dst_fetch_args, /* fetch_args */ 337647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca dst_emit /* emit */ 338bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 339bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 340bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_END */ 341bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 342bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardend_emit( 343bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 344bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 345bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 346bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 347bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->pc = -1; 348bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 349bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 350bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_EXP */ 351bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 352bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 353bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardexp_emit( 354bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 355bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 356bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 357bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 358bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef floor_x; 359bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 360bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* floor( src0.x ) */ 361bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard floor_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR, 362bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 363bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 364bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* 2 ^ floor( src0.x ) */ 365bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = lp_build_emit_llvm_unary(bld_base, 366bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_EX2, floor_x); 367bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 368bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.x - floor( src0.x ) */ 369bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 370bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_SUB, emit_data->args[0] /* src0.x */, floor_x); 371bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 372bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* 2 ^ src0.x */ 373bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = lp_build_emit_llvm_unary(bld_base, 374bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_EX2, emit_data->args[0] /* src0.x */); 375bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 376bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 377bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 378bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 379bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardconst struct lp_build_tgsi_action exp_action = { 380647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scalar_unary_fetch_args, /* fetch_args */ 381647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca exp_emit /* emit */ 382bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 383bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 384bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_FRC */ 385bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 386bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 387bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardfrc_emit( 388bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 389bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 390bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 391bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 392bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 393bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR, 394bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 395bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 396bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_SUB, emit_data->args[0], tmp); 397bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 398bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 399bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_KIL */ 400bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 401bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 402bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardkil_fetch_args( 403bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 404bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 405bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 406bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.x */ 407bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 408bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_X); 409bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.y */ 410bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 411bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_Y); 412bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.z */ 413bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 414bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_Z); 415bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.w */ 416bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] = lp_build_emit_fetch(bld_base, emit_data->inst, 417bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 0, TGSI_CHAN_W); 418bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->arg_count = 4; 419bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->dst_type = LLVMVoidTypeInContext(bld_base->base.gallivm->context); 420bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 421bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 422bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_KILP */ 423bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 424bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 425bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardkilp_fetch_args( 426bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 427bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 428bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 429bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->dst_type = LLVMVoidTypeInContext(bld_base->base.gallivm->context); 430bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 431bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 432bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_LIT */ 433bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 434bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 435bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlit_fetch_args( 436bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 437bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 438bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 439bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.x */ 440bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_X); 441bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.y */ 442bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_Y); 443bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* src0.w */ 444bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_W); 445bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->arg_count = 3; 446bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 447bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 448bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 449bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlit_emit( 450bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 451bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 452bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 453bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 454dde807b9dc038266fbe594c1a700283df007bf5eJosé Fonseca LLVMValueRef tmp0, tmp1, tmp2; 455bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 456bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x */ 457bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = bld_base->base.one; 458bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 459bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst. y */ 460bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 461bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_MAX, 462bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */, 463bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.zero); 464bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 465bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.z */ 466bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* XMM[1] = SrcReg[0].yyyy */ 467dde807b9dc038266fbe594c1a700283df007bf5eJosé Fonseca tmp1 = emit_data->args[1]; 468bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* XMM[1] = max(XMM[1], 0) */ 469bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MAX, 470bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1, bld_base->base.zero); 471bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* XMM[2] = SrcReg[0].wwww */ 472bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp2 = emit_data->args[2]; 473bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_POW, 474bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1, tmp2); 475bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = emit_data->args[0]; 476bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = lp_build_emit_llvm_ternary(bld_base, 477bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_CMP, 478bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0, bld_base->base.zero, tmp1); 479bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.w */ 480bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 481bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 482bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 483bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action lit_action = { 484647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca lit_fetch_args, /* fetch_args */ 485647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca lit_emit /* emit */ 486bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 487bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 488bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_LOG */ 489bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 490bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 491bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlog_emit( 492bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 493bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 494bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 495bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 496bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 497bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef abs_x, log_abs_x, flr_log_abs_x, ex2_flr_log_abs_x; 498bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 499bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* abs( src0.x) */ 500bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS, 501bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */); 502bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 503bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* log( abs( src0.x ) ) */ 504bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_LG2, 505bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard abs_x); 506bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 507bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* floor( log( abs( src0.x ) ) ) */ 508bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard flr_log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR, 509bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard log_abs_x); 510bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x */ 511bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = flr_log_abs_x; 512bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 513bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.y */ 514bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard ex2_flr_log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_EX2, 515bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard flr_log_abs_x); 516bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 517bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */ 518bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 519bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_DIV, abs_x, ex2_flr_log_abs_x); 520bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 521bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x */ 522bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = log_abs_x; 523bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 524bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.w */ 525bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 526bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 527bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 528bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action log_action = { 529647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scalar_unary_fetch_args, /* fetch_args */ 530647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca log_emit /* emit */ 531bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 532bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 533bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_LRP */ 534bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 535bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 536bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlrp_emit( 537bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 538bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 539bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 540bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 541bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 542bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_SUB, 543bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1], 544bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2]); 545bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_ternary(bld_base, 546bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_MAD, emit_data->args[0], tmp, emit_data->args[2]); 547bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 548bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 549bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_MAD */ 550bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 551bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 552bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardmad_emit( 553bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 554bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 555bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 556bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 557bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp; 558bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 559bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], 560bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1]); 561bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 562bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_ADD, tmp, emit_data->args[2]); 563bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 564bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 565bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_MOV */ 566bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 567bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 568bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardmov_emit( 569bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 570bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 571bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 572bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 573bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = emit_data->args[0]; 574bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 575bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 576bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_MUL */ 577bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 578bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardmul_emit( 579bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 580bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 581bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 582bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 583bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_mul(&bld_base->base, 584bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 585bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 586bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 587bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_POW */ 588bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 589bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 590bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardpow_emit( 591bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 592bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 593bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 594bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 595bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_pow(&bld_base->base, 596bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 597bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 598bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 599bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic struct lp_build_tgsi_action pow_action = { 600647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scalar_binary_fetch_args, /* fetch_args */ 601647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca pow_emit /* emit */ 602bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 603bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 604bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_RSQ */ 605bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 606bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 607bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardrsq_emit( 608bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 609bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 610bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 611bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 612bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS, 613bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 614bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard if (bld_base->rsq_action.emit) { 615bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->rsq_action.emit(&bld_base->rsq_action, bld_base, emit_data); 616bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } else { 617bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = bld_base->base.undef; 618bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard } 619bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 620bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 621bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardconst struct lp_build_tgsi_action rsq_action = { 622647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scalar_unary_fetch_args, /* fetch_args */ 623647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca rsq_emit /* emit */ 624bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 625bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 626bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 627bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SCS */ 628bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 629bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardscs_emit( 630bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 631bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 632bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 633bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 634bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.x */ 635bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = lp_build_emit_llvm_unary(bld_base, 636bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_COS, emit_data->args[0]); 637bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.y */ 638bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_unary(bld_base, 639bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_SIN, emit_data->args[0]); 640bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.z */ 641bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = bld_base->base.zero; 642bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 643bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard /* dst.w */ 644bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 645bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 646bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 647bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardconst struct lp_build_tgsi_action scs_action = { 648647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scalar_unary_fetch_args, /* fetch_args */ 649647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca scs_emit /* emit */ 650bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 651bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 652bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SFL */ 653bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 654bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 655bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsfl_emit( 656bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 657bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 658bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 659bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 660bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = bld_base->base.zero; 661bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 662bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 663bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_STR */ 664bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 665bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 666bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstr_emit( 667bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 668bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 669bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 670bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 671bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = bld_base->base.one; 672bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 673bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 674bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SUB */ 675bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 676bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsub_emit( 677bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 678bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 679bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 680bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 681bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = LLVMBuildFSub( 682bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.gallivm->builder, 683bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], 684bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1], ""); 685bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 686bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 687579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_U2F */ 688579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 689579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieu2f_emit( 690579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 691579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 692579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 693579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 694579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = LLVMBuildUIToFP(bld_base->base.gallivm->builder, 695579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], 69627e94ba4eabec90b2c4d7361a9448b35e2819a8bOlivier Galibert bld_base->base.vec_type, ""); 697579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 698579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 699579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 700579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieumad_emit( 701579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 702579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 703579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 704579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 705579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie LLVMValueRef tmp; 706579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_UMUL, 707579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], 708579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[1]); 709579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 710579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie TGSI_OPCODE_UADD, tmp, emit_data->args[2]); 711579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 712579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 713579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_UMUL */ 714579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 715579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieumul_emit( 716579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 717579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 718579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 719579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 720579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_mul(&bld_base->uint_bld, 721579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 722579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 723579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 724bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_XPD */ 725bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 726bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 727bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardxpd_fetch_args( 728bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 729bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 730bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 731bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard dp_fetch_args(bld_base, emit_data, 3); 732bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 733bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 734bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/** 735bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * (a * b) - (c * d) 736bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard */ 737bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic LLVMValueRef 738bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardxpd_helper( 739bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 740bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef a, 741bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef b, 742bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef c, 743bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef d) 744bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 745bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef tmp0, tmp1; 746bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 747bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, a, b); 748bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, c, d); 749bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 750bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard return lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_SUB, tmp0, tmp1); 751bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 752bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 753bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 754bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardxpd_emit( 755bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 756bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 757bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 758bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 759bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = xpd_helper(bld_base, 760bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1] /* src0.y */, emit_data->args[5] /* src1.z */, 761bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[4] /* src1.y */, emit_data->args[2] /* src0.z */); 762bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 763bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = xpd_helper(bld_base, 764bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2] /* src0.z */, emit_data->args[3] /* src1.x */, 765bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[5] /* src1.z */, emit_data->args[0] /* src0.x */); 766bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 767bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = xpd_helper(bld_base, 768bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0] /* src0.x */, emit_data->args[4] /* src1.y */, 769bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[3] /* src1.x */, emit_data->args[1] /* src0.y */); 770bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 771bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 772bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 773bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 774bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardconst struct lp_build_tgsi_action xpd_action = { 775647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca xpd_fetch_args, /* fetch_args */ 776647ca47cc30dc3f40752fc0a5983e3c31512cfabJosé Fonseca xpd_emit /* emit */ 777bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard}; 778bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 779bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardvoid 780bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlp_set_default_actions(struct lp_build_tgsi_context * bld_base) 781bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 782bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DP2] = dp2_action; 783bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DP3] = dp3_action; 784bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DP4] = dp4_action; 785bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DP2A] = dp2a_action; 786bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DPH] = dph_action; 787bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DST] = dst_action; 788bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_EXP] = exp_action; 789bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LIT] = lit_action; 790bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LOG] = log_action; 791bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_RSQ] = rsq_action; 792bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_POW] = pow_action; 793bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SCS] = scs_action; 794bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_XPD] = xpd_action; 795bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 796bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_COS].fetch_args = scalar_unary_fetch_args; 797bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_EX2].fetch_args = scalar_unary_fetch_args; 798bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_IF].fetch_args = scalar_unary_fetch_args; 799bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_KIL].fetch_args = kil_fetch_args; 800bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_KILP].fetch_args = kilp_fetch_args; 801bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_RCP].fetch_args = scalar_unary_fetch_args; 802bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SIN].fetch_args = scalar_unary_fetch_args; 803bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LG2].fetch_args = scalar_unary_fetch_args; 804bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 805bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_ADD].emit = add_emit; 806bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_ARR].emit = arr_emit; 807bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_CLAMP].emit = clamp_emit; 808bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_END].emit = end_emit; 809bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_FRC].emit = frc_emit; 810bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LRP].emit = lrp_emit; 811bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_MAD].emit = mad_emit; 812bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_MOV].emit = mov_emit; 813bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_MUL].emit = mul_emit; 814bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SFL].emit = sfl_emit; 815bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_STR].emit = str_emit; 816bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SUB].emit = sub_emit; 817579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 818579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_UARL].emit = mov_emit; 819579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_U2F].emit = u2f_emit; 820579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_UMAD].emit = umad_emit; 821579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_UMUL].emit = umul_emit; 822bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 823bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 824bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* CPU Only default actions */ 825bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 826bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* These actions are CPU only, because they could potentially output SSE 827bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * intrinsics. 828bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard */ 829bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 830bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_ABS (CPU Only)*/ 831bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 832bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 833bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardabs_emit_cpu( 834bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 835bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 836bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 837bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 838bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->base, 839bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 840bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 841bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 842bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_ADD (CPU Only) */ 843bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 844bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardadd_emit_cpu( 845bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 846bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 847bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 848bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 849bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_add(&bld_base->base, 850bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 851bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 852bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 853579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_AND (CPU Only) */ 854579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 855579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieand_emit_cpu( 856579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 857579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 858579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 859579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 860579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_and(&bld_base->uint_bld, 861579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 862579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 863579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 864117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie/* TGSI_OPCODE_ARL (CPU Only) */ 865117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airliestatic void 866117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airliearl_emit_cpu( 867117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie const struct lp_build_tgsi_action * action, 868117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie struct lp_build_tgsi_context * bld_base, 869117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie struct lp_build_emit_data * emit_data) 870117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie{ 871117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie LLVMValueRef tmp; 872117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie tmp = lp_build_floor(&bld_base->base, 873117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie emit_data->args[0]); 874117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie emit_data->output[emit_data->chan] = LLVMBuildFPToSI(bld_base->base.gallivm->builder, tmp, 875117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie bld_base->uint_bld.vec_type, ""); 876117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie} 877117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie 878a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca/* TGSI_OPCODE_ARR (CPU Only) */ 879a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonsecastatic void 880a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonsecaarr_emit_cpu( 881a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca const struct lp_build_tgsi_action * action, 882a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca struct lp_build_tgsi_context * bld_base, 883a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca struct lp_build_emit_data * emit_data) 884a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca{ 885a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca emit_data->output[emit_data->chan] = lp_build_iround(&bld_base->base, emit_data->args[0]); 886a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca} 887a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca 888bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_CEIL (CPU Only) */ 889bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 890bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardceil_emit_cpu( 891bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 892bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 893bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 894bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 89523c0d469e55b3cb79ad4b2fd0d961562a26234fdJosé Fonseca emit_data->output[emit_data->chan] = lp_build_ceil(&bld_base->base, 89623c0d469e55b3cb79ad4b2fd0d961562a26234fdJosé Fonseca emit_data->args[0]); 897bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 898bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 899bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_CMP (CPU Only) */ 900bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 901bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardcmp_emit_cpu( 902bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 903bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 904bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 905bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 906bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef cond = lp_build_cmp(&bld_base->base, PIPE_FUNC_LESS, 907bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], bld_base->base.zero); 908bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base, 909bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard cond, emit_data->args[1], emit_data->args[2]); 910bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 911bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 912bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_CND (CPU Only) */ 913bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 914bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardcnd_emit_cpu( 915bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 916bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 917bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 918bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 919bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef half, tmp; 920bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard half = lp_build_const_vec(bld_base->base.gallivm, bld_base->base.type, 0.5); 921bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp = lp_build_cmp(&bld_base->base, PIPE_FUNC_GREATER, 922bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[2], half); 923bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base, 924bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard tmp, 925bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], 926bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1]); 927bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 928bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 929bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_COS (CPU Only) */ 930bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 931bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardcos_emit_cpu( 932bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 933bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 934bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 935bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 936bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_cos(&bld_base->base, 937bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 938bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 939bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 940bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_DIV (CPU Only) */ 941bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 942bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellarddiv_emit_cpu( 943bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 944bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 945bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 946bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 947bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_div(&bld_base->base, 948bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 949bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 950bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 951bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_EX2 (CPU Only) */ 952bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 953bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardex2_emit_cpu( 954bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 955bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 956bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 957bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 958bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_exp2(&bld_base->base, 959bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 960bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 961bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 962bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_EXP (CPU Only) */ 963bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 964bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardexp_emit_cpu( 965bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 966bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 967bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 968bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 969bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_exp2_approx(&bld_base->base, emit_data->args[0], 970bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &emit_data->output[TGSI_CHAN_X], 971bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &emit_data->output[TGSI_CHAN_Y], 972bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &emit_data->output[TGSI_CHAN_Z]); 973bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 974bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 975bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 976579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_F2I (CPU Only) */ 977579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 978579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlief2i_emit_cpu( 979579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 980579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 981579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 982579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 983579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_itrunc(&bld_base->base, 984579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0]); 985579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 986579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 9879d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry/* TGSI_OPCODE_F2U (CPU Only) */ 9889d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berrystatic void 9899d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berryf2u_emit_cpu( 9909d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry const struct lp_build_tgsi_action * action, 9919d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry struct lp_build_tgsi_context * bld_base, 9929d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry struct lp_build_emit_data * emit_data) 9939d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry{ 9949d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry /* FIXME: implement and use lp_build_utrunc() */ 9959d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry emit_data->output[emit_data->chan] = lp_build_itrunc(&bld_base->base, 9969d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry emit_data->args[0]); 9979d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry} 9989d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry 999bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_FLR (CPU Only) */ 1000bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1001bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1002bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardflr_emit_cpu( 1003bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1004bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1005bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1006bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1007bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_floor(&bld_base->base, 1008bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1009bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1010bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1011579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_I2F (CPU Only) */ 1012579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1013579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliei2f_emit_cpu( 1014579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1015579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1016579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1017579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1018579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_int_to_float(&bld_base->base, 1019579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0]); 1020579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1021579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1022729d9148244551c6bcae00a760f39a6902c925efDave Airlie/* TGSI_OPCODE_IABS (CPU Only) */ 1023729d9148244551c6bcae00a760f39a6902c925efDave Airliestatic void 1024729d9148244551c6bcae00a760f39a6902c925efDave Airlieiabs_emit_cpu( 1025729d9148244551c6bcae00a760f39a6902c925efDave Airlie const struct lp_build_tgsi_action * action, 1026729d9148244551c6bcae00a760f39a6902c925efDave Airlie struct lp_build_tgsi_context * bld_base, 1027729d9148244551c6bcae00a760f39a6902c925efDave Airlie struct lp_build_emit_data * emit_data) 1028729d9148244551c6bcae00a760f39a6902c925efDave Airlie{ 1029729d9148244551c6bcae00a760f39a6902c925efDave Airlie emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->int_bld, 1030729d9148244551c6bcae00a760f39a6902c925efDave Airlie emit_data->args[0]); 1031729d9148244551c6bcae00a760f39a6902c925efDave Airlie} 1032729d9148244551c6bcae00a760f39a6902c925efDave Airlie 1033579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_IDIV (CPU Only) */ 1034579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1035579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieidiv_emit_cpu( 1036579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1037579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1038579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1039579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1040579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_div(&bld_base->int_bld, 1041579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1042579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1043579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1044579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_INEG (CPU Only) */ 1045579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1046579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieineg_emit_cpu( 1047579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1048579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1049579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1050579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1051579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->int_bld, 1052579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->int_bld.zero, 1053579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0]); 1054579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1055579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1056579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_ISET Helper (CPU Only) */ 1057579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1058579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieiset_emit_cpu( 1059579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1060579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1061579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data, 1062579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie unsigned pipe_func) 1063579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1064579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie LLVMValueRef nz = lp_build_const_vec(bld_base->base.gallivm, 1065579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->int_bld.type, ~0U); 1066579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie LLVMValueRef cond = lp_build_cmp(&bld_base->int_bld, pipe_func, 1067579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1068579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_select(&bld_base->int_bld, 1069579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie cond, 1070579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie nz, 1071579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->int_bld.zero); 1072579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1073579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1074579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_IMAX (CPU Only) */ 1075579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1076579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieimax_emit_cpu( 1077579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1078579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1079579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1080579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1081579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_max(&bld_base->int_bld, 1082579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1083579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1084579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1085579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_IMIN (CPU Only) */ 1086579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1087579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieimin_emit_cpu( 1088579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1089579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1090579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1091579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1092579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_min(&bld_base->int_bld, 1093579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1094579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1095579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1096579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_ISGE (CPU Only) */ 1097579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1098579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieisge_emit_cpu( 1099579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1100579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1101579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1102579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1103579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie iset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL); 1104579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1105579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1106579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_ISHR (CPU Only) */ 1107579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1108579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieishr_emit_cpu( 1109579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1110579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1111579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1112579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1113579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_shr(&bld_base->int_bld, 1114579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1115579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1116579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1117579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_ISLT (CPU Only) */ 1118579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1119579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieislt_emit_cpu( 1120579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1121579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1122579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1123579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1124579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie iset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS); 1125579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1126579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1127729d9148244551c6bcae00a760f39a6902c925efDave Airlie 1128729d9148244551c6bcae00a760f39a6902c925efDave Airlie/* TGSI_OPCODE_ISSG (CPU Only) */ 1129729d9148244551c6bcae00a760f39a6902c925efDave Airliestatic void 1130729d9148244551c6bcae00a760f39a6902c925efDave Airlieissg_emit_cpu( 1131729d9148244551c6bcae00a760f39a6902c925efDave Airlie const struct lp_build_tgsi_action * action, 1132729d9148244551c6bcae00a760f39a6902c925efDave Airlie struct lp_build_tgsi_context * bld_base, 1133729d9148244551c6bcae00a760f39a6902c925efDave Airlie struct lp_build_emit_data * emit_data) 1134729d9148244551c6bcae00a760f39a6902c925efDave Airlie{ 1135729d9148244551c6bcae00a760f39a6902c925efDave Airlie emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->int_bld, 1136729d9148244551c6bcae00a760f39a6902c925efDave Airlie emit_data->args[0]); 1137729d9148244551c6bcae00a760f39a6902c925efDave Airlie} 1138729d9148244551c6bcae00a760f39a6902c925efDave Airlie 1139bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_LG2 (CPU Only) */ 1140bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1141bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlg2_emit_cpu( 1142bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1143bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1144bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1145bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1146bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_log2(&bld_base->base, 1147bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1148bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1149bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1150bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_LOG (CPU Only) */ 1151bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1152bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlog_emit_cpu( 1153bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1154bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1155bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1156bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1157bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef p_floor_log2; 1158bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef p_exp; 1159bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef p_log2; 1160bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef src0 = emit_data->args[0]; 1161bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1162bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_build_log2_approx(&bld_base->base, src0, 1163bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard &p_exp, &p_floor_log2, &p_log2); 1164bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1165bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_X] = p_floor_log2; 1166bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1167bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 1168bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard TGSI_OPCODE_DIV, 1169bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard src0, p_exp); 1170bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_Z] = p_log2; 1171bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1172bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 1173bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1174bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1175bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1176bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_MAX (CPU Only) */ 1177bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1178bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1179bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardmax_emit_cpu( 1180bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1181bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1182bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1183bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1184bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_max(&bld_base->base, 1185bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 1186bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1187bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1188bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_MIN (CPU Only) */ 1189bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1190bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardmin_emit_cpu( 1191bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1192bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1193bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1194bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1195bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_min(&bld_base->base, 1196bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 1197bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1198bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1199579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_MOD (CPU Only) */ 1200579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1201579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliemod_emit_cpu( 1202579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1203579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1204579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1205579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1206579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_mod(&bld_base->int_bld, 1207579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1208579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1209579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1210579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_NOT */ 1211579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1212579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlienot_emit_cpu( 1213579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1214579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1215579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1216579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1217579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_not(&bld_base->base, 1218579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0]); 1219579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1220579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1221579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_OR (CPU Only) */ 1222579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1223579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieor_emit_cpu( 1224579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1225579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1226579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1227579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1228579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_or(&bld_base->uint_bld, 1229579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1230579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1231579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1232bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_POW (CPU Only) */ 1233bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1234bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardpow_emit_cpu( 1235bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1236bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1237bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1238bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1239bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_pow(&bld_base->base, 1240bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 1241bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1242bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1243bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1244bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_RCP (CPU Only) */ 1245bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1246bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1247bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardrcp_emit_cpu( 1248bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1249bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1250bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1251bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1252bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_rcp(&bld_base->base, 1253bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1254bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1255bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1256bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* Reciprical squareroot (CPU Only) */ 1257bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1258bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* This is not the same as TGSI_OPCODE_RSQ, which requres the argument to be 1259bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard * greater than or equal to 0 */ 1260bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1261bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardrecip_sqrt_emit_cpu( 1262bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1263bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1264bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1265bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1266bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_rsqrt(&bld_base->base, 1267bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1268bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1269bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1270bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_ROUND (CPU Only) */ 1271bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1272bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardround_emit_cpu( 1273bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1274bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1275bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1276bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1277bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_round(&bld_base->base, 1278bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1279bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1280bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1281bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SET Helper (CPU Only) */ 1282bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1283bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1284bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardset_emit_cpu( 1285bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1286bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1287bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data, 1288bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard unsigned pipe_func) 1289bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1290bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard LLVMValueRef cond = lp_build_cmp(&bld_base->base, pipe_func, 1291bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], emit_data->args[1]); 1292bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base, 1293bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard cond, 1294bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.one, 1295bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->base.zero); 1296bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1297bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1298bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SEQ (CPU Only) */ 1299bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1300bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1301bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardseq_emit_cpu( 1302bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1303bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1304bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1305bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1306bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL); 1307bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1308bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1309bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SGE (CPU Only) */ 1310bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1311bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsge_emit_cpu( 1312bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1313bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1314bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1315bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1316bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL); 1317bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1318bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1319bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SGT (CPU Only)*/ 1320bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1321bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1322bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsgt_emit_cpu( 1323bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1324bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1325bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1326bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1327bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GREATER); 1328bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1329bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1330579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_SHL (CPU Only) */ 1331579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1332579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieshl_emit_cpu( 1333579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1334579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1335579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1336579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1337579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_shl(&bld_base->uint_bld, 1338579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1339579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1340579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1341bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SIN (CPU Only) */ 1342bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1343bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsin_emit_cpu( 1344bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1345bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1346bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1347bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1348bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_sin(&bld_base->base, 1349bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1350bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1351bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1352bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SLE (CPU Only) */ 1353bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1354bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsle_emit_cpu( 1355bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1356bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1357bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1358bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1359bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LEQUAL); 1360bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1361bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1362bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SLT (CPU Only) */ 1363bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1364bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardslt_emit_cpu( 1365bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1366bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1367bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1368bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1369bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS); 1370bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1371bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1372bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SNE (CPU Only) */ 1373bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1374bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1375bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsne_emit_cpu( 1376bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1377bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1378bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1379bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1380bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL); 1381bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1382bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1383bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SSG (CPU Only) */ 1384bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1385bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1386bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardssg_emit_cpu( 1387bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1388bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1389bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1390bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1391bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->base, 1392bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1393bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1394bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1395bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_SUB (CPU Only) */ 1396bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1397bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1398bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardsub_emit_cpu( 1399bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1400bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1401bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1402bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1403bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->base, 1404bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0], 1405bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[1]); 1406bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1407bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1408bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard/* TGSI_OPCODE_TRUNC (CPU Only) */ 1409bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1410bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardstatic void 1411bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardtrunc_emit_cpu( 1412bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard const struct lp_build_tgsi_action * action, 1413bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base, 1414bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_emit_data * emit_data) 1415bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1416bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->output[emit_data->chan] = lp_build_trunc(&bld_base->base, 1417bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard emit_data->args[0]); 1418bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1419bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1420579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_UADD (CPU Only) */ 1421579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1422579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieuadd_emit_cpu( 1423579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1424579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1425579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1426579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1427579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_add(&bld_base->uint_bld, 1428579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1429579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1430579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1431579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_UDIV (CPU Only) */ 1432579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1433579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieudiv_emit_cpu( 1434579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1435579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1436579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1437579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1438579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_div(&bld_base->uint_bld, 1439579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1440579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1441579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1442579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_UMAX (CPU Only) */ 1443579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1444579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieumax_emit_cpu( 1445579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1446579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1447579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1448579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1449579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_max(&bld_base->uint_bld, 1450579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1451579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1452579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1453579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_UMIN (CPU Only) */ 1454579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1455579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieumin_emit_cpu( 1456579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1457579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1458579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1459579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1460579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_min(&bld_base->uint_bld, 1461579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1462579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1463579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1464579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_UMOD (CPU Only) */ 1465579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1466579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieumod_emit_cpu( 1467579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1468579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1469579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1470579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1471579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_mod(&bld_base->uint_bld, 1472579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1473579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1474579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1475579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_USET Helper (CPU Only) */ 1476579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1477579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieuset_emit_cpu( 1478579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1479579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1480579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data, 1481579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie unsigned pipe_func) 1482579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1483579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie LLVMValueRef nz = lp_build_const_vec(bld_base->base.gallivm, 1484579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->uint_bld.type, ~0U); 1485579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie LLVMValueRef cond = lp_build_cmp(&bld_base->uint_bld, pipe_func, 1486579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1487579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_select(&bld_base->uint_bld, 1488579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie cond, 1489579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie nz, 1490579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->uint_bld.zero); 1491579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1492579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1493579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1494579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_USEQ (CPU Only) */ 1495579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1496579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieuseq_emit_cpu( 1497579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1498579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1499579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1500579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1501579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL); 1502579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1503579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1504579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_ISGE (CPU Only) */ 1505579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1506579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieusge_emit_cpu( 1507579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1508579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1509579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1510579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1511579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL); 1512579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1513579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1514579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_USHR (CPU Only) */ 1515579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1516579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieushr_emit_cpu( 1517579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1518579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1519579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1520579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1521579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_shr(&bld_base->uint_bld, 1522579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], emit_data->args[1]); 1523579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1524579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1525579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_ISLT (CPU Only) */ 1526579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1527579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieuslt_emit_cpu( 1528579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1529579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1530579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1531579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1532579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS); 1533579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1534579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1535579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_USNE (CPU Only) */ 1536579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1537579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1538579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlieusne_emit_cpu( 1539579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1540579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1541579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1542579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1543579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL); 1544579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1545579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1546579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie/* TGSI_OPCODE_XOR */ 1547579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliestatic void 1548579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airliexor_emit_cpu( 1549579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie const struct lp_build_tgsi_action * action, 1550579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_tgsi_context * bld_base, 1551579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie struct lp_build_emit_data * emit_data) 1552579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie{ 1553579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->output[emit_data->chan] = lp_build_xor(&bld_base->uint_bld, 1554579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[0], 1555579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie emit_data->args[1]); 1556579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie} 1557579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1558bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardvoid 1559bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellardlp_set_default_actions_cpu( 1560bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard struct lp_build_tgsi_context * bld_base) 1561bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard{ 1562bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard lp_set_default_actions(bld_base); 1563bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_ABS].emit = abs_emit_cpu; 1564bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_ADD].emit = add_emit_cpu; 1565579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_AND].emit = and_emit_cpu; 1566117a0e91afa4fae55df88de48a058c9b881c6b14Dave Airlie bld_base->op_actions[TGSI_OPCODE_ARL].emit = arl_emit_cpu; 1567a206c4cd69a881bf3f8d960607d604b6d53e3a26José Fonseca bld_base->op_actions[TGSI_OPCODE_ARR].emit = arr_emit_cpu; 1568bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_CEIL].emit = ceil_emit_cpu; 1569bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_CND].emit = cnd_emit_cpu; 1570bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_COS].emit = cos_emit_cpu; 1571bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_CMP].emit = cmp_emit_cpu; 1572bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_DIV].emit = div_emit_cpu; 1573bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_EX2].emit = ex2_emit_cpu; 1574bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_EXP].emit = exp_emit_cpu; 1575579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_F2I].emit = f2i_emit_cpu; 15769d57d483cbcced5051d0dd4d48bbe750b5c15592Paul Berry bld_base->op_actions[TGSI_OPCODE_F2U].emit = f2u_emit_cpu; 1577bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_FLR].emit = flr_emit_cpu; 1578579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1579579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_I2F].emit = i2f_emit_cpu; 1580729d9148244551c6bcae00a760f39a6902c925efDave Airlie bld_base->op_actions[TGSI_OPCODE_IABS].emit = iabs_emit_cpu; 1581579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_IDIV].emit = idiv_emit_cpu; 1582579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_INEG].emit = ineg_emit_cpu; 1583579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_IMAX].emit = imax_emit_cpu; 1584579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_IMIN].emit = imin_emit_cpu; 1585579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_ISGE].emit = isge_emit_cpu; 1586579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_ISHR].emit = ishr_emit_cpu; 1587579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_ISLT].emit = islt_emit_cpu; 1588729d9148244551c6bcae00a760f39a6902c925efDave Airlie bld_base->op_actions[TGSI_OPCODE_ISSG].emit = issg_emit_cpu; 1589579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1590bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LG2].emit = lg2_emit_cpu; 1591bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_LOG].emit = log_emit_cpu; 1592bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_MAX].emit = max_emit_cpu; 1593bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_MIN].emit = min_emit_cpu; 1594579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_MOD].emit = mod_emit_cpu; 1595579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_NOT].emit = not_emit_cpu; 1596579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_OR].emit = or_emit_cpu; 1597bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_POW].emit = pow_emit_cpu; 1598bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_RCP].emit = rcp_emit_cpu; 1599bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_ROUND].emit = round_emit_cpu; 1600bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SEQ].emit = seq_emit_cpu; 1601bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SGE].emit = sge_emit_cpu; 1602bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SGT].emit = sgt_emit_cpu; 1603bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SIN].emit = sin_emit_cpu; 1604579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_SHL].emit = shl_emit_cpu; 1605bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SLE].emit = sle_emit_cpu; 1606bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SLT].emit = slt_emit_cpu; 1607bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SNE].emit = sne_emit_cpu; 1608bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SSG].emit = ssg_emit_cpu; 1609bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_SUB].emit = sub_emit_cpu; 1610bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->op_actions[TGSI_OPCODE_TRUNC].emit = trunc_emit_cpu; 1611bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard 1612bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard bld_base->rsq_action.emit = recip_sqrt_emit_cpu; 1613579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1614579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_UADD].emit = uadd_emit_cpu; 1615579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_UDIV].emit = udiv_emit_cpu; 1616579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_UMAX].emit = umax_emit_cpu; 1617579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_UMIN].emit = umin_emit_cpu; 1618579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_UMOD].emit = umod_emit_cpu; 1619579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_USEQ].emit = useq_emit_cpu; 1620579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_USGE].emit = usge_emit_cpu; 1621579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_USHR].emit = ushr_emit_cpu; 1622579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_USLT].emit = uslt_emit_cpu; 1623579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_USNE].emit = usne_emit_cpu; 1624579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1625579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie bld_base->op_actions[TGSI_OPCODE_XOR].emit = xor_emit_cpu; 1626579ccae73d29211c9f5c01ba527e1743ea39c94eDave Airlie 1627bc2875aa483a0fef7f6e32c1886f6e2edaba7694Tom Stellard} 1628