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