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