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