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_DIV.*/
588 static void fdiv_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
)
593 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
594 bld_base
->base
.gallivm
->builder
,
595 emit_data
->args
[0], emit_data
->args
[1], "");
598 /*.TGSI_OPCODE_RCP.*/
599 static void rcp_emit(
600 const struct lp_build_tgsi_action
* action
,
601 struct lp_build_tgsi_context
* bld_base
,
602 struct lp_build_emit_data
* emit_data
)
605 one
= lp_build_const_float(bld_base
->base
.gallivm
, 1.0f
);
606 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
607 TGSI_OPCODE_DIV
, one
, emit_data
->args
[0]);
610 /* TGSI_OPCODE_POW */
614 const struct lp_build_tgsi_action
* action
,
615 struct lp_build_tgsi_context
* bld_base
,
616 struct lp_build_emit_data
* emit_data
)
618 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
619 emit_data
->args
[0], emit_data
->args
[1]);
622 static struct lp_build_tgsi_action pow_action
= {
623 scalar_binary_fetch_args
, /* fetch_args */
627 /* TGSI_OPCODE_RSQ */
631 const struct lp_build_tgsi_action
* action
,
632 struct lp_build_tgsi_context
* bld_base
,
633 struct lp_build_emit_data
* emit_data
)
635 emit_data
->args
[0] = lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_ABS
,
637 if (bld_base
->rsq_action
.emit
) {
638 bld_base
->rsq_action
.emit(&bld_base
->rsq_action
, bld_base
, emit_data
);
640 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
644 const struct lp_build_tgsi_action rsq_action
= {
645 scalar_unary_fetch_args
, /* fetch_args */
650 /* TGSI_OPCODE_SCS */
653 const struct lp_build_tgsi_action
* action
,
654 struct lp_build_tgsi_context
* bld_base
,
655 struct lp_build_emit_data
* emit_data
)
658 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
659 TGSI_OPCODE_COS
, emit_data
->args
[0]);
661 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_unary(bld_base
,
662 TGSI_OPCODE_SIN
, emit_data
->args
[0]);
664 emit_data
->output
[TGSI_CHAN_Z
] = bld_base
->base
.zero
;
667 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
670 const struct lp_build_tgsi_action scs_action
= {
671 scalar_unary_fetch_args
, /* fetch_args */
675 /* TGSI_OPCODE_SFL */
679 const struct lp_build_tgsi_action
* action
,
680 struct lp_build_tgsi_context
* bld_base
,
681 struct lp_build_emit_data
* emit_data
)
683 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.zero
;
686 /* TGSI_OPCODE_STR */
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
] = bld_base
->base
.one
;
697 /* TGSI_OPCODE_SUB */
700 const struct lp_build_tgsi_action
* action
,
701 struct lp_build_tgsi_context
* bld_base
,
702 struct lp_build_emit_data
* emit_data
)
704 emit_data
->output
[emit_data
->chan
] = LLVMBuildFSub(
705 bld_base
->base
.gallivm
->builder
,
707 emit_data
->args
[1], "");
710 /* TGSI_OPCODE_U2F */
713 const struct lp_build_tgsi_action
* action
,
714 struct lp_build_tgsi_context
* bld_base
,
715 struct lp_build_emit_data
* emit_data
)
717 emit_data
->output
[emit_data
->chan
] = LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
719 bld_base
->base
.vec_type
, "");
724 const struct lp_build_tgsi_action
* action
,
725 struct lp_build_tgsi_context
* bld_base
,
726 struct lp_build_emit_data
* emit_data
)
729 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_UMUL
,
732 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
733 TGSI_OPCODE_UADD
, tmp
, emit_data
->args
[2]);
736 /* TGSI_OPCODE_UMUL */
739 const struct lp_build_tgsi_action
* action
,
740 struct lp_build_tgsi_context
* bld_base
,
741 struct lp_build_emit_data
* emit_data
)
743 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint_bld
,
744 emit_data
->args
[0], emit_data
->args
[1]);
747 /* TGSI_OPCODE_MAX */
748 static void fmax_emit(
749 const struct lp_build_tgsi_action
* action
,
750 struct lp_build_tgsi_context
* bld_base
,
751 struct lp_build_emit_data
* emit_data
)
753 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
754 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
755 LLVMBuildFCmp(builder
, LLVMRealUGE
,
756 emit_data
->args
[0], emit_data
->args
[1], ""),
757 emit_data
->args
[0], emit_data
->args
[1], "");
760 /* TGSI_OPCODE_MIN */
761 static void fmin_emit(
762 const struct lp_build_tgsi_action
* action
,
763 struct lp_build_tgsi_context
* bld_base
,
764 struct lp_build_emit_data
* emit_data
)
766 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
767 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
768 LLVMBuildFCmp(builder
, LLVMRealUGE
,
769 emit_data
->args
[0], emit_data
->args
[1], ""),
770 emit_data
->args
[1], emit_data
->args
[0], "");
773 /* TGSI_OPCODE_XPD */
777 struct lp_build_tgsi_context
* bld_base
,
778 struct lp_build_emit_data
* emit_data
)
780 dp_fetch_args(bld_base
, emit_data
, 3);
788 struct lp_build_tgsi_context
* bld_base
,
794 LLVMValueRef tmp0
, tmp1
;
796 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, a
, b
);
797 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, c
, d
);
799 return lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_SUB
, tmp0
, tmp1
);
804 const struct lp_build_tgsi_action
* action
,
805 struct lp_build_tgsi_context
* bld_base
,
806 struct lp_build_emit_data
* emit_data
)
808 emit_data
->output
[TGSI_CHAN_X
] = xpd_helper(bld_base
,
809 emit_data
->args
[1] /* src0.y */, emit_data
->args
[5] /* src1.z */,
810 emit_data
->args
[4] /* src1.y */, emit_data
->args
[2] /* src0.z */);
812 emit_data
->output
[TGSI_CHAN_Y
] = xpd_helper(bld_base
,
813 emit_data
->args
[2] /* src0.z */, emit_data
->args
[3] /* src1.x */,
814 emit_data
->args
[5] /* src1.z */, emit_data
->args
[0] /* src0.x */);
816 emit_data
->output
[TGSI_CHAN_Z
] = xpd_helper(bld_base
,
817 emit_data
->args
[0] /* src0.x */, emit_data
->args
[4] /* src1.y */,
818 emit_data
->args
[3] /* src1.x */, emit_data
->args
[1] /* src0.y */);
820 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
823 const struct lp_build_tgsi_action xpd_action
= {
824 xpd_fetch_args
, /* fetch_args */
829 lp_set_default_actions(struct lp_build_tgsi_context
* bld_base
)
831 bld_base
->op_actions
[TGSI_OPCODE_DP2
] = dp2_action
;
832 bld_base
->op_actions
[TGSI_OPCODE_DP3
] = dp3_action
;
833 bld_base
->op_actions
[TGSI_OPCODE_DP4
] = dp4_action
;
834 bld_base
->op_actions
[TGSI_OPCODE_DP2A
] = dp2a_action
;
835 bld_base
->op_actions
[TGSI_OPCODE_DPH
] = dph_action
;
836 bld_base
->op_actions
[TGSI_OPCODE_DST
] = dst_action
;
837 bld_base
->op_actions
[TGSI_OPCODE_EXP
] = exp_action
;
838 bld_base
->op_actions
[TGSI_OPCODE_LIT
] = lit_action
;
839 bld_base
->op_actions
[TGSI_OPCODE_LOG
] = log_action
;
840 bld_base
->op_actions
[TGSI_OPCODE_RSQ
] = rsq_action
;
841 bld_base
->op_actions
[TGSI_OPCODE_POW
] = pow_action
;
842 bld_base
->op_actions
[TGSI_OPCODE_SCS
] = scs_action
;
843 bld_base
->op_actions
[TGSI_OPCODE_XPD
] = xpd_action
;
845 bld_base
->op_actions
[TGSI_OPCODE_COS
].fetch_args
= scalar_unary_fetch_args
;
846 bld_base
->op_actions
[TGSI_OPCODE_EX2
].fetch_args
= scalar_unary_fetch_args
;
847 bld_base
->op_actions
[TGSI_OPCODE_IF
].fetch_args
= scalar_unary_fetch_args
;
848 bld_base
->op_actions
[TGSI_OPCODE_KIL
].fetch_args
= kil_fetch_args
;
849 bld_base
->op_actions
[TGSI_OPCODE_KILP
].fetch_args
= kilp_fetch_args
;
850 bld_base
->op_actions
[TGSI_OPCODE_RCP
].fetch_args
= scalar_unary_fetch_args
;
851 bld_base
->op_actions
[TGSI_OPCODE_SIN
].fetch_args
= scalar_unary_fetch_args
;
852 bld_base
->op_actions
[TGSI_OPCODE_LG2
].fetch_args
= scalar_unary_fetch_args
;
854 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit
;
855 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit
;
856 bld_base
->op_actions
[TGSI_OPCODE_CLAMP
].emit
= clamp_emit
;
857 bld_base
->op_actions
[TGSI_OPCODE_END
].emit
= end_emit
;
858 bld_base
->op_actions
[TGSI_OPCODE_FRC
].emit
= frc_emit
;
859 bld_base
->op_actions
[TGSI_OPCODE_LRP
].emit
= lrp_emit
;
860 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit
;
861 bld_base
->op_actions
[TGSI_OPCODE_MOV
].emit
= mov_emit
;
862 bld_base
->op_actions
[TGSI_OPCODE_MUL
].emit
= mul_emit
;
863 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= fdiv_emit
;
864 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit
;
865 bld_base
->op_actions
[TGSI_OPCODE_SFL
].emit
= sfl_emit
;
866 bld_base
->op_actions
[TGSI_OPCODE_STR
].emit
= str_emit
;
867 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit
;
869 bld_base
->op_actions
[TGSI_OPCODE_UARL
].emit
= mov_emit
;
870 bld_base
->op_actions
[TGSI_OPCODE_U2F
].emit
= u2f_emit
;
871 bld_base
->op_actions
[TGSI_OPCODE_UMAD
].emit
= umad_emit
;
872 bld_base
->op_actions
[TGSI_OPCODE_UMUL
].emit
= umul_emit
;
874 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= fmax_emit
;
875 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= fmin_emit
;
878 /* CPU Only default actions */
880 /* These actions are CPU only, because they could potentially output SSE
884 /* TGSI_OPCODE_ABS (CPU Only)*/
888 const struct lp_build_tgsi_action
* action
,
889 struct lp_build_tgsi_context
* bld_base
,
890 struct lp_build_emit_data
* emit_data
)
892 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->base
,
896 /* TGSI_OPCODE_ADD (CPU Only) */
899 const struct lp_build_tgsi_action
* action
,
900 struct lp_build_tgsi_context
* bld_base
,
901 struct lp_build_emit_data
* emit_data
)
903 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->base
,
904 emit_data
->args
[0], emit_data
->args
[1]);
907 /* TGSI_OPCODE_AND (CPU Only) */
910 const struct lp_build_tgsi_action
* action
,
911 struct lp_build_tgsi_context
* bld_base
,
912 struct lp_build_emit_data
* emit_data
)
914 emit_data
->output
[emit_data
->chan
] = lp_build_and(&bld_base
->uint_bld
,
915 emit_data
->args
[0], emit_data
->args
[1]);
918 /* TGSI_OPCODE_ARL (CPU Only) */
921 const struct lp_build_tgsi_action
* action
,
922 struct lp_build_tgsi_context
* bld_base
,
923 struct lp_build_emit_data
* emit_data
)
926 tmp
= lp_build_floor(&bld_base
->base
,
928 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
929 bld_base
->uint_bld
.vec_type
, "");
932 /* TGSI_OPCODE_ARR (CPU Only) */
935 const struct lp_build_tgsi_action
* action
,
936 struct lp_build_tgsi_context
* bld_base
,
937 struct lp_build_emit_data
* emit_data
)
939 emit_data
->output
[emit_data
->chan
] = lp_build_iround(&bld_base
->base
, emit_data
->args
[0]);
942 /* TGSI_OPCODE_CEIL (CPU Only) */
945 const struct lp_build_tgsi_action
* action
,
946 struct lp_build_tgsi_context
* bld_base
,
947 struct lp_build_emit_data
* emit_data
)
949 emit_data
->output
[emit_data
->chan
] = lp_build_ceil(&bld_base
->base
,
953 /* TGSI_OPCODE_CMP (CPU Only) */
956 const struct lp_build_tgsi_action
* action
,
957 struct lp_build_tgsi_context
* bld_base
,
958 struct lp_build_emit_data
* emit_data
)
960 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_LESS
,
961 emit_data
->args
[0], bld_base
->base
.zero
);
962 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
963 cond
, emit_data
->args
[1], emit_data
->args
[2]);
966 /* TGSI_OPCODE_CND (CPU Only) */
969 const struct lp_build_tgsi_action
* action
,
970 struct lp_build_tgsi_context
* bld_base
,
971 struct lp_build_emit_data
* emit_data
)
973 LLVMValueRef half
, tmp
;
974 half
= lp_build_const_vec(bld_base
->base
.gallivm
, bld_base
->base
.type
, 0.5);
975 tmp
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_GREATER
,
976 emit_data
->args
[2], half
);
977 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
983 /* TGSI_OPCODE_COS (CPU Only) */
986 const struct lp_build_tgsi_action
* action
,
987 struct lp_build_tgsi_context
* bld_base
,
988 struct lp_build_emit_data
* emit_data
)
990 emit_data
->output
[emit_data
->chan
] = lp_build_cos(&bld_base
->base
,
994 /* TGSI_OPCODE_DIV (CPU Only) */
997 const struct lp_build_tgsi_action
* action
,
998 struct lp_build_tgsi_context
* bld_base
,
999 struct lp_build_emit_data
* emit_data
)
1001 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->base
,
1002 emit_data
->args
[0], emit_data
->args
[1]);
1005 /* TGSI_OPCODE_EX2 (CPU Only) */
1008 const struct lp_build_tgsi_action
* action
,
1009 struct lp_build_tgsi_context
* bld_base
,
1010 struct lp_build_emit_data
* emit_data
)
1012 emit_data
->output
[emit_data
->chan
] = lp_build_exp2(&bld_base
->base
,
1013 emit_data
->args
[0]);
1016 /* TGSI_OPCODE_EXP (CPU Only) */
1019 const struct lp_build_tgsi_action
* action
,
1020 struct lp_build_tgsi_context
* bld_base
,
1021 struct lp_build_emit_data
* emit_data
)
1023 lp_build_exp2_approx(&bld_base
->base
, emit_data
->args
[0],
1024 &emit_data
->output
[TGSI_CHAN_X
],
1025 &emit_data
->output
[TGSI_CHAN_Y
],
1026 &emit_data
->output
[TGSI_CHAN_Z
]);
1027 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
1030 /* TGSI_OPCODE_F2I (CPU Only) */
1033 const struct lp_build_tgsi_action
* action
,
1034 struct lp_build_tgsi_context
* bld_base
,
1035 struct lp_build_emit_data
* emit_data
)
1037 emit_data
->output
[emit_data
->chan
] = lp_build_itrunc(&bld_base
->base
,
1038 emit_data
->args
[0]);
1041 /* TGSI_OPCODE_F2U (CPU Only) */
1044 const struct lp_build_tgsi_action
* action
,
1045 struct lp_build_tgsi_context
* bld_base
,
1046 struct lp_build_emit_data
* emit_data
)
1048 /* FIXME: implement and use lp_build_utrunc() */
1049 emit_data
->output
[emit_data
->chan
] = lp_build_itrunc(&bld_base
->base
,
1050 emit_data
->args
[0]);
1053 /* TGSI_OPCODE_FLR (CPU Only) */
1057 const struct lp_build_tgsi_action
* action
,
1058 struct lp_build_tgsi_context
* bld_base
,
1059 struct lp_build_emit_data
* emit_data
)
1061 emit_data
->output
[emit_data
->chan
] = lp_build_floor(&bld_base
->base
,
1062 emit_data
->args
[0]);
1065 /* TGSI_OPCODE_I2F (CPU Only) */
1068 const struct lp_build_tgsi_action
* action
,
1069 struct lp_build_tgsi_context
* bld_base
,
1070 struct lp_build_emit_data
* emit_data
)
1072 emit_data
->output
[emit_data
->chan
] = lp_build_int_to_float(&bld_base
->base
,
1073 emit_data
->args
[0]);
1076 /* TGSI_OPCODE_IABS (CPU Only) */
1079 const struct lp_build_tgsi_action
* action
,
1080 struct lp_build_tgsi_context
* bld_base
,
1081 struct lp_build_emit_data
* emit_data
)
1083 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int_bld
,
1084 emit_data
->args
[0]);
1087 /* TGSI_OPCODE_IDIV (CPU Only) */
1090 const struct lp_build_tgsi_action
* action
,
1091 struct lp_build_tgsi_context
* bld_base
,
1092 struct lp_build_emit_data
* emit_data
)
1094 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->int_bld
,
1095 emit_data
->args
[0], emit_data
->args
[1]);
1098 /* TGSI_OPCODE_INEG (CPU Only) */
1101 const struct lp_build_tgsi_action
* action
,
1102 struct lp_build_tgsi_context
* bld_base
,
1103 struct lp_build_emit_data
* emit_data
)
1105 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int_bld
,
1106 bld_base
->int_bld
.zero
,
1107 emit_data
->args
[0]);
1110 /* TGSI_OPCODE_ISET Helper (CPU Only) */
1113 const struct lp_build_tgsi_action
* action
,
1114 struct lp_build_tgsi_context
* bld_base
,
1115 struct lp_build_emit_data
* emit_data
,
1118 LLVMValueRef nz
= lp_build_const_vec(bld_base
->base
.gallivm
,
1119 bld_base
->int_bld
.type
, ~0U);
1120 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int_bld
, pipe_func
,
1121 emit_data
->args
[0], emit_data
->args
[1]);
1122 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->int_bld
,
1125 bld_base
->int_bld
.zero
);
1128 /* TGSI_OPCODE_IMAX (CPU Only) */
1131 const struct lp_build_tgsi_action
* action
,
1132 struct lp_build_tgsi_context
* bld_base
,
1133 struct lp_build_emit_data
* emit_data
)
1135 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int_bld
,
1136 emit_data
->args
[0], emit_data
->args
[1]);
1139 /* TGSI_OPCODE_IMIN (CPU Only) */
1142 const struct lp_build_tgsi_action
* action
,
1143 struct lp_build_tgsi_context
* bld_base
,
1144 struct lp_build_emit_data
* emit_data
)
1146 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int_bld
,
1147 emit_data
->args
[0], emit_data
->args
[1]);
1150 /* TGSI_OPCODE_ISGE (CPU Only) */
1153 const struct lp_build_tgsi_action
* action
,
1154 struct lp_build_tgsi_context
* bld_base
,
1155 struct lp_build_emit_data
* emit_data
)
1157 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1160 /* TGSI_OPCODE_ISHR (CPU Only) */
1163 const struct lp_build_tgsi_action
* action
,
1164 struct lp_build_tgsi_context
* bld_base
,
1165 struct lp_build_emit_data
* emit_data
)
1167 emit_data
->output
[emit_data
->chan
] = lp_build_shr(&bld_base
->int_bld
,
1168 emit_data
->args
[0], emit_data
->args
[1]);
1171 /* TGSI_OPCODE_ISLT (CPU Only) */
1174 const struct lp_build_tgsi_action
* action
,
1175 struct lp_build_tgsi_context
* bld_base
,
1176 struct lp_build_emit_data
* emit_data
)
1178 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1182 /* TGSI_OPCODE_ISSG (CPU Only) */
1185 const struct lp_build_tgsi_action
* action
,
1186 struct lp_build_tgsi_context
* bld_base
,
1187 struct lp_build_emit_data
* emit_data
)
1189 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int_bld
,
1190 emit_data
->args
[0]);
1193 /* TGSI_OPCODE_LG2 (CPU Only) */
1196 const struct lp_build_tgsi_action
* action
,
1197 struct lp_build_tgsi_context
* bld_base
,
1198 struct lp_build_emit_data
* emit_data
)
1200 emit_data
->output
[emit_data
->chan
] = lp_build_log2(&bld_base
->base
,
1201 emit_data
->args
[0]);
1204 /* TGSI_OPCODE_LOG (CPU Only) */
1207 const struct lp_build_tgsi_action
* action
,
1208 struct lp_build_tgsi_context
* bld_base
,
1209 struct lp_build_emit_data
* emit_data
)
1211 LLVMValueRef p_floor_log2
;
1213 LLVMValueRef p_log2
;
1214 LLVMValueRef src0
= emit_data
->args
[0];
1216 lp_build_log2_approx(&bld_base
->base
, src0
,
1217 &p_exp
, &p_floor_log2
, &p_log2
);
1219 emit_data
->output
[TGSI_CHAN_X
] = p_floor_log2
;
1221 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
1224 emit_data
->output
[TGSI_CHAN_Z
] = p_log2
;
1226 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
1230 /* TGSI_OPCODE_MAX (CPU Only) */
1234 const struct lp_build_tgsi_action
* action
,
1235 struct lp_build_tgsi_context
* bld_base
,
1236 struct lp_build_emit_data
* emit_data
)
1238 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->base
,
1239 emit_data
->args
[0], emit_data
->args
[1]);
1242 /* TGSI_OPCODE_MIN (CPU Only) */
1245 const struct lp_build_tgsi_action
* action
,
1246 struct lp_build_tgsi_context
* bld_base
,
1247 struct lp_build_emit_data
* emit_data
)
1249 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->base
,
1250 emit_data
->args
[0], emit_data
->args
[1]);
1253 /* TGSI_OPCODE_MOD (CPU Only) */
1256 const struct lp_build_tgsi_action
* action
,
1257 struct lp_build_tgsi_context
* bld_base
,
1258 struct lp_build_emit_data
* emit_data
)
1260 emit_data
->output
[emit_data
->chan
] = lp_build_mod(&bld_base
->int_bld
,
1261 emit_data
->args
[0], emit_data
->args
[1]);
1264 /* TGSI_OPCODE_NOT */
1267 const struct lp_build_tgsi_action
* action
,
1268 struct lp_build_tgsi_context
* bld_base
,
1269 struct lp_build_emit_data
* emit_data
)
1271 emit_data
->output
[emit_data
->chan
] = lp_build_not(&bld_base
->base
,
1272 emit_data
->args
[0]);
1275 /* TGSI_OPCODE_OR (CPU Only) */
1278 const struct lp_build_tgsi_action
* action
,
1279 struct lp_build_tgsi_context
* bld_base
,
1280 struct lp_build_emit_data
* emit_data
)
1282 emit_data
->output
[emit_data
->chan
] = lp_build_or(&bld_base
->uint_bld
,
1283 emit_data
->args
[0], emit_data
->args
[1]);
1286 /* TGSI_OPCODE_POW (CPU Only) */
1289 const struct lp_build_tgsi_action
* action
,
1290 struct lp_build_tgsi_context
* bld_base
,
1291 struct lp_build_emit_data
* emit_data
)
1293 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
1294 emit_data
->args
[0], emit_data
->args
[1]);
1298 /* TGSI_OPCODE_RCP (CPU Only) */
1302 const struct lp_build_tgsi_action
* action
,
1303 struct lp_build_tgsi_context
* bld_base
,
1304 struct lp_build_emit_data
* emit_data
)
1306 emit_data
->output
[emit_data
->chan
] = lp_build_rcp(&bld_base
->base
,
1307 emit_data
->args
[0]);
1310 /* Reciprical squareroot (CPU Only) */
1312 /* This is not the same as TGSI_OPCODE_RSQ, which requres the argument to be
1313 * greater than or equal to 0 */
1315 recip_sqrt_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
)
1320 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->base
,
1321 emit_data
->args
[0]);
1324 /* TGSI_OPCODE_ROUND (CPU Only) */
1327 const struct lp_build_tgsi_action
* action
,
1328 struct lp_build_tgsi_context
* bld_base
,
1329 struct lp_build_emit_data
* emit_data
)
1331 emit_data
->output
[emit_data
->chan
] = lp_build_round(&bld_base
->base
,
1332 emit_data
->args
[0]);
1335 /* TGSI_OPCODE_SET Helper (CPU Only) */
1339 const struct lp_build_tgsi_action
* action
,
1340 struct lp_build_tgsi_context
* bld_base
,
1341 struct lp_build_emit_data
* emit_data
,
1344 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1345 emit_data
->args
[0], emit_data
->args
[1]);
1346 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1349 bld_base
->base
.zero
);
1352 /* TGSI_OPCODE_SEQ (CPU Only) */
1356 const struct lp_build_tgsi_action
* action
,
1357 struct lp_build_tgsi_context
* bld_base
,
1358 struct lp_build_emit_data
* emit_data
)
1360 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1363 /* TGSI_OPCODE_SGE (CPU Only) */
1366 const struct lp_build_tgsi_action
* action
,
1367 struct lp_build_tgsi_context
* bld_base
,
1368 struct lp_build_emit_data
* emit_data
)
1370 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1373 /* TGSI_OPCODE_SGT (CPU Only)*/
1377 const struct lp_build_tgsi_action
* action
,
1378 struct lp_build_tgsi_context
* bld_base
,
1379 struct lp_build_emit_data
* emit_data
)
1381 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GREATER
);
1384 /* TGSI_OPCODE_SHL (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_shl(&bld_base
->uint_bld
,
1392 emit_data
->args
[0], emit_data
->args
[1]);
1395 /* TGSI_OPCODE_SIN (CPU Only) */
1398 const struct lp_build_tgsi_action
* action
,
1399 struct lp_build_tgsi_context
* bld_base
,
1400 struct lp_build_emit_data
* emit_data
)
1402 emit_data
->output
[emit_data
->chan
] = lp_build_sin(&bld_base
->base
,
1403 emit_data
->args
[0]);
1406 /* TGSI_OPCODE_SLE (CPU Only) */
1409 const struct lp_build_tgsi_action
* action
,
1410 struct lp_build_tgsi_context
* bld_base
,
1411 struct lp_build_emit_data
* emit_data
)
1413 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LEQUAL
);
1416 /* TGSI_OPCODE_SLT (CPU Only) */
1419 const struct lp_build_tgsi_action
* action
,
1420 struct lp_build_tgsi_context
* bld_base
,
1421 struct lp_build_emit_data
* emit_data
)
1423 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1426 /* TGSI_OPCODE_SNE (CPU Only) */
1430 const struct lp_build_tgsi_action
* action
,
1431 struct lp_build_tgsi_context
* bld_base
,
1432 struct lp_build_emit_data
* emit_data
)
1434 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1437 /* TGSI_OPCODE_SSG (CPU Only) */
1441 const struct lp_build_tgsi_action
* action
,
1442 struct lp_build_tgsi_context
* bld_base
,
1443 struct lp_build_emit_data
* emit_data
)
1445 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->base
,
1446 emit_data
->args
[0]);
1449 /* TGSI_OPCODE_SUB (CPU Only) */
1453 const struct lp_build_tgsi_action
* action
,
1454 struct lp_build_tgsi_context
* bld_base
,
1455 struct lp_build_emit_data
* emit_data
)
1457 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->base
,
1459 emit_data
->args
[1]);
1462 /* TGSI_OPCODE_TRUNC (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
)
1470 emit_data
->output
[emit_data
->chan
] = lp_build_trunc(&bld_base
->base
,
1471 emit_data
->args
[0]);
1474 /* TGSI_OPCODE_UADD (CPU Only) */
1477 const struct lp_build_tgsi_action
* action
,
1478 struct lp_build_tgsi_context
* bld_base
,
1479 struct lp_build_emit_data
* emit_data
)
1481 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint_bld
,
1482 emit_data
->args
[0], emit_data
->args
[1]);
1485 /* TGSI_OPCODE_UDIV (CPU Only) */
1488 const struct lp_build_tgsi_action
* action
,
1489 struct lp_build_tgsi_context
* bld_base
,
1490 struct lp_build_emit_data
* emit_data
)
1492 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->uint_bld
,
1493 emit_data
->args
[0], emit_data
->args
[1]);
1496 /* TGSI_OPCODE_UMAX (CPU Only) */
1499 const struct lp_build_tgsi_action
* action
,
1500 struct lp_build_tgsi_context
* bld_base
,
1501 struct lp_build_emit_data
* emit_data
)
1503 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint_bld
,
1504 emit_data
->args
[0], emit_data
->args
[1]);
1507 /* TGSI_OPCODE_UMIN (CPU Only) */
1510 const struct lp_build_tgsi_action
* action
,
1511 struct lp_build_tgsi_context
* bld_base
,
1512 struct lp_build_emit_data
* emit_data
)
1514 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint_bld
,
1515 emit_data
->args
[0], emit_data
->args
[1]);
1518 /* TGSI_OPCODE_UMOD (CPU Only) */
1521 const struct lp_build_tgsi_action
* action
,
1522 struct lp_build_tgsi_context
* bld_base
,
1523 struct lp_build_emit_data
* emit_data
)
1525 emit_data
->output
[emit_data
->chan
] = lp_build_mod(&bld_base
->uint_bld
,
1526 emit_data
->args
[0], emit_data
->args
[1]);
1529 /* TGSI_OPCODE_USET Helper (CPU Only) */
1532 const struct lp_build_tgsi_action
* action
,
1533 struct lp_build_tgsi_context
* bld_base
,
1534 struct lp_build_emit_data
* emit_data
,
1537 LLVMValueRef nz
= lp_build_const_vec(bld_base
->base
.gallivm
,
1538 bld_base
->uint_bld
.type
, ~0U);
1539 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint_bld
, pipe_func
,
1540 emit_data
->args
[0], emit_data
->args
[1]);
1541 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->uint_bld
,
1544 bld_base
->uint_bld
.zero
);
1548 /* TGSI_OPCODE_USEQ (CPU Only) */
1551 const struct lp_build_tgsi_action
* action
,
1552 struct lp_build_tgsi_context
* bld_base
,
1553 struct lp_build_emit_data
* emit_data
)
1555 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1558 /* TGSI_OPCODE_ISGE (CPU Only) */
1561 const struct lp_build_tgsi_action
* action
,
1562 struct lp_build_tgsi_context
* bld_base
,
1563 struct lp_build_emit_data
* emit_data
)
1565 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1568 /* TGSI_OPCODE_USHR (CPU Only) */
1571 const struct lp_build_tgsi_action
* action
,
1572 struct lp_build_tgsi_context
* bld_base
,
1573 struct lp_build_emit_data
* emit_data
)
1575 emit_data
->output
[emit_data
->chan
] = lp_build_shr(&bld_base
->uint_bld
,
1576 emit_data
->args
[0], emit_data
->args
[1]);
1579 /* TGSI_OPCODE_ISLT (CPU Only) */
1582 const struct lp_build_tgsi_action
* action
,
1583 struct lp_build_tgsi_context
* bld_base
,
1584 struct lp_build_emit_data
* emit_data
)
1586 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1589 /* TGSI_OPCODE_USNE (CPU Only) */
1593 const struct lp_build_tgsi_action
* action
,
1594 struct lp_build_tgsi_context
* bld_base
,
1595 struct lp_build_emit_data
* emit_data
)
1597 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1600 /* TGSI_OPCODE_XOR */
1603 const struct lp_build_tgsi_action
* action
,
1604 struct lp_build_tgsi_context
* bld_base
,
1605 struct lp_build_emit_data
* emit_data
)
1607 emit_data
->output
[emit_data
->chan
] = lp_build_xor(&bld_base
->uint_bld
,
1609 emit_data
->args
[1]);
1613 lp_set_default_actions_cpu(
1614 struct lp_build_tgsi_context
* bld_base
)
1616 lp_set_default_actions(bld_base
);
1617 bld_base
->op_actions
[TGSI_OPCODE_ABS
].emit
= abs_emit_cpu
;
1618 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit_cpu
;
1619 bld_base
->op_actions
[TGSI_OPCODE_AND
].emit
= and_emit_cpu
;
1620 bld_base
->op_actions
[TGSI_OPCODE_ARL
].emit
= arl_emit_cpu
;
1621 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit_cpu
;
1622 bld_base
->op_actions
[TGSI_OPCODE_CEIL
].emit
= ceil_emit_cpu
;
1623 bld_base
->op_actions
[TGSI_OPCODE_CND
].emit
= cnd_emit_cpu
;
1624 bld_base
->op_actions
[TGSI_OPCODE_COS
].emit
= cos_emit_cpu
;
1625 bld_base
->op_actions
[TGSI_OPCODE_CMP
].emit
= cmp_emit_cpu
;
1626 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= div_emit_cpu
;
1627 bld_base
->op_actions
[TGSI_OPCODE_EX2
].emit
= ex2_emit_cpu
;
1628 bld_base
->op_actions
[TGSI_OPCODE_EXP
].emit
= exp_emit_cpu
;
1629 bld_base
->op_actions
[TGSI_OPCODE_F2I
].emit
= f2i_emit_cpu
;
1630 bld_base
->op_actions
[TGSI_OPCODE_F2U
].emit
= f2u_emit_cpu
;
1631 bld_base
->op_actions
[TGSI_OPCODE_FLR
].emit
= flr_emit_cpu
;
1633 bld_base
->op_actions
[TGSI_OPCODE_I2F
].emit
= i2f_emit_cpu
;
1634 bld_base
->op_actions
[TGSI_OPCODE_IABS
].emit
= iabs_emit_cpu
;
1635 bld_base
->op_actions
[TGSI_OPCODE_IDIV
].emit
= idiv_emit_cpu
;
1636 bld_base
->op_actions
[TGSI_OPCODE_INEG
].emit
= ineg_emit_cpu
;
1637 bld_base
->op_actions
[TGSI_OPCODE_IMAX
].emit
= imax_emit_cpu
;
1638 bld_base
->op_actions
[TGSI_OPCODE_IMIN
].emit
= imin_emit_cpu
;
1639 bld_base
->op_actions
[TGSI_OPCODE_ISGE
].emit
= isge_emit_cpu
;
1640 bld_base
->op_actions
[TGSI_OPCODE_ISHR
].emit
= ishr_emit_cpu
;
1641 bld_base
->op_actions
[TGSI_OPCODE_ISLT
].emit
= islt_emit_cpu
;
1642 bld_base
->op_actions
[TGSI_OPCODE_ISSG
].emit
= issg_emit_cpu
;
1644 bld_base
->op_actions
[TGSI_OPCODE_LG2
].emit
= lg2_emit_cpu
;
1645 bld_base
->op_actions
[TGSI_OPCODE_LOG
].emit
= log_emit_cpu
;
1646 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= max_emit_cpu
;
1647 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= min_emit_cpu
;
1648 bld_base
->op_actions
[TGSI_OPCODE_MOD
].emit
= mod_emit_cpu
;
1649 bld_base
->op_actions
[TGSI_OPCODE_NOT
].emit
= not_emit_cpu
;
1650 bld_base
->op_actions
[TGSI_OPCODE_OR
].emit
= or_emit_cpu
;
1651 bld_base
->op_actions
[TGSI_OPCODE_POW
].emit
= pow_emit_cpu
;
1652 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit_cpu
;
1653 bld_base
->op_actions
[TGSI_OPCODE_ROUND
].emit
= round_emit_cpu
;
1654 bld_base
->op_actions
[TGSI_OPCODE_SEQ
].emit
= seq_emit_cpu
;
1655 bld_base
->op_actions
[TGSI_OPCODE_SGE
].emit
= sge_emit_cpu
;
1656 bld_base
->op_actions
[TGSI_OPCODE_SGT
].emit
= sgt_emit_cpu
;
1657 bld_base
->op_actions
[TGSI_OPCODE_SIN
].emit
= sin_emit_cpu
;
1658 bld_base
->op_actions
[TGSI_OPCODE_SHL
].emit
= shl_emit_cpu
;
1659 bld_base
->op_actions
[TGSI_OPCODE_SLE
].emit
= sle_emit_cpu
;
1660 bld_base
->op_actions
[TGSI_OPCODE_SLT
].emit
= slt_emit_cpu
;
1661 bld_base
->op_actions
[TGSI_OPCODE_SNE
].emit
= sne_emit_cpu
;
1662 bld_base
->op_actions
[TGSI_OPCODE_SSG
].emit
= ssg_emit_cpu
;
1663 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit_cpu
;
1664 bld_base
->op_actions
[TGSI_OPCODE_TRUNC
].emit
= trunc_emit_cpu
;
1666 bld_base
->rsq_action
.emit
= recip_sqrt_emit_cpu
;
1668 bld_base
->op_actions
[TGSI_OPCODE_UADD
].emit
= uadd_emit_cpu
;
1669 bld_base
->op_actions
[TGSI_OPCODE_UDIV
].emit
= udiv_emit_cpu
;
1670 bld_base
->op_actions
[TGSI_OPCODE_UMAX
].emit
= umax_emit_cpu
;
1671 bld_base
->op_actions
[TGSI_OPCODE_UMIN
].emit
= umin_emit_cpu
;
1672 bld_base
->op_actions
[TGSI_OPCODE_UMOD
].emit
= umod_emit_cpu
;
1673 bld_base
->op_actions
[TGSI_OPCODE_USEQ
].emit
= useq_emit_cpu
;
1674 bld_base
->op_actions
[TGSI_OPCODE_USGE
].emit
= usge_emit_cpu
;
1675 bld_base
->op_actions
[TGSI_OPCODE_USHR
].emit
= ushr_emit_cpu
;
1676 bld_base
->op_actions
[TGSI_OPCODE_USLT
].emit
= uslt_emit_cpu
;
1677 bld_base
->op_actions
[TGSI_OPCODE_USNE
].emit
= usne_emit_cpu
;
1679 bld_base
->op_actions
[TGSI_OPCODE_XOR
].emit
= xor_emit_cpu
;