xref: /aosp_15_r20/external/mesa3d/src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /**************************************************************************
2  *
3  * Copyright 2011-2012 Advanced Micro Devices, Inc.
4  * Copyright 2009 VMware, Inc.
5  * Copyright 2007-2008 VMware, Inc.
6  * All Rights Reserved.
7  *
8  * Permission is hereby granted, free of charge, to any person obtaining a
9  * copy of this software and associated documentation files (the
10  * "Software"), to deal in the Software without restriction, including
11  * without limitation the rights to use, copy, modify, merge, publish,
12  * distribute, sub license, and/or sell copies of the Software, and to
13  * permit persons to whom the Software is furnished to do so, subject to
14  * the following conditions:
15  *
16  * The above copyright notice and this permission notice (including the
17  * next paragraph) shall be included in all copies or substantial portions
18  * of the Software.
19  *
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
23  * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
24  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27  *
28  **************************************************************************/
29 
30 /**
31  * @file
32  * TGSI to LLVM IR translation.
33  *
34  * @author Jose Fonseca <[email protected]>
35  * @author Tom Stellard <[email protected]>
36  *
37  * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell,
38  * Brian Paul, and others.
39  */
40 
41 
42 #include "lp_bld_tgsi_action.h"
43 
44 #include "lp_bld_tgsi.h"
45 #include "lp_bld_arit.h"
46 #include "lp_bld_bitarit.h"
47 #include "lp_bld_const.h"
48 #include "lp_bld_conv.h"
49 #include "lp_bld_gather.h"
50 #include "lp_bld_logic.h"
51 #include "lp_bld_pack.h"
52 
53 /* XXX: The CPU only defaults should be repaced by generic ones.  In most
54  * cases, the CPU defaults are just wrappers around a function in
55  * lp_build_arit.c and these functions should be inlined here and the CPU
56  * generic code should be removed and placed elsewhere.
57  */
58 
59 /* Default actions */
60 
61 /* Generic fetch_arg functions */
62 
scalar_unary_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)63 static void scalar_unary_fetch_args(
64    struct lp_build_tgsi_context * bld_base,
65    struct lp_build_emit_data * emit_data)
66 {
67    /* src0.x */
68    emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, 0);
69    emit_data->arg_count = 1;
70    emit_data->dst_type = LLVMTypeOf(emit_data->args[0]);
71 }
72 
scalar_binary_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)73 static void scalar_binary_fetch_args(
74    struct lp_build_tgsi_context * bld_base,
75    struct lp_build_emit_data * emit_data)
76 {
77    /* src0.x */
78    emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst,
79                                             0, TGSI_CHAN_X);
80    /* src1.x */
81    emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst,
82                                             1, TGSI_CHAN_X);
83    emit_data->arg_count = 2;
84    emit_data->dst_type = LLVMTypeOf(emit_data->args[0]);
85 }
86 
87 /* TGSI_OPCODE_ADD */
88 static void
add_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)89 add_emit(
90    const struct lp_build_tgsi_action * action,
91    struct lp_build_tgsi_context * bld_base,
92    struct lp_build_emit_data * emit_data)
93 {
94    emit_data->output[emit_data->chan] = LLVMBuildFAdd(
95                                 bld_base->base.gallivm->builder,
96                                 emit_data->args[0], emit_data->args[1], "");
97 }
98 
99 /* TGSI_OPCODE_ARR */
100 static void
arr_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)101 arr_emit(
102    const struct lp_build_tgsi_action * action,
103    struct lp_build_tgsi_context * bld_base,
104    struct lp_build_emit_data * emit_data)
105 {
106    LLVMValueRef tmp = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ROUND, emit_data->args[0]);
107    emit_data->output[emit_data->chan] = LLVMBuildFPToSI(bld_base->base.gallivm->builder, tmp,
108 							bld_base->uint_bld.vec_type, "");
109 }
110 
111 /* DP* Helper */
112 
113 static void
dp_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned dp_components)114 dp_fetch_args(
115    struct lp_build_tgsi_context * bld_base,
116    struct lp_build_emit_data * emit_data,
117    unsigned dp_components)
118 {
119    unsigned chan, src;
120    for (src = 0; src < 2; src++) {
121       for (chan = 0; chan < dp_components; chan++) {
122          emit_data->args[(src * dp_components) + chan] =
123                      lp_build_emit_fetch(bld_base, emit_data->inst, src, chan);
124       }
125    }
126    emit_data->dst_type = bld_base->base.elem_type;
127 }
128 
129 /* TGSI_OPCODE_DP2 */
130 static void
dp2_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)131 dp2_fetch_args(
132    struct lp_build_tgsi_context * bld_base,
133    struct lp_build_emit_data * emit_data)
134 {
135    dp_fetch_args(bld_base, emit_data, 2);
136 }
137 
138 static void
dp2_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)139 dp2_emit(
140    const struct lp_build_tgsi_action * action,
141    struct lp_build_tgsi_context * bld_base,
142    struct lp_build_emit_data * emit_data)
143 {
144    LLVMValueRef tmp0, tmp1;
145    tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
146                                     emit_data->args[0] /* src0.x */,
147                                     emit_data->args[2] /* src1.x */);
148    tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
149                                     emit_data->args[1] /* src0.y */,
150                                     emit_data->args[3] /* src1.y */);
151    emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
152                                                     TGSI_OPCODE_ADD, tmp0, tmp1);
153 }
154 
155 static struct lp_build_tgsi_action dp2_action = {
156    dp2_fetch_args,	 /* fetch_args */
157    dp2_emit	 /* emit */
158 };
159 
160 /* TGSI_OPCODE_DP3 */
161 static void
dp3_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)162 dp3_fetch_args(
163    struct lp_build_tgsi_context * bld_base,
164    struct lp_build_emit_data * emit_data)
165 {
166    dp_fetch_args(bld_base, emit_data, 3);
167 }
168 
169 static void
dp3_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)170 dp3_emit(
171    const struct lp_build_tgsi_action * action,
172    struct lp_build_tgsi_context * bld_base,
173    struct lp_build_emit_data * emit_data)
174 {
175    LLVMValueRef tmp0, tmp1;
176    tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
177                                     emit_data->args[0] /* src0.x */,
178                                     emit_data->args[3] /* src1.x */);
179    tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
180                                     emit_data->args[1] /* src0.y */,
181                                     emit_data->args[4] /* src1.y */);
182    tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp1, tmp0);
183    tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
184                                     emit_data->args[2] /* src0.z */,
185                                     emit_data->args[5] /* src1.z */);
186    emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
187                                                     TGSI_OPCODE_ADD, tmp0, tmp1);
188 }
189 
190 static struct lp_build_tgsi_action dp3_action = {
191    dp3_fetch_args,	 /* fetch_args */
192    dp3_emit	 /* emit */
193 };
194 
195 /* TGSI_OPCODDE_DP4 */
196 
197 static void
dp4_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)198 dp4_fetch_args(
199    struct lp_build_tgsi_context * bld_base,
200    struct lp_build_emit_data * emit_data)
201 {
202    dp_fetch_args(bld_base, emit_data, 4);
203 }
204 
205 static void
dp4_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)206 dp4_emit(
207    const struct lp_build_tgsi_action * action,
208    struct lp_build_tgsi_context * bld_base,
209    struct lp_build_emit_data * emit_data)
210 {
211    LLVMValueRef tmp0, tmp1;
212    tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
213                                     emit_data->args[0] /* src0.x */,
214                                     emit_data->args[4] /* src1.x */);
215    tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
216                                     emit_data->args[1] /* src0.y */,
217                                     emit_data->args[5] /* src1.y */);
218    tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp0, tmp1);
219    tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
220                                     emit_data->args[2] /* src0.z */,
221                                     emit_data->args[6] /* src1.z */);
222    tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp0, tmp1);
223    tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
224                                     emit_data->args[3] /* src0.w */,
225                                     emit_data->args[7] /* src1.w */);
226    emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
227                                                     TGSI_OPCODE_ADD, tmp0, tmp1);
228 }
229 
230 static struct lp_build_tgsi_action dp4_action = {
231    dp4_fetch_args,	 /* fetch_args */
232    dp4_emit	 /* emit */
233 };
234 
235 /* TGSI_OPCODE_DST */
236 static void
dst_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)237 dst_fetch_args(
238    struct lp_build_tgsi_context * bld_base,
239    struct lp_build_emit_data * emit_data)
240 {
241    /* src0.y */
242    emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst,
243                                             0, TGSI_CHAN_Y);
244    /* src0.z */
245    emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst,
246                                             0, TGSI_CHAN_Z);
247    /* src1.y */
248    emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst,
249                                             1, TGSI_CHAN_Y);
250    /* src1.w */
251    emit_data->args[3] = lp_build_emit_fetch(bld_base, emit_data->inst,
252                                             1, TGSI_CHAN_W);
253 }
254 
255 static void
dst_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)256 dst_emit(
257    const struct lp_build_tgsi_action * action,
258    struct lp_build_tgsi_context * bld_base,
259    struct lp_build_emit_data * emit_data)
260 {
261    /* dst.x */
262    emit_data->output[TGSI_CHAN_X] = bld_base->base.one;
263 
264    /* dst.y */
265    emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base,
266                                           TGSI_OPCODE_MUL,
267                                           emit_data->args[0] /* src0.y */,
268                                           emit_data->args[2] /* src1.y */);
269    /* dst.z */
270    emit_data->output[TGSI_CHAN_Z] = emit_data->args[1]; /* src0.z */
271 
272    /* dst.w */
273    emit_data->output[TGSI_CHAN_W] = emit_data->args[3]; /* src1.w */
274 }
275 
276 static struct lp_build_tgsi_action dst_action = {
277    dst_fetch_args,	 /* fetch_args */
278    dst_emit	 /* emit */
279 };
280 
281 /* TGSI_OPCODE_END */
282 static void
end_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)283 end_emit(
284    const struct lp_build_tgsi_action * action,
285    struct lp_build_tgsi_context * bld_base,
286    struct lp_build_emit_data * emit_data)
287 {
288    bld_base->pc = -1;
289 }
290 
291 /* TGSI_OPCODE_EXP */
292 
293 static void
exp_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)294 exp_emit(
295    const struct lp_build_tgsi_action * action,
296    struct lp_build_tgsi_context * bld_base,
297    struct lp_build_emit_data * emit_data)
298 {
299    LLVMValueRef floor_x;
300 
301    /* floor( src0.x ) */
302    floor_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR,
303                                       emit_data->args[0]);
304 
305    /* 2 ^ floor( src0.x ) */
306    emit_data->output[TGSI_CHAN_X] = lp_build_emit_llvm_unary(bld_base,
307                                        TGSI_OPCODE_EX2, floor_x);
308 
309    /* src0.x - floor( src0.x ) */
310    emit_data->output[TGSI_CHAN_Y] =
311       lp_build_sub(&bld_base->base, emit_data->args[0] /* src0.x */, floor_x);
312 
313    /* 2 ^ src0.x */
314    emit_data->output[TGSI_CHAN_Z] = lp_build_emit_llvm_unary(bld_base,
315                              TGSI_OPCODE_EX2, emit_data->args[0] /* src0.x */);
316 
317    emit_data->output[TGSI_CHAN_W] = bld_base->base.one;
318 }
319 
320 const struct lp_build_tgsi_action exp_action = {
321    scalar_unary_fetch_args,	 /* fetch_args */
322    exp_emit	 /* emit */
323 };
324 
325 /* TGSI_OPCODE_FRC */
326 
327 static void
frc_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)328 frc_emit(
329    const struct lp_build_tgsi_action * action,
330    struct lp_build_tgsi_context * bld_base,
331    struct lp_build_emit_data * emit_data)
332 {
333    LLVMValueRef tmp;
334    tmp = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR,
335                                   emit_data->args[0]);
336    emit_data->output[emit_data->chan] =
337       lp_build_sub(&bld_base->base, emit_data->args[0], tmp);
338 }
339 
340 /* TGSI_OPCODE_KILL_IF */
341 
342 static void
kil_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)343 kil_fetch_args(
344    struct lp_build_tgsi_context * bld_base,
345    struct lp_build_emit_data * emit_data)
346 {
347    /* src0.x */
348    emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst,
349                                             0, TGSI_CHAN_X);
350    /* src0.y */
351    emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst,
352                                             0, TGSI_CHAN_Y);
353    /* src0.z */
354    emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst,
355                                             0, TGSI_CHAN_Z);
356    /* src0.w */
357    emit_data->args[3] = lp_build_emit_fetch(bld_base, emit_data->inst,
358                                             0, TGSI_CHAN_W);
359    emit_data->arg_count = 4;
360    emit_data->dst_type = LLVMVoidTypeInContext(bld_base->base.gallivm->context);
361 }
362 
363 /* TGSI_OPCODE_KILL */
364 
365 static void
kilp_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)366 kilp_fetch_args(
367    struct lp_build_tgsi_context * bld_base,
368    struct lp_build_emit_data * emit_data)
369 {
370    emit_data->dst_type = LLVMVoidTypeInContext(bld_base->base.gallivm->context);
371 }
372 
373 /* TGSI_OPCODE_LIT */
374 
375 static void
lit_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)376 lit_fetch_args(
377    struct lp_build_tgsi_context * bld_base,
378    struct lp_build_emit_data * emit_data)
379 {
380    /* src0.x */
381    emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_X);
382    /* src0.y */
383    emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_Y);
384    /* src0.w */
385    emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_W);
386    emit_data->arg_count = 3;
387 }
388 
389 static void
lit_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)390 lit_emit(
391    const struct lp_build_tgsi_action * action,
392    struct lp_build_tgsi_context * bld_base,
393    struct lp_build_emit_data * emit_data)
394 {
395    LLVMValueRef tmp0, tmp1, tmp2;
396 
397    /* dst.x */
398    emit_data->output[TGSI_CHAN_X] = bld_base->base.one;
399 
400    /* dst. y */
401    emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base,
402                                                TGSI_OPCODE_MAX,
403                                                emit_data->args[0] /* src0.x */,
404                                                bld_base->base.zero);
405 
406    /* dst.z */
407    /* XMM[1] = SrcReg[0].yyyy */
408    tmp1 = emit_data->args[1];
409    /* XMM[1] = max(XMM[1], 0) */
410    tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MAX,
411                                     tmp1, bld_base->base.zero);
412    /* XMM[2] = SrcReg[0].wwww */
413    tmp2 = emit_data->args[2];
414    tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_POW,
415                                     tmp1, tmp2);
416    tmp0 = emit_data->args[0];
417    emit_data->output[TGSI_CHAN_Z] = lp_build_emit_llvm_ternary(bld_base,
418                                              TGSI_OPCODE_CMP,
419                                              tmp0, bld_base->base.zero, tmp1);
420    /* dst.w */
421    emit_data->output[TGSI_CHAN_W] = bld_base->base.one;
422 }
423 
424 static struct lp_build_tgsi_action lit_action = {
425    lit_fetch_args,	 /* fetch_args */
426    lit_emit	 /* emit */
427 };
428 
429 /* TGSI_OPCODE_LOG */
430 
431 static void
log_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)432 log_emit(
433    const struct lp_build_tgsi_action * action,
434    struct lp_build_tgsi_context * bld_base,
435    struct lp_build_emit_data * emit_data)
436 {
437 
438    LLVMValueRef abs_x, log_abs_x, flr_log_abs_x, ex2_flr_log_abs_x;
439 
440    /* abs( src0.x) */
441    abs_x = lp_build_abs(&bld_base->base, emit_data->args[0] /* src0.x */);
442 
443    /* log( abs( src0.x ) ) */
444    log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_LG2,
445                                         abs_x);
446 
447    /* floor( log( abs( src0.x ) ) ) */
448    flr_log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR,
449                                             log_abs_x);
450    /* dst.x */
451    emit_data->output[TGSI_CHAN_X] = flr_log_abs_x;
452 
453    /* dst.y */
454    ex2_flr_log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_EX2,
455                                                 flr_log_abs_x);
456 
457    /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */
458    emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base,
459                                     TGSI_OPCODE_DIV, abs_x, ex2_flr_log_abs_x);
460 
461    /* dst.x */
462    emit_data->output[TGSI_CHAN_Z] = log_abs_x;
463 
464    /* dst.w */
465    emit_data->output[TGSI_CHAN_W] = bld_base->base.one;
466 }
467 
468 static struct lp_build_tgsi_action log_action = {
469    scalar_unary_fetch_args,	 /* fetch_args */
470    log_emit	 /* emit */
471 };
472 
473 /* TGSI_OPCODE_PK2H */
474 
475 static void
pk2h_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)476 pk2h_fetch_args(
477    struct lp_build_tgsi_context * bld_base,
478    struct lp_build_emit_data * emit_data)
479 {
480    /* src0.x */
481    emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst,
482                                             0, TGSI_CHAN_X);
483    /* src0.y */
484    emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst,
485                                             0, TGSI_CHAN_Y);
486 }
487 
488 static void
pk2h_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)489 pk2h_emit(
490    const struct lp_build_tgsi_action *action,
491    struct lp_build_tgsi_context *bld_base,
492    struct lp_build_emit_data *emit_data)
493 {
494    struct gallivm_state *gallivm = bld_base->base.gallivm;
495    struct lp_type f16i_t;
496    LLVMValueRef lo, hi, res;
497 
498    f16i_t = lp_type_uint_vec(16, bld_base->base.type.length * 32);
499    lo = lp_build_float_to_half(gallivm, emit_data->args[0]);
500    hi = lp_build_float_to_half(gallivm, emit_data->args[1]);
501    /* maybe some interleave doubling vector width would be useful... */
502    lo = lp_build_pad_vector(gallivm, lo, bld_base->base.type.length * 2);
503    hi = lp_build_pad_vector(gallivm, hi, bld_base->base.type.length * 2);
504    res = lp_build_interleave2(gallivm, f16i_t, lo, hi, 0);
505 
506    emit_data->output[emit_data->chan] = res;
507 }
508 
509 static struct lp_build_tgsi_action pk2h_action = {
510    pk2h_fetch_args, /* fetch_args */
511    pk2h_emit        /* emit */
512 };
513 
514 /* TGSI_OPCODE_UP2H */
515 
516 static void
up2h_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)517 up2h_emit(
518    const struct lp_build_tgsi_action *action,
519    struct lp_build_tgsi_context *bld_base,
520    struct lp_build_emit_data *emit_data)
521 {
522    struct gallivm_state *gallivm = bld_base->base.gallivm;
523    LLVMBuilderRef builder = gallivm->builder;
524    LLVMContextRef context = gallivm->context;
525    LLVMValueRef lo, hi, res[2], arg;
526    unsigned nr = bld_base->base.type.length;
527    LLVMTypeRef i16t = LLVMVectorType(LLVMInt16TypeInContext(context), nr * 2);
528 
529    arg = LLVMBuildBitCast(builder, emit_data->args[0], i16t, "");
530    lo = lp_build_uninterleave1(gallivm, nr * 2, arg, 0);
531    hi = lp_build_uninterleave1(gallivm, nr * 2, arg, 1);
532    res[0] = lp_build_half_to_float(gallivm, lo);
533    res[1] = lp_build_half_to_float(gallivm, hi);
534 
535    emit_data->output[0] = emit_data->output[2] = res[0];
536    emit_data->output[1] = emit_data->output[3] = res[1];
537 }
538 
539 static struct lp_build_tgsi_action up2h_action = {
540    scalar_unary_fetch_args, /* fetch_args */
541    up2h_emit                /* emit */
542 };
543 
544 /* TGSI_OPCODE_LRP */
545 
546 static void
lrp_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)547 lrp_emit(
548    const struct lp_build_tgsi_action * action,
549    struct lp_build_tgsi_context * bld_base,
550    struct lp_build_emit_data * emit_data)
551 {
552    struct lp_build_context *bld = &bld_base->base;
553    LLVMValueRef inv, a, b;
554 
555    /* This uses the correct version: (1 - t)*a + t*b
556     *
557     * An alternative version is "a + t*(b-a)". The problem is this version
558     * doesn't return "b" for t = 1, because "a + (b-a)" isn't equal to "b"
559     * because of the floating-point rounding.
560     */
561    inv = lp_build_sub(bld, bld_base->base.one, emit_data->args[0]);
562    a = lp_build_mul(bld, emit_data->args[1], emit_data->args[0]);
563    b = lp_build_mul(bld, emit_data->args[2], inv);
564    emit_data->output[emit_data->chan] = lp_build_add(bld, a, b);
565 }
566 
567 /* TGSI_OPCODE_MAD */
568 
569 static void
mad_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)570 mad_emit(
571    const struct lp_build_tgsi_action * action,
572    struct lp_build_tgsi_context * bld_base,
573    struct lp_build_emit_data * emit_data)
574 {
575    LLVMValueRef tmp;
576    tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
577                                    emit_data->args[0],
578                                    emit_data->args[1]);
579    emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
580                                        TGSI_OPCODE_ADD, tmp, emit_data->args[2]);
581 }
582 
583 /* TGSI_OPCODE_MOV */
584 
585 static void
mov_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)586 mov_emit(
587    const struct lp_build_tgsi_action * action,
588    struct lp_build_tgsi_context * bld_base,
589    struct lp_build_emit_data * emit_data)
590 {
591    emit_data->output[emit_data->chan] = emit_data->args[0];
592 }
593 
594 /* TGSI_OPCODE_MUL */
595 static void
mul_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)596 mul_emit(
597    const struct lp_build_tgsi_action * action,
598    struct lp_build_tgsi_context * bld_base,
599    struct lp_build_emit_data * emit_data)
600 {
601    emit_data->output[emit_data->chan] = LLVMBuildFMul(
602                                    bld_base->base.gallivm->builder,
603                                    emit_data->args[0], emit_data->args[1], "");
604 }
605 
606 /*.TGSI_OPCODE_DIV.*/
fdiv_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)607 static void fdiv_emit(
608    const struct lp_build_tgsi_action * action,
609    struct lp_build_tgsi_context * bld_base,
610    struct lp_build_emit_data * emit_data)
611 {
612    emit_data->output[emit_data->chan] = LLVMBuildFDiv(
613                                    bld_base->base.gallivm->builder,
614                                    emit_data->args[0], emit_data->args[1], "");
615 }
616 
617 /*.TGSI_OPCODE_RCP.*/
rcp_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)618 static void rcp_emit(
619    const struct lp_build_tgsi_action * action,
620    struct lp_build_tgsi_context * bld_base,
621    struct lp_build_emit_data * emit_data)
622 {
623    LLVMValueRef one;
624    one = lp_build_const_float(bld_base->base.gallivm, 1.0f);
625    emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
626                                    TGSI_OPCODE_DIV, one, emit_data->args[0]);
627 }
628 
629 /* TGSI_OPCODE_POW */
630 
631 static void
pow_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)632 pow_emit(
633    const struct lp_build_tgsi_action * action,
634    struct lp_build_tgsi_context * bld_base,
635    struct lp_build_emit_data * emit_data)
636 {
637    emit_data->output[emit_data->chan] = lp_build_pow(&bld_base->base,
638                                    emit_data->args[0], emit_data->args[1]);
639 }
640 
641 static struct lp_build_tgsi_action pow_action = {
642    scalar_binary_fetch_args,	 /* fetch_args */
643    pow_emit	 /* emit */
644 };
645 
646 /* TGSI_OPCODE_RSQ */
647 
648 static void
rsq_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)649 rsq_emit(
650    const struct lp_build_tgsi_action * action,
651    struct lp_build_tgsi_context * bld_base,
652    struct lp_build_emit_data * emit_data)
653 {
654    if (bld_base->rsq_action.emit) {
655       bld_base->rsq_action.emit(&bld_base->rsq_action, bld_base, emit_data);
656    } else {
657       emit_data->output[emit_data->chan] = bld_base->base.undef;
658    }
659 }
660 
661 const struct lp_build_tgsi_action rsq_action = {
662    scalar_unary_fetch_args,	 /* fetch_args */
663    rsq_emit	 /* emit */
664 
665 };
666 
667 /* TGSI_OPCODE_SQRT */
668 
669 static void
sqrt_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)670 sqrt_emit(
671    const struct lp_build_tgsi_action * action,
672    struct lp_build_tgsi_context * bld_base,
673    struct lp_build_emit_data * emit_data)
674 {
675    if (bld_base->sqrt_action.emit) {
676       bld_base->sqrt_action.emit(&bld_base->sqrt_action, bld_base, emit_data);
677    } else {
678       emit_data->output[emit_data->chan] = bld_base->base.undef;
679    }
680 }
681 
682 const struct lp_build_tgsi_action sqrt_action = {
683    scalar_unary_fetch_args,	 /* fetch_args */
684    sqrt_emit	 /* emit */
685 };
686 
687 /* TGSI_OPCODE_F2U */
688 static void
f2u_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)689 f2u_emit(
690    const struct lp_build_tgsi_action * action,
691    struct lp_build_tgsi_context * bld_base,
692    struct lp_build_emit_data * emit_data)
693 {
694    emit_data->output[emit_data->chan] =
695       LLVMBuildFPToUI(bld_base->base.gallivm->builder,
696                       emit_data->args[0],
697                       bld_base->base.int_vec_type, "");
698 }
699 
700 /* TGSI_OPCODE_U2F */
701 static void
u2f_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)702 u2f_emit(
703    const struct lp_build_tgsi_action * action,
704    struct lp_build_tgsi_context * bld_base,
705    struct lp_build_emit_data * emit_data)
706 {
707    emit_data->output[emit_data->chan] =
708       LLVMBuildUIToFP(bld_base->base.gallivm->builder,
709                       emit_data->args[0],
710                       bld_base->base.vec_type, "");
711 }
712 
713 static void
umad_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)714 umad_emit(
715    const struct lp_build_tgsi_action * action,
716    struct lp_build_tgsi_context * bld_base,
717    struct lp_build_emit_data * emit_data)
718 {
719    LLVMValueRef tmp;
720    tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_UMUL,
721                                    emit_data->args[0],
722                                    emit_data->args[1]);
723    emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
724                                        TGSI_OPCODE_UADD, tmp, emit_data->args[2]);
725 }
726 
727 /* TGSI_OPCODE_UMUL */
728 static void
umul_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)729 umul_emit(
730    const struct lp_build_tgsi_action * action,
731    struct lp_build_tgsi_context * bld_base,
732    struct lp_build_emit_data * emit_data)
733 {
734    emit_data->output[emit_data->chan] = lp_build_mul(&bld_base->uint_bld,
735                                    emit_data->args[0], emit_data->args[1]);
736 }
737 
738 /* TGSI_OPCODE_IMUL_HI */
739 static void
imul_hi_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)740 imul_hi_emit(
741    const struct lp_build_tgsi_action * action,
742    struct lp_build_tgsi_context * bld_base,
743    struct lp_build_emit_data * emit_data)
744 {
745    struct lp_build_context *int_bld = &bld_base->int_bld;
746    LLVMValueRef hi_bits;
747 
748    assert(int_bld->type.width == 32);
749 
750    /* low result bits are tossed away */
751    lp_build_mul_32_lohi(int_bld, emit_data->args[0],
752                         emit_data->args[1], &hi_bits);
753    emit_data->output[emit_data->chan] = hi_bits;
754 }
755 
756 static void
imul_hi_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)757 imul_hi_emit_cpu(
758    const struct lp_build_tgsi_action * action,
759    struct lp_build_tgsi_context * bld_base,
760    struct lp_build_emit_data * emit_data)
761 {
762    struct lp_build_context *int_bld = &bld_base->int_bld;
763    LLVMValueRef hi_bits;
764 
765    assert(int_bld->type.width == 32);
766 
767    /* low result bits are tossed away */
768    lp_build_mul_32_lohi_cpu(int_bld, emit_data->args[0],
769                             emit_data->args[1], &hi_bits);
770    emit_data->output[emit_data->chan] = hi_bits;
771 }
772 
773 /* TGSI_OPCODE_UMUL_HI */
774 static void
umul_hi_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)775 umul_hi_emit(
776    const struct lp_build_tgsi_action * action,
777    struct lp_build_tgsi_context * bld_base,
778    struct lp_build_emit_data * emit_data)
779 {
780    struct lp_build_context *uint_bld = &bld_base->uint_bld;
781    LLVMValueRef hi_bits;
782 
783    assert(uint_bld->type.width == 32);
784 
785    /* low result bits are tossed away */
786    lp_build_mul_32_lohi(uint_bld, emit_data->args[0],
787                         emit_data->args[1], &hi_bits);
788    emit_data->output[emit_data->chan] = hi_bits;
789 }
790 
791 static void
umul_hi_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)792 umul_hi_emit_cpu(
793    const struct lp_build_tgsi_action * action,
794    struct lp_build_tgsi_context * bld_base,
795    struct lp_build_emit_data * emit_data)
796 {
797    struct lp_build_context *uint_bld = &bld_base->uint_bld;
798    LLVMValueRef hi_bits;
799 
800    assert(uint_bld->type.width == 32);
801 
802    /* low result bits are tossed away */
803    lp_build_mul_32_lohi_cpu(uint_bld, emit_data->args[0],
804                             emit_data->args[1], &hi_bits);
805    emit_data->output[emit_data->chan] = hi_bits;
806 }
807 
808 /* TGSI_OPCODE_MAX */
fmax_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)809 static void fmax_emit(
810    const struct lp_build_tgsi_action * action,
811    struct lp_build_tgsi_context * bld_base,
812    struct lp_build_emit_data * emit_data)
813 {
814    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
815    emit_data->output[emit_data->chan] = LLVMBuildSelect(builder,
816                                    LLVMBuildFCmp(builder, LLVMRealUGE,
817                                    emit_data->args[0], emit_data->args[1], ""),
818                                    emit_data->args[0], emit_data->args[1], "");
819 }
820 
821 /* TGSI_OPCODE_MIN */
fmin_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)822 static void fmin_emit(
823    const struct lp_build_tgsi_action * action,
824    struct lp_build_tgsi_context * bld_base,
825    struct lp_build_emit_data * emit_data)
826 {
827    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
828    emit_data->output[emit_data->chan] = LLVMBuildSelect(builder,
829                                    LLVMBuildFCmp(builder, LLVMRealUGE,
830                                    emit_data->args[0], emit_data->args[1], ""),
831                                    emit_data->args[1], emit_data->args[0], "");
832 }
833 
834 /* TGSI_OPCODE_D2F */
835 static void
d2f_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)836 d2f_emit(
837    const struct lp_build_tgsi_action * action,
838    struct lp_build_tgsi_context * bld_base,
839    struct lp_build_emit_data * emit_data)
840 {
841    emit_data->output[emit_data->chan] =
842       LLVMBuildFPTrunc(bld_base->base.gallivm->builder,
843                       emit_data->args[0],
844                        bld_base->base.vec_type, "");
845 }
846 
847 /* TGSI_OPCODE_D2I */
848 static void
d2i_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)849 d2i_emit(
850    const struct lp_build_tgsi_action * action,
851    struct lp_build_tgsi_context * bld_base,
852    struct lp_build_emit_data * emit_data)
853 {
854    emit_data->output[emit_data->chan] =
855       LLVMBuildFPToSI(bld_base->base.gallivm->builder,
856                       emit_data->args[0],
857                       bld_base->base.int_vec_type, "");
858 }
859 
860 /* TGSI_OPCODE_D2U */
861 static void
d2u_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)862 d2u_emit(
863    const struct lp_build_tgsi_action * action,
864    struct lp_build_tgsi_context * bld_base,
865    struct lp_build_emit_data * emit_data)
866 {
867    emit_data->output[emit_data->chan] =
868       LLVMBuildFPToUI(bld_base->base.gallivm->builder,
869                       emit_data->args[0],
870                       bld_base->base.int_vec_type, "");
871 }
872 
873 /* TGSI_OPCODE_F2D */
874 static void
f2d_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)875 f2d_emit(
876    const struct lp_build_tgsi_action * action,
877    struct lp_build_tgsi_context * bld_base,
878    struct lp_build_emit_data * emit_data)
879 {
880    emit_data->output[emit_data->chan] =
881       LLVMBuildFPExt(bld_base->base.gallivm->builder,
882                       emit_data->args[0],
883                       bld_base->dbl_bld.vec_type, "");
884 }
885 
886 /* TGSI_OPCODE_U2D */
887 static void
u2d_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)888 u2d_emit(
889    const struct lp_build_tgsi_action * action,
890    struct lp_build_tgsi_context * bld_base,
891    struct lp_build_emit_data * emit_data)
892 {
893    emit_data->output[emit_data->chan] =
894       LLVMBuildUIToFP(bld_base->base.gallivm->builder,
895                       emit_data->args[0],
896                       bld_base->dbl_bld.vec_type, "");
897 }
898 
899 /* TGSI_OPCODE_I2D */
900 static void
i2d_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)901 i2d_emit(
902    const struct lp_build_tgsi_action * action,
903    struct lp_build_tgsi_context * bld_base,
904    struct lp_build_emit_data * emit_data)
905 {
906    emit_data->output[emit_data->chan] =
907       LLVMBuildSIToFP(bld_base->base.gallivm->builder,
908                       emit_data->args[0],
909                       bld_base->dbl_bld.vec_type, "");
910 }
911 
912 /* TGSI_OPCODE_DMAD */
913 static void
dmad_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)914 dmad_emit(
915    const struct lp_build_tgsi_action * action,
916    struct lp_build_tgsi_context * bld_base,
917    struct lp_build_emit_data * emit_data)
918 {
919    LLVMValueRef tmp;
920    tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_DMUL,
921                                    emit_data->args[0],
922                                    emit_data->args[1]);
923    emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
924                                        TGSI_OPCODE_DADD, tmp, emit_data->args[2]);
925 }
926 
927 /*.TGSI_OPCODE_DRCP.*/
drcp_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)928 static void drcp_emit(
929    const struct lp_build_tgsi_action * action,
930    struct lp_build_tgsi_context * bld_base,
931    struct lp_build_emit_data * emit_data)
932 {
933    LLVMValueRef one;
934    one = lp_build_const_vec(bld_base->dbl_bld.gallivm, bld_base->dbl_bld.type, 1.0f);
935    emit_data->output[emit_data->chan] = LLVMBuildFDiv(
936       bld_base->base.gallivm->builder,
937       one, emit_data->args[0], "");
938 }
939 
940 /* TGSI_OPCODE_DFRAC */
dfrac_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)941 static void dfrac_emit(
942    const struct lp_build_tgsi_action * action,
943    struct lp_build_tgsi_context * bld_base,
944    struct lp_build_emit_data * emit_data)
945 {
946    LLVMValueRef tmp;
947    tmp = lp_build_floor(&bld_base->dbl_bld,
948 			emit_data->args[0]);
949    emit_data->output[emit_data->chan] =  LLVMBuildFSub(bld_base->base.gallivm->builder,
950                                                        emit_data->args[0], tmp, "");
951 }
952 
953 static void
u64mul_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)954 u64mul_emit(
955    const struct lp_build_tgsi_action * action,
956    struct lp_build_tgsi_context * bld_base,
957    struct lp_build_emit_data * emit_data)
958 {
959    emit_data->output[emit_data->chan] = lp_build_mul(&bld_base->uint64_bld,
960                                    emit_data->args[0], emit_data->args[1]);
961 }
962 
963 static void
u64mod_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)964 u64mod_emit_cpu(
965    const struct lp_build_tgsi_action * action,
966    struct lp_build_tgsi_context * bld_base,
967    struct lp_build_emit_data * emit_data)
968 {
969    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
970    LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint64_bld,
971                                         PIPE_FUNC_EQUAL, emit_data->args[1],
972                                         bld_base->uint64_bld.zero);
973    /* We want to make sure that we never divide/mod by zero to not
974     * generate sigfpe. We don't want to crash just because the
975     * shader is doing something weird. */
976    LLVMValueRef divisor = LLVMBuildOr(builder,
977                                       div_mask,
978                                       emit_data->args[1], "");
979    LLVMValueRef result = lp_build_mod(&bld_base->uint64_bld,
980                                       emit_data->args[0], divisor);
981    /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
982    emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
983                                                     div_mask,
984                                                     result, "");
985 }
986 
987 static void
i64mod_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)988 i64mod_emit_cpu(
989    const struct lp_build_tgsi_action * action,
990    struct lp_build_tgsi_context * bld_base,
991    struct lp_build_emit_data * emit_data)
992 {
993    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
994    LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint64_bld,
995                                         PIPE_FUNC_EQUAL, emit_data->args[1],
996                                         bld_base->uint64_bld.zero);
997    /* We want to make sure that we never divide/mod by zero to not
998     * generate sigfpe. We don't want to crash just because the
999     * shader is doing something weird. */
1000    LLVMValueRef divisor = LLVMBuildOr(builder,
1001                                       div_mask,
1002                                       emit_data->args[1], "");
1003    LLVMValueRef result = lp_build_mod(&bld_base->int64_bld,
1004                                       emit_data->args[0], divisor);
1005    /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1006    emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
1007                                                     div_mask,
1008                                                     result, "");
1009 }
1010 
1011 static void
u64div_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1012 u64div_emit_cpu(
1013    const struct lp_build_tgsi_action * action,
1014    struct lp_build_tgsi_context * bld_base,
1015    struct lp_build_emit_data * emit_data)
1016 {
1017 
1018    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1019    LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint64_bld,
1020                                         PIPE_FUNC_EQUAL, emit_data->args[1],
1021                                         bld_base->uint64_bld.zero);
1022    /* We want to make sure that we never divide/mod by zero to not
1023     * generate sigfpe. We don't want to crash just because the
1024     * shader is doing something weird. */
1025    LLVMValueRef divisor = LLVMBuildOr(builder,
1026                                       div_mask,
1027                                       emit_data->args[1], "");
1028    LLVMValueRef result = LLVMBuildUDiv(builder,
1029 				       emit_data->args[0], divisor, "");
1030    /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1031    emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
1032                                                     div_mask,
1033                                                     result, "");
1034 }
1035 
1036 static void
i64div_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1037 i64div_emit_cpu(
1038    const struct lp_build_tgsi_action * action,
1039    struct lp_build_tgsi_context * bld_base,
1040    struct lp_build_emit_data * emit_data)
1041 {
1042 
1043    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1044    LLVMValueRef div_mask = lp_build_cmp(&bld_base->int64_bld,
1045                                         PIPE_FUNC_EQUAL, emit_data->args[1],
1046                                         bld_base->int64_bld.zero);
1047    /* We want to make sure that we never divide/mod by zero to not
1048     * generate sigfpe. We don't want to crash just because the
1049     * shader is doing something weird. */
1050    LLVMValueRef divisor = LLVMBuildOr(builder,
1051                                       div_mask,
1052                                       emit_data->args[1], "");
1053    LLVMValueRef result = LLVMBuildSDiv(builder,
1054 				       emit_data->args[0], divisor, "");
1055    /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1056    emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
1057                                                     div_mask,
1058                                                     result, "");
1059 }
1060 
1061 static void
f2u64_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1062 f2u64_emit(
1063    const struct lp_build_tgsi_action * action,
1064    struct lp_build_tgsi_context * bld_base,
1065    struct lp_build_emit_data * emit_data)
1066 {
1067    emit_data->output[emit_data->chan] =
1068       LLVMBuildFPToUI(bld_base->base.gallivm->builder,
1069                       emit_data->args[0],
1070                       bld_base->uint64_bld.vec_type, "");
1071 }
1072 
1073 static void
f2i64_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1074 f2i64_emit(
1075    const struct lp_build_tgsi_action * action,
1076    struct lp_build_tgsi_context * bld_base,
1077    struct lp_build_emit_data * emit_data)
1078 {
1079    emit_data->output[emit_data->chan] =
1080       LLVMBuildFPToSI(bld_base->base.gallivm->builder,
1081                       emit_data->args[0],
1082                       bld_base->int64_bld.vec_type, "");
1083 }
1084 
1085 static void
u2i64_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1086 u2i64_emit(
1087    const struct lp_build_tgsi_action * action,
1088    struct lp_build_tgsi_context * bld_base,
1089    struct lp_build_emit_data * emit_data)
1090 {
1091    emit_data->output[emit_data->chan] =
1092       LLVMBuildZExt(bld_base->base.gallivm->builder,
1093                       emit_data->args[0],
1094                       bld_base->uint64_bld.vec_type, "");
1095 }
1096 
1097 static void
i2i64_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1098 i2i64_emit(
1099    const struct lp_build_tgsi_action * action,
1100    struct lp_build_tgsi_context * bld_base,
1101    struct lp_build_emit_data * emit_data)
1102 {
1103    emit_data->output[emit_data->chan] =
1104       LLVMBuildSExt(bld_base->base.gallivm->builder,
1105                       emit_data->args[0],
1106                       bld_base->int64_bld.vec_type, "");
1107 }
1108 
1109 static void
i642f_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1110 i642f_emit(
1111    const struct lp_build_tgsi_action * action,
1112    struct lp_build_tgsi_context * bld_base,
1113    struct lp_build_emit_data * emit_data)
1114 {
1115    emit_data->output[emit_data->chan] =
1116       LLVMBuildSIToFP(bld_base->base.gallivm->builder,
1117                       emit_data->args[0],
1118                       bld_base->base.vec_type, "");
1119 }
1120 
1121 static void
u642f_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1122 u642f_emit(
1123    const struct lp_build_tgsi_action * action,
1124    struct lp_build_tgsi_context * bld_base,
1125    struct lp_build_emit_data * emit_data)
1126 {
1127    emit_data->output[emit_data->chan] =
1128       LLVMBuildUIToFP(bld_base->base.gallivm->builder,
1129                       emit_data->args[0],
1130                       bld_base->base.vec_type, "");
1131 }
1132 
1133 static void
i642d_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1134 i642d_emit(
1135    const struct lp_build_tgsi_action * action,
1136    struct lp_build_tgsi_context * bld_base,
1137    struct lp_build_emit_data * emit_data)
1138 {
1139    emit_data->output[emit_data->chan] =
1140       LLVMBuildSIToFP(bld_base->base.gallivm->builder,
1141                       emit_data->args[0],
1142                       bld_base->dbl_bld.vec_type, "");
1143 }
1144 
1145 static void
u642d_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1146 u642d_emit(
1147    const struct lp_build_tgsi_action * action,
1148    struct lp_build_tgsi_context * bld_base,
1149    struct lp_build_emit_data * emit_data)
1150 {
1151    emit_data->output[emit_data->chan] =
1152       LLVMBuildUIToFP(bld_base->base.gallivm->builder,
1153                       emit_data->args[0],
1154                       bld_base->dbl_bld.vec_type, "");
1155 }
1156 
1157 void
lp_set_default_actions(struct lp_build_tgsi_context * bld_base)1158 lp_set_default_actions(struct lp_build_tgsi_context * bld_base)
1159 {
1160    bld_base->op_actions[TGSI_OPCODE_DP2] = dp2_action;
1161    bld_base->op_actions[TGSI_OPCODE_DP3] = dp3_action;
1162    bld_base->op_actions[TGSI_OPCODE_DP4] = dp4_action;
1163    bld_base->op_actions[TGSI_OPCODE_DST] = dst_action;
1164    bld_base->op_actions[TGSI_OPCODE_EXP] = exp_action;
1165    bld_base->op_actions[TGSI_OPCODE_LIT] = lit_action;
1166    bld_base->op_actions[TGSI_OPCODE_LOG] = log_action;
1167    bld_base->op_actions[TGSI_OPCODE_PK2H] = pk2h_action;
1168    bld_base->op_actions[TGSI_OPCODE_RSQ] = rsq_action;
1169    bld_base->op_actions[TGSI_OPCODE_SQRT] = sqrt_action;
1170    bld_base->op_actions[TGSI_OPCODE_POW] = pow_action;
1171    bld_base->op_actions[TGSI_OPCODE_UP2H] = up2h_action;
1172 
1173    bld_base->op_actions[TGSI_OPCODE_SWITCH].fetch_args = scalar_unary_fetch_args;
1174    bld_base->op_actions[TGSI_OPCODE_CASE].fetch_args = scalar_unary_fetch_args;
1175    bld_base->op_actions[TGSI_OPCODE_COS].fetch_args = scalar_unary_fetch_args;
1176    bld_base->op_actions[TGSI_OPCODE_EX2].fetch_args = scalar_unary_fetch_args;
1177    bld_base->op_actions[TGSI_OPCODE_IF].fetch_args = scalar_unary_fetch_args;
1178    bld_base->op_actions[TGSI_OPCODE_UIF].fetch_args = scalar_unary_fetch_args;
1179    bld_base->op_actions[TGSI_OPCODE_KILL_IF].fetch_args = kil_fetch_args;
1180    bld_base->op_actions[TGSI_OPCODE_KILL].fetch_args = kilp_fetch_args;
1181    bld_base->op_actions[TGSI_OPCODE_RCP].fetch_args = scalar_unary_fetch_args;
1182    bld_base->op_actions[TGSI_OPCODE_SIN].fetch_args = scalar_unary_fetch_args;
1183    bld_base->op_actions[TGSI_OPCODE_LG2].fetch_args = scalar_unary_fetch_args;
1184 
1185    bld_base->op_actions[TGSI_OPCODE_ADD].emit = add_emit;
1186    bld_base->op_actions[TGSI_OPCODE_ARR].emit = arr_emit;
1187    bld_base->op_actions[TGSI_OPCODE_END].emit = end_emit;
1188    bld_base->op_actions[TGSI_OPCODE_FRC].emit = frc_emit;
1189    bld_base->op_actions[TGSI_OPCODE_LRP].emit = lrp_emit;
1190    bld_base->op_actions[TGSI_OPCODE_MAD].emit = mad_emit;
1191    bld_base->op_actions[TGSI_OPCODE_MOV].emit = mov_emit;
1192    bld_base->op_actions[TGSI_OPCODE_MUL].emit = mul_emit;
1193    bld_base->op_actions[TGSI_OPCODE_DIV].emit = fdiv_emit;
1194    bld_base->op_actions[TGSI_OPCODE_RCP].emit = rcp_emit;
1195 
1196    bld_base->op_actions[TGSI_OPCODE_UARL].emit = mov_emit;
1197    bld_base->op_actions[TGSI_OPCODE_F2U].emit = f2u_emit;
1198    bld_base->op_actions[TGSI_OPCODE_U2F].emit = u2f_emit;
1199    bld_base->op_actions[TGSI_OPCODE_UMAD].emit = umad_emit;
1200    bld_base->op_actions[TGSI_OPCODE_UMUL].emit = umul_emit;
1201    bld_base->op_actions[TGSI_OPCODE_IMUL_HI].emit = imul_hi_emit;
1202    bld_base->op_actions[TGSI_OPCODE_UMUL_HI].emit = umul_hi_emit;
1203 
1204    bld_base->op_actions[TGSI_OPCODE_MAX].emit = fmax_emit;
1205    bld_base->op_actions[TGSI_OPCODE_MIN].emit = fmin_emit;
1206 
1207    bld_base->op_actions[TGSI_OPCODE_DADD].emit = add_emit;
1208    bld_base->op_actions[TGSI_OPCODE_DMAX].emit = fmax_emit;
1209    bld_base->op_actions[TGSI_OPCODE_DMIN].emit = fmin_emit;
1210    bld_base->op_actions[TGSI_OPCODE_DMUL].emit = mul_emit;
1211    bld_base->op_actions[TGSI_OPCODE_DDIV].emit = fdiv_emit;
1212 
1213    bld_base->op_actions[TGSI_OPCODE_D2F].emit = d2f_emit;
1214    bld_base->op_actions[TGSI_OPCODE_D2I].emit = d2i_emit;
1215    bld_base->op_actions[TGSI_OPCODE_D2U].emit = d2u_emit;
1216 
1217    bld_base->op_actions[TGSI_OPCODE_F2D].emit = f2d_emit;
1218    bld_base->op_actions[TGSI_OPCODE_I2D].emit = i2d_emit;
1219    bld_base->op_actions[TGSI_OPCODE_U2D].emit = u2d_emit;
1220 
1221    bld_base->op_actions[TGSI_OPCODE_DMAD].emit = dmad_emit;
1222 
1223    bld_base->op_actions[TGSI_OPCODE_DRCP].emit = drcp_emit;
1224    bld_base->op_actions[TGSI_OPCODE_DFRAC].emit = dfrac_emit;
1225 
1226    bld_base->op_actions[TGSI_OPCODE_U64MUL].emit = u64mul_emit;
1227 
1228    bld_base->op_actions[TGSI_OPCODE_F2I64].emit = f2i64_emit;
1229    bld_base->op_actions[TGSI_OPCODE_F2U64].emit = f2u64_emit;
1230 
1231    bld_base->op_actions[TGSI_OPCODE_D2I64].emit = f2i64_emit;
1232    bld_base->op_actions[TGSI_OPCODE_D2U64].emit = f2u64_emit;
1233 
1234    bld_base->op_actions[TGSI_OPCODE_I2I64].emit = i2i64_emit;
1235    bld_base->op_actions[TGSI_OPCODE_U2I64].emit = u2i64_emit;
1236 
1237    bld_base->op_actions[TGSI_OPCODE_I642F].emit = i642f_emit;
1238    bld_base->op_actions[TGSI_OPCODE_U642F].emit = u642f_emit;
1239 
1240    bld_base->op_actions[TGSI_OPCODE_I642F].emit = i642f_emit;
1241    bld_base->op_actions[TGSI_OPCODE_U642F].emit = u642f_emit;
1242 
1243    bld_base->op_actions[TGSI_OPCODE_I642D].emit = i642d_emit;
1244    bld_base->op_actions[TGSI_OPCODE_U642D].emit = u642d_emit;
1245 
1246 }
1247 
1248 /* CPU Only default actions */
1249 
1250 /* These actions are CPU only, because they could potentially output SSE
1251  * intrinsics.
1252  */
1253 
1254 /* TGSI_OPCODE_ADD (CPU Only) */
1255 static void
add_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1256 add_emit_cpu(
1257    const struct lp_build_tgsi_action * action,
1258    struct lp_build_tgsi_context * bld_base,
1259    struct lp_build_emit_data * emit_data)
1260 {
1261    emit_data->output[emit_data->chan] = lp_build_add(&bld_base->base,
1262                                    emit_data->args[0], emit_data->args[1]);
1263 }
1264 
1265 /* TGSI_OPCODE_AND (CPU Only) */
1266 static void
and_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1267 and_emit_cpu(
1268    const struct lp_build_tgsi_action * action,
1269    struct lp_build_tgsi_context * bld_base,
1270    struct lp_build_emit_data * emit_data)
1271 {
1272    emit_data->output[emit_data->chan] = lp_build_and(&bld_base->uint_bld,
1273                                    emit_data->args[0], emit_data->args[1]);
1274 }
1275 
1276 /* TGSI_OPCODE_ARL (CPU Only) */
1277 static void
arl_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1278 arl_emit_cpu(
1279    const struct lp_build_tgsi_action * action,
1280    struct lp_build_tgsi_context * bld_base,
1281    struct lp_build_emit_data * emit_data)
1282 {
1283    LLVMValueRef tmp;
1284    tmp = lp_build_floor(&bld_base->base,
1285 			emit_data->args[0]);
1286    emit_data->output[emit_data->chan] = LLVMBuildFPToSI(bld_base->base.gallivm->builder, tmp,
1287 							bld_base->uint_bld.vec_type, "");
1288 }
1289 
1290 /* TGSI_OPCODE_ARR (CPU Only) */
1291 static void
arr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1292 arr_emit_cpu(
1293    const struct lp_build_tgsi_action * action,
1294    struct lp_build_tgsi_context * bld_base,
1295    struct lp_build_emit_data * emit_data)
1296 {
1297    emit_data->output[emit_data->chan] = lp_build_iround(&bld_base->base, emit_data->args[0]);
1298 }
1299 
1300 /* TGSI_OPCODE_CEIL (CPU Only) */
1301 static void
ceil_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1302 ceil_emit_cpu(
1303    const struct lp_build_tgsi_action * action,
1304    struct lp_build_tgsi_context * bld_base,
1305    struct lp_build_emit_data * emit_data)
1306 {
1307    emit_data->output[emit_data->chan] = lp_build_ceil(&bld_base->base,
1308                                                       emit_data->args[0]);
1309 }
1310 
1311 /* TGSI_OPCODE_CMP (CPU Only) */
1312 static void
cmp_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1313 cmp_emit_cpu(
1314    const struct lp_build_tgsi_action * action,
1315    struct lp_build_tgsi_context * bld_base,
1316    struct lp_build_emit_data * emit_data)
1317 {
1318    LLVMValueRef cond = lp_build_cmp(&bld_base->base, PIPE_FUNC_LESS,
1319                                    emit_data->args[0], bld_base->base.zero);
1320    emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base,
1321                                 cond, emit_data->args[1], emit_data->args[2]);
1322 }
1323 
1324 /* TGSI_OPCODE_UCMP (CPU Only) */
1325 static void
ucmp_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1326 ucmp_emit_cpu(
1327    const struct lp_build_tgsi_action * action,
1328    struct lp_build_tgsi_context * bld_base,
1329    struct lp_build_emit_data * emit_data)
1330 {
1331    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1332    struct lp_build_context *uint_bld = &bld_base->uint_bld;
1333    LLVMValueRef unsigned_cond =
1334       LLVMBuildBitCast(builder, emit_data->args[0], uint_bld->vec_type, "");
1335    LLVMValueRef cond = lp_build_cmp(uint_bld, PIPE_FUNC_NOTEQUAL,
1336                                     unsigned_cond,
1337                                     uint_bld->zero);
1338    emit_data->output[emit_data->chan] =
1339       lp_build_select(&bld_base->base,
1340                       cond, emit_data->args[1], emit_data->args[2]);
1341 }
1342 
1343 /* TGSI_OPCODE_COS (CPU Only) */
1344 static void
cos_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1345 cos_emit_cpu(
1346    const struct lp_build_tgsi_action * action,
1347    struct lp_build_tgsi_context * bld_base,
1348    struct lp_build_emit_data * emit_data)
1349 {
1350    emit_data->output[emit_data->chan] = lp_build_cos(&bld_base->base,
1351                                                        emit_data->args[0]);
1352 }
1353 
1354 /* TGSI_OPCODE_DIV (CPU Only) */
1355 static void
div_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1356 div_emit_cpu(
1357    const struct lp_build_tgsi_action * action,
1358    struct lp_build_tgsi_context * bld_base,
1359    struct lp_build_emit_data * emit_data)
1360 {
1361    emit_data->output[emit_data->chan] = lp_build_div(&bld_base->base,
1362                                    emit_data->args[0], emit_data->args[1]);
1363 }
1364 
1365 /* TGSI_OPCODE_EX2 (CPU Only) */
1366 static void
ex2_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1367 ex2_emit_cpu(
1368    const struct lp_build_tgsi_action * action,
1369    struct lp_build_tgsi_context * bld_base,
1370    struct lp_build_emit_data * emit_data)
1371 {
1372    emit_data->output[emit_data->chan] = lp_build_exp2(&bld_base->base,
1373                                                         emit_data->args[0]);
1374 }
1375 
1376 /* TGSI_OPCODE_F2I (CPU Only) */
1377 static void
f2i_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1378 f2i_emit_cpu(
1379    const struct lp_build_tgsi_action * action,
1380    struct lp_build_tgsi_context * bld_base,
1381    struct lp_build_emit_data * emit_data)
1382 {
1383    emit_data->output[emit_data->chan] = lp_build_itrunc(&bld_base->base,
1384                                                         emit_data->args[0]);
1385 }
1386 
1387 /* TGSI_OPCODE_FSET Helper (CPU Only) */
1388 static void
fset_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)1389 fset_emit_cpu(
1390    const struct lp_build_tgsi_action * action,
1391    struct lp_build_tgsi_context * bld_base,
1392    struct lp_build_emit_data * emit_data,
1393    unsigned pipe_func)
1394 {
1395    LLVMValueRef cond;
1396 
1397    if (pipe_func != PIPE_FUNC_NOTEQUAL) {
1398       cond = lp_build_cmp_ordered(&bld_base->base, pipe_func,
1399                                   emit_data->args[0], emit_data->args[1]);
1400    }
1401    else {
1402       cond = lp_build_cmp(&bld_base->base, pipe_func,
1403                           emit_data->args[0], emit_data->args[1]);
1404 
1405    }
1406    emit_data->output[emit_data->chan] = cond;
1407 }
1408 
1409 
1410 /* TGSI_OPCODE_FSEQ (CPU Only) */
1411 static void
fseq_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1412 fseq_emit_cpu(
1413    const struct lp_build_tgsi_action * action,
1414    struct lp_build_tgsi_context * bld_base,
1415    struct lp_build_emit_data * emit_data)
1416 {
1417    fset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL);
1418 }
1419 
1420 /* TGSI_OPCODE_ISGE (CPU Only) */
1421 static void
fsge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1422 fsge_emit_cpu(
1423    const struct lp_build_tgsi_action * action,
1424    struct lp_build_tgsi_context * bld_base,
1425    struct lp_build_emit_data * emit_data)
1426 {
1427    fset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
1428 }
1429 
1430 /* TGSI_OPCODE_ISLT (CPU Only) */
1431 static void
fslt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1432 fslt_emit_cpu(
1433    const struct lp_build_tgsi_action * action,
1434    struct lp_build_tgsi_context * bld_base,
1435    struct lp_build_emit_data * emit_data)
1436 {
1437    fset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
1438 }
1439 
1440 /* TGSI_OPCODE_USNE (CPU Only) */
1441 
1442 static void
fsne_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1443 fsne_emit_cpu(
1444    const struct lp_build_tgsi_action * action,
1445    struct lp_build_tgsi_context * bld_base,
1446    struct lp_build_emit_data * emit_data)
1447 {
1448    fset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL);
1449 }
1450 
1451 /* TGSI_OPCODE_FLR (CPU Only) */
1452 
1453 static void
flr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1454 flr_emit_cpu(
1455    const struct lp_build_tgsi_action * action,
1456    struct lp_build_tgsi_context * bld_base,
1457    struct lp_build_emit_data * emit_data)
1458 {
1459    emit_data->output[emit_data->chan] = lp_build_floor(&bld_base->base,
1460                                                          emit_data->args[0]);
1461 }
1462 
1463 /* TGSI_OPCODE_I2F (CPU Only) */
1464 static void
i2f_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1465 i2f_emit_cpu(
1466    const struct lp_build_tgsi_action * action,
1467    struct lp_build_tgsi_context * bld_base,
1468    struct lp_build_emit_data * emit_data)
1469 {
1470    emit_data->output[emit_data->chan] = lp_build_int_to_float(&bld_base->base,
1471                                                               emit_data->args[0]);
1472 }
1473 
1474 /* TGSI_OPCODE_IABS (CPU Only) */
1475 static void
iabs_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1476 iabs_emit_cpu(
1477    const struct lp_build_tgsi_action * action,
1478    struct lp_build_tgsi_context * bld_base,
1479    struct lp_build_emit_data * emit_data)
1480 {
1481    emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->int_bld,
1482                                                        emit_data->args[0]);
1483 }
1484 
1485 /* TGSI_OPCODE_IDIV (CPU Only) */
1486 static void
idiv_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1487 idiv_emit_cpu(
1488    const struct lp_build_tgsi_action * action,
1489    struct lp_build_tgsi_context * bld_base,
1490    struct lp_build_emit_data * emit_data)
1491 {
1492    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1493    LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint_bld,
1494                                         PIPE_FUNC_EQUAL, emit_data->args[1],
1495                                         bld_base->uint_bld.zero);
1496    /* We want to make sure that we never divide/mod by zero to not
1497     * generate sigfpe. We don't want to crash just because the
1498     * shader is doing something weird. */
1499    LLVMValueRef divisor = LLVMBuildOr(builder,
1500                                       div_mask,
1501                                       emit_data->args[1], "");
1502    LLVMValueRef result = lp_build_div(&bld_base->int_bld,
1503                                       emit_data->args[0], divisor);
1504    LLVMValueRef not_div_mask = LLVMBuildNot(builder,
1505                                             div_mask,"");
1506    /* idiv by zero doesn't have a guaranteed return value chose 0 for now. */
1507    emit_data->output[emit_data->chan] = LLVMBuildAnd(builder,
1508                                                      not_div_mask,
1509                                                      result, "");
1510 }
1511 
1512 /* TGSI_OPCODE_INEG (CPU Only) */
1513 static void
ineg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1514 ineg_emit_cpu(
1515    const struct lp_build_tgsi_action * action,
1516    struct lp_build_tgsi_context * bld_base,
1517    struct lp_build_emit_data * emit_data)
1518 {
1519    emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->int_bld,
1520                                                      bld_base->int_bld.zero,
1521                                                      emit_data->args[0]);
1522 }
1523 
1524 /* TGSI_OPCODE_ISET Helper (CPU Only) */
1525 static void
iset_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)1526 iset_emit_cpu(
1527    const struct lp_build_tgsi_action * action,
1528    struct lp_build_tgsi_context * bld_base,
1529    struct lp_build_emit_data * emit_data,
1530    unsigned pipe_func)
1531 {
1532    LLVMValueRef cond = lp_build_cmp(&bld_base->int_bld, pipe_func,
1533                                     emit_data->args[0], emit_data->args[1]);
1534    emit_data->output[emit_data->chan] = cond;
1535 }
1536 
1537 /* TGSI_OPCODE_IMAX (CPU Only) */
1538 static void
imax_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1539 imax_emit_cpu(
1540    const struct lp_build_tgsi_action * action,
1541    struct lp_build_tgsi_context * bld_base,
1542    struct lp_build_emit_data * emit_data)
1543 {
1544    emit_data->output[emit_data->chan] = lp_build_max(&bld_base->int_bld,
1545                                    emit_data->args[0], emit_data->args[1]);
1546 }
1547 
1548 /* TGSI_OPCODE_IMIN (CPU Only) */
1549 static void
imin_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1550 imin_emit_cpu(
1551    const struct lp_build_tgsi_action * action,
1552    struct lp_build_tgsi_context * bld_base,
1553    struct lp_build_emit_data * emit_data)
1554 {
1555    emit_data->output[emit_data->chan] = lp_build_min(&bld_base->int_bld,
1556                                    emit_data->args[0], emit_data->args[1]);
1557 }
1558 
1559 /* TGSI_OPCODE_ISGE (CPU Only) */
1560 static void
isge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1561 isge_emit_cpu(
1562    const struct lp_build_tgsi_action * action,
1563    struct lp_build_tgsi_context * bld_base,
1564    struct lp_build_emit_data * emit_data)
1565 {
1566    iset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
1567 }
1568 
1569 /* TGSI_OPCODE_ISHR (CPU Only) */
1570 static void
ishr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1571 ishr_emit_cpu(
1572    const struct lp_build_tgsi_action * action,
1573    struct lp_build_tgsi_context * bld_base,
1574    struct lp_build_emit_data * emit_data)
1575 {
1576    struct lp_build_context *int_bld = &bld_base->int_bld;
1577    LLVMValueRef mask = lp_build_const_vec(int_bld->gallivm, int_bld->type,
1578                                           int_bld->type.width - 1);
1579    LLVMValueRef masked_count = lp_build_and(int_bld, emit_data->args[1], mask);
1580    emit_data->output[emit_data->chan] = lp_build_shr(int_bld, emit_data->args[0],
1581                                                      masked_count);
1582 }
1583 
1584 /* TGSI_OPCODE_ISLT (CPU Only) */
1585 static void
islt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1586 islt_emit_cpu(
1587    const struct lp_build_tgsi_action * action,
1588    struct lp_build_tgsi_context * bld_base,
1589    struct lp_build_emit_data * emit_data)
1590 {
1591    iset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
1592 }
1593 
1594 
1595 /* TGSI_OPCODE_ISSG (CPU Only) */
1596 static void
issg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1597 issg_emit_cpu(
1598    const struct lp_build_tgsi_action * action,
1599    struct lp_build_tgsi_context * bld_base,
1600    struct lp_build_emit_data * emit_data)
1601 {
1602    emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->int_bld,
1603                                                        emit_data->args[0]);
1604 }
1605 
1606 /* TGSI_OPCODE_LG2 (CPU Only) */
1607 static void
lg2_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1608 lg2_emit_cpu(
1609    const struct lp_build_tgsi_action * action,
1610    struct lp_build_tgsi_context * bld_base,
1611    struct lp_build_emit_data * emit_data)
1612 {
1613    emit_data->output[emit_data->chan] = lp_build_log2_safe(&bld_base->base,
1614                                                            emit_data->args[0]);
1615 }
1616 
1617 /* TGSI_OPCODE_LOG (CPU Only) */
1618 static void
log_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1619 log_emit_cpu(
1620    const struct lp_build_tgsi_action * action,
1621    struct lp_build_tgsi_context * bld_base,
1622    struct lp_build_emit_data * emit_data)
1623 {
1624    LLVMValueRef p_floor_log2;
1625    LLVMValueRef p_exp;
1626    LLVMValueRef p_log2;
1627    LLVMValueRef src0 = emit_data->args[0];
1628 
1629    lp_build_log2_approx(&bld_base->base, src0,
1630                         &p_exp, &p_floor_log2, &p_log2, false);
1631 
1632    emit_data->output[TGSI_CHAN_X] = p_floor_log2;
1633 
1634    emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base,
1635                                              TGSI_OPCODE_DIV,
1636                                              src0, p_exp);
1637    emit_data->output[TGSI_CHAN_Z] = p_log2;
1638 
1639    emit_data->output[TGSI_CHAN_W] = bld_base->base.one;
1640 
1641 }
1642 
1643 /* TGSI_OPCODE_MAD (CPU Only) */
1644 
1645 static void
mad_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1646 mad_emit_cpu(
1647    const struct lp_build_tgsi_action * action,
1648    struct lp_build_tgsi_context * bld_base,
1649    struct lp_build_emit_data * emit_data)
1650 {
1651    emit_data->output[emit_data->chan] =
1652       lp_build_mad(&bld_base->base,
1653                    emit_data->args[0], emit_data->args[1], emit_data->args[2]);
1654 }
1655 
1656 /* TGSI_OPCODE_MAX (CPU Only) */
1657 
1658 static void
max_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1659 max_emit_cpu(
1660    const struct lp_build_tgsi_action * action,
1661    struct lp_build_tgsi_context * bld_base,
1662    struct lp_build_emit_data * emit_data)
1663 {
1664    emit_data->output[emit_data->chan] =
1665       lp_build_max_ext(&bld_base->base,
1666                        emit_data->args[0], emit_data->args[1],
1667                        GALLIVM_NAN_RETURN_OTHER);
1668 }
1669 
1670 /* TGSI_OPCODE_MIN (CPU Only) */
1671 static void
min_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1672 min_emit_cpu(
1673    const struct lp_build_tgsi_action * action,
1674    struct lp_build_tgsi_context * bld_base,
1675    struct lp_build_emit_data * emit_data)
1676 {
1677    emit_data->output[emit_data->chan] =
1678       lp_build_min_ext(&bld_base->base,
1679                        emit_data->args[0], emit_data->args[1],
1680                        GALLIVM_NAN_RETURN_OTHER);
1681 }
1682 
1683 /* TGSI_OPCODE_MOD (CPU Only) */
1684 static void
mod_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1685 mod_emit_cpu(
1686    const struct lp_build_tgsi_action * action,
1687    struct lp_build_tgsi_context * bld_base,
1688    struct lp_build_emit_data * emit_data)
1689 {
1690    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1691    LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint_bld,
1692                                         PIPE_FUNC_EQUAL, emit_data->args[1],
1693                                         bld_base->uint_bld.zero);
1694    /* We want to make sure that we never divide/mod by zero to not
1695     * generate sigfpe. We don't want to crash just because the
1696     * shader is doing something weird. */
1697    LLVMValueRef divisor = LLVMBuildOr(builder,
1698                                       div_mask,
1699                                       emit_data->args[1], "");
1700    LLVMValueRef result = lp_build_mod(&bld_base->int_bld,
1701                                       emit_data->args[0], divisor);
1702    /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1703    emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
1704                                                     div_mask,
1705                                                     result, "");
1706 }
1707 
1708 /* TGSI_OPCODE_NOT */
1709 static void
not_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1710 not_emit_cpu(
1711    const struct lp_build_tgsi_action * action,
1712    struct lp_build_tgsi_context * bld_base,
1713    struct lp_build_emit_data * emit_data)
1714 {
1715    emit_data->output[emit_data->chan] = lp_build_not(&bld_base->uint_bld,
1716                                                      emit_data->args[0]);
1717 }
1718 
1719 /* TGSI_OPCODE_OR (CPU Only) */
1720 static void
or_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1721 or_emit_cpu(
1722    const struct lp_build_tgsi_action * action,
1723    struct lp_build_tgsi_context * bld_base,
1724    struct lp_build_emit_data * emit_data)
1725 {
1726    emit_data->output[emit_data->chan] = lp_build_or(&bld_base->uint_bld,
1727                                    emit_data->args[0], emit_data->args[1]);
1728 }
1729 
1730 /* TGSI_OPCODE_POW (CPU Only) */
1731 static void
pow_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1732 pow_emit_cpu(
1733    const struct lp_build_tgsi_action * action,
1734    struct lp_build_tgsi_context * bld_base,
1735    struct lp_build_emit_data * emit_data)
1736 {
1737    emit_data->output[emit_data->chan] = lp_build_pow(&bld_base->base,
1738                                    emit_data->args[0], emit_data->args[1]);
1739 }
1740 
1741 
1742 /* TGSI_OPCODE_RCP (CPU Only) */
1743 
1744 static void
rcp_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1745 rcp_emit_cpu(
1746    const struct lp_build_tgsi_action * action,
1747    struct lp_build_tgsi_context * bld_base,
1748    struct lp_build_emit_data * emit_data)
1749 {
1750    emit_data->output[emit_data->chan] = lp_build_rcp(&bld_base->base,
1751                                                        emit_data->args[0]);
1752 }
1753 
1754 /* Reciprical squareroot (CPU Only) */
1755 static void
recip_sqrt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1756 recip_sqrt_emit_cpu(
1757    const struct lp_build_tgsi_action * action,
1758    struct lp_build_tgsi_context * bld_base,
1759    struct lp_build_emit_data * emit_data)
1760 {
1761    emit_data->output[emit_data->chan] = lp_build_rsqrt(&bld_base->base,
1762                                                          emit_data->args[0]);
1763 }
1764 
1765 static void
sqrt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1766 sqrt_emit_cpu(
1767    const struct lp_build_tgsi_action * action,
1768    struct lp_build_tgsi_context * bld_base,
1769    struct lp_build_emit_data * emit_data)
1770 {
1771    emit_data->output[emit_data->chan] = lp_build_sqrt(&bld_base->base,
1772                                                       emit_data->args[0]);
1773 }
1774 
1775 
1776 /* TGSI_OPCODE_ROUND (CPU Only) */
1777 static void
round_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1778 round_emit_cpu(
1779    const struct lp_build_tgsi_action * action,
1780    struct lp_build_tgsi_context * bld_base,
1781    struct lp_build_emit_data * emit_data)
1782 {
1783    emit_data->output[emit_data->chan] = lp_build_round(&bld_base->base,
1784                                                          emit_data->args[0]);
1785 }
1786 
1787 /* TGSI_OPCODE_SET Helper (CPU Only) */
1788 
1789 static void
set_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)1790 set_emit_cpu(
1791    const struct lp_build_tgsi_action * action,
1792    struct lp_build_tgsi_context * bld_base,
1793    struct lp_build_emit_data * emit_data,
1794    unsigned pipe_func)
1795 {
1796    LLVMValueRef cond;
1797 
1798    if (pipe_func != PIPE_FUNC_NOTEQUAL) {
1799       cond = lp_build_cmp_ordered(&bld_base->base, pipe_func,
1800                                   emit_data->args[0], emit_data->args[1]);
1801    }
1802    else {
1803       cond = lp_build_cmp(&bld_base->base, pipe_func,
1804                           emit_data->args[0], emit_data->args[1]);
1805 
1806    }
1807    emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base,
1808                                           cond,
1809                                           bld_base->base.one,
1810                                           bld_base->base.zero);
1811 }
1812 
1813 /* TGSI_OPCODE_SEQ (CPU Only) */
1814 
1815 static void
seq_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1816 seq_emit_cpu(
1817    const struct lp_build_tgsi_action * action,
1818    struct lp_build_tgsi_context * bld_base,
1819    struct lp_build_emit_data * emit_data)
1820 {
1821    set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL);
1822 }
1823 
1824 /* TGSI_OPCODE_SGE (CPU Only) */
1825 static void
sge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1826 sge_emit_cpu(
1827    const struct lp_build_tgsi_action * action,
1828    struct lp_build_tgsi_context * bld_base,
1829    struct lp_build_emit_data * emit_data)
1830 {
1831    set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
1832 }
1833 
1834 /* TGSI_OPCODE_SGT (CPU Only)*/
1835 
1836 static void
sgt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1837 sgt_emit_cpu(
1838    const struct lp_build_tgsi_action * action,
1839    struct lp_build_tgsi_context * bld_base,
1840    struct lp_build_emit_data * emit_data)
1841 {
1842    set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GREATER);
1843 }
1844 
1845 /* TGSI_OPCODE_SHL (CPU Only) */
1846 static void
shl_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1847 shl_emit_cpu(
1848    const struct lp_build_tgsi_action * action,
1849    struct lp_build_tgsi_context * bld_base,
1850    struct lp_build_emit_data * emit_data)
1851 {
1852    struct lp_build_context *uint_bld = &bld_base->uint_bld;
1853    LLVMValueRef mask = lp_build_const_vec(uint_bld->gallivm, uint_bld->type,
1854                                           uint_bld->type.width - 1);
1855    LLVMValueRef masked_count = lp_build_and(uint_bld, emit_data->args[1], mask);
1856    emit_data->output[emit_data->chan] = lp_build_shl(uint_bld, emit_data->args[0],
1857                                                      masked_count);
1858 }
1859 
1860 /* TGSI_OPCODE_SIN (CPU Only) */
1861 static void
sin_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1862 sin_emit_cpu(
1863    const struct lp_build_tgsi_action * action,
1864    struct lp_build_tgsi_context * bld_base,
1865    struct lp_build_emit_data * emit_data)
1866 {
1867    emit_data->output[emit_data->chan] = lp_build_sin(&bld_base->base,
1868                                                        emit_data->args[0]);
1869 }
1870 
1871 /* TGSI_OPCODE_SLE (CPU Only) */
1872 static void
sle_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1873 sle_emit_cpu(
1874    const struct lp_build_tgsi_action * action,
1875    struct lp_build_tgsi_context * bld_base,
1876    struct lp_build_emit_data * emit_data)
1877 {
1878    set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LEQUAL);
1879 }
1880 
1881 /* TGSI_OPCODE_SLT (CPU Only) */
1882 static void
slt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1883 slt_emit_cpu(
1884    const struct lp_build_tgsi_action * action,
1885    struct lp_build_tgsi_context * bld_base,
1886    struct lp_build_emit_data * emit_data)
1887 {
1888    set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
1889 }
1890 
1891 /* TGSI_OPCODE_SNE (CPU Only) */
1892 
1893 static void
sne_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1894 sne_emit_cpu(
1895    const struct lp_build_tgsi_action * action,
1896    struct lp_build_tgsi_context * bld_base,
1897    struct lp_build_emit_data * emit_data)
1898 {
1899    set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL);
1900 }
1901 
1902 /* TGSI_OPCODE_SSG (CPU Only) */
1903 
1904 static void
ssg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1905 ssg_emit_cpu(
1906    const struct lp_build_tgsi_action * action,
1907    struct lp_build_tgsi_context * bld_base,
1908    struct lp_build_emit_data * emit_data)
1909 {
1910    emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->base,
1911                                                        emit_data->args[0]);
1912 }
1913 
1914 /* TGSI_OPCODE_TRUNC (CPU Only) */
1915 
1916 static void
trunc_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1917 trunc_emit_cpu(
1918    const struct lp_build_tgsi_action * action,
1919    struct lp_build_tgsi_context * bld_base,
1920    struct lp_build_emit_data * emit_data)
1921 {
1922    emit_data->output[emit_data->chan] = lp_build_trunc(&bld_base->base,
1923                                                          emit_data->args[0]);
1924 }
1925 
1926 /* TGSI_OPCODE_UADD (CPU Only) */
1927 static void
uadd_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1928 uadd_emit_cpu(
1929    const struct lp_build_tgsi_action * action,
1930    struct lp_build_tgsi_context * bld_base,
1931    struct lp_build_emit_data * emit_data)
1932 {
1933    emit_data->output[emit_data->chan] = lp_build_add(&bld_base->uint_bld,
1934                                    emit_data->args[0], emit_data->args[1]);
1935 }
1936 
1937 /* TGSI_OPCODE_UDIV (CPU Only) */
1938 static void
udiv_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1939 udiv_emit_cpu(
1940    const struct lp_build_tgsi_action * action,
1941    struct lp_build_tgsi_context * bld_base,
1942    struct lp_build_emit_data * emit_data)
1943 {
1944 
1945    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1946    LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint_bld,
1947                                         PIPE_FUNC_EQUAL, emit_data->args[1],
1948                                         bld_base->uint_bld.zero);
1949    /* We want to make sure that we never divide/mod by zero to not
1950     * generate sigfpe. We don't want to crash just because the
1951     * shader is doing something weird. */
1952    LLVMValueRef divisor = LLVMBuildOr(builder,
1953                                       div_mask,
1954                                       emit_data->args[1], "");
1955    LLVMValueRef result = lp_build_div(&bld_base->uint_bld,
1956                                       emit_data->args[0], divisor);
1957    /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1958    emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
1959                                                     div_mask,
1960                                                     result, "");
1961 }
1962 
1963 /* TGSI_OPCODE_UMAX (CPU Only) */
1964 static void
umax_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1965 umax_emit_cpu(
1966    const struct lp_build_tgsi_action * action,
1967    struct lp_build_tgsi_context * bld_base,
1968    struct lp_build_emit_data * emit_data)
1969 {
1970    emit_data->output[emit_data->chan] = lp_build_max(&bld_base->uint_bld,
1971                                    emit_data->args[0], emit_data->args[1]);
1972 }
1973 
1974 /* TGSI_OPCODE_UMIN (CPU Only) */
1975 static void
umin_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1976 umin_emit_cpu(
1977    const struct lp_build_tgsi_action * action,
1978    struct lp_build_tgsi_context * bld_base,
1979    struct lp_build_emit_data * emit_data)
1980 {
1981    emit_data->output[emit_data->chan] = lp_build_min(&bld_base->uint_bld,
1982                                    emit_data->args[0], emit_data->args[1]);
1983 }
1984 
1985 /* TGSI_OPCODE_UMOD (CPU Only) */
1986 static void
umod_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1987 umod_emit_cpu(
1988    const struct lp_build_tgsi_action * action,
1989    struct lp_build_tgsi_context * bld_base,
1990    struct lp_build_emit_data * emit_data)
1991 {
1992    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1993    LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint_bld,
1994                                         PIPE_FUNC_EQUAL, emit_data->args[1],
1995                                         bld_base->uint_bld.zero);
1996    /* We want to make sure that we never divide/mod by zero to not
1997     * generate sigfpe. We don't want to crash just because the
1998     * shader is doing something weird. */
1999    LLVMValueRef divisor = LLVMBuildOr(builder,
2000                                       div_mask,
2001                                       emit_data->args[1], "");
2002    LLVMValueRef result = lp_build_mod(&bld_base->uint_bld,
2003                                       emit_data->args[0], divisor);
2004    /* umod by zero is guaranteed to return 0xffffffff */
2005    emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
2006                                                     div_mask,
2007                                                     result, "");
2008 }
2009 
2010 /* TGSI_OPCODE_USET Helper (CPU Only) */
2011 static void
uset_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)2012 uset_emit_cpu(
2013    const struct lp_build_tgsi_action * action,
2014    struct lp_build_tgsi_context * bld_base,
2015    struct lp_build_emit_data * emit_data,
2016    unsigned pipe_func)
2017 {
2018    LLVMValueRef cond = lp_build_cmp(&bld_base->uint_bld, pipe_func,
2019                                     emit_data->args[0], emit_data->args[1]);
2020    emit_data->output[emit_data->chan] = cond;
2021 }
2022 
2023 
2024 /* TGSI_OPCODE_USEQ (CPU Only) */
2025 static void
useq_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2026 useq_emit_cpu(
2027    const struct lp_build_tgsi_action * action,
2028    struct lp_build_tgsi_context * bld_base,
2029    struct lp_build_emit_data * emit_data)
2030 {
2031    uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL);
2032 }
2033 
2034 /* TGSI_OPCODE_ISGE (CPU Only) */
2035 static void
usge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2036 usge_emit_cpu(
2037    const struct lp_build_tgsi_action * action,
2038    struct lp_build_tgsi_context * bld_base,
2039    struct lp_build_emit_data * emit_data)
2040 {
2041    uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
2042 }
2043 
2044 /* TGSI_OPCODE_USHR (CPU Only) */
2045 static void
ushr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2046 ushr_emit_cpu(
2047    const struct lp_build_tgsi_action * action,
2048    struct lp_build_tgsi_context * bld_base,
2049    struct lp_build_emit_data * emit_data)
2050 {
2051    struct lp_build_context *uint_bld = &bld_base->uint_bld;
2052    LLVMValueRef mask = lp_build_const_vec(uint_bld->gallivm, uint_bld->type,
2053                                           uint_bld->type.width - 1);
2054    LLVMValueRef masked_count = lp_build_and(uint_bld, emit_data->args[1], mask);
2055    emit_data->output[emit_data->chan] = lp_build_shr(uint_bld, emit_data->args[0],
2056                                                      masked_count);
2057 }
2058 
2059 /* TGSI_OPCODE_ISLT (CPU Only) */
2060 static void
uslt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2061 uslt_emit_cpu(
2062    const struct lp_build_tgsi_action * action,
2063    struct lp_build_tgsi_context * bld_base,
2064    struct lp_build_emit_data * emit_data)
2065 {
2066    uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
2067 }
2068 
2069 /* TGSI_OPCODE_USNE (CPU Only) */
2070 
2071 static void
usne_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2072 usne_emit_cpu(
2073    const struct lp_build_tgsi_action * action,
2074    struct lp_build_tgsi_context * bld_base,
2075    struct lp_build_emit_data * emit_data)
2076 {
2077    uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL);
2078 }
2079 
2080 /* TGSI_OPCODE_XOR */
2081 static void
xor_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2082 xor_emit_cpu(
2083    const struct lp_build_tgsi_action * action,
2084    struct lp_build_tgsi_context * bld_base,
2085    struct lp_build_emit_data * emit_data)
2086 {
2087    emit_data->output[emit_data->chan] = lp_build_xor(&bld_base->uint_bld,
2088                                                      emit_data->args[0],
2089                                                      emit_data->args[1]);
2090 }
2091 
2092 /* TGSI_OPCODE_DABS (CPU Only) */
2093 static void
dabs_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2094 dabs_emit_cpu(
2095    const struct lp_build_tgsi_action * action,
2096    struct lp_build_tgsi_context * bld_base,
2097    struct lp_build_emit_data * emit_data)
2098 {
2099    emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->dbl_bld,
2100                                                        emit_data->args[0]);
2101 }
2102 
2103 /* TGSI_OPCODE_DNEG (CPU Only) */
2104 static void
dneg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2105 dneg_emit_cpu(
2106    const struct lp_build_tgsi_action * action,
2107    struct lp_build_tgsi_context * bld_base,
2108    struct lp_build_emit_data * emit_data)
2109 {
2110    emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->dbl_bld,
2111                                                      bld_base->dbl_bld.zero,
2112                                                      emit_data->args[0]);
2113 }
2114 
2115 /* TGSI_OPCODE_DSET Helper (CPU Only) */
2116 static void
dset_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)2117 dset_emit_cpu(
2118    const struct lp_build_tgsi_action * action,
2119    struct lp_build_tgsi_context * bld_base,
2120    struct lp_build_emit_data * emit_data,
2121    unsigned pipe_func)
2122 {
2123    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
2124    LLVMValueRef cond = lp_build_cmp(&bld_base->dbl_bld, pipe_func,
2125                                     emit_data->args[0], emit_data->args[1]);
2126    /* arguments were 64 bit but store as 32 bit */
2127    cond = LLVMBuildTrunc(builder, cond, bld_base->int_bld.int_vec_type, "");
2128    emit_data->output[emit_data->chan] = cond;
2129 }
2130 
2131 /* TGSI_OPCODE_DSEQ (CPU Only) */
2132 static void
dseq_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2133 dseq_emit_cpu(
2134    const struct lp_build_tgsi_action * action,
2135    struct lp_build_tgsi_context * bld_base,
2136    struct lp_build_emit_data * emit_data)
2137 {
2138    dset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL);
2139 }
2140 
2141 /* TGSI_OPCODE_DSGE (CPU Only) */
2142 static void
dsge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2143 dsge_emit_cpu(
2144    const struct lp_build_tgsi_action * action,
2145    struct lp_build_tgsi_context * bld_base,
2146    struct lp_build_emit_data * emit_data)
2147 {
2148    dset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
2149 }
2150 
2151 /* TGSI_OPCODE_DSLT (CPU Only) */
2152 static void
dslt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2153 dslt_emit_cpu(
2154    const struct lp_build_tgsi_action * action,
2155    struct lp_build_tgsi_context * bld_base,
2156    struct lp_build_emit_data * emit_data)
2157 {
2158    dset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
2159 }
2160 
2161 /* TGSI_OPCODE_DSNE (CPU Only) */
2162 static void
dsne_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2163 dsne_emit_cpu(
2164    const struct lp_build_tgsi_action * action,
2165    struct lp_build_tgsi_context * bld_base,
2166    struct lp_build_emit_data * emit_data)
2167 {
2168    dset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL);
2169 }
2170 
2171 /* Double Reciprocal squareroot (CPU Only) */
2172 static void
drecip_sqrt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2173 drecip_sqrt_emit_cpu(
2174    const struct lp_build_tgsi_action * action,
2175    struct lp_build_tgsi_context * bld_base,
2176    struct lp_build_emit_data * emit_data)
2177 {
2178    emit_data->output[emit_data->chan] = lp_build_rsqrt(&bld_base->dbl_bld,
2179                                                          emit_data->args[0]);
2180 }
2181 
2182 /* Double Squareroot (CPU Only) */
2183 static void
dsqrt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2184 dsqrt_emit_cpu(
2185    const struct lp_build_tgsi_action * action,
2186    struct lp_build_tgsi_context * bld_base,
2187    struct lp_build_emit_data * emit_data)
2188 {
2189    emit_data->output[emit_data->chan] = lp_build_sqrt(&bld_base->dbl_bld,
2190                                                       emit_data->args[0]);
2191 }
2192 
2193 static void
i64abs_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2194 i64abs_emit_cpu(
2195    const struct lp_build_tgsi_action * action,
2196    struct lp_build_tgsi_context * bld_base,
2197    struct lp_build_emit_data * emit_data)
2198 {
2199    emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->int64_bld,
2200                                                        emit_data->args[0]);
2201 }
2202 
2203 static void
i64ssg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2204 i64ssg_emit_cpu(
2205    const struct lp_build_tgsi_action * action,
2206    struct lp_build_tgsi_context * bld_base,
2207    struct lp_build_emit_data * emit_data)
2208 {
2209    emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->int64_bld,
2210                                                        emit_data->args[0]);
2211 }
2212 
2213 static void
i64neg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2214 i64neg_emit_cpu(
2215    const struct lp_build_tgsi_action * action,
2216    struct lp_build_tgsi_context * bld_base,
2217    struct lp_build_emit_data * emit_data)
2218 {
2219    emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->int64_bld,
2220                                                      bld_base->int64_bld.zero,
2221                                                      emit_data->args[0]);
2222 }
2223 
2224 static void
u64set_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)2225 u64set_emit_cpu(
2226    const struct lp_build_tgsi_action * action,
2227    struct lp_build_tgsi_context * bld_base,
2228    struct lp_build_emit_data * emit_data,
2229    unsigned pipe_func)
2230 {
2231    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
2232    LLVMValueRef cond = lp_build_cmp(&bld_base->uint64_bld, pipe_func,
2233                                     emit_data->args[0], emit_data->args[1]);
2234    /* arguments were 64 bit but store as 32 bit */
2235    cond = LLVMBuildTrunc(builder, cond, bld_base->int_bld.int_vec_type, "");
2236    emit_data->output[emit_data->chan] = cond;
2237 }
2238 
2239 static void
u64seq_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2240 u64seq_emit_cpu(
2241    const struct lp_build_tgsi_action * action,
2242    struct lp_build_tgsi_context * bld_base,
2243    struct lp_build_emit_data * emit_data)
2244 {
2245    u64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL);
2246 }
2247 
2248 static void
u64sne_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2249 u64sne_emit_cpu(
2250    const struct lp_build_tgsi_action * action,
2251    struct lp_build_tgsi_context * bld_base,
2252    struct lp_build_emit_data * emit_data)
2253 {
2254    u64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL);
2255 }
2256 
2257 static void
u64slt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2258 u64slt_emit_cpu(
2259    const struct lp_build_tgsi_action * action,
2260    struct lp_build_tgsi_context * bld_base,
2261    struct lp_build_emit_data * emit_data)
2262 {
2263    u64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
2264 }
2265 
2266 static void
u64sge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2267 u64sge_emit_cpu(
2268    const struct lp_build_tgsi_action * action,
2269    struct lp_build_tgsi_context * bld_base,
2270    struct lp_build_emit_data * emit_data)
2271 {
2272    u64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
2273 }
2274 
2275 static void
i64set_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)2276 i64set_emit_cpu(
2277    const struct lp_build_tgsi_action * action,
2278    struct lp_build_tgsi_context * bld_base,
2279    struct lp_build_emit_data * emit_data,
2280    unsigned pipe_func)
2281 {
2282    LLVMBuilderRef builder = bld_base->base.gallivm->builder;
2283    LLVMValueRef cond = lp_build_cmp(&bld_base->int64_bld, pipe_func,
2284                                     emit_data->args[0], emit_data->args[1]);
2285    /* arguments were 64 bit but store as 32 bit */
2286    cond = LLVMBuildTrunc(builder, cond, bld_base->int_bld.int_vec_type, "");
2287    emit_data->output[emit_data->chan] = cond;
2288 }
2289 
2290 static void
i64slt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2291 i64slt_emit_cpu(
2292    const struct lp_build_tgsi_action * action,
2293    struct lp_build_tgsi_context * bld_base,
2294    struct lp_build_emit_data * emit_data)
2295 {
2296    i64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
2297 }
2298 
2299 static void
i64sge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2300 i64sge_emit_cpu(
2301    const struct lp_build_tgsi_action * action,
2302    struct lp_build_tgsi_context * bld_base,
2303    struct lp_build_emit_data * emit_data)
2304 {
2305    i64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
2306 }
2307 
2308 static void
u64max_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2309 u64max_emit_cpu(
2310    const struct lp_build_tgsi_action * action,
2311    struct lp_build_tgsi_context * bld_base,
2312    struct lp_build_emit_data * emit_data)
2313 {
2314    emit_data->output[emit_data->chan] = lp_build_max(&bld_base->uint64_bld,
2315                                    emit_data->args[0], emit_data->args[1]);
2316 }
2317 
2318 static void
u64min_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2319 u64min_emit_cpu(
2320    const struct lp_build_tgsi_action * action,
2321    struct lp_build_tgsi_context * bld_base,
2322    struct lp_build_emit_data * emit_data)
2323 {
2324    emit_data->output[emit_data->chan] = lp_build_min(&bld_base->uint64_bld,
2325                                    emit_data->args[0], emit_data->args[1]);
2326 }
2327 
2328 static void
i64max_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2329 i64max_emit_cpu(
2330    const struct lp_build_tgsi_action * action,
2331    struct lp_build_tgsi_context * bld_base,
2332    struct lp_build_emit_data * emit_data)
2333 {
2334    emit_data->output[emit_data->chan] = lp_build_max(&bld_base->int64_bld,
2335                                    emit_data->args[0], emit_data->args[1]);
2336 }
2337 
2338 static void
i64min_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2339 i64min_emit_cpu(
2340    const struct lp_build_tgsi_action * action,
2341    struct lp_build_tgsi_context * bld_base,
2342    struct lp_build_emit_data * emit_data)
2343 {
2344    emit_data->output[emit_data->chan] = lp_build_min(&bld_base->int64_bld,
2345                                    emit_data->args[0], emit_data->args[1]);
2346 }
2347 
2348 static void
u64add_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2349 u64add_emit_cpu(
2350    const struct lp_build_tgsi_action * action,
2351    struct lp_build_tgsi_context * bld_base,
2352    struct lp_build_emit_data * emit_data)
2353 {
2354    emit_data->output[emit_data->chan] = lp_build_add(&bld_base->uint64_bld,
2355                                    emit_data->args[0], emit_data->args[1]);
2356 }
2357 
2358 static void
u64shl_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2359 u64shl_emit_cpu(
2360    const struct lp_build_tgsi_action * action,
2361    struct lp_build_tgsi_context * bld_base,
2362    struct lp_build_emit_data * emit_data)
2363 {
2364    struct lp_build_context *uint_bld = &bld_base->uint64_bld;
2365    LLVMValueRef mask = lp_build_const_vec(uint_bld->gallivm, uint_bld->type,
2366                                           uint_bld->type.width - 1);
2367    LLVMValueRef masked_count = lp_build_and(uint_bld, emit_data->args[1], mask);
2368    emit_data->output[emit_data->chan] = lp_build_shl(uint_bld, emit_data->args[0],
2369                                                      masked_count);
2370 }
2371 
2372 static void
i64shr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2373 i64shr_emit_cpu(
2374    const struct lp_build_tgsi_action * action,
2375    struct lp_build_tgsi_context * bld_base,
2376    struct lp_build_emit_data * emit_data)
2377 {
2378    struct lp_build_context *int_bld = &bld_base->int64_bld;
2379    LLVMValueRef mask = lp_build_const_vec(int_bld->gallivm, int_bld->type,
2380                                           int_bld->type.width - 1);
2381    LLVMValueRef masked_count = lp_build_and(int_bld, emit_data->args[1], mask);
2382    emit_data->output[emit_data->chan] = lp_build_shr(int_bld, emit_data->args[0],
2383                                                      masked_count);
2384 }
2385 
2386 static void
u64shr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2387 u64shr_emit_cpu(
2388    const struct lp_build_tgsi_action * action,
2389    struct lp_build_tgsi_context * bld_base,
2390    struct lp_build_emit_data * emit_data)
2391 {
2392    struct lp_build_context *uint_bld = &bld_base->uint64_bld;
2393    LLVMValueRef mask = lp_build_const_vec(uint_bld->gallivm, uint_bld->type,
2394                                           uint_bld->type.width - 1);
2395    LLVMValueRef masked_count = lp_build_and(uint_bld, emit_data->args[1], mask);
2396    emit_data->output[emit_data->chan] = lp_build_shr(uint_bld, emit_data->args[0],
2397                                                      masked_count);
2398 }
bfi_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2399 static void bfi_emit_cpu(const struct lp_build_tgsi_action *action,
2400                          struct lp_build_tgsi_context *bld_base,
2401                          struct lp_build_emit_data *emit_data) {
2402   /*
2403    * def bfi(base, insert, offset, bits):
2404    *   if offset < 0 or bits < 0 or offset + bits > 32:
2405    *     return undefined
2406    *   # << defined such that mask == ~0 when bits == 32, offset == 0
2407    *   mask = ((1 << bits) - 1) << offset
2408    *   return ((insert << offset) & mask) | (base & ~mask)
2409    */
2410   struct lp_build_context *uint_bld = &bld_base->uint_bld;
2411   LLVMValueRef one_shl_bits_dec_one = lp_build_sub(
2412       uint_bld, lp_build_shl(uint_bld, uint_bld->one, emit_data->args[3]),
2413       uint_bld->one);
2414   LLVMValueRef mask =
2415       lp_build_shl(uint_bld, one_shl_bits_dec_one, emit_data->args[2]);
2416   LLVMValueRef insert_shl_offset =
2417       lp_build_shl(uint_bld, emit_data->args[1], emit_data->args[2]);
2418   LLVMValueRef insert_shl_offset_and_mask =
2419       lp_build_and(uint_bld, insert_shl_offset, mask);
2420   LLVMValueRef base_and_not_mask =
2421       lp_build_and(uint_bld, emit_data->args[0], lp_build_not(uint_bld, mask));
2422 
2423   emit_data->output[emit_data->chan] =
2424       lp_build_or(uint_bld, insert_shl_offset_and_mask, base_and_not_mask);
2425 }
2426 
lsb_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2427 static void lsb_emit_cpu(const struct lp_build_tgsi_action *action,
2428                          struct lp_build_tgsi_context *bld_base,
2429                          struct lp_build_emit_data *emit_data) {
2430   struct lp_build_context *uint_bld = &bld_base->int_bld;
2431 
2432   LLVMValueRef result = lp_build_cttz(uint_bld, emit_data->args[0]);
2433   LLVMValueRef cond =
2434       lp_build_cmp(uint_bld, PIPE_FUNC_LESS, result,
2435                    lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 32));
2436   emit_data->output[emit_data->chan] = lp_build_select(
2437       uint_bld, cond, result,
2438       lp_build_const_vec(uint_bld->gallivm, uint_bld->type, -1));
2439 }
2440 
umsb_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2441 static void umsb_emit_cpu(const struct lp_build_tgsi_action *action,
2442                           struct lp_build_tgsi_context *bld_base,
2443                           struct lp_build_emit_data *emit_data) {
2444   struct lp_build_context *uint_bld = &bld_base->int_bld;
2445   emit_data->output[emit_data->chan] = lp_build_sub(
2446       uint_bld, lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 31),
2447       lp_build_ctlz(uint_bld, emit_data->args[0]));
2448 }
2449 
imsb_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2450 static void imsb_emit_cpu(const struct lp_build_tgsi_action *action,
2451                           struct lp_build_tgsi_context *bld_base,
2452                           struct lp_build_emit_data *emit_data) {
2453   struct lp_build_context *uint_bld = &bld_base->int_bld;
2454 
2455   LLVMValueRef cond =
2456       lp_build_cmp(uint_bld, PIPE_FUNC_LESS, emit_data->args[0],
2457                    lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 0));
2458   emit_data->args[0] = lp_build_select(
2459       uint_bld, cond, lp_build_not(uint_bld, emit_data->args[0]),
2460       emit_data->args[0]);
2461   umsb_emit_cpu(action, bld_base, emit_data);
2462 }
2463 
popc_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2464 static void popc_emit_cpu(const struct lp_build_tgsi_action *action,
2465                           struct lp_build_tgsi_context *bld_base,
2466                           struct lp_build_emit_data *emit_data) {
2467   struct lp_build_context *uint_bld = &bld_base->int_bld;
2468   emit_data->output[emit_data->chan] =
2469       lp_build_popcount(uint_bld, emit_data->args[0]);
2470 }
2471 
ibfe_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2472 static void ibfe_emit_cpu(const struct lp_build_tgsi_action *action,
2473                           struct lp_build_tgsi_context *bld_base,
2474                           struct lp_build_emit_data *emit_data) {
2475   /* def ibfe(value, offset, bits):
2476    *   if offset < 0 or bits < 0 or offset + bits > 32:
2477    *     return undefined
2478    *   if bits == 0: return 0
2479    *   # Note: >> sign-extends
2480    *   return (value << (32 - offset - bits)) >> (32 - bits)
2481    */
2482   struct lp_build_context *uint_bld = &bld_base->int_bld;
2483 
2484   LLVMValueRef r_32_sub_bits = lp_build_sub(
2485       uint_bld, lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 32),
2486       emit_data->args[2]);
2487   LLVMValueRef temp1 =
2488       lp_build_sub(uint_bld, r_32_sub_bits, emit_data->args[1]);
2489   LLVMValueRef temp2 = lp_build_shl(uint_bld, emit_data->args[0], temp1);
2490   LLVMValueRef cond =
2491       lp_build_cmp(uint_bld, PIPE_FUNC_EQUAL, emit_data->args[2],
2492                    lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 0));
2493   emit_data->output[emit_data->chan] = lp_build_select(
2494       uint_bld, cond, lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 0),
2495       lp_build_shr(uint_bld, temp2, r_32_sub_bits));
2496 }
2497 
ubfe_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2498 static void ubfe_emit_cpu(const struct lp_build_tgsi_action *action,
2499                           struct lp_build_tgsi_context *bld_base,
2500                           struct lp_build_emit_data *emit_data) {
2501   /* def ubfe(value, offset, bits):
2502    *   if offset < 0 or bits < 0 or offset + bits > 32:
2503    *     return undefined
2504    *   if bits == 0: return 0
2505    *   # Note: >> does not sign-extend
2506    *   return (value << (32 - offset - bits)) >> (32 - bits)
2507    */
2508   struct lp_build_context *uint_bld = &bld_base->uint_bld;
2509 
2510   LLVMValueRef r_32_sub_bits = lp_build_sub(
2511       uint_bld, lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 32),
2512       emit_data->args[2]);
2513   LLVMValueRef temp1 =
2514       lp_build_sub(uint_bld, r_32_sub_bits, emit_data->args[1]);
2515   LLVMValueRef temp2 = lp_build_shl(uint_bld, emit_data->args[0], temp1);
2516   emit_data->output[emit_data->chan] =
2517       lp_build_shr(uint_bld, temp2, r_32_sub_bits);
2518 }
2519 
brev_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2520 static void brev_emit_cpu(const struct lp_build_tgsi_action *action,
2521                           struct lp_build_tgsi_context *bld_base,
2522                           struct lp_build_emit_data *emit_data) {
2523   struct lp_build_context *uint_bld = &bld_base->uint_bld;
2524   emit_data->output[emit_data->chan] =
2525       lp_build_bitfield_reverse(uint_bld, emit_data->args[0]);
2526 }
2527 
2528 void
lp_set_default_actions_cpu(struct lp_build_tgsi_context * bld_base)2529 lp_set_default_actions_cpu(
2530    struct lp_build_tgsi_context * bld_base)
2531 {
2532    lp_set_default_actions(bld_base);
2533    bld_base->op_actions[TGSI_OPCODE_ADD].emit = add_emit_cpu;
2534    bld_base->op_actions[TGSI_OPCODE_AND].emit = and_emit_cpu;
2535    bld_base->op_actions[TGSI_OPCODE_ARL].emit = arl_emit_cpu;
2536    bld_base->op_actions[TGSI_OPCODE_ARR].emit = arr_emit_cpu;
2537    bld_base->op_actions[TGSI_OPCODE_CEIL].emit = ceil_emit_cpu;
2538    bld_base->op_actions[TGSI_OPCODE_COS].emit = cos_emit_cpu;
2539    bld_base->op_actions[TGSI_OPCODE_CMP].emit = cmp_emit_cpu;
2540    bld_base->op_actions[TGSI_OPCODE_DIV].emit = div_emit_cpu;
2541    bld_base->op_actions[TGSI_OPCODE_EX2].emit = ex2_emit_cpu;
2542    bld_base->op_actions[TGSI_OPCODE_F2I].emit = f2i_emit_cpu;
2543    bld_base->op_actions[TGSI_OPCODE_FLR].emit = flr_emit_cpu;
2544    bld_base->op_actions[TGSI_OPCODE_FSEQ].emit = fseq_emit_cpu;
2545    bld_base->op_actions[TGSI_OPCODE_FSGE].emit = fsge_emit_cpu;
2546    bld_base->op_actions[TGSI_OPCODE_FSLT].emit = fslt_emit_cpu;
2547    bld_base->op_actions[TGSI_OPCODE_FSNE].emit = fsne_emit_cpu;
2548 
2549    bld_base->op_actions[TGSI_OPCODE_I2F].emit = i2f_emit_cpu;
2550    bld_base->op_actions[TGSI_OPCODE_IABS].emit = iabs_emit_cpu;
2551    bld_base->op_actions[TGSI_OPCODE_IDIV].emit = idiv_emit_cpu;
2552    bld_base->op_actions[TGSI_OPCODE_INEG].emit = ineg_emit_cpu;
2553    bld_base->op_actions[TGSI_OPCODE_IMAX].emit = imax_emit_cpu;
2554    bld_base->op_actions[TGSI_OPCODE_IMIN].emit = imin_emit_cpu;
2555    bld_base->op_actions[TGSI_OPCODE_ISGE].emit = isge_emit_cpu;
2556    bld_base->op_actions[TGSI_OPCODE_ISHR].emit = ishr_emit_cpu;
2557    bld_base->op_actions[TGSI_OPCODE_ISLT].emit = islt_emit_cpu;
2558    bld_base->op_actions[TGSI_OPCODE_ISSG].emit = issg_emit_cpu;
2559    bld_base->op_actions[TGSI_OPCODE_IMUL_HI].emit = imul_hi_emit_cpu;
2560    bld_base->op_actions[TGSI_OPCODE_UMUL_HI].emit = umul_hi_emit_cpu;
2561 
2562    bld_base->op_actions[TGSI_OPCODE_LG2].emit = lg2_emit_cpu;
2563    bld_base->op_actions[TGSI_OPCODE_LOG].emit = log_emit_cpu;
2564    bld_base->op_actions[TGSI_OPCODE_MAD].emit = mad_emit_cpu;
2565    bld_base->op_actions[TGSI_OPCODE_MAX].emit = max_emit_cpu;
2566    bld_base->op_actions[TGSI_OPCODE_MIN].emit = min_emit_cpu;
2567    bld_base->op_actions[TGSI_OPCODE_MOD].emit = mod_emit_cpu;
2568    bld_base->op_actions[TGSI_OPCODE_NOT].emit = not_emit_cpu;
2569    bld_base->op_actions[TGSI_OPCODE_OR].emit = or_emit_cpu;
2570    bld_base->op_actions[TGSI_OPCODE_POW].emit = pow_emit_cpu;
2571    bld_base->op_actions[TGSI_OPCODE_RCP].emit = rcp_emit_cpu;
2572    bld_base->op_actions[TGSI_OPCODE_ROUND].emit = round_emit_cpu;
2573    bld_base->op_actions[TGSI_OPCODE_SEQ].emit = seq_emit_cpu;
2574    bld_base->op_actions[TGSI_OPCODE_SGE].emit = sge_emit_cpu;
2575    bld_base->op_actions[TGSI_OPCODE_SGT].emit = sgt_emit_cpu;
2576    bld_base->op_actions[TGSI_OPCODE_SIN].emit = sin_emit_cpu;
2577    bld_base->op_actions[TGSI_OPCODE_SHL].emit = shl_emit_cpu;
2578    bld_base->op_actions[TGSI_OPCODE_SLE].emit = sle_emit_cpu;
2579    bld_base->op_actions[TGSI_OPCODE_SLT].emit = slt_emit_cpu;
2580    bld_base->op_actions[TGSI_OPCODE_SNE].emit = sne_emit_cpu;
2581    bld_base->op_actions[TGSI_OPCODE_SSG].emit = ssg_emit_cpu;
2582    bld_base->op_actions[TGSI_OPCODE_TRUNC].emit = trunc_emit_cpu;
2583 
2584    bld_base->rsq_action.emit = recip_sqrt_emit_cpu;
2585    bld_base->sqrt_action.emit = sqrt_emit_cpu;
2586 
2587    bld_base->op_actions[TGSI_OPCODE_UADD].emit = uadd_emit_cpu;
2588    bld_base->op_actions[TGSI_OPCODE_UCMP].emit = ucmp_emit_cpu;
2589    bld_base->op_actions[TGSI_OPCODE_UDIV].emit = udiv_emit_cpu;
2590    bld_base->op_actions[TGSI_OPCODE_UMAX].emit = umax_emit_cpu;
2591    bld_base->op_actions[TGSI_OPCODE_UMIN].emit = umin_emit_cpu;
2592    bld_base->op_actions[TGSI_OPCODE_UMOD].emit = umod_emit_cpu;
2593    bld_base->op_actions[TGSI_OPCODE_USEQ].emit = useq_emit_cpu;
2594    bld_base->op_actions[TGSI_OPCODE_USGE].emit = usge_emit_cpu;
2595    bld_base->op_actions[TGSI_OPCODE_USHR].emit = ushr_emit_cpu;
2596    bld_base->op_actions[TGSI_OPCODE_USLT].emit = uslt_emit_cpu;
2597    bld_base->op_actions[TGSI_OPCODE_USNE].emit = usne_emit_cpu;
2598 
2599    bld_base->op_actions[TGSI_OPCODE_XOR].emit = xor_emit_cpu;
2600 
2601    bld_base->op_actions[TGSI_OPCODE_DABS].emit = dabs_emit_cpu;
2602    bld_base->op_actions[TGSI_OPCODE_DNEG].emit = dneg_emit_cpu;
2603    bld_base->op_actions[TGSI_OPCODE_DSEQ].emit = dseq_emit_cpu;
2604    bld_base->op_actions[TGSI_OPCODE_DSGE].emit = dsge_emit_cpu;
2605    bld_base->op_actions[TGSI_OPCODE_DSLT].emit = dslt_emit_cpu;
2606    bld_base->op_actions[TGSI_OPCODE_DSNE].emit = dsne_emit_cpu;
2607 
2608    bld_base->op_actions[TGSI_OPCODE_DRSQ].emit = drecip_sqrt_emit_cpu;
2609    bld_base->op_actions[TGSI_OPCODE_DSQRT].emit = dsqrt_emit_cpu;
2610 
2611    bld_base->op_actions[TGSI_OPCODE_I64ABS].emit = i64abs_emit_cpu;
2612    bld_base->op_actions[TGSI_OPCODE_I64SSG].emit = i64ssg_emit_cpu;
2613    bld_base->op_actions[TGSI_OPCODE_I64NEG].emit = i64neg_emit_cpu;
2614 
2615    bld_base->op_actions[TGSI_OPCODE_U64SEQ].emit = u64seq_emit_cpu;
2616    bld_base->op_actions[TGSI_OPCODE_U64SNE].emit = u64sne_emit_cpu;
2617    bld_base->op_actions[TGSI_OPCODE_U64SLT].emit = u64slt_emit_cpu;
2618    bld_base->op_actions[TGSI_OPCODE_U64SGE].emit = u64sge_emit_cpu;
2619    bld_base->op_actions[TGSI_OPCODE_I64SLT].emit = i64slt_emit_cpu;
2620    bld_base->op_actions[TGSI_OPCODE_I64SGE].emit = i64sge_emit_cpu;
2621 
2622    bld_base->op_actions[TGSI_OPCODE_U64MIN].emit = u64min_emit_cpu;
2623    bld_base->op_actions[TGSI_OPCODE_U64MAX].emit = u64max_emit_cpu;
2624    bld_base->op_actions[TGSI_OPCODE_I64MIN].emit = i64min_emit_cpu;
2625    bld_base->op_actions[TGSI_OPCODE_I64MAX].emit = i64max_emit_cpu;
2626 
2627    bld_base->op_actions[TGSI_OPCODE_U64ADD].emit = u64add_emit_cpu;
2628    bld_base->op_actions[TGSI_OPCODE_U64MOD].emit = u64mod_emit_cpu;
2629    bld_base->op_actions[TGSI_OPCODE_I64MOD].emit = i64mod_emit_cpu;
2630    bld_base->op_actions[TGSI_OPCODE_U64DIV].emit = u64div_emit_cpu;
2631    bld_base->op_actions[TGSI_OPCODE_I64DIV].emit = i64div_emit_cpu;
2632 
2633    bld_base->op_actions[TGSI_OPCODE_U64SHL].emit = u64shl_emit_cpu;
2634    bld_base->op_actions[TGSI_OPCODE_I64SHR].emit = i64shr_emit_cpu;
2635    bld_base->op_actions[TGSI_OPCODE_U64SHR].emit = u64shr_emit_cpu;
2636 
2637    bld_base->op_actions[TGSI_OPCODE_BFI].emit = bfi_emit_cpu;
2638    bld_base->op_actions[TGSI_OPCODE_POPC].emit = popc_emit_cpu;
2639    bld_base->op_actions[TGSI_OPCODE_LSB].emit = lsb_emit_cpu;
2640    bld_base->op_actions[TGSI_OPCODE_IMSB].emit = imsb_emit_cpu;
2641    bld_base->op_actions[TGSI_OPCODE_UMSB].emit = umsb_emit_cpu;
2642    bld_base->op_actions[TGSI_OPCODE_IBFE].emit = ibfe_emit_cpu;
2643    bld_base->op_actions[TGSI_OPCODE_UBFE].emit = ubfe_emit_cpu;
2644    bld_base->op_actions[TGSI_OPCODE_BREV].emit = brev_emit_cpu;
2645 
2646 }
2647