1 /**************************************************************************
3 * Copyright 2011-2012 Advanced Micro Devices, Inc.
4 * Copyright 2009 VMware, Inc.
5 * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas.
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:
16 * The above copyright notice and this permission notice (including the
17 * next paragraph) shall be included in all copies or substantial portions
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 TUNGSTEN GRAPHICS 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.
28 **************************************************************************/
32 * TGSI to LLVM IR translation.
34 * @author Jose Fonseca <jfonseca@vmware.com>
35 * @author Tom Stellard <thomas.stellard@amd.com>
37 * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell,
38 * Brian Paul, and others.
42 #include "lp_bld_tgsi_action.h"
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_gather.h"
49 #include "lp_bld_logic.h"
51 #include "tgsi/tgsi_exec.h"
53 /* XXX: The CPU only defaults should be repaced by generic ones. In most
54 * cases, the CPU defaults are just wrappers around a function in
55 * lp_build_arit.c and these functions should be inlined here and the CPU
56 * generic code should be removed and placed elsewhere.
61 /* Generic fetch_arg functions */
63 static void scalar_unary_fetch_args(
64 struct lp_build_tgsi_context
* bld_base
,
65 struct lp_build_emit_data
* emit_data
)
68 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, 0);
69 emit_data
->arg_count
= 1;
70 emit_data
->dst_type
= LLVMTypeOf(emit_data
->args
[0]);
73 static void scalar_binary_fetch_args(
74 struct lp_build_tgsi_context
* bld_base
,
75 struct lp_build_emit_data
* emit_data
)
78 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
81 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
83 emit_data
->arg_count
= 2;
84 emit_data
->dst_type
= LLVMTypeOf(emit_data
->args
[0]);
90 const struct lp_build_tgsi_action
* action
,
91 struct lp_build_tgsi_context
* bld_base
,
92 struct lp_build_emit_data
* emit_data
)
94 emit_data
->output
[emit_data
->chan
] = LLVMBuildFAdd(
95 bld_base
->base
.gallivm
->builder
,
96 emit_data
->args
[0], emit_data
->args
[1], "");
102 const struct lp_build_tgsi_action
* action
,
103 struct lp_build_tgsi_context
* bld_base
,
104 struct lp_build_emit_data
* emit_data
)
106 LLVMValueRef tmp
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_ROUND
, emit_data
->args
[0]);
107 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
108 bld_base
->uint_bld
.vec_type
, "");
111 /* TGSI_OPCODE_CLAMP */
114 const struct lp_build_tgsi_action
* action
,
115 struct lp_build_tgsi_context
* bld_base
,
116 struct lp_build_emit_data
* emit_data
)
119 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MAX
,
122 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
123 TGSI_OPCODE_MIN
, tmp
, emit_data
->args
[2]);
130 struct lp_build_tgsi_context
* bld_base
,
131 struct lp_build_emit_data
* emit_data
,
132 unsigned dp_components
)
135 for (src
= 0; src
< 2; src
++) {
136 for (chan
= 0; chan
< dp_components
; chan
++) {
137 emit_data
->args
[(src
* dp_components
) + chan
] =
138 lp_build_emit_fetch(bld_base
, emit_data
->inst
, src
, chan
);
141 emit_data
->dst_type
= bld_base
->base
.elem_type
;
144 /* TGSI_OPCODE_DP2 */
147 struct lp_build_tgsi_context
* bld_base
,
148 struct lp_build_emit_data
* emit_data
)
150 dp_fetch_args(bld_base
, emit_data
, 2);
155 const struct lp_build_tgsi_action
* action
,
156 struct lp_build_tgsi_context
* bld_base
,
157 struct lp_build_emit_data
* emit_data
)
159 LLVMValueRef tmp0
, tmp1
;
160 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
161 emit_data
->args
[0] /* src0.x */,
162 emit_data
->args
[2] /* src1.x */);
163 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
164 emit_data
->args
[1] /* src0.y */,
165 emit_data
->args
[3] /* src1.y */);
166 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
167 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
170 static struct lp_build_tgsi_action dp2_action
= {
171 dp2_fetch_args
, /* fetch_args */
175 /* TGSI_OPCODE_DP2A */
178 struct lp_build_tgsi_context
* bld_base
,
179 struct lp_build_emit_data
* emit_data
)
181 dp_fetch_args(bld_base
, emit_data
, 2);
182 emit_data
->args
[5] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
188 const struct lp_build_tgsi_action
* action
,
189 struct lp_build_tgsi_context
* bld_base
,
190 struct lp_build_emit_data
* emit_data
)
193 tmp
= lp_build_emit_llvm(bld_base
, TGSI_OPCODE_DP2
, emit_data
);
194 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
,
195 emit_data
->args
[5], tmp
);
198 static struct lp_build_tgsi_action dp2a_action
= {
199 dp2a_fetch_args
, /* fetch_args */
203 /* TGSI_OPCODE_DP3 */
206 struct lp_build_tgsi_context
* bld_base
,
207 struct lp_build_emit_data
* emit_data
)
209 dp_fetch_args(bld_base
, emit_data
, 3);
214 const struct lp_build_tgsi_action
* action
,
215 struct lp_build_tgsi_context
* bld_base
,
216 struct lp_build_emit_data
* emit_data
)
218 LLVMValueRef tmp0
, tmp1
;
219 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
220 emit_data
->args
[0] /* src0.x */,
221 emit_data
->args
[3] /* src1.x */);
222 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
223 emit_data
->args
[1] /* src0.y */,
224 emit_data
->args
[4] /* src1.y */);
225 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp1
, tmp0
);
226 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
227 emit_data
->args
[2] /* src0.z */,
228 emit_data
->args
[5] /* src1.z */);
229 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
230 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
233 static struct lp_build_tgsi_action dp3_action
= {
234 dp3_fetch_args
, /* fetch_args */
238 /* TGSI_OPCODDE_DP4 */
242 struct lp_build_tgsi_context
* bld_base
,
243 struct lp_build_emit_data
* emit_data
)
245 dp_fetch_args(bld_base
, emit_data
, 4);
250 const struct lp_build_tgsi_action
* action
,
251 struct lp_build_tgsi_context
* bld_base
,
252 struct lp_build_emit_data
* emit_data
)
254 LLVMValueRef tmp0
, tmp1
;
255 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
256 emit_data
->args
[0] /* src0.x */,
257 emit_data
->args
[4] /* src1.x */);
258 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
259 emit_data
->args
[1] /* src0.y */,
260 emit_data
->args
[5] /* src1.y */);
261 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp0
, tmp1
);
262 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
263 emit_data
->args
[2] /* src0.z */,
264 emit_data
->args
[6] /* src1.z */);
265 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp0
, tmp1
);
266 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
267 emit_data
->args
[3] /* src0.w */,
268 emit_data
->args
[7] /* src1.w */);
269 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
270 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
273 static struct lp_build_tgsi_action dp4_action
= {
274 dp4_fetch_args
, /* fetch_args */
278 /* TGSI_OPCODE_DPH */
281 struct lp_build_tgsi_context
* bld_base
,
282 struct lp_build_emit_data
* emit_data
)
284 dp_fetch_args(bld_base
, emit_data
, 4);
286 emit_data
->args
[3] = bld_base
->base
.one
;
289 const struct lp_build_tgsi_action dph_action
= {
290 dph_fetch_args
, /* fetch_args */
294 /* TGSI_OPCODE_DST */
297 struct lp_build_tgsi_context
* bld_base
,
298 struct lp_build_emit_data
* emit_data
)
301 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
304 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
307 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
310 emit_data
->args
[3] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
316 const struct lp_build_tgsi_action
* action
,
317 struct lp_build_tgsi_context
* bld_base
,
318 struct lp_build_emit_data
* emit_data
)
321 emit_data
->output
[TGSI_CHAN_X
] = bld_base
->base
.one
;
324 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
326 emit_data
->args
[0] /* src0.y */,
327 emit_data
->args
[2] /* src1.y */);
329 emit_data
->output
[TGSI_CHAN_Z
] = emit_data
->args
[1]; /* src0.z */
332 emit_data
->output
[TGSI_CHAN_W
] = emit_data
->args
[3]; /* src1.w */
335 static struct lp_build_tgsi_action dst_action
= {
336 dst_fetch_args
, /* fetch_args */
340 /* TGSI_OPCODE_END */
343 const struct lp_build_tgsi_action
* action
,
344 struct lp_build_tgsi_context
* bld_base
,
345 struct lp_build_emit_data
* emit_data
)
350 /* TGSI_OPCODE_EXP */
354 const struct lp_build_tgsi_action
* action
,
355 struct lp_build_tgsi_context
* bld_base
,
356 struct lp_build_emit_data
* emit_data
)
358 LLVMValueRef floor_x
;
360 /* floor( src0.x ) */
361 floor_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
364 /* 2 ^ floor( src0.x ) */
365 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
366 TGSI_OPCODE_EX2
, floor_x
);
368 /* src0.x - floor( src0.x ) */
369 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
370 TGSI_OPCODE_SUB
, emit_data
->args
[0] /* src0.x */, floor_x
);
373 emit_data
->output
[TGSI_CHAN_Z
] = lp_build_emit_llvm_unary(bld_base
,
374 TGSI_OPCODE_EX2
, emit_data
->args
[0] /* src0.x */);
376 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
379 const struct lp_build_tgsi_action exp_action
= {
380 scalar_unary_fetch_args
, /* fetch_args */
384 /* TGSI_OPCODE_FRC */
388 const struct lp_build_tgsi_action
* action
,
389 struct lp_build_tgsi_context
* bld_base
,
390 struct lp_build_emit_data
* emit_data
)
393 tmp
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
395 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
396 TGSI_OPCODE_SUB
, emit_data
->args
[0], tmp
);
399 /* TGSI_OPCODE_KIL */
403 struct lp_build_tgsi_context
* bld_base
,
404 struct lp_build_emit_data
* emit_data
)
407 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
410 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
413 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
416 emit_data
->args
[3] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
418 emit_data
->arg_count
= 4;
419 emit_data
->dst_type
= LLVMVoidTypeInContext(bld_base
->base
.gallivm
->context
);
422 /* TGSI_OPCODE_KILP */
426 struct lp_build_tgsi_context
* bld_base
,
427 struct lp_build_emit_data
* emit_data
)
429 emit_data
->dst_type
= LLVMVoidTypeInContext(bld_base
->base
.gallivm
->context
);
432 /* TGSI_OPCODE_LIT */
436 struct lp_build_tgsi_context
* bld_base
,
437 struct lp_build_emit_data
* emit_data
)
440 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_X
);
442 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_Y
);
444 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_W
);
445 emit_data
->arg_count
= 3;
450 const struct lp_build_tgsi_action
* action
,
451 struct lp_build_tgsi_context
* bld_base
,
452 struct lp_build_emit_data
* emit_data
)
454 LLVMValueRef tmp0
, tmp1
, tmp2
;
457 emit_data
->output
[TGSI_CHAN_X
] = bld_base
->base
.one
;
460 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
462 emit_data
->args
[0] /* src0.x */,
463 bld_base
->base
.zero
);
466 /* XMM[1] = SrcReg[0].yyyy */
467 tmp1
= emit_data
->args
[1];
468 /* XMM[1] = max(XMM[1], 0) */
469 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MAX
,
470 tmp1
, bld_base
->base
.zero
);
471 /* XMM[2] = SrcReg[0].wwww */
472 tmp2
= emit_data
->args
[2];
473 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_POW
,
475 tmp0
= emit_data
->args
[0];
476 emit_data
->output
[TGSI_CHAN_Z
] = lp_build_emit_llvm_ternary(bld_base
,
478 tmp0
, bld_base
->base
.zero
, tmp1
);
480 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
483 static struct lp_build_tgsi_action lit_action
= {
484 lit_fetch_args
, /* fetch_args */
488 /* TGSI_OPCODE_LOG */
492 const struct lp_build_tgsi_action
* action
,
493 struct lp_build_tgsi_context
* bld_base
,
494 struct lp_build_emit_data
* emit_data
)
497 LLVMValueRef abs_x
, log_abs_x
, flr_log_abs_x
, ex2_flr_log_abs_x
;
500 abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_ABS
,
501 emit_data
->args
[0] /* src0.x */);
503 /* log( abs( src0.x ) ) */
504 log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_LG2
,
507 /* floor( log( abs( src0.x ) ) ) */
508 flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
511 emit_data
->output
[TGSI_CHAN_X
] = flr_log_abs_x
;
514 ex2_flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_EX2
,
517 /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */
518 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
519 TGSI_OPCODE_DIV
, abs_x
, ex2_flr_log_abs_x
);
522 emit_data
->output
[TGSI_CHAN_Z
] = log_abs_x
;
525 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
528 static struct lp_build_tgsi_action log_action
= {
529 scalar_unary_fetch_args
, /* fetch_args */
533 /* TGSI_OPCODE_LRP */
537 const struct lp_build_tgsi_action
* action
,
538 struct lp_build_tgsi_context
* bld_base
,
539 struct lp_build_emit_data
* emit_data
)
542 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_SUB
,
545 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_ternary(bld_base
,
546 TGSI_OPCODE_MAD
, emit_data
->args
[0], tmp
, emit_data
->args
[2]);
549 /* TGSI_OPCODE_MAD */
553 const struct lp_build_tgsi_action
* action
,
554 struct lp_build_tgsi_context
* bld_base
,
555 struct lp_build_emit_data
* emit_data
)
558 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
561 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
562 TGSI_OPCODE_ADD
, tmp
, emit_data
->args
[2]);
565 /* TGSI_OPCODE_MOV */
569 const struct lp_build_tgsi_action
* action
,
570 struct lp_build_tgsi_context
* bld_base
,
571 struct lp_build_emit_data
* emit_data
)
573 emit_data
->output
[emit_data
->chan
] = emit_data
->args
[0];
576 /* TGSI_OPCODE_MUL */
579 const struct lp_build_tgsi_action
* action
,
580 struct lp_build_tgsi_context
* bld_base
,
581 struct lp_build_emit_data
* emit_data
)
583 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->base
,
584 emit_data
->args
[0], emit_data
->args
[1]);
587 /* TGSI_OPCODE_POW */
591 const struct lp_build_tgsi_action
* action
,
592 struct lp_build_tgsi_context
* bld_base
,
593 struct lp_build_emit_data
* emit_data
)
595 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
596 emit_data
->args
[0], emit_data
->args
[1]);
599 static struct lp_build_tgsi_action pow_action
= {
600 scalar_binary_fetch_args
, /* fetch_args */
604 /* TGSI_OPCODE_RSQ */
608 const struct lp_build_tgsi_action
* action
,
609 struct lp_build_tgsi_context
* bld_base
,
610 struct lp_build_emit_data
* emit_data
)
612 emit_data
->args
[0] = lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_ABS
,
614 if (bld_base
->rsq_action
.emit
) {
615 bld_base
->rsq_action
.emit(&bld_base
->rsq_action
, bld_base
, emit_data
);
617 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
621 const struct lp_build_tgsi_action rsq_action
= {
622 scalar_unary_fetch_args
, /* fetch_args */
627 /* TGSI_OPCODE_SCS */
630 const struct lp_build_tgsi_action
* action
,
631 struct lp_build_tgsi_context
* bld_base
,
632 struct lp_build_emit_data
* emit_data
)
635 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
636 TGSI_OPCODE_COS
, emit_data
->args
[0]);
638 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_unary(bld_base
,
639 TGSI_OPCODE_SIN
, emit_data
->args
[0]);
641 emit_data
->output
[TGSI_CHAN_Z
] = bld_base
->base
.zero
;
644 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
647 const struct lp_build_tgsi_action scs_action
= {
648 scalar_unary_fetch_args
, /* fetch_args */
652 /* TGSI_OPCODE_SFL */
656 const struct lp_build_tgsi_action
* action
,
657 struct lp_build_tgsi_context
* bld_base
,
658 struct lp_build_emit_data
* emit_data
)
660 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.zero
;
663 /* TGSI_OPCODE_STR */
667 const struct lp_build_tgsi_action
* action
,
668 struct lp_build_tgsi_context
* bld_base
,
669 struct lp_build_emit_data
* emit_data
)
671 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.one
;
674 /* TGSI_OPCODE_SUB */
677 const struct lp_build_tgsi_action
* action
,
678 struct lp_build_tgsi_context
* bld_base
,
679 struct lp_build_emit_data
* emit_data
)
681 emit_data
->output
[emit_data
->chan
] = LLVMBuildFSub(
682 bld_base
->base
.gallivm
->builder
,
684 emit_data
->args
[1], "");
687 /* TGSI_OPCODE_U2F */
690 const struct lp_build_tgsi_action
* action
,
691 struct lp_build_tgsi_context
* bld_base
,
692 struct lp_build_emit_data
* emit_data
)
694 emit_data
->output
[emit_data
->chan
] = LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
696 bld_base
->uint_bld
.vec_type
, "");
701 const struct lp_build_tgsi_action
* action
,
702 struct lp_build_tgsi_context
* bld_base
,
703 struct lp_build_emit_data
* emit_data
)
706 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_UMUL
,
709 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
710 TGSI_OPCODE_UADD
, tmp
, emit_data
->args
[2]);
713 /* TGSI_OPCODE_UMUL */
716 const struct lp_build_tgsi_action
* action
,
717 struct lp_build_tgsi_context
* bld_base
,
718 struct lp_build_emit_data
* emit_data
)
720 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint_bld
,
721 emit_data
->args
[0], emit_data
->args
[1]);
724 /* TGSI_OPCODE_XPD */
728 struct lp_build_tgsi_context
* bld_base
,
729 struct lp_build_emit_data
* emit_data
)
731 dp_fetch_args(bld_base
, emit_data
, 3);
739 struct lp_build_tgsi_context
* bld_base
,
745 LLVMValueRef tmp0
, tmp1
;
747 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, a
, b
);
748 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, c
, d
);
750 return lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_SUB
, tmp0
, tmp1
);
755 const struct lp_build_tgsi_action
* action
,
756 struct lp_build_tgsi_context
* bld_base
,
757 struct lp_build_emit_data
* emit_data
)
759 emit_data
->output
[TGSI_CHAN_X
] = xpd_helper(bld_base
,
760 emit_data
->args
[1] /* src0.y */, emit_data
->args
[5] /* src1.z */,
761 emit_data
->args
[4] /* src1.y */, emit_data
->args
[2] /* src0.z */);
763 emit_data
->output
[TGSI_CHAN_Y
] = xpd_helper(bld_base
,
764 emit_data
->args
[2] /* src0.z */, emit_data
->args
[3] /* src1.x */,
765 emit_data
->args
[5] /* src1.z */, emit_data
->args
[0] /* src0.x */);
767 emit_data
->output
[TGSI_CHAN_Z
] = xpd_helper(bld_base
,
768 emit_data
->args
[0] /* src0.x */, emit_data
->args
[4] /* src1.y */,
769 emit_data
->args
[3] /* src1.x */, emit_data
->args
[1] /* src0.y */);
771 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
774 const struct lp_build_tgsi_action xpd_action
= {
775 xpd_fetch_args
, /* fetch_args */
780 lp_set_default_actions(struct lp_build_tgsi_context
* bld_base
)
782 bld_base
->op_actions
[TGSI_OPCODE_DP2
] = dp2_action
;
783 bld_base
->op_actions
[TGSI_OPCODE_DP3
] = dp3_action
;
784 bld_base
->op_actions
[TGSI_OPCODE_DP4
] = dp4_action
;
785 bld_base
->op_actions
[TGSI_OPCODE_DP2A
] = dp2a_action
;
786 bld_base
->op_actions
[TGSI_OPCODE_DPH
] = dph_action
;
787 bld_base
->op_actions
[TGSI_OPCODE_DST
] = dst_action
;
788 bld_base
->op_actions
[TGSI_OPCODE_EXP
] = exp_action
;
789 bld_base
->op_actions
[TGSI_OPCODE_LIT
] = lit_action
;
790 bld_base
->op_actions
[TGSI_OPCODE_LOG
] = log_action
;
791 bld_base
->op_actions
[TGSI_OPCODE_RSQ
] = rsq_action
;
792 bld_base
->op_actions
[TGSI_OPCODE_POW
] = pow_action
;
793 bld_base
->op_actions
[TGSI_OPCODE_SCS
] = scs_action
;
794 bld_base
->op_actions
[TGSI_OPCODE_XPD
] = xpd_action
;
796 bld_base
->op_actions
[TGSI_OPCODE_COS
].fetch_args
= scalar_unary_fetch_args
;
797 bld_base
->op_actions
[TGSI_OPCODE_EX2
].fetch_args
= scalar_unary_fetch_args
;
798 bld_base
->op_actions
[TGSI_OPCODE_IF
].fetch_args
= scalar_unary_fetch_args
;
799 bld_base
->op_actions
[TGSI_OPCODE_KIL
].fetch_args
= kil_fetch_args
;
800 bld_base
->op_actions
[TGSI_OPCODE_KILP
].fetch_args
= kilp_fetch_args
;
801 bld_base
->op_actions
[TGSI_OPCODE_RCP
].fetch_args
= scalar_unary_fetch_args
;
802 bld_base
->op_actions
[TGSI_OPCODE_SIN
].fetch_args
= scalar_unary_fetch_args
;
803 bld_base
->op_actions
[TGSI_OPCODE_LG2
].fetch_args
= scalar_unary_fetch_args
;
805 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit
;
806 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit
;
807 bld_base
->op_actions
[TGSI_OPCODE_CLAMP
].emit
= clamp_emit
;
808 bld_base
->op_actions
[TGSI_OPCODE_END
].emit
= end_emit
;
809 bld_base
->op_actions
[TGSI_OPCODE_FRC
].emit
= frc_emit
;
810 bld_base
->op_actions
[TGSI_OPCODE_LRP
].emit
= lrp_emit
;
811 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit
;
812 bld_base
->op_actions
[TGSI_OPCODE_MOV
].emit
= mov_emit
;
813 bld_base
->op_actions
[TGSI_OPCODE_MUL
].emit
= mul_emit
;
814 bld_base
->op_actions
[TGSI_OPCODE_SFL
].emit
= sfl_emit
;
815 bld_base
->op_actions
[TGSI_OPCODE_STR
].emit
= str_emit
;
816 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit
;
818 bld_base
->op_actions
[TGSI_OPCODE_UARL
].emit
= mov_emit
;
819 bld_base
->op_actions
[TGSI_OPCODE_U2F
].emit
= u2f_emit
;
820 bld_base
->op_actions
[TGSI_OPCODE_UMAD
].emit
= umad_emit
;
821 bld_base
->op_actions
[TGSI_OPCODE_UMUL
].emit
= umul_emit
;
824 /* CPU Only default actions */
826 /* These actions are CPU only, because they could potentially output SSE
830 /* TGSI_OPCODE_ABS (CPU Only)*/
834 const struct lp_build_tgsi_action
* action
,
835 struct lp_build_tgsi_context
* bld_base
,
836 struct lp_build_emit_data
* emit_data
)
838 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->base
,
842 /* TGSI_OPCODE_ADD (CPU Only) */
845 const struct lp_build_tgsi_action
* action
,
846 struct lp_build_tgsi_context
* bld_base
,
847 struct lp_build_emit_data
* emit_data
)
849 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->base
,
850 emit_data
->args
[0], emit_data
->args
[1]);
853 /* TGSI_OPCODE_AND (CPU Only) */
856 const struct lp_build_tgsi_action
* action
,
857 struct lp_build_tgsi_context
* bld_base
,
858 struct lp_build_emit_data
* emit_data
)
860 emit_data
->output
[emit_data
->chan
] = lp_build_and(&bld_base
->uint_bld
,
861 emit_data
->args
[0], emit_data
->args
[1]);
864 /* TGSI_OPCODE_ARL (CPU Only) */
867 const struct lp_build_tgsi_action
* action
,
868 struct lp_build_tgsi_context
* bld_base
,
869 struct lp_build_emit_data
* emit_data
)
872 tmp
= lp_build_floor(&bld_base
->base
,
874 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
875 bld_base
->uint_bld
.vec_type
, "");
878 /* TGSI_OPCODE_ARR (CPU Only) */
881 const struct lp_build_tgsi_action
* action
,
882 struct lp_build_tgsi_context
* bld_base
,
883 struct lp_build_emit_data
* emit_data
)
885 emit_data
->output
[emit_data
->chan
] = lp_build_iround(&bld_base
->base
, emit_data
->args
[0]);
888 /* TGSI_OPCODE_CEIL (CPU Only) */
891 const struct lp_build_tgsi_action
* action
,
892 struct lp_build_tgsi_context
* bld_base
,
893 struct lp_build_emit_data
* emit_data
)
895 emit_data
->output
[emit_data
->chan
] = lp_build_ceil(&bld_base
->base
,
899 /* TGSI_OPCODE_CMP (CPU Only) */
902 const struct lp_build_tgsi_action
* action
,
903 struct lp_build_tgsi_context
* bld_base
,
904 struct lp_build_emit_data
* emit_data
)
906 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_LESS
,
907 emit_data
->args
[0], bld_base
->base
.zero
);
908 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
909 cond
, emit_data
->args
[1], emit_data
->args
[2]);
912 /* TGSI_OPCODE_CND (CPU Only) */
915 const struct lp_build_tgsi_action
* action
,
916 struct lp_build_tgsi_context
* bld_base
,
917 struct lp_build_emit_data
* emit_data
)
919 LLVMValueRef half
, tmp
;
920 half
= lp_build_const_vec(bld_base
->base
.gallivm
, bld_base
->base
.type
, 0.5);
921 tmp
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_GREATER
,
922 emit_data
->args
[2], half
);
923 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
929 /* TGSI_OPCODE_COS (CPU Only) */
932 const struct lp_build_tgsi_action
* action
,
933 struct lp_build_tgsi_context
* bld_base
,
934 struct lp_build_emit_data
* emit_data
)
936 emit_data
->output
[emit_data
->chan
] = lp_build_cos(&bld_base
->base
,
940 /* TGSI_OPCODE_DIV (CPU Only) */
943 const struct lp_build_tgsi_action
* action
,
944 struct lp_build_tgsi_context
* bld_base
,
945 struct lp_build_emit_data
* emit_data
)
947 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->base
,
948 emit_data
->args
[0], emit_data
->args
[1]);
951 /* TGSI_OPCODE_EX2 (CPU Only) */
954 const struct lp_build_tgsi_action
* action
,
955 struct lp_build_tgsi_context
* bld_base
,
956 struct lp_build_emit_data
* emit_data
)
958 emit_data
->output
[emit_data
->chan
] = lp_build_exp2(&bld_base
->base
,
962 /* TGSI_OPCODE_EXP (CPU Only) */
965 const struct lp_build_tgsi_action
* action
,
966 struct lp_build_tgsi_context
* bld_base
,
967 struct lp_build_emit_data
* emit_data
)
969 lp_build_exp2_approx(&bld_base
->base
, emit_data
->args
[0],
970 &emit_data
->output
[TGSI_CHAN_X
],
971 &emit_data
->output
[TGSI_CHAN_Y
],
972 &emit_data
->output
[TGSI_CHAN_Z
]);
973 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
976 /* TGSI_OPCODE_F2I (CPU Only) */
979 const struct lp_build_tgsi_action
* action
,
980 struct lp_build_tgsi_context
* bld_base
,
981 struct lp_build_emit_data
* emit_data
)
983 emit_data
->output
[emit_data
->chan
] = lp_build_itrunc(&bld_base
->base
,
987 /* TGSI_OPCODE_FLR (CPU Only) */
991 const struct lp_build_tgsi_action
* action
,
992 struct lp_build_tgsi_context
* bld_base
,
993 struct lp_build_emit_data
* emit_data
)
995 emit_data
->output
[emit_data
->chan
] = lp_build_floor(&bld_base
->base
,
999 /* TGSI_OPCODE_I2F (CPU Only) */
1002 const struct lp_build_tgsi_action
* action
,
1003 struct lp_build_tgsi_context
* bld_base
,
1004 struct lp_build_emit_data
* emit_data
)
1006 emit_data
->output
[emit_data
->chan
] = lp_build_int_to_float(&bld_base
->base
,
1007 emit_data
->args
[0]);
1010 /* TGSI_OPCODE_IABS (CPU Only) */
1013 const struct lp_build_tgsi_action
* action
,
1014 struct lp_build_tgsi_context
* bld_base
,
1015 struct lp_build_emit_data
* emit_data
)
1017 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int_bld
,
1018 emit_data
->args
[0]);
1021 /* TGSI_OPCODE_IDIV (CPU Only) */
1024 const struct lp_build_tgsi_action
* action
,
1025 struct lp_build_tgsi_context
* bld_base
,
1026 struct lp_build_emit_data
* emit_data
)
1028 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->int_bld
,
1029 emit_data
->args
[0], emit_data
->args
[1]);
1032 /* TGSI_OPCODE_INEG (CPU Only) */
1035 const struct lp_build_tgsi_action
* action
,
1036 struct lp_build_tgsi_context
* bld_base
,
1037 struct lp_build_emit_data
* emit_data
)
1039 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int_bld
,
1040 bld_base
->int_bld
.zero
,
1041 emit_data
->args
[0]);
1044 /* TGSI_OPCODE_ISET Helper (CPU Only) */
1047 const struct lp_build_tgsi_action
* action
,
1048 struct lp_build_tgsi_context
* bld_base
,
1049 struct lp_build_emit_data
* emit_data
,
1052 LLVMValueRef nz
= lp_build_const_vec(bld_base
->base
.gallivm
,
1053 bld_base
->int_bld
.type
, ~0U);
1054 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int_bld
, pipe_func
,
1055 emit_data
->args
[0], emit_data
->args
[1]);
1056 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->int_bld
,
1059 bld_base
->int_bld
.zero
);
1062 /* TGSI_OPCODE_IMAX (CPU Only) */
1065 const struct lp_build_tgsi_action
* action
,
1066 struct lp_build_tgsi_context
* bld_base
,
1067 struct lp_build_emit_data
* emit_data
)
1069 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int_bld
,
1070 emit_data
->args
[0], emit_data
->args
[1]);
1073 /* TGSI_OPCODE_IMIN (CPU Only) */
1076 const struct lp_build_tgsi_action
* action
,
1077 struct lp_build_tgsi_context
* bld_base
,
1078 struct lp_build_emit_data
* emit_data
)
1080 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int_bld
,
1081 emit_data
->args
[0], emit_data
->args
[1]);
1084 /* TGSI_OPCODE_ISGE (CPU Only) */
1087 const struct lp_build_tgsi_action
* action
,
1088 struct lp_build_tgsi_context
* bld_base
,
1089 struct lp_build_emit_data
* emit_data
)
1091 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1094 /* TGSI_OPCODE_ISHR (CPU Only) */
1097 const struct lp_build_tgsi_action
* action
,
1098 struct lp_build_tgsi_context
* bld_base
,
1099 struct lp_build_emit_data
* emit_data
)
1101 emit_data
->output
[emit_data
->chan
] = lp_build_shr(&bld_base
->int_bld
,
1102 emit_data
->args
[0], emit_data
->args
[1]);
1105 /* TGSI_OPCODE_ISLT (CPU Only) */
1108 const struct lp_build_tgsi_action
* action
,
1109 struct lp_build_tgsi_context
* bld_base
,
1110 struct lp_build_emit_data
* emit_data
)
1112 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1116 /* TGSI_OPCODE_ISSG (CPU Only) */
1119 const struct lp_build_tgsi_action
* action
,
1120 struct lp_build_tgsi_context
* bld_base
,
1121 struct lp_build_emit_data
* emit_data
)
1123 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int_bld
,
1124 emit_data
->args
[0]);
1127 /* TGSI_OPCODE_LG2 (CPU Only) */
1130 const struct lp_build_tgsi_action
* action
,
1131 struct lp_build_tgsi_context
* bld_base
,
1132 struct lp_build_emit_data
* emit_data
)
1134 emit_data
->output
[emit_data
->chan
] = lp_build_log2(&bld_base
->base
,
1135 emit_data
->args
[0]);
1138 /* TGSI_OPCODE_LOG (CPU Only) */
1141 const struct lp_build_tgsi_action
* action
,
1142 struct lp_build_tgsi_context
* bld_base
,
1143 struct lp_build_emit_data
* emit_data
)
1145 LLVMValueRef p_floor_log2
;
1147 LLVMValueRef p_log2
;
1148 LLVMValueRef src0
= emit_data
->args
[0];
1150 lp_build_log2_approx(&bld_base
->base
, src0
,
1151 &p_exp
, &p_floor_log2
, &p_log2
);
1153 emit_data
->output
[TGSI_CHAN_X
] = p_floor_log2
;
1155 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
1158 emit_data
->output
[TGSI_CHAN_Z
] = p_log2
;
1160 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
1164 /* TGSI_OPCODE_MAX (CPU Only) */
1168 const struct lp_build_tgsi_action
* action
,
1169 struct lp_build_tgsi_context
* bld_base
,
1170 struct lp_build_emit_data
* emit_data
)
1172 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->base
,
1173 emit_data
->args
[0], emit_data
->args
[1]);
1176 /* TGSI_OPCODE_MIN (CPU Only) */
1179 const struct lp_build_tgsi_action
* action
,
1180 struct lp_build_tgsi_context
* bld_base
,
1181 struct lp_build_emit_data
* emit_data
)
1183 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->base
,
1184 emit_data
->args
[0], emit_data
->args
[1]);
1187 /* TGSI_OPCODE_MOD (CPU Only) */
1190 const struct lp_build_tgsi_action
* action
,
1191 struct lp_build_tgsi_context
* bld_base
,
1192 struct lp_build_emit_data
* emit_data
)
1194 emit_data
->output
[emit_data
->chan
] = lp_build_mod(&bld_base
->int_bld
,
1195 emit_data
->args
[0], emit_data
->args
[1]);
1198 /* TGSI_OPCODE_NOT */
1201 const struct lp_build_tgsi_action
* action
,
1202 struct lp_build_tgsi_context
* bld_base
,
1203 struct lp_build_emit_data
* emit_data
)
1205 emit_data
->output
[emit_data
->chan
] = lp_build_not(&bld_base
->base
,
1206 emit_data
->args
[0]);
1209 /* TGSI_OPCODE_OR (CPU Only) */
1212 const struct lp_build_tgsi_action
* action
,
1213 struct lp_build_tgsi_context
* bld_base
,
1214 struct lp_build_emit_data
* emit_data
)
1216 emit_data
->output
[emit_data
->chan
] = lp_build_or(&bld_base
->uint_bld
,
1217 emit_data
->args
[0], emit_data
->args
[1]);
1220 /* TGSI_OPCODE_POW (CPU Only) */
1223 const struct lp_build_tgsi_action
* action
,
1224 struct lp_build_tgsi_context
* bld_base
,
1225 struct lp_build_emit_data
* emit_data
)
1227 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
1228 emit_data
->args
[0], emit_data
->args
[1]);
1232 /* TGSI_OPCODE_RCP (CPU Only) */
1236 const struct lp_build_tgsi_action
* action
,
1237 struct lp_build_tgsi_context
* bld_base
,
1238 struct lp_build_emit_data
* emit_data
)
1240 emit_data
->output
[emit_data
->chan
] = lp_build_rcp(&bld_base
->base
,
1241 emit_data
->args
[0]);
1244 /* Reciprical squareroot (CPU Only) */
1246 /* This is not the same as TGSI_OPCODE_RSQ, which requres the argument to be
1247 * greater than or equal to 0 */
1249 recip_sqrt_emit_cpu(
1250 const struct lp_build_tgsi_action
* action
,
1251 struct lp_build_tgsi_context
* bld_base
,
1252 struct lp_build_emit_data
* emit_data
)
1254 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->base
,
1255 emit_data
->args
[0]);
1258 /* TGSI_OPCODE_ROUND (CPU Only) */
1261 const struct lp_build_tgsi_action
* action
,
1262 struct lp_build_tgsi_context
* bld_base
,
1263 struct lp_build_emit_data
* emit_data
)
1265 emit_data
->output
[emit_data
->chan
] = lp_build_round(&bld_base
->base
,
1266 emit_data
->args
[0]);
1269 /* TGSI_OPCODE_SET Helper (CPU Only) */
1273 const struct lp_build_tgsi_action
* action
,
1274 struct lp_build_tgsi_context
* bld_base
,
1275 struct lp_build_emit_data
* emit_data
,
1278 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1279 emit_data
->args
[0], emit_data
->args
[1]);
1280 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1283 bld_base
->base
.zero
);
1286 /* TGSI_OPCODE_SEQ (CPU Only) */
1290 const struct lp_build_tgsi_action
* action
,
1291 struct lp_build_tgsi_context
* bld_base
,
1292 struct lp_build_emit_data
* emit_data
)
1294 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1297 /* TGSI_OPCODE_SGE (CPU Only) */
1300 const struct lp_build_tgsi_action
* action
,
1301 struct lp_build_tgsi_context
* bld_base
,
1302 struct lp_build_emit_data
* emit_data
)
1304 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1307 /* TGSI_OPCODE_SGT (CPU Only)*/
1311 const struct lp_build_tgsi_action
* action
,
1312 struct lp_build_tgsi_context
* bld_base
,
1313 struct lp_build_emit_data
* emit_data
)
1315 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GREATER
);
1318 /* TGSI_OPCODE_SHL (CPU Only) */
1321 const struct lp_build_tgsi_action
* action
,
1322 struct lp_build_tgsi_context
* bld_base
,
1323 struct lp_build_emit_data
* emit_data
)
1325 emit_data
->output
[emit_data
->chan
] = lp_build_shl(&bld_base
->uint_bld
,
1326 emit_data
->args
[0], emit_data
->args
[1]);
1329 /* TGSI_OPCODE_SIN (CPU Only) */
1332 const struct lp_build_tgsi_action
* action
,
1333 struct lp_build_tgsi_context
* bld_base
,
1334 struct lp_build_emit_data
* emit_data
)
1336 emit_data
->output
[emit_data
->chan
] = lp_build_sin(&bld_base
->base
,
1337 emit_data
->args
[0]);
1340 /* TGSI_OPCODE_SLE (CPU Only) */
1343 const struct lp_build_tgsi_action
* action
,
1344 struct lp_build_tgsi_context
* bld_base
,
1345 struct lp_build_emit_data
* emit_data
)
1347 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LEQUAL
);
1350 /* TGSI_OPCODE_SLT (CPU Only) */
1353 const struct lp_build_tgsi_action
* action
,
1354 struct lp_build_tgsi_context
* bld_base
,
1355 struct lp_build_emit_data
* emit_data
)
1357 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1360 /* TGSI_OPCODE_SNE (CPU Only) */
1364 const struct lp_build_tgsi_action
* action
,
1365 struct lp_build_tgsi_context
* bld_base
,
1366 struct lp_build_emit_data
* emit_data
)
1368 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1371 /* TGSI_OPCODE_SSG (CPU Only) */
1375 const struct lp_build_tgsi_action
* action
,
1376 struct lp_build_tgsi_context
* bld_base
,
1377 struct lp_build_emit_data
* emit_data
)
1379 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->base
,
1380 emit_data
->args
[0]);
1383 /* TGSI_OPCODE_SUB (CPU Only) */
1387 const struct lp_build_tgsi_action
* action
,
1388 struct lp_build_tgsi_context
* bld_base
,
1389 struct lp_build_emit_data
* emit_data
)
1391 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->base
,
1393 emit_data
->args
[1]);
1396 /* TGSI_OPCODE_TRUNC (CPU Only) */
1400 const struct lp_build_tgsi_action
* action
,
1401 struct lp_build_tgsi_context
* bld_base
,
1402 struct lp_build_emit_data
* emit_data
)
1404 emit_data
->output
[emit_data
->chan
] = lp_build_trunc(&bld_base
->base
,
1405 emit_data
->args
[0]);
1408 /* TGSI_OPCODE_UADD (CPU Only) */
1411 const struct lp_build_tgsi_action
* action
,
1412 struct lp_build_tgsi_context
* bld_base
,
1413 struct lp_build_emit_data
* emit_data
)
1415 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint_bld
,
1416 emit_data
->args
[0], emit_data
->args
[1]);
1419 /* TGSI_OPCODE_UDIV (CPU Only) */
1422 const struct lp_build_tgsi_action
* action
,
1423 struct lp_build_tgsi_context
* bld_base
,
1424 struct lp_build_emit_data
* emit_data
)
1426 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->uint_bld
,
1427 emit_data
->args
[0], emit_data
->args
[1]);
1430 /* TGSI_OPCODE_UMAX (CPU Only) */
1433 const struct lp_build_tgsi_action
* action
,
1434 struct lp_build_tgsi_context
* bld_base
,
1435 struct lp_build_emit_data
* emit_data
)
1437 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint_bld
,
1438 emit_data
->args
[0], emit_data
->args
[1]);
1441 /* TGSI_OPCODE_UMIN (CPU Only) */
1444 const struct lp_build_tgsi_action
* action
,
1445 struct lp_build_tgsi_context
* bld_base
,
1446 struct lp_build_emit_data
* emit_data
)
1448 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint_bld
,
1449 emit_data
->args
[0], emit_data
->args
[1]);
1452 /* TGSI_OPCODE_UMOD (CPU Only) */
1455 const struct lp_build_tgsi_action
* action
,
1456 struct lp_build_tgsi_context
* bld_base
,
1457 struct lp_build_emit_data
* emit_data
)
1459 emit_data
->output
[emit_data
->chan
] = lp_build_mod(&bld_base
->uint_bld
,
1460 emit_data
->args
[0], emit_data
->args
[1]);
1463 /* TGSI_OPCODE_USET Helper (CPU Only) */
1466 const struct lp_build_tgsi_action
* action
,
1467 struct lp_build_tgsi_context
* bld_base
,
1468 struct lp_build_emit_data
* emit_data
,
1471 LLVMValueRef nz
= lp_build_const_vec(bld_base
->base
.gallivm
,
1472 bld_base
->uint_bld
.type
, ~0U);
1473 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint_bld
, pipe_func
,
1474 emit_data
->args
[0], emit_data
->args
[1]);
1475 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->uint_bld
,
1478 bld_base
->uint_bld
.zero
);
1482 /* TGSI_OPCODE_USEQ (CPU Only) */
1485 const struct lp_build_tgsi_action
* action
,
1486 struct lp_build_tgsi_context
* bld_base
,
1487 struct lp_build_emit_data
* emit_data
)
1489 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1492 /* TGSI_OPCODE_ISGE (CPU Only) */
1495 const struct lp_build_tgsi_action
* action
,
1496 struct lp_build_tgsi_context
* bld_base
,
1497 struct lp_build_emit_data
* emit_data
)
1499 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1502 /* TGSI_OPCODE_USHR (CPU Only) */
1505 const struct lp_build_tgsi_action
* action
,
1506 struct lp_build_tgsi_context
* bld_base
,
1507 struct lp_build_emit_data
* emit_data
)
1509 emit_data
->output
[emit_data
->chan
] = lp_build_shr(&bld_base
->uint_bld
,
1510 emit_data
->args
[0], emit_data
->args
[1]);
1513 /* TGSI_OPCODE_ISLT (CPU Only) */
1516 const struct lp_build_tgsi_action
* action
,
1517 struct lp_build_tgsi_context
* bld_base
,
1518 struct lp_build_emit_data
* emit_data
)
1520 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1523 /* TGSI_OPCODE_USNE (CPU Only) */
1527 const struct lp_build_tgsi_action
* action
,
1528 struct lp_build_tgsi_context
* bld_base
,
1529 struct lp_build_emit_data
* emit_data
)
1531 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1534 /* TGSI_OPCODE_XOR */
1537 const struct lp_build_tgsi_action
* action
,
1538 struct lp_build_tgsi_context
* bld_base
,
1539 struct lp_build_emit_data
* emit_data
)
1541 emit_data
->output
[emit_data
->chan
] = lp_build_xor(&bld_base
->uint_bld
,
1543 emit_data
->args
[1]);
1547 lp_set_default_actions_cpu(
1548 struct lp_build_tgsi_context
* bld_base
)
1550 lp_set_default_actions(bld_base
);
1551 bld_base
->op_actions
[TGSI_OPCODE_ABS
].emit
= abs_emit_cpu
;
1552 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit_cpu
;
1553 bld_base
->op_actions
[TGSI_OPCODE_AND
].emit
= and_emit_cpu
;
1554 bld_base
->op_actions
[TGSI_OPCODE_ARL
].emit
= arl_emit_cpu
;
1555 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit_cpu
;
1556 bld_base
->op_actions
[TGSI_OPCODE_CEIL
].emit
= ceil_emit_cpu
;
1557 bld_base
->op_actions
[TGSI_OPCODE_CND
].emit
= cnd_emit_cpu
;
1558 bld_base
->op_actions
[TGSI_OPCODE_COS
].emit
= cos_emit_cpu
;
1559 bld_base
->op_actions
[TGSI_OPCODE_CMP
].emit
= cmp_emit_cpu
;
1560 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= div_emit_cpu
;
1561 bld_base
->op_actions
[TGSI_OPCODE_EX2
].emit
= ex2_emit_cpu
;
1562 bld_base
->op_actions
[TGSI_OPCODE_EXP
].emit
= exp_emit_cpu
;
1563 bld_base
->op_actions
[TGSI_OPCODE_F2I
].emit
= f2i_emit_cpu
;
1564 bld_base
->op_actions
[TGSI_OPCODE_FLR
].emit
= flr_emit_cpu
;
1566 bld_base
->op_actions
[TGSI_OPCODE_I2F
].emit
= i2f_emit_cpu
;
1567 bld_base
->op_actions
[TGSI_OPCODE_IABS
].emit
= iabs_emit_cpu
;
1568 bld_base
->op_actions
[TGSI_OPCODE_IDIV
].emit
= idiv_emit_cpu
;
1569 bld_base
->op_actions
[TGSI_OPCODE_INEG
].emit
= ineg_emit_cpu
;
1570 bld_base
->op_actions
[TGSI_OPCODE_IMAX
].emit
= imax_emit_cpu
;
1571 bld_base
->op_actions
[TGSI_OPCODE_IMIN
].emit
= imin_emit_cpu
;
1572 bld_base
->op_actions
[TGSI_OPCODE_ISGE
].emit
= isge_emit_cpu
;
1573 bld_base
->op_actions
[TGSI_OPCODE_ISHR
].emit
= ishr_emit_cpu
;
1574 bld_base
->op_actions
[TGSI_OPCODE_ISLT
].emit
= islt_emit_cpu
;
1575 bld_base
->op_actions
[TGSI_OPCODE_ISSG
].emit
= issg_emit_cpu
;
1577 bld_base
->op_actions
[TGSI_OPCODE_LG2
].emit
= lg2_emit_cpu
;
1578 bld_base
->op_actions
[TGSI_OPCODE_LOG
].emit
= log_emit_cpu
;
1579 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= max_emit_cpu
;
1580 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= min_emit_cpu
;
1581 bld_base
->op_actions
[TGSI_OPCODE_MOD
].emit
= mod_emit_cpu
;
1582 bld_base
->op_actions
[TGSI_OPCODE_NOT
].emit
= not_emit_cpu
;
1583 bld_base
->op_actions
[TGSI_OPCODE_OR
].emit
= or_emit_cpu
;
1584 bld_base
->op_actions
[TGSI_OPCODE_POW
].emit
= pow_emit_cpu
;
1585 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit_cpu
;
1586 bld_base
->op_actions
[TGSI_OPCODE_ROUND
].emit
= round_emit_cpu
;
1587 bld_base
->op_actions
[TGSI_OPCODE_SEQ
].emit
= seq_emit_cpu
;
1588 bld_base
->op_actions
[TGSI_OPCODE_SGE
].emit
= sge_emit_cpu
;
1589 bld_base
->op_actions
[TGSI_OPCODE_SGT
].emit
= sgt_emit_cpu
;
1590 bld_base
->op_actions
[TGSI_OPCODE_SIN
].emit
= sin_emit_cpu
;
1591 bld_base
->op_actions
[TGSI_OPCODE_SHL
].emit
= shl_emit_cpu
;
1592 bld_base
->op_actions
[TGSI_OPCODE_SLE
].emit
= sle_emit_cpu
;
1593 bld_base
->op_actions
[TGSI_OPCODE_SLT
].emit
= slt_emit_cpu
;
1594 bld_base
->op_actions
[TGSI_OPCODE_SNE
].emit
= sne_emit_cpu
;
1595 bld_base
->op_actions
[TGSI_OPCODE_SSG
].emit
= ssg_emit_cpu
;
1596 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit_cpu
;
1597 bld_base
->op_actions
[TGSI_OPCODE_TRUNC
].emit
= trunc_emit_cpu
;
1599 bld_base
->rsq_action
.emit
= recip_sqrt_emit_cpu
;
1601 bld_base
->op_actions
[TGSI_OPCODE_UADD
].emit
= uadd_emit_cpu
;
1602 bld_base
->op_actions
[TGSI_OPCODE_UDIV
].emit
= udiv_emit_cpu
;
1603 bld_base
->op_actions
[TGSI_OPCODE_UMAX
].emit
= umax_emit_cpu
;
1604 bld_base
->op_actions
[TGSI_OPCODE_UMIN
].emit
= umin_emit_cpu
;
1605 bld_base
->op_actions
[TGSI_OPCODE_UMOD
].emit
= umod_emit_cpu
;
1606 bld_base
->op_actions
[TGSI_OPCODE_USEQ
].emit
= useq_emit_cpu
;
1607 bld_base
->op_actions
[TGSI_OPCODE_USGE
].emit
= usge_emit_cpu
;
1608 bld_base
->op_actions
[TGSI_OPCODE_USHR
].emit
= ushr_emit_cpu
;
1609 bld_base
->op_actions
[TGSI_OPCODE_USLT
].emit
= uslt_emit_cpu
;
1610 bld_base
->op_actions
[TGSI_OPCODE_USNE
].emit
= usne_emit_cpu
;
1612 bld_base
->op_actions
[TGSI_OPCODE_XOR
].emit
= xor_emit_cpu
;