1 /**************************************************************************
3 * Copyright 2011-2012 Advanced Micro Devices, Inc.
4 * Copyright 2009 VMware, Inc.
5 * Copyright 2007-2008 VMware, Inc.
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 VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
24 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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_KILL_IF */
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_KILL */
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
] = LLVMBuildFMul(
584 bld_base
->base
.gallivm
->builder
,
585 emit_data
->args
[0], emit_data
->args
[1], "");
588 /*.TGSI_OPCODE_DIV.*/
589 static void fdiv_emit(
590 const struct lp_build_tgsi_action
* action
,
591 struct lp_build_tgsi_context
* bld_base
,
592 struct lp_build_emit_data
* emit_data
)
594 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
595 bld_base
->base
.gallivm
->builder
,
596 emit_data
->args
[0], emit_data
->args
[1], "");
599 /*.TGSI_OPCODE_RCP.*/
600 static void rcp_emit(
601 const struct lp_build_tgsi_action
* action
,
602 struct lp_build_tgsi_context
* bld_base
,
603 struct lp_build_emit_data
* emit_data
)
606 one
= lp_build_const_float(bld_base
->base
.gallivm
, 1.0f
);
607 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
608 TGSI_OPCODE_DIV
, one
, emit_data
->args
[0]);
611 /* TGSI_OPCODE_POW */
615 const struct lp_build_tgsi_action
* action
,
616 struct lp_build_tgsi_context
* bld_base
,
617 struct lp_build_emit_data
* emit_data
)
619 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
620 emit_data
->args
[0], emit_data
->args
[1]);
623 static struct lp_build_tgsi_action pow_action
= {
624 scalar_binary_fetch_args
, /* fetch_args */
628 /* TGSI_OPCODE_RSQ */
632 const struct lp_build_tgsi_action
* action
,
633 struct lp_build_tgsi_context
* bld_base
,
634 struct lp_build_emit_data
* emit_data
)
636 if (bld_base
->rsq_action
.emit
) {
637 bld_base
->rsq_action
.emit(&bld_base
->rsq_action
, bld_base
, emit_data
);
639 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
643 const struct lp_build_tgsi_action rsq_action
= {
644 scalar_unary_fetch_args
, /* fetch_args */
649 /* TGSI_OPCODE_SQRT */
653 const struct lp_build_tgsi_action
* action
,
654 struct lp_build_tgsi_context
* bld_base
,
655 struct lp_build_emit_data
* emit_data
)
657 if (bld_base
->sqrt_action
.emit
) {
658 bld_base
->sqrt_action
.emit(&bld_base
->sqrt_action
, bld_base
, emit_data
);
660 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
664 const struct lp_build_tgsi_action sqrt_action
= {
665 scalar_unary_fetch_args
, /* fetch_args */
669 /* TGSI_OPCODE_SCS */
672 const struct lp_build_tgsi_action
* action
,
673 struct lp_build_tgsi_context
* bld_base
,
674 struct lp_build_emit_data
* emit_data
)
677 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
678 TGSI_OPCODE_COS
, emit_data
->args
[0]);
680 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_unary(bld_base
,
681 TGSI_OPCODE_SIN
, emit_data
->args
[0]);
683 emit_data
->output
[TGSI_CHAN_Z
] = bld_base
->base
.zero
;
686 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
689 const struct lp_build_tgsi_action scs_action
= {
690 scalar_unary_fetch_args
, /* fetch_args */
694 /* TGSI_OPCODE_SFL */
698 const struct lp_build_tgsi_action
* action
,
699 struct lp_build_tgsi_context
* bld_base
,
700 struct lp_build_emit_data
* emit_data
)
702 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.zero
;
705 /* TGSI_OPCODE_STR */
709 const struct lp_build_tgsi_action
* action
,
710 struct lp_build_tgsi_context
* bld_base
,
711 struct lp_build_emit_data
* emit_data
)
713 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.one
;
716 /* TGSI_OPCODE_SUB */
719 const struct lp_build_tgsi_action
* action
,
720 struct lp_build_tgsi_context
* bld_base
,
721 struct lp_build_emit_data
* emit_data
)
723 emit_data
->output
[emit_data
->chan
] =
724 LLVMBuildFSub(bld_base
->base
.gallivm
->builder
,
726 emit_data
->args
[1], "");
729 /* TGSI_OPCODE_F2U */
732 const struct lp_build_tgsi_action
* action
,
733 struct lp_build_tgsi_context
* bld_base
,
734 struct lp_build_emit_data
* emit_data
)
736 emit_data
->output
[emit_data
->chan
] =
737 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
739 bld_base
->base
.int_vec_type
, "");
742 /* TGSI_OPCODE_U2F */
745 const struct lp_build_tgsi_action
* action
,
746 struct lp_build_tgsi_context
* bld_base
,
747 struct lp_build_emit_data
* emit_data
)
749 emit_data
->output
[emit_data
->chan
] =
750 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
752 bld_base
->base
.vec_type
, "");
757 const struct lp_build_tgsi_action
* action
,
758 struct lp_build_tgsi_context
* bld_base
,
759 struct lp_build_emit_data
* emit_data
)
762 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_UMUL
,
765 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
766 TGSI_OPCODE_UADD
, tmp
, emit_data
->args
[2]);
769 /* TGSI_OPCODE_UMUL */
772 const struct lp_build_tgsi_action
* action
,
773 struct lp_build_tgsi_context
* bld_base
,
774 struct lp_build_emit_data
* emit_data
)
776 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint_bld
,
777 emit_data
->args
[0], emit_data
->args
[1]);
780 /* TGSI_OPCODE_IMUL_HI */
783 const struct lp_build_tgsi_action
* action
,
784 struct lp_build_tgsi_context
* bld_base
,
785 struct lp_build_emit_data
* emit_data
)
787 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
788 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
789 struct lp_type type
= int_bld
->type
;
790 LLVMValueRef src0
, src1
;
794 assert(type
.width
== 32);
796 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
797 src0
= LLVMBuildSExt(builder
, emit_data
->args
[0], typeRef
, "");
798 src1
= LLVMBuildSExt(builder
, emit_data
->args
[1], typeRef
, "");
799 dst64
= LLVMBuildMul(builder
, src0
, src1
, "");
800 dst64
= LLVMBuildAShr(
802 lp_build_const_vec(bld_base
->base
.gallivm
, type
, 32), "");
804 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
805 emit_data
->output
[emit_data
->chan
] =
806 LLVMBuildTrunc(builder
, dst64
, typeRef
, "");
809 /* TGSI_OPCODE_UMUL_HI */
812 const struct lp_build_tgsi_action
* action
,
813 struct lp_build_tgsi_context
* bld_base
,
814 struct lp_build_emit_data
* emit_data
)
816 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
817 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
818 struct lp_type type
= uint_bld
->type
;
819 LLVMValueRef src0
, src1
;
823 assert(type
.width
== 32);
825 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
826 src0
= LLVMBuildZExt(builder
, emit_data
->args
[0], typeRef
, "");
827 src1
= LLVMBuildZExt(builder
, emit_data
->args
[1], typeRef
, "");
828 dst64
= LLVMBuildMul(builder
, src0
, src1
, "");
829 dst64
= LLVMBuildLShr(
831 lp_build_const_vec(bld_base
->base
.gallivm
, type
, 32), "");
833 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
834 emit_data
->output
[emit_data
->chan
] =
835 LLVMBuildTrunc(builder
, dst64
, typeRef
, "");
838 /* TGSI_OPCODE_MAX */
839 static void fmax_emit(
840 const struct lp_build_tgsi_action
* action
,
841 struct lp_build_tgsi_context
* bld_base
,
842 struct lp_build_emit_data
* emit_data
)
844 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
845 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
846 LLVMBuildFCmp(builder
, LLVMRealUGE
,
847 emit_data
->args
[0], emit_data
->args
[1], ""),
848 emit_data
->args
[0], emit_data
->args
[1], "");
851 /* TGSI_OPCODE_MIN */
852 static void fmin_emit(
853 const struct lp_build_tgsi_action
* action
,
854 struct lp_build_tgsi_context
* bld_base
,
855 struct lp_build_emit_data
* emit_data
)
857 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
858 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
859 LLVMBuildFCmp(builder
, LLVMRealUGE
,
860 emit_data
->args
[0], emit_data
->args
[1], ""),
861 emit_data
->args
[1], emit_data
->args
[0], "");
864 /* TGSI_OPCODE_XPD */
868 struct lp_build_tgsi_context
* bld_base
,
869 struct lp_build_emit_data
* emit_data
)
871 dp_fetch_args(bld_base
, emit_data
, 3);
879 struct lp_build_tgsi_context
* bld_base
,
885 LLVMValueRef tmp0
, tmp1
;
887 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, a
, b
);
888 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, c
, d
);
890 return lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_SUB
, tmp0
, tmp1
);
895 const struct lp_build_tgsi_action
* action
,
896 struct lp_build_tgsi_context
* bld_base
,
897 struct lp_build_emit_data
* emit_data
)
899 emit_data
->output
[TGSI_CHAN_X
] = xpd_helper(bld_base
,
900 emit_data
->args
[1] /* src0.y */, emit_data
->args
[5] /* src1.z */,
901 emit_data
->args
[4] /* src1.y */, emit_data
->args
[2] /* src0.z */);
903 emit_data
->output
[TGSI_CHAN_Y
] = xpd_helper(bld_base
,
904 emit_data
->args
[2] /* src0.z */, emit_data
->args
[3] /* src1.x */,
905 emit_data
->args
[5] /* src1.z */, emit_data
->args
[0] /* src0.x */);
907 emit_data
->output
[TGSI_CHAN_Z
] = xpd_helper(bld_base
,
908 emit_data
->args
[0] /* src0.x */, emit_data
->args
[4] /* src1.y */,
909 emit_data
->args
[3] /* src1.x */, emit_data
->args
[1] /* src0.y */);
911 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
914 const struct lp_build_tgsi_action xpd_action
= {
915 xpd_fetch_args
, /* fetch_args */
920 lp_set_default_actions(struct lp_build_tgsi_context
* bld_base
)
922 bld_base
->op_actions
[TGSI_OPCODE_DP2
] = dp2_action
;
923 bld_base
->op_actions
[TGSI_OPCODE_DP3
] = dp3_action
;
924 bld_base
->op_actions
[TGSI_OPCODE_DP4
] = dp4_action
;
925 bld_base
->op_actions
[TGSI_OPCODE_DP2A
] = dp2a_action
;
926 bld_base
->op_actions
[TGSI_OPCODE_DPH
] = dph_action
;
927 bld_base
->op_actions
[TGSI_OPCODE_DST
] = dst_action
;
928 bld_base
->op_actions
[TGSI_OPCODE_EXP
] = exp_action
;
929 bld_base
->op_actions
[TGSI_OPCODE_LIT
] = lit_action
;
930 bld_base
->op_actions
[TGSI_OPCODE_LOG
] = log_action
;
931 bld_base
->op_actions
[TGSI_OPCODE_RSQ
] = rsq_action
;
932 bld_base
->op_actions
[TGSI_OPCODE_SQRT
] = sqrt_action
;
933 bld_base
->op_actions
[TGSI_OPCODE_POW
] = pow_action
;
934 bld_base
->op_actions
[TGSI_OPCODE_SCS
] = scs_action
;
935 bld_base
->op_actions
[TGSI_OPCODE_XPD
] = xpd_action
;
937 bld_base
->op_actions
[TGSI_OPCODE_BREAKC
].fetch_args
= scalar_unary_fetch_args
;
938 bld_base
->op_actions
[TGSI_OPCODE_SWITCH
].fetch_args
= scalar_unary_fetch_args
;
939 bld_base
->op_actions
[TGSI_OPCODE_CASE
].fetch_args
= scalar_unary_fetch_args
;
940 bld_base
->op_actions
[TGSI_OPCODE_COS
].fetch_args
= scalar_unary_fetch_args
;
941 bld_base
->op_actions
[TGSI_OPCODE_EX2
].fetch_args
= scalar_unary_fetch_args
;
942 bld_base
->op_actions
[TGSI_OPCODE_IF
].fetch_args
= scalar_unary_fetch_args
;
943 bld_base
->op_actions
[TGSI_OPCODE_UIF
].fetch_args
= scalar_unary_fetch_args
;
944 bld_base
->op_actions
[TGSI_OPCODE_KILL_IF
].fetch_args
= kil_fetch_args
;
945 bld_base
->op_actions
[TGSI_OPCODE_KILL
].fetch_args
= kilp_fetch_args
;
946 bld_base
->op_actions
[TGSI_OPCODE_RCP
].fetch_args
= scalar_unary_fetch_args
;
947 bld_base
->op_actions
[TGSI_OPCODE_SIN
].fetch_args
= scalar_unary_fetch_args
;
948 bld_base
->op_actions
[TGSI_OPCODE_LG2
].fetch_args
= scalar_unary_fetch_args
;
950 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit
;
951 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit
;
952 bld_base
->op_actions
[TGSI_OPCODE_CLAMP
].emit
= clamp_emit
;
953 bld_base
->op_actions
[TGSI_OPCODE_END
].emit
= end_emit
;
954 bld_base
->op_actions
[TGSI_OPCODE_FRC
].emit
= frc_emit
;
955 bld_base
->op_actions
[TGSI_OPCODE_LRP
].emit
= lrp_emit
;
956 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit
;
957 bld_base
->op_actions
[TGSI_OPCODE_MOV
].emit
= mov_emit
;
958 bld_base
->op_actions
[TGSI_OPCODE_MUL
].emit
= mul_emit
;
959 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= fdiv_emit
;
960 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit
;
961 bld_base
->op_actions
[TGSI_OPCODE_SFL
].emit
= sfl_emit
;
962 bld_base
->op_actions
[TGSI_OPCODE_STR
].emit
= str_emit
;
963 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit
;
965 bld_base
->op_actions
[TGSI_OPCODE_UARL
].emit
= mov_emit
;
966 bld_base
->op_actions
[TGSI_OPCODE_F2U
].emit
= f2u_emit
;
967 bld_base
->op_actions
[TGSI_OPCODE_U2F
].emit
= u2f_emit
;
968 bld_base
->op_actions
[TGSI_OPCODE_UMAD
].emit
= umad_emit
;
969 bld_base
->op_actions
[TGSI_OPCODE_UMUL
].emit
= umul_emit
;
970 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit
;
971 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit
;
973 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= fmax_emit
;
974 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= fmin_emit
;
977 /* CPU Only default actions */
979 /* These actions are CPU only, because they could potentially output SSE
983 /* TGSI_OPCODE_ABS (CPU Only)*/
987 const struct lp_build_tgsi_action
* action
,
988 struct lp_build_tgsi_context
* bld_base
,
989 struct lp_build_emit_data
* emit_data
)
991 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->base
,
995 /* TGSI_OPCODE_ADD (CPU Only) */
998 const struct lp_build_tgsi_action
* action
,
999 struct lp_build_tgsi_context
* bld_base
,
1000 struct lp_build_emit_data
* emit_data
)
1002 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->base
,
1003 emit_data
->args
[0], emit_data
->args
[1]);
1006 /* TGSI_OPCODE_AND (CPU Only) */
1009 const struct lp_build_tgsi_action
* action
,
1010 struct lp_build_tgsi_context
* bld_base
,
1011 struct lp_build_emit_data
* emit_data
)
1013 emit_data
->output
[emit_data
->chan
] = lp_build_and(&bld_base
->uint_bld
,
1014 emit_data
->args
[0], emit_data
->args
[1]);
1017 /* TGSI_OPCODE_ARL (CPU Only) */
1020 const struct lp_build_tgsi_action
* action
,
1021 struct lp_build_tgsi_context
* bld_base
,
1022 struct lp_build_emit_data
* emit_data
)
1025 tmp
= lp_build_floor(&bld_base
->base
,
1026 emit_data
->args
[0]);
1027 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
1028 bld_base
->uint_bld
.vec_type
, "");
1031 /* TGSI_OPCODE_ARR (CPU Only) */
1034 const struct lp_build_tgsi_action
* action
,
1035 struct lp_build_tgsi_context
* bld_base
,
1036 struct lp_build_emit_data
* emit_data
)
1038 emit_data
->output
[emit_data
->chan
] = lp_build_iround(&bld_base
->base
, emit_data
->args
[0]);
1041 /* TGSI_OPCODE_CEIL (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 emit_data
->output
[emit_data
->chan
] = lp_build_ceil(&bld_base
->base
,
1049 emit_data
->args
[0]);
1052 /* TGSI_OPCODE_CMP (CPU Only) */
1055 const struct lp_build_tgsi_action
* action
,
1056 struct lp_build_tgsi_context
* bld_base
,
1057 struct lp_build_emit_data
* emit_data
)
1059 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_LESS
,
1060 emit_data
->args
[0], bld_base
->base
.zero
);
1061 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1062 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1065 /* TGSI_OPCODE_UCMP (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 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1073 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1074 LLVMValueRef unsigned_cond
=
1075 LLVMBuildBitCast(builder
, emit_data
->args
[0], uint_bld
->vec_type
, "");
1076 LLVMValueRef cond
= lp_build_cmp(uint_bld
, PIPE_FUNC_NOTEQUAL
,
1079 emit_data
->output
[emit_data
->chan
] =
1080 lp_build_select(&bld_base
->base
,
1081 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1085 /* TGSI_OPCODE_CND (CPU Only) */
1088 const struct lp_build_tgsi_action
* action
,
1089 struct lp_build_tgsi_context
* bld_base
,
1090 struct lp_build_emit_data
* emit_data
)
1092 LLVMValueRef half
, tmp
;
1093 half
= lp_build_const_vec(bld_base
->base
.gallivm
, bld_base
->base
.type
, 0.5);
1094 tmp
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_GREATER
,
1095 emit_data
->args
[2], half
);
1096 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1099 emit_data
->args
[1]);
1102 /* TGSI_OPCODE_COS (CPU Only) */
1105 const struct lp_build_tgsi_action
* action
,
1106 struct lp_build_tgsi_context
* bld_base
,
1107 struct lp_build_emit_data
* emit_data
)
1109 emit_data
->output
[emit_data
->chan
] = lp_build_cos(&bld_base
->base
,
1110 emit_data
->args
[0]);
1113 /* TGSI_OPCODE_DIV (CPU Only) */
1116 const struct lp_build_tgsi_action
* action
,
1117 struct lp_build_tgsi_context
* bld_base
,
1118 struct lp_build_emit_data
* emit_data
)
1120 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->base
,
1121 emit_data
->args
[0], emit_data
->args
[1]);
1124 /* TGSI_OPCODE_EX2 (CPU Only) */
1127 const struct lp_build_tgsi_action
* action
,
1128 struct lp_build_tgsi_context
* bld_base
,
1129 struct lp_build_emit_data
* emit_data
)
1131 emit_data
->output
[emit_data
->chan
] = lp_build_exp2(&bld_base
->base
,
1132 emit_data
->args
[0]);
1135 /* TGSI_OPCODE_F2I (CPU Only) */
1138 const struct lp_build_tgsi_action
* action
,
1139 struct lp_build_tgsi_context
* bld_base
,
1140 struct lp_build_emit_data
* emit_data
)
1142 emit_data
->output
[emit_data
->chan
] = lp_build_itrunc(&bld_base
->base
,
1143 emit_data
->args
[0]);
1146 /* TGSI_OPCODE_FSET Helper (CPU Only) */
1149 const struct lp_build_tgsi_action
* action
,
1150 struct lp_build_tgsi_context
* bld_base
,
1151 struct lp_build_emit_data
* emit_data
,
1156 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1157 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1158 emit_data
->args
[0], emit_data
->args
[1]);
1161 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1162 emit_data
->args
[0], emit_data
->args
[1]);
1165 emit_data
->output
[emit_data
->chan
] = cond
;
1169 /* TGSI_OPCODE_FSEQ (CPU Only) */
1172 const struct lp_build_tgsi_action
* action
,
1173 struct lp_build_tgsi_context
* bld_base
,
1174 struct lp_build_emit_data
* emit_data
)
1176 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1179 /* TGSI_OPCODE_ISGE (CPU Only) */
1182 const struct lp_build_tgsi_action
* action
,
1183 struct lp_build_tgsi_context
* bld_base
,
1184 struct lp_build_emit_data
* emit_data
)
1186 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1189 /* TGSI_OPCODE_ISLT (CPU Only) */
1192 const struct lp_build_tgsi_action
* action
,
1193 struct lp_build_tgsi_context
* bld_base
,
1194 struct lp_build_emit_data
* emit_data
)
1196 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1199 /* TGSI_OPCODE_USNE (CPU Only) */
1203 const struct lp_build_tgsi_action
* action
,
1204 struct lp_build_tgsi_context
* bld_base
,
1205 struct lp_build_emit_data
* emit_data
)
1207 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1210 /* TGSI_OPCODE_FLR (CPU Only) */
1214 const struct lp_build_tgsi_action
* action
,
1215 struct lp_build_tgsi_context
* bld_base
,
1216 struct lp_build_emit_data
* emit_data
)
1218 emit_data
->output
[emit_data
->chan
] = lp_build_floor(&bld_base
->base
,
1219 emit_data
->args
[0]);
1222 /* TGSI_OPCODE_I2F (CPU Only) */
1225 const struct lp_build_tgsi_action
* action
,
1226 struct lp_build_tgsi_context
* bld_base
,
1227 struct lp_build_emit_data
* emit_data
)
1229 emit_data
->output
[emit_data
->chan
] = lp_build_int_to_float(&bld_base
->base
,
1230 emit_data
->args
[0]);
1233 /* TGSI_OPCODE_IABS (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_abs(&bld_base
->int_bld
,
1241 emit_data
->args
[0]);
1244 /* TGSI_OPCODE_IDIV (CPU Only) */
1247 const struct lp_build_tgsi_action
* action
,
1248 struct lp_build_tgsi_context
* bld_base
,
1249 struct lp_build_emit_data
* emit_data
)
1251 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->int_bld
,
1252 emit_data
->args
[0], emit_data
->args
[1]);
1255 /* TGSI_OPCODE_INEG (CPU Only) */
1258 const struct lp_build_tgsi_action
* action
,
1259 struct lp_build_tgsi_context
* bld_base
,
1260 struct lp_build_emit_data
* emit_data
)
1262 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int_bld
,
1263 bld_base
->int_bld
.zero
,
1264 emit_data
->args
[0]);
1267 /* TGSI_OPCODE_ISET Helper (CPU Only) */
1270 const struct lp_build_tgsi_action
* action
,
1271 struct lp_build_tgsi_context
* bld_base
,
1272 struct lp_build_emit_data
* emit_data
,
1275 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int_bld
, pipe_func
,
1276 emit_data
->args
[0], emit_data
->args
[1]);
1277 emit_data
->output
[emit_data
->chan
] = cond
;
1280 /* TGSI_OPCODE_IMAX (CPU Only) */
1283 const struct lp_build_tgsi_action
* action
,
1284 struct lp_build_tgsi_context
* bld_base
,
1285 struct lp_build_emit_data
* emit_data
)
1287 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int_bld
,
1288 emit_data
->args
[0], emit_data
->args
[1]);
1291 /* TGSI_OPCODE_IMIN (CPU Only) */
1294 const struct lp_build_tgsi_action
* action
,
1295 struct lp_build_tgsi_context
* bld_base
,
1296 struct lp_build_emit_data
* emit_data
)
1298 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int_bld
,
1299 emit_data
->args
[0], emit_data
->args
[1]);
1302 /* TGSI_OPCODE_ISGE (CPU Only) */
1305 const struct lp_build_tgsi_action
* action
,
1306 struct lp_build_tgsi_context
* bld_base
,
1307 struct lp_build_emit_data
* emit_data
)
1309 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1312 /* TGSI_OPCODE_ISHR (CPU Only) */
1315 const struct lp_build_tgsi_action
* action
,
1316 struct lp_build_tgsi_context
* bld_base
,
1317 struct lp_build_emit_data
* emit_data
)
1319 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
1320 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
1321 int_bld
->type
.width
- 1);
1322 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
1323 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
1327 /* TGSI_OPCODE_ISLT (CPU Only) */
1330 const struct lp_build_tgsi_action
* action
,
1331 struct lp_build_tgsi_context
* bld_base
,
1332 struct lp_build_emit_data
* emit_data
)
1334 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1338 /* TGSI_OPCODE_ISSG (CPU Only) */
1341 const struct lp_build_tgsi_action
* action
,
1342 struct lp_build_tgsi_context
* bld_base
,
1343 struct lp_build_emit_data
* emit_data
)
1345 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int_bld
,
1346 emit_data
->args
[0]);
1349 /* TGSI_OPCODE_LG2 (CPU Only) */
1352 const struct lp_build_tgsi_action
* action
,
1353 struct lp_build_tgsi_context
* bld_base
,
1354 struct lp_build_emit_data
* emit_data
)
1356 emit_data
->output
[emit_data
->chan
] = lp_build_log2_safe(&bld_base
->base
,
1357 emit_data
->args
[0]);
1360 /* TGSI_OPCODE_LOG (CPU Only) */
1363 const struct lp_build_tgsi_action
* action
,
1364 struct lp_build_tgsi_context
* bld_base
,
1365 struct lp_build_emit_data
* emit_data
)
1367 LLVMValueRef p_floor_log2
;
1369 LLVMValueRef p_log2
;
1370 LLVMValueRef src0
= emit_data
->args
[0];
1372 lp_build_log2_approx(&bld_base
->base
, src0
,
1373 &p_exp
, &p_floor_log2
, &p_log2
, FALSE
);
1375 emit_data
->output
[TGSI_CHAN_X
] = p_floor_log2
;
1377 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
1380 emit_data
->output
[TGSI_CHAN_Z
] = p_log2
;
1382 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
1386 /* TGSI_OPCODE_MAX (CPU Only) */
1390 const struct lp_build_tgsi_action
* action
,
1391 struct lp_build_tgsi_context
* bld_base
,
1392 struct lp_build_emit_data
* emit_data
)
1394 emit_data
->output
[emit_data
->chan
] =
1395 lp_build_max_ext(&bld_base
->base
,
1396 emit_data
->args
[0], emit_data
->args
[1],
1397 GALLIVM_NAN_RETURN_OTHER
);
1400 /* TGSI_OPCODE_MIN (CPU Only) */
1403 const struct lp_build_tgsi_action
* action
,
1404 struct lp_build_tgsi_context
* bld_base
,
1405 struct lp_build_emit_data
* emit_data
)
1407 emit_data
->output
[emit_data
->chan
] =
1408 lp_build_min_ext(&bld_base
->base
,
1409 emit_data
->args
[0], emit_data
->args
[1],
1410 GALLIVM_NAN_RETURN_OTHER
);
1413 /* TGSI_OPCODE_MOD (CPU Only) */
1416 const struct lp_build_tgsi_action
* action
,
1417 struct lp_build_tgsi_context
* bld_base
,
1418 struct lp_build_emit_data
* emit_data
)
1420 emit_data
->output
[emit_data
->chan
] = lp_build_mod(&bld_base
->int_bld
,
1421 emit_data
->args
[0], emit_data
->args
[1]);
1424 /* TGSI_OPCODE_NOT */
1427 const struct lp_build_tgsi_action
* action
,
1428 struct lp_build_tgsi_context
* bld_base
,
1429 struct lp_build_emit_data
* emit_data
)
1431 emit_data
->output
[emit_data
->chan
] = lp_build_not(&bld_base
->uint_bld
,
1432 emit_data
->args
[0]);
1435 /* TGSI_OPCODE_OR (CPU Only) */
1438 const struct lp_build_tgsi_action
* action
,
1439 struct lp_build_tgsi_context
* bld_base
,
1440 struct lp_build_emit_data
* emit_data
)
1442 emit_data
->output
[emit_data
->chan
] = lp_build_or(&bld_base
->uint_bld
,
1443 emit_data
->args
[0], emit_data
->args
[1]);
1446 /* TGSI_OPCODE_POW (CPU Only) */
1449 const struct lp_build_tgsi_action
* action
,
1450 struct lp_build_tgsi_context
* bld_base
,
1451 struct lp_build_emit_data
* emit_data
)
1453 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
1454 emit_data
->args
[0], emit_data
->args
[1]);
1458 /* TGSI_OPCODE_RCP (CPU Only) */
1462 const struct lp_build_tgsi_action
* action
,
1463 struct lp_build_tgsi_context
* bld_base
,
1464 struct lp_build_emit_data
* emit_data
)
1466 emit_data
->output
[emit_data
->chan
] = lp_build_rcp(&bld_base
->base
,
1467 emit_data
->args
[0]);
1470 /* Reciprical squareroot (CPU Only) */
1472 recip_sqrt_emit_cpu(
1473 const struct lp_build_tgsi_action
* action
,
1474 struct lp_build_tgsi_context
* bld_base
,
1475 struct lp_build_emit_data
* emit_data
)
1477 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->base
,
1478 emit_data
->args
[0]);
1483 const struct lp_build_tgsi_action
* action
,
1484 struct lp_build_tgsi_context
* bld_base
,
1485 struct lp_build_emit_data
* emit_data
)
1487 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->base
,
1488 emit_data
->args
[0]);
1492 /* TGSI_OPCODE_ROUND (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 emit_data
->output
[emit_data
->chan
] = lp_build_round(&bld_base
->base
,
1500 emit_data
->args
[0]);
1503 /* TGSI_OPCODE_SET Helper (CPU Only) */
1507 const struct lp_build_tgsi_action
* action
,
1508 struct lp_build_tgsi_context
* bld_base
,
1509 struct lp_build_emit_data
* emit_data
,
1514 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1515 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1516 emit_data
->args
[0], emit_data
->args
[1]);
1519 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1520 emit_data
->args
[0], emit_data
->args
[1]);
1523 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1526 bld_base
->base
.zero
);
1529 /* TGSI_OPCODE_SEQ (CPU Only) */
1533 const struct lp_build_tgsi_action
* action
,
1534 struct lp_build_tgsi_context
* bld_base
,
1535 struct lp_build_emit_data
* emit_data
)
1537 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1540 /* TGSI_OPCODE_SGE (CPU Only) */
1543 const struct lp_build_tgsi_action
* action
,
1544 struct lp_build_tgsi_context
* bld_base
,
1545 struct lp_build_emit_data
* emit_data
)
1547 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1550 /* TGSI_OPCODE_SGT (CPU Only)*/
1554 const struct lp_build_tgsi_action
* action
,
1555 struct lp_build_tgsi_context
* bld_base
,
1556 struct lp_build_emit_data
* emit_data
)
1558 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GREATER
);
1561 /* TGSI_OPCODE_SHL (CPU Only) */
1564 const struct lp_build_tgsi_action
* action
,
1565 struct lp_build_tgsi_context
* bld_base
,
1566 struct lp_build_emit_data
* emit_data
)
1568 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1569 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
1570 uint_bld
->type
.width
- 1);
1571 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
1572 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
1576 /* TGSI_OPCODE_SIN (CPU Only) */
1579 const struct lp_build_tgsi_action
* action
,
1580 struct lp_build_tgsi_context
* bld_base
,
1581 struct lp_build_emit_data
* emit_data
)
1583 emit_data
->output
[emit_data
->chan
] = lp_build_sin(&bld_base
->base
,
1584 emit_data
->args
[0]);
1587 /* TGSI_OPCODE_SLE (CPU Only) */
1590 const struct lp_build_tgsi_action
* action
,
1591 struct lp_build_tgsi_context
* bld_base
,
1592 struct lp_build_emit_data
* emit_data
)
1594 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LEQUAL
);
1597 /* TGSI_OPCODE_SLT (CPU Only) */
1600 const struct lp_build_tgsi_action
* action
,
1601 struct lp_build_tgsi_context
* bld_base
,
1602 struct lp_build_emit_data
* emit_data
)
1604 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1607 /* TGSI_OPCODE_SNE (CPU Only) */
1611 const struct lp_build_tgsi_action
* action
,
1612 struct lp_build_tgsi_context
* bld_base
,
1613 struct lp_build_emit_data
* emit_data
)
1615 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1618 /* TGSI_OPCODE_SSG (CPU Only) */
1622 const struct lp_build_tgsi_action
* action
,
1623 struct lp_build_tgsi_context
* bld_base
,
1624 struct lp_build_emit_data
* emit_data
)
1626 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->base
,
1627 emit_data
->args
[0]);
1630 /* TGSI_OPCODE_SUB (CPU Only) */
1634 const struct lp_build_tgsi_action
* action
,
1635 struct lp_build_tgsi_context
* bld_base
,
1636 struct lp_build_emit_data
* emit_data
)
1638 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->base
,
1640 emit_data
->args
[1]);
1643 /* TGSI_OPCODE_TRUNC (CPU Only) */
1647 const struct lp_build_tgsi_action
* action
,
1648 struct lp_build_tgsi_context
* bld_base
,
1649 struct lp_build_emit_data
* emit_data
)
1651 emit_data
->output
[emit_data
->chan
] = lp_build_trunc(&bld_base
->base
,
1652 emit_data
->args
[0]);
1655 /* TGSI_OPCODE_UADD (CPU Only) */
1658 const struct lp_build_tgsi_action
* action
,
1659 struct lp_build_tgsi_context
* bld_base
,
1660 struct lp_build_emit_data
* emit_data
)
1662 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint_bld
,
1663 emit_data
->args
[0], emit_data
->args
[1]);
1666 /* TGSI_OPCODE_UDIV (CPU Only) */
1669 const struct lp_build_tgsi_action
* action
,
1670 struct lp_build_tgsi_context
* bld_base
,
1671 struct lp_build_emit_data
* emit_data
)
1674 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1675 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1676 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1677 bld_base
->uint_bld
.zero
);
1678 /* We want to make sure that we never divide/mod by zero to not
1679 * generate sigfpe. We don't want to crash just because the
1680 * shader is doing something weird. */
1681 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1683 emit_data
->args
[1], "");
1684 LLVMValueRef result
= lp_build_div(&bld_base
->uint_bld
,
1685 emit_data
->args
[0], divisor
);
1686 /* udiv by zero is guaranteed to return 0xffffffff */
1687 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1692 /* TGSI_OPCODE_UMAX (CPU Only) */
1695 const struct lp_build_tgsi_action
* action
,
1696 struct lp_build_tgsi_context
* bld_base
,
1697 struct lp_build_emit_data
* emit_data
)
1699 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint_bld
,
1700 emit_data
->args
[0], emit_data
->args
[1]);
1703 /* TGSI_OPCODE_UMIN (CPU Only) */
1706 const struct lp_build_tgsi_action
* action
,
1707 struct lp_build_tgsi_context
* bld_base
,
1708 struct lp_build_emit_data
* emit_data
)
1710 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint_bld
,
1711 emit_data
->args
[0], emit_data
->args
[1]);
1714 /* TGSI_OPCODE_UMOD (CPU Only) */
1717 const struct lp_build_tgsi_action
* action
,
1718 struct lp_build_tgsi_context
* bld_base
,
1719 struct lp_build_emit_data
* emit_data
)
1721 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1722 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1723 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1724 bld_base
->uint_bld
.zero
);
1725 /* We want to make sure that we never divide/mod by zero to not
1726 * generate sigfpe. We don't want to crash just because the
1727 * shader is doing something weird. */
1728 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1730 emit_data
->args
[1], "");
1731 LLVMValueRef result
= lp_build_mod(&bld_base
->uint_bld
,
1732 emit_data
->args
[0], divisor
);
1733 /* umod by zero is guaranteed to return 0xffffffff */
1734 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1739 /* TGSI_OPCODE_USET Helper (CPU Only) */
1742 const struct lp_build_tgsi_action
* action
,
1743 struct lp_build_tgsi_context
* bld_base
,
1744 struct lp_build_emit_data
* emit_data
,
1747 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint_bld
, pipe_func
,
1748 emit_data
->args
[0], emit_data
->args
[1]);
1749 emit_data
->output
[emit_data
->chan
] = cond
;
1753 /* TGSI_OPCODE_USEQ (CPU Only) */
1756 const struct lp_build_tgsi_action
* action
,
1757 struct lp_build_tgsi_context
* bld_base
,
1758 struct lp_build_emit_data
* emit_data
)
1760 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1763 /* TGSI_OPCODE_ISGE (CPU Only) */
1766 const struct lp_build_tgsi_action
* action
,
1767 struct lp_build_tgsi_context
* bld_base
,
1768 struct lp_build_emit_data
* emit_data
)
1770 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1773 /* TGSI_OPCODE_USHR (CPU Only) */
1776 const struct lp_build_tgsi_action
* action
,
1777 struct lp_build_tgsi_context
* bld_base
,
1778 struct lp_build_emit_data
* emit_data
)
1780 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1781 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
1782 uint_bld
->type
.width
- 1);
1783 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
1784 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
1788 /* TGSI_OPCODE_ISLT (CPU Only) */
1791 const struct lp_build_tgsi_action
* action
,
1792 struct lp_build_tgsi_context
* bld_base
,
1793 struct lp_build_emit_data
* emit_data
)
1795 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1798 /* TGSI_OPCODE_USNE (CPU Only) */
1802 const struct lp_build_tgsi_action
* action
,
1803 struct lp_build_tgsi_context
* bld_base
,
1804 struct lp_build_emit_data
* emit_data
)
1806 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1809 /* TGSI_OPCODE_XOR */
1812 const struct lp_build_tgsi_action
* action
,
1813 struct lp_build_tgsi_context
* bld_base
,
1814 struct lp_build_emit_data
* emit_data
)
1816 emit_data
->output
[emit_data
->chan
] = lp_build_xor(&bld_base
->uint_bld
,
1818 emit_data
->args
[1]);
1822 lp_set_default_actions_cpu(
1823 struct lp_build_tgsi_context
* bld_base
)
1825 lp_set_default_actions(bld_base
);
1826 bld_base
->op_actions
[TGSI_OPCODE_ABS
].emit
= abs_emit_cpu
;
1827 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit_cpu
;
1828 bld_base
->op_actions
[TGSI_OPCODE_AND
].emit
= and_emit_cpu
;
1829 bld_base
->op_actions
[TGSI_OPCODE_ARL
].emit
= arl_emit_cpu
;
1830 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit_cpu
;
1831 bld_base
->op_actions
[TGSI_OPCODE_CEIL
].emit
= ceil_emit_cpu
;
1832 bld_base
->op_actions
[TGSI_OPCODE_CND
].emit
= cnd_emit_cpu
;
1833 bld_base
->op_actions
[TGSI_OPCODE_COS
].emit
= cos_emit_cpu
;
1834 bld_base
->op_actions
[TGSI_OPCODE_CMP
].emit
= cmp_emit_cpu
;
1835 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= div_emit_cpu
;
1836 bld_base
->op_actions
[TGSI_OPCODE_EX2
].emit
= ex2_emit_cpu
;
1837 bld_base
->op_actions
[TGSI_OPCODE_F2I
].emit
= f2i_emit_cpu
;
1838 bld_base
->op_actions
[TGSI_OPCODE_FLR
].emit
= flr_emit_cpu
;
1839 bld_base
->op_actions
[TGSI_OPCODE_FSEQ
].emit
= fseq_emit_cpu
;
1840 bld_base
->op_actions
[TGSI_OPCODE_FSGE
].emit
= fsge_emit_cpu
;
1841 bld_base
->op_actions
[TGSI_OPCODE_FSLT
].emit
= fslt_emit_cpu
;
1842 bld_base
->op_actions
[TGSI_OPCODE_FSNE
].emit
= fsne_emit_cpu
;
1844 bld_base
->op_actions
[TGSI_OPCODE_I2F
].emit
= i2f_emit_cpu
;
1845 bld_base
->op_actions
[TGSI_OPCODE_IABS
].emit
= iabs_emit_cpu
;
1846 bld_base
->op_actions
[TGSI_OPCODE_IDIV
].emit
= idiv_emit_cpu
;
1847 bld_base
->op_actions
[TGSI_OPCODE_INEG
].emit
= ineg_emit_cpu
;
1848 bld_base
->op_actions
[TGSI_OPCODE_IMAX
].emit
= imax_emit_cpu
;
1849 bld_base
->op_actions
[TGSI_OPCODE_IMIN
].emit
= imin_emit_cpu
;
1850 bld_base
->op_actions
[TGSI_OPCODE_ISGE
].emit
= isge_emit_cpu
;
1851 bld_base
->op_actions
[TGSI_OPCODE_ISHR
].emit
= ishr_emit_cpu
;
1852 bld_base
->op_actions
[TGSI_OPCODE_ISLT
].emit
= islt_emit_cpu
;
1853 bld_base
->op_actions
[TGSI_OPCODE_ISSG
].emit
= issg_emit_cpu
;
1855 bld_base
->op_actions
[TGSI_OPCODE_LG2
].emit
= lg2_emit_cpu
;
1856 bld_base
->op_actions
[TGSI_OPCODE_LOG
].emit
= log_emit_cpu
;
1857 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= max_emit_cpu
;
1858 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= min_emit_cpu
;
1859 bld_base
->op_actions
[TGSI_OPCODE_MOD
].emit
= mod_emit_cpu
;
1860 bld_base
->op_actions
[TGSI_OPCODE_NOT
].emit
= not_emit_cpu
;
1861 bld_base
->op_actions
[TGSI_OPCODE_OR
].emit
= or_emit_cpu
;
1862 bld_base
->op_actions
[TGSI_OPCODE_POW
].emit
= pow_emit_cpu
;
1863 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit_cpu
;
1864 bld_base
->op_actions
[TGSI_OPCODE_ROUND
].emit
= round_emit_cpu
;
1865 bld_base
->op_actions
[TGSI_OPCODE_SEQ
].emit
= seq_emit_cpu
;
1866 bld_base
->op_actions
[TGSI_OPCODE_SGE
].emit
= sge_emit_cpu
;
1867 bld_base
->op_actions
[TGSI_OPCODE_SGT
].emit
= sgt_emit_cpu
;
1868 bld_base
->op_actions
[TGSI_OPCODE_SIN
].emit
= sin_emit_cpu
;
1869 bld_base
->op_actions
[TGSI_OPCODE_SHL
].emit
= shl_emit_cpu
;
1870 bld_base
->op_actions
[TGSI_OPCODE_SLE
].emit
= sle_emit_cpu
;
1871 bld_base
->op_actions
[TGSI_OPCODE_SLT
].emit
= slt_emit_cpu
;
1872 bld_base
->op_actions
[TGSI_OPCODE_SNE
].emit
= sne_emit_cpu
;
1873 bld_base
->op_actions
[TGSI_OPCODE_SSG
].emit
= ssg_emit_cpu
;
1874 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit_cpu
;
1875 bld_base
->op_actions
[TGSI_OPCODE_TRUNC
].emit
= trunc_emit_cpu
;
1877 bld_base
->rsq_action
.emit
= recip_sqrt_emit_cpu
;
1878 bld_base
->sqrt_action
.emit
= sqrt_emit_cpu
;
1880 bld_base
->op_actions
[TGSI_OPCODE_UADD
].emit
= uadd_emit_cpu
;
1881 bld_base
->op_actions
[TGSI_OPCODE_UCMP
].emit
= ucmp_emit_cpu
;
1882 bld_base
->op_actions
[TGSI_OPCODE_UDIV
].emit
= udiv_emit_cpu
;
1883 bld_base
->op_actions
[TGSI_OPCODE_UMAX
].emit
= umax_emit_cpu
;
1884 bld_base
->op_actions
[TGSI_OPCODE_UMIN
].emit
= umin_emit_cpu
;
1885 bld_base
->op_actions
[TGSI_OPCODE_UMOD
].emit
= umod_emit_cpu
;
1886 bld_base
->op_actions
[TGSI_OPCODE_USEQ
].emit
= useq_emit_cpu
;
1887 bld_base
->op_actions
[TGSI_OPCODE_USGE
].emit
= usge_emit_cpu
;
1888 bld_base
->op_actions
[TGSI_OPCODE_USHR
].emit
= ushr_emit_cpu
;
1889 bld_base
->op_actions
[TGSI_OPCODE_USLT
].emit
= uslt_emit_cpu
;
1890 bld_base
->op_actions
[TGSI_OPCODE_USNE
].emit
= usne_emit_cpu
;
1892 bld_base
->op_actions
[TGSI_OPCODE_XOR
].emit
= xor_emit_cpu
;