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_conv.h"
49 #include "lp_bld_gather.h"
50 #include "lp_bld_logic.h"
51 #include "lp_bld_pack.h"
53 #include "tgsi/tgsi_exec.h"
55 /* XXX: The CPU only defaults should be repaced by generic ones. In most
56 * cases, the CPU defaults are just wrappers around a function in
57 * lp_build_arit.c and these functions should be inlined here and the CPU
58 * generic code should be removed and placed elsewhere.
63 /* Generic fetch_arg functions */
65 static void scalar_unary_fetch_args(
66 struct lp_build_tgsi_context
* bld_base
,
67 struct lp_build_emit_data
* emit_data
)
70 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, 0);
71 emit_data
->arg_count
= 1;
72 emit_data
->dst_type
= LLVMTypeOf(emit_data
->args
[0]);
75 static void scalar_binary_fetch_args(
76 struct lp_build_tgsi_context
* bld_base
,
77 struct lp_build_emit_data
* emit_data
)
80 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
83 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
85 emit_data
->arg_count
= 2;
86 emit_data
->dst_type
= LLVMTypeOf(emit_data
->args
[0]);
92 const struct lp_build_tgsi_action
* action
,
93 struct lp_build_tgsi_context
* bld_base
,
94 struct lp_build_emit_data
* emit_data
)
96 emit_data
->output
[emit_data
->chan
] = LLVMBuildFAdd(
97 bld_base
->base
.gallivm
->builder
,
98 emit_data
->args
[0], emit_data
->args
[1], "");
101 /* TGSI_OPCODE_ARR */
104 const struct lp_build_tgsi_action
* action
,
105 struct lp_build_tgsi_context
* bld_base
,
106 struct lp_build_emit_data
* emit_data
)
108 LLVMValueRef tmp
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_ROUND
, emit_data
->args
[0]);
109 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
110 bld_base
->uint_bld
.vec_type
, "");
117 struct lp_build_tgsi_context
* bld_base
,
118 struct lp_build_emit_data
* emit_data
,
119 unsigned dp_components
)
122 for (src
= 0; src
< 2; src
++) {
123 for (chan
= 0; chan
< dp_components
; chan
++) {
124 emit_data
->args
[(src
* dp_components
) + chan
] =
125 lp_build_emit_fetch(bld_base
, emit_data
->inst
, src
, chan
);
128 emit_data
->dst_type
= bld_base
->base
.elem_type
;
131 /* TGSI_OPCODE_DP2 */
134 struct lp_build_tgsi_context
* bld_base
,
135 struct lp_build_emit_data
* emit_data
)
137 dp_fetch_args(bld_base
, emit_data
, 2);
142 const struct lp_build_tgsi_action
* action
,
143 struct lp_build_tgsi_context
* bld_base
,
144 struct lp_build_emit_data
* emit_data
)
146 LLVMValueRef tmp0
, tmp1
;
147 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
148 emit_data
->args
[0] /* src0.x */,
149 emit_data
->args
[2] /* src1.x */);
150 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
151 emit_data
->args
[1] /* src0.y */,
152 emit_data
->args
[3] /* src1.y */);
153 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
154 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
157 static struct lp_build_tgsi_action dp2_action
= {
158 dp2_fetch_args
, /* fetch_args */
162 /* TGSI_OPCODE_DP2A */
165 struct lp_build_tgsi_context
* bld_base
,
166 struct lp_build_emit_data
* emit_data
)
168 dp_fetch_args(bld_base
, emit_data
, 2);
169 emit_data
->args
[5] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
175 const struct lp_build_tgsi_action
* action
,
176 struct lp_build_tgsi_context
* bld_base
,
177 struct lp_build_emit_data
* emit_data
)
180 tmp
= lp_build_emit_llvm(bld_base
, TGSI_OPCODE_DP2
, emit_data
);
181 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
,
182 emit_data
->args
[5], tmp
);
185 static struct lp_build_tgsi_action dp2a_action
= {
186 dp2a_fetch_args
, /* fetch_args */
190 /* TGSI_OPCODE_DP3 */
193 struct lp_build_tgsi_context
* bld_base
,
194 struct lp_build_emit_data
* emit_data
)
196 dp_fetch_args(bld_base
, emit_data
, 3);
201 const struct lp_build_tgsi_action
* action
,
202 struct lp_build_tgsi_context
* bld_base
,
203 struct lp_build_emit_data
* emit_data
)
205 LLVMValueRef tmp0
, tmp1
;
206 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
207 emit_data
->args
[0] /* src0.x */,
208 emit_data
->args
[3] /* src1.x */);
209 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
210 emit_data
->args
[1] /* src0.y */,
211 emit_data
->args
[4] /* src1.y */);
212 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp1
, tmp0
);
213 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
214 emit_data
->args
[2] /* src0.z */,
215 emit_data
->args
[5] /* src1.z */);
216 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
217 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
220 static struct lp_build_tgsi_action dp3_action
= {
221 dp3_fetch_args
, /* fetch_args */
225 /* TGSI_OPCODDE_DP4 */
229 struct lp_build_tgsi_context
* bld_base
,
230 struct lp_build_emit_data
* emit_data
)
232 dp_fetch_args(bld_base
, emit_data
, 4);
237 const struct lp_build_tgsi_action
* action
,
238 struct lp_build_tgsi_context
* bld_base
,
239 struct lp_build_emit_data
* emit_data
)
241 LLVMValueRef tmp0
, tmp1
;
242 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
243 emit_data
->args
[0] /* src0.x */,
244 emit_data
->args
[4] /* src1.x */);
245 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
246 emit_data
->args
[1] /* src0.y */,
247 emit_data
->args
[5] /* src1.y */);
248 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp0
, tmp1
);
249 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
250 emit_data
->args
[2] /* src0.z */,
251 emit_data
->args
[6] /* src1.z */);
252 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp0
, tmp1
);
253 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
254 emit_data
->args
[3] /* src0.w */,
255 emit_data
->args
[7] /* src1.w */);
256 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
257 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
260 static struct lp_build_tgsi_action dp4_action
= {
261 dp4_fetch_args
, /* fetch_args */
265 /* TGSI_OPCODE_DPH */
268 struct lp_build_tgsi_context
* bld_base
,
269 struct lp_build_emit_data
* emit_data
)
271 dp_fetch_args(bld_base
, emit_data
, 4);
273 emit_data
->args
[3] = bld_base
->base
.one
;
276 const struct lp_build_tgsi_action dph_action
= {
277 dph_fetch_args
, /* fetch_args */
281 /* TGSI_OPCODE_DST */
284 struct lp_build_tgsi_context
* bld_base
,
285 struct lp_build_emit_data
* emit_data
)
288 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
291 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
294 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
297 emit_data
->args
[3] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
303 const struct lp_build_tgsi_action
* action
,
304 struct lp_build_tgsi_context
* bld_base
,
305 struct lp_build_emit_data
* emit_data
)
308 emit_data
->output
[TGSI_CHAN_X
] = bld_base
->base
.one
;
311 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
313 emit_data
->args
[0] /* src0.y */,
314 emit_data
->args
[2] /* src1.y */);
316 emit_data
->output
[TGSI_CHAN_Z
] = emit_data
->args
[1]; /* src0.z */
319 emit_data
->output
[TGSI_CHAN_W
] = emit_data
->args
[3]; /* src1.w */
322 static struct lp_build_tgsi_action dst_action
= {
323 dst_fetch_args
, /* fetch_args */
327 /* TGSI_OPCODE_END */
330 const struct lp_build_tgsi_action
* action
,
331 struct lp_build_tgsi_context
* bld_base
,
332 struct lp_build_emit_data
* emit_data
)
337 /* TGSI_OPCODE_EXP */
341 const struct lp_build_tgsi_action
* action
,
342 struct lp_build_tgsi_context
* bld_base
,
343 struct lp_build_emit_data
* emit_data
)
345 LLVMValueRef floor_x
;
347 /* floor( src0.x ) */
348 floor_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
351 /* 2 ^ floor( src0.x ) */
352 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
353 TGSI_OPCODE_EX2
, floor_x
);
355 /* src0.x - floor( src0.x ) */
356 emit_data
->output
[TGSI_CHAN_Y
] =
357 lp_build_sub(&bld_base
->base
, emit_data
->args
[0] /* src0.x */, floor_x
);
360 emit_data
->output
[TGSI_CHAN_Z
] = lp_build_emit_llvm_unary(bld_base
,
361 TGSI_OPCODE_EX2
, emit_data
->args
[0] /* src0.x */);
363 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
366 const struct lp_build_tgsi_action exp_action
= {
367 scalar_unary_fetch_args
, /* fetch_args */
371 /* TGSI_OPCODE_FRC */
375 const struct lp_build_tgsi_action
* action
,
376 struct lp_build_tgsi_context
* bld_base
,
377 struct lp_build_emit_data
* emit_data
)
380 tmp
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
382 emit_data
->output
[emit_data
->chan
] =
383 lp_build_sub(&bld_base
->base
, emit_data
->args
[0], tmp
);
386 /* TGSI_OPCODE_KILL_IF */
390 struct lp_build_tgsi_context
* bld_base
,
391 struct lp_build_emit_data
* emit_data
)
394 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
397 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
400 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
403 emit_data
->args
[3] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
405 emit_data
->arg_count
= 4;
406 emit_data
->dst_type
= LLVMVoidTypeInContext(bld_base
->base
.gallivm
->context
);
409 /* TGSI_OPCODE_KILL */
413 struct lp_build_tgsi_context
* bld_base
,
414 struct lp_build_emit_data
* emit_data
)
416 emit_data
->dst_type
= LLVMVoidTypeInContext(bld_base
->base
.gallivm
->context
);
419 /* TGSI_OPCODE_LIT */
423 struct lp_build_tgsi_context
* bld_base
,
424 struct lp_build_emit_data
* emit_data
)
427 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_X
);
429 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_Y
);
431 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_W
);
432 emit_data
->arg_count
= 3;
437 const struct lp_build_tgsi_action
* action
,
438 struct lp_build_tgsi_context
* bld_base
,
439 struct lp_build_emit_data
* emit_data
)
441 LLVMValueRef tmp0
, tmp1
, tmp2
;
444 emit_data
->output
[TGSI_CHAN_X
] = bld_base
->base
.one
;
447 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
449 emit_data
->args
[0] /* src0.x */,
450 bld_base
->base
.zero
);
453 /* XMM[1] = SrcReg[0].yyyy */
454 tmp1
= emit_data
->args
[1];
455 /* XMM[1] = max(XMM[1], 0) */
456 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MAX
,
457 tmp1
, bld_base
->base
.zero
);
458 /* XMM[2] = SrcReg[0].wwww */
459 tmp2
= emit_data
->args
[2];
460 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_POW
,
462 tmp0
= emit_data
->args
[0];
463 emit_data
->output
[TGSI_CHAN_Z
] = lp_build_emit_llvm_ternary(bld_base
,
465 tmp0
, bld_base
->base
.zero
, tmp1
);
467 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
470 static struct lp_build_tgsi_action lit_action
= {
471 lit_fetch_args
, /* fetch_args */
475 /* TGSI_OPCODE_LOG */
479 const struct lp_build_tgsi_action
* action
,
480 struct lp_build_tgsi_context
* bld_base
,
481 struct lp_build_emit_data
* emit_data
)
484 LLVMValueRef abs_x
, log_abs_x
, flr_log_abs_x
, ex2_flr_log_abs_x
;
487 abs_x
= lp_build_abs(&bld_base
->base
, emit_data
->args
[0] /* src0.x */);
489 /* log( abs( src0.x ) ) */
490 log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_LG2
,
493 /* floor( log( abs( src0.x ) ) ) */
494 flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
497 emit_data
->output
[TGSI_CHAN_X
] = flr_log_abs_x
;
500 ex2_flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_EX2
,
503 /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */
504 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
505 TGSI_OPCODE_DIV
, abs_x
, ex2_flr_log_abs_x
);
508 emit_data
->output
[TGSI_CHAN_Z
] = log_abs_x
;
511 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
514 static struct lp_build_tgsi_action log_action
= {
515 scalar_unary_fetch_args
, /* fetch_args */
519 /* TGSI_OPCODE_PK2H */
523 struct lp_build_tgsi_context
* bld_base
,
524 struct lp_build_emit_data
* emit_data
)
527 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
530 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
536 const struct lp_build_tgsi_action
*action
,
537 struct lp_build_tgsi_context
*bld_base
,
538 struct lp_build_emit_data
*emit_data
)
540 struct gallivm_state
*gallivm
= bld_base
->base
.gallivm
;
541 struct lp_type f16i_t
;
542 LLVMValueRef lo
, hi
, res
;
544 f16i_t
= lp_type_uint_vec(16, bld_base
->base
.type
.length
* 32);
545 lo
= lp_build_float_to_half(gallivm
, emit_data
->args
[0]);
546 hi
= lp_build_float_to_half(gallivm
, emit_data
->args
[1]);
547 /* maybe some interleave doubling vector width would be useful... */
548 lo
= lp_build_pad_vector(gallivm
, lo
, bld_base
->base
.type
.length
* 2);
549 hi
= lp_build_pad_vector(gallivm
, hi
, bld_base
->base
.type
.length
* 2);
550 res
= lp_build_interleave2(gallivm
, f16i_t
, lo
, hi
, 0);
552 emit_data
->output
[emit_data
->chan
] = res
;
555 static struct lp_build_tgsi_action pk2h_action
= {
556 pk2h_fetch_args
, /* fetch_args */
560 /* TGSI_OPCODE_UP2H */
564 const struct lp_build_tgsi_action
*action
,
565 struct lp_build_tgsi_context
*bld_base
,
566 struct lp_build_emit_data
*emit_data
)
568 struct gallivm_state
*gallivm
= bld_base
->base
.gallivm
;
569 LLVMBuilderRef builder
= gallivm
->builder
;
570 LLVMContextRef context
= gallivm
->context
;
571 LLVMValueRef lo
, hi
, res
[2], arg
;
572 unsigned nr
= bld_base
->base
.type
.length
;
573 LLVMTypeRef i16t
= LLVMVectorType(LLVMInt16TypeInContext(context
), nr
* 2);
575 arg
= LLVMBuildBitCast(builder
, emit_data
->args
[0], i16t
, "");
576 lo
= lp_build_uninterleave1(gallivm
, nr
* 2, arg
, 0);
577 hi
= lp_build_uninterleave1(gallivm
, nr
* 2, arg
, 1);
578 res
[0] = lp_build_half_to_float(gallivm
, lo
);
579 res
[1] = lp_build_half_to_float(gallivm
, hi
);
581 emit_data
->output
[0] = emit_data
->output
[2] = res
[0];
582 emit_data
->output
[1] = emit_data
->output
[3] = res
[1];
585 static struct lp_build_tgsi_action up2h_action
= {
586 scalar_unary_fetch_args
, /* fetch_args */
590 /* TGSI_OPCODE_LRP */
594 const struct lp_build_tgsi_action
* action
,
595 struct lp_build_tgsi_context
* bld_base
,
596 struct lp_build_emit_data
* emit_data
)
598 struct lp_build_context
*bld
= &bld_base
->base
;
599 LLVMValueRef inv
, a
, b
;
601 /* This uses the correct version: (1 - t)*a + t*b
603 * An alternative version is "a + t*(b-a)". The problem is this version
604 * doesn't return "b" for t = 1, because "a + (b-a)" isn't equal to "b"
605 * because of the floating-point rounding.
607 inv
= lp_build_sub(bld
, bld_base
->base
.one
, emit_data
->args
[0]);
608 a
= lp_build_mul(bld
, emit_data
->args
[1], emit_data
->args
[0]);
609 b
= lp_build_mul(bld
, emit_data
->args
[2], inv
);
610 emit_data
->output
[emit_data
->chan
] = lp_build_add(bld
, a
, b
);
613 /* TGSI_OPCODE_MAD */
617 const struct lp_build_tgsi_action
* action
,
618 struct lp_build_tgsi_context
* bld_base
,
619 struct lp_build_emit_data
* emit_data
)
622 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
625 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
626 TGSI_OPCODE_ADD
, tmp
, emit_data
->args
[2]);
629 /* TGSI_OPCODE_MOV */
633 const struct lp_build_tgsi_action
* action
,
634 struct lp_build_tgsi_context
* bld_base
,
635 struct lp_build_emit_data
* emit_data
)
637 emit_data
->output
[emit_data
->chan
] = emit_data
->args
[0];
640 /* TGSI_OPCODE_MUL */
643 const struct lp_build_tgsi_action
* action
,
644 struct lp_build_tgsi_context
* bld_base
,
645 struct lp_build_emit_data
* emit_data
)
647 emit_data
->output
[emit_data
->chan
] = LLVMBuildFMul(
648 bld_base
->base
.gallivm
->builder
,
649 emit_data
->args
[0], emit_data
->args
[1], "");
652 /*.TGSI_OPCODE_DIV.*/
653 static void fdiv_emit(
654 const struct lp_build_tgsi_action
* action
,
655 struct lp_build_tgsi_context
* bld_base
,
656 struct lp_build_emit_data
* emit_data
)
658 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
659 bld_base
->base
.gallivm
->builder
,
660 emit_data
->args
[0], emit_data
->args
[1], "");
663 /*.TGSI_OPCODE_RCP.*/
664 static void rcp_emit(
665 const struct lp_build_tgsi_action
* action
,
666 struct lp_build_tgsi_context
* bld_base
,
667 struct lp_build_emit_data
* emit_data
)
670 one
= lp_build_const_float(bld_base
->base
.gallivm
, 1.0f
);
671 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
672 TGSI_OPCODE_DIV
, one
, emit_data
->args
[0]);
675 /* TGSI_OPCODE_POW */
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
] = lp_build_pow(&bld_base
->base
,
684 emit_data
->args
[0], emit_data
->args
[1]);
687 static struct lp_build_tgsi_action pow_action
= {
688 scalar_binary_fetch_args
, /* fetch_args */
692 /* TGSI_OPCODE_RSQ */
696 const struct lp_build_tgsi_action
* action
,
697 struct lp_build_tgsi_context
* bld_base
,
698 struct lp_build_emit_data
* emit_data
)
700 if (bld_base
->rsq_action
.emit
) {
701 bld_base
->rsq_action
.emit(&bld_base
->rsq_action
, bld_base
, emit_data
);
703 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
707 const struct lp_build_tgsi_action rsq_action
= {
708 scalar_unary_fetch_args
, /* fetch_args */
713 /* TGSI_OPCODE_SQRT */
717 const struct lp_build_tgsi_action
* action
,
718 struct lp_build_tgsi_context
* bld_base
,
719 struct lp_build_emit_data
* emit_data
)
721 if (bld_base
->sqrt_action
.emit
) {
722 bld_base
->sqrt_action
.emit(&bld_base
->sqrt_action
, bld_base
, emit_data
);
724 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
728 const struct lp_build_tgsi_action sqrt_action
= {
729 scalar_unary_fetch_args
, /* fetch_args */
733 /* TGSI_OPCODE_SCS */
736 const struct lp_build_tgsi_action
* action
,
737 struct lp_build_tgsi_context
* bld_base
,
738 struct lp_build_emit_data
* emit_data
)
741 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
742 TGSI_OPCODE_COS
, emit_data
->args
[0]);
744 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_unary(bld_base
,
745 TGSI_OPCODE_SIN
, emit_data
->args
[0]);
747 emit_data
->output
[TGSI_CHAN_Z
] = bld_base
->base
.zero
;
750 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
753 const struct lp_build_tgsi_action scs_action
= {
754 scalar_unary_fetch_args
, /* fetch_args */
758 /* TGSI_OPCODE_F2U */
761 const struct lp_build_tgsi_action
* action
,
762 struct lp_build_tgsi_context
* bld_base
,
763 struct lp_build_emit_data
* emit_data
)
765 emit_data
->output
[emit_data
->chan
] =
766 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
768 bld_base
->base
.int_vec_type
, "");
771 /* TGSI_OPCODE_U2F */
774 const struct lp_build_tgsi_action
* action
,
775 struct lp_build_tgsi_context
* bld_base
,
776 struct lp_build_emit_data
* emit_data
)
778 emit_data
->output
[emit_data
->chan
] =
779 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
781 bld_base
->base
.vec_type
, "");
786 const struct lp_build_tgsi_action
* action
,
787 struct lp_build_tgsi_context
* bld_base
,
788 struct lp_build_emit_data
* emit_data
)
791 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_UMUL
,
794 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
795 TGSI_OPCODE_UADD
, tmp
, emit_data
->args
[2]);
798 /* TGSI_OPCODE_UMUL */
801 const struct lp_build_tgsi_action
* action
,
802 struct lp_build_tgsi_context
* bld_base
,
803 struct lp_build_emit_data
* emit_data
)
805 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint_bld
,
806 emit_data
->args
[0], emit_data
->args
[1]);
809 /* TGSI_OPCODE_IMUL_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 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
817 LLVMValueRef hi_bits
;
819 assert(int_bld
->type
.width
== 32);
821 /* low result bits are tossed away */
822 lp_build_mul_32_lohi(int_bld
, emit_data
->args
[0],
823 emit_data
->args
[1], &hi_bits
);
824 emit_data
->output
[emit_data
->chan
] = hi_bits
;
829 const struct lp_build_tgsi_action
* action
,
830 struct lp_build_tgsi_context
* bld_base
,
831 struct lp_build_emit_data
* emit_data
)
833 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
834 LLVMValueRef hi_bits
;
836 assert(int_bld
->type
.width
== 32);
838 /* low result bits are tossed away */
839 lp_build_mul_32_lohi_cpu(int_bld
, emit_data
->args
[0],
840 emit_data
->args
[1], &hi_bits
);
841 emit_data
->output
[emit_data
->chan
] = hi_bits
;
844 /* TGSI_OPCODE_UMUL_HI */
847 const struct lp_build_tgsi_action
* action
,
848 struct lp_build_tgsi_context
* bld_base
,
849 struct lp_build_emit_data
* emit_data
)
851 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
852 LLVMValueRef hi_bits
;
854 assert(uint_bld
->type
.width
== 32);
856 /* low result bits are tossed away */
857 lp_build_mul_32_lohi(uint_bld
, emit_data
->args
[0],
858 emit_data
->args
[1], &hi_bits
);
859 emit_data
->output
[emit_data
->chan
] = hi_bits
;
864 const struct lp_build_tgsi_action
* action
,
865 struct lp_build_tgsi_context
* bld_base
,
866 struct lp_build_emit_data
* emit_data
)
868 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
869 LLVMValueRef hi_bits
;
871 assert(uint_bld
->type
.width
== 32);
873 /* low result bits are tossed away */
874 lp_build_mul_32_lohi_cpu(uint_bld
, emit_data
->args
[0],
875 emit_data
->args
[1], &hi_bits
);
876 emit_data
->output
[emit_data
->chan
] = hi_bits
;
879 /* TGSI_OPCODE_MAX */
880 static void fmax_emit(
881 const struct lp_build_tgsi_action
* action
,
882 struct lp_build_tgsi_context
* bld_base
,
883 struct lp_build_emit_data
* emit_data
)
885 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
886 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
887 LLVMBuildFCmp(builder
, LLVMRealUGE
,
888 emit_data
->args
[0], emit_data
->args
[1], ""),
889 emit_data
->args
[0], emit_data
->args
[1], "");
892 /* TGSI_OPCODE_MIN */
893 static void fmin_emit(
894 const struct lp_build_tgsi_action
* action
,
895 struct lp_build_tgsi_context
* bld_base
,
896 struct lp_build_emit_data
* emit_data
)
898 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
899 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
900 LLVMBuildFCmp(builder
, LLVMRealUGE
,
901 emit_data
->args
[0], emit_data
->args
[1], ""),
902 emit_data
->args
[1], emit_data
->args
[0], "");
905 /* TGSI_OPCODE_XPD */
909 struct lp_build_tgsi_context
* bld_base
,
910 struct lp_build_emit_data
* emit_data
)
912 dp_fetch_args(bld_base
, emit_data
, 3);
920 struct lp_build_tgsi_context
* bld_base
,
926 LLVMValueRef tmp0
, tmp1
;
928 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, a
, b
);
929 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, c
, d
);
931 return lp_build_sub(&bld_base
->base
, tmp0
, tmp1
);
936 const struct lp_build_tgsi_action
* action
,
937 struct lp_build_tgsi_context
* bld_base
,
938 struct lp_build_emit_data
* emit_data
)
940 emit_data
->output
[TGSI_CHAN_X
] = xpd_helper(bld_base
,
941 emit_data
->args
[1] /* src0.y */, emit_data
->args
[5] /* src1.z */,
942 emit_data
->args
[4] /* src1.y */, emit_data
->args
[2] /* src0.z */);
944 emit_data
->output
[TGSI_CHAN_Y
] = xpd_helper(bld_base
,
945 emit_data
->args
[2] /* src0.z */, emit_data
->args
[3] /* src1.x */,
946 emit_data
->args
[5] /* src1.z */, emit_data
->args
[0] /* src0.x */);
948 emit_data
->output
[TGSI_CHAN_Z
] = xpd_helper(bld_base
,
949 emit_data
->args
[0] /* src0.x */, emit_data
->args
[4] /* src1.y */,
950 emit_data
->args
[3] /* src1.x */, emit_data
->args
[1] /* src0.y */);
952 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
955 const struct lp_build_tgsi_action xpd_action
= {
956 xpd_fetch_args
, /* fetch_args */
960 /* TGSI_OPCODE_D2F */
963 const struct lp_build_tgsi_action
* action
,
964 struct lp_build_tgsi_context
* bld_base
,
965 struct lp_build_emit_data
* emit_data
)
967 emit_data
->output
[emit_data
->chan
] =
968 LLVMBuildFPTrunc(bld_base
->base
.gallivm
->builder
,
970 bld_base
->base
.vec_type
, "");
973 /* TGSI_OPCODE_D2I */
976 const struct lp_build_tgsi_action
* action
,
977 struct lp_build_tgsi_context
* bld_base
,
978 struct lp_build_emit_data
* emit_data
)
980 emit_data
->output
[emit_data
->chan
] =
981 LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
,
983 bld_base
->base
.int_vec_type
, "");
986 /* TGSI_OPCODE_D2U */
989 const struct lp_build_tgsi_action
* action
,
990 struct lp_build_tgsi_context
* bld_base
,
991 struct lp_build_emit_data
* emit_data
)
993 emit_data
->output
[emit_data
->chan
] =
994 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
996 bld_base
->base
.int_vec_type
, "");
999 /* TGSI_OPCODE_F2D */
1002 const struct lp_build_tgsi_action
* action
,
1003 struct lp_build_tgsi_context
* bld_base
,
1004 struct lp_build_emit_data
* emit_data
)
1006 emit_data
->output
[emit_data
->chan
] =
1007 LLVMBuildFPExt(bld_base
->base
.gallivm
->builder
,
1009 bld_base
->dbl_bld
.vec_type
, "");
1012 /* TGSI_OPCODE_U2D */
1015 const struct lp_build_tgsi_action
* action
,
1016 struct lp_build_tgsi_context
* bld_base
,
1017 struct lp_build_emit_data
* emit_data
)
1019 emit_data
->output
[emit_data
->chan
] =
1020 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1022 bld_base
->dbl_bld
.vec_type
, "");
1025 /* TGSI_OPCODE_I2D */
1028 const struct lp_build_tgsi_action
* action
,
1029 struct lp_build_tgsi_context
* bld_base
,
1030 struct lp_build_emit_data
* emit_data
)
1032 emit_data
->output
[emit_data
->chan
] =
1033 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1035 bld_base
->dbl_bld
.vec_type
, "");
1038 /* TGSI_OPCODE_DMAD */
1041 const struct lp_build_tgsi_action
* action
,
1042 struct lp_build_tgsi_context
* bld_base
,
1043 struct lp_build_emit_data
* emit_data
)
1046 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_DMUL
,
1048 emit_data
->args
[1]);
1049 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
1050 TGSI_OPCODE_DADD
, tmp
, emit_data
->args
[2]);
1053 /*.TGSI_OPCODE_DRCP.*/
1054 static void drcp_emit(
1055 const struct lp_build_tgsi_action
* action
,
1056 struct lp_build_tgsi_context
* bld_base
,
1057 struct lp_build_emit_data
* emit_data
)
1060 one
= lp_build_const_vec(bld_base
->dbl_bld
.gallivm
, bld_base
->dbl_bld
.type
, 1.0f
);
1061 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
1062 bld_base
->base
.gallivm
->builder
,
1063 one
, emit_data
->args
[0], "");
1066 /* TGSI_OPCODE_DFRAC */
1067 static void dfrac_emit(
1068 const struct lp_build_tgsi_action
* action
,
1069 struct lp_build_tgsi_context
* bld_base
,
1070 struct lp_build_emit_data
* emit_data
)
1073 tmp
= lp_build_floor(&bld_base
->dbl_bld
,
1074 emit_data
->args
[0]);
1075 emit_data
->output
[emit_data
->chan
] = LLVMBuildFSub(bld_base
->base
.gallivm
->builder
,
1076 emit_data
->args
[0], tmp
, "");
1081 const struct lp_build_tgsi_action
* action
,
1082 struct lp_build_tgsi_context
* bld_base
,
1083 struct lp_build_emit_data
* emit_data
)
1085 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint64_bld
,
1086 emit_data
->args
[0], emit_data
->args
[1]);
1091 const struct lp_build_tgsi_action
* action
,
1092 struct lp_build_tgsi_context
* bld_base
,
1093 struct lp_build_emit_data
* emit_data
)
1095 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1096 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
1097 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1098 bld_base
->uint64_bld
.zero
);
1099 /* We want to make sure that we never divide/mod by zero to not
1100 * generate sigfpe. We don't want to crash just because the
1101 * shader is doing something weird. */
1102 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1104 emit_data
->args
[1], "");
1105 LLVMValueRef result
= lp_build_mod(&bld_base
->uint64_bld
,
1106 emit_data
->args
[0], divisor
);
1107 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1108 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1115 const struct lp_build_tgsi_action
* action
,
1116 struct lp_build_tgsi_context
* bld_base
,
1117 struct lp_build_emit_data
* emit_data
)
1119 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1120 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
1121 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1122 bld_base
->uint64_bld
.zero
);
1123 /* We want to make sure that we never divide/mod by zero to not
1124 * generate sigfpe. We don't want to crash just because the
1125 * shader is doing something weird. */
1126 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1128 emit_data
->args
[1], "");
1129 LLVMValueRef result
= lp_build_mod(&bld_base
->int64_bld
,
1130 emit_data
->args
[0], divisor
);
1131 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1132 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1139 const struct lp_build_tgsi_action
* action
,
1140 struct lp_build_tgsi_context
* bld_base
,
1141 struct lp_build_emit_data
* emit_data
)
1144 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1145 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
1146 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1147 bld_base
->uint64_bld
.zero
);
1148 /* We want to make sure that we never divide/mod by zero to not
1149 * generate sigfpe. We don't want to crash just because the
1150 * shader is doing something weird. */
1151 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1153 emit_data
->args
[1], "");
1154 LLVMValueRef result
= LLVMBuildUDiv(builder
,
1155 emit_data
->args
[0], divisor
, "");
1156 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1157 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1164 const struct lp_build_tgsi_action
* action
,
1165 struct lp_build_tgsi_context
* bld_base
,
1166 struct lp_build_emit_data
* emit_data
)
1169 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1170 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->int64_bld
,
1171 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1172 bld_base
->int64_bld
.zero
);
1173 /* We want to make sure that we never divide/mod by zero to not
1174 * generate sigfpe. We don't want to crash just because the
1175 * shader is doing something weird. */
1176 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1178 emit_data
->args
[1], "");
1179 LLVMValueRef result
= LLVMBuildSDiv(builder
,
1180 emit_data
->args
[0], divisor
, "");
1181 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1182 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1189 const struct lp_build_tgsi_action
* action
,
1190 struct lp_build_tgsi_context
* bld_base
,
1191 struct lp_build_emit_data
* emit_data
)
1193 emit_data
->output
[emit_data
->chan
] =
1194 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
1196 bld_base
->uint64_bld
.vec_type
, "");
1201 const struct lp_build_tgsi_action
* action
,
1202 struct lp_build_tgsi_context
* bld_base
,
1203 struct lp_build_emit_data
* emit_data
)
1205 emit_data
->output
[emit_data
->chan
] =
1206 LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
,
1208 bld_base
->int64_bld
.vec_type
, "");
1213 const struct lp_build_tgsi_action
* action
,
1214 struct lp_build_tgsi_context
* bld_base
,
1215 struct lp_build_emit_data
* emit_data
)
1217 emit_data
->output
[emit_data
->chan
] =
1218 LLVMBuildZExt(bld_base
->base
.gallivm
->builder
,
1220 bld_base
->uint64_bld
.vec_type
, "");
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
] =
1230 LLVMBuildSExt(bld_base
->base
.gallivm
->builder
,
1232 bld_base
->int64_bld
.vec_type
, "");
1237 const struct lp_build_tgsi_action
* action
,
1238 struct lp_build_tgsi_context
* bld_base
,
1239 struct lp_build_emit_data
* emit_data
)
1241 emit_data
->output
[emit_data
->chan
] =
1242 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1244 bld_base
->base
.vec_type
, "");
1249 const struct lp_build_tgsi_action
* action
,
1250 struct lp_build_tgsi_context
* bld_base
,
1251 struct lp_build_emit_data
* emit_data
)
1253 emit_data
->output
[emit_data
->chan
] =
1254 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1256 bld_base
->base
.vec_type
, "");
1261 const struct lp_build_tgsi_action
* action
,
1262 struct lp_build_tgsi_context
* bld_base
,
1263 struct lp_build_emit_data
* emit_data
)
1265 emit_data
->output
[emit_data
->chan
] =
1266 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1268 bld_base
->dbl_bld
.vec_type
, "");
1273 const struct lp_build_tgsi_action
* action
,
1274 struct lp_build_tgsi_context
* bld_base
,
1275 struct lp_build_emit_data
* emit_data
)
1277 emit_data
->output
[emit_data
->chan
] =
1278 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1280 bld_base
->dbl_bld
.vec_type
, "");
1284 lp_set_default_actions(struct lp_build_tgsi_context
* bld_base
)
1286 bld_base
->op_actions
[TGSI_OPCODE_DP2
] = dp2_action
;
1287 bld_base
->op_actions
[TGSI_OPCODE_DP3
] = dp3_action
;
1288 bld_base
->op_actions
[TGSI_OPCODE_DP4
] = dp4_action
;
1289 bld_base
->op_actions
[TGSI_OPCODE_DP2A
] = dp2a_action
;
1290 bld_base
->op_actions
[TGSI_OPCODE_DPH
] = dph_action
;
1291 bld_base
->op_actions
[TGSI_OPCODE_DST
] = dst_action
;
1292 bld_base
->op_actions
[TGSI_OPCODE_EXP
] = exp_action
;
1293 bld_base
->op_actions
[TGSI_OPCODE_LIT
] = lit_action
;
1294 bld_base
->op_actions
[TGSI_OPCODE_LOG
] = log_action
;
1295 bld_base
->op_actions
[TGSI_OPCODE_PK2H
] = pk2h_action
;
1296 bld_base
->op_actions
[TGSI_OPCODE_RSQ
] = rsq_action
;
1297 bld_base
->op_actions
[TGSI_OPCODE_SQRT
] = sqrt_action
;
1298 bld_base
->op_actions
[TGSI_OPCODE_POW
] = pow_action
;
1299 bld_base
->op_actions
[TGSI_OPCODE_SCS
] = scs_action
;
1300 bld_base
->op_actions
[TGSI_OPCODE_UP2H
] = up2h_action
;
1301 bld_base
->op_actions
[TGSI_OPCODE_XPD
] = xpd_action
;
1303 bld_base
->op_actions
[TGSI_OPCODE_BREAKC
].fetch_args
= scalar_unary_fetch_args
;
1304 bld_base
->op_actions
[TGSI_OPCODE_SWITCH
].fetch_args
= scalar_unary_fetch_args
;
1305 bld_base
->op_actions
[TGSI_OPCODE_CASE
].fetch_args
= scalar_unary_fetch_args
;
1306 bld_base
->op_actions
[TGSI_OPCODE_COS
].fetch_args
= scalar_unary_fetch_args
;
1307 bld_base
->op_actions
[TGSI_OPCODE_EX2
].fetch_args
= scalar_unary_fetch_args
;
1308 bld_base
->op_actions
[TGSI_OPCODE_IF
].fetch_args
= scalar_unary_fetch_args
;
1309 bld_base
->op_actions
[TGSI_OPCODE_UIF
].fetch_args
= scalar_unary_fetch_args
;
1310 bld_base
->op_actions
[TGSI_OPCODE_KILL_IF
].fetch_args
= kil_fetch_args
;
1311 bld_base
->op_actions
[TGSI_OPCODE_KILL
].fetch_args
= kilp_fetch_args
;
1312 bld_base
->op_actions
[TGSI_OPCODE_RCP
].fetch_args
= scalar_unary_fetch_args
;
1313 bld_base
->op_actions
[TGSI_OPCODE_SIN
].fetch_args
= scalar_unary_fetch_args
;
1314 bld_base
->op_actions
[TGSI_OPCODE_LG2
].fetch_args
= scalar_unary_fetch_args
;
1316 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit
;
1317 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit
;
1318 bld_base
->op_actions
[TGSI_OPCODE_END
].emit
= end_emit
;
1319 bld_base
->op_actions
[TGSI_OPCODE_FRC
].emit
= frc_emit
;
1320 bld_base
->op_actions
[TGSI_OPCODE_LRP
].emit
= lrp_emit
;
1321 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit
;
1322 bld_base
->op_actions
[TGSI_OPCODE_MOV
].emit
= mov_emit
;
1323 bld_base
->op_actions
[TGSI_OPCODE_MUL
].emit
= mul_emit
;
1324 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= fdiv_emit
;
1325 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit
;
1327 bld_base
->op_actions
[TGSI_OPCODE_UARL
].emit
= mov_emit
;
1328 bld_base
->op_actions
[TGSI_OPCODE_F2U
].emit
= f2u_emit
;
1329 bld_base
->op_actions
[TGSI_OPCODE_U2F
].emit
= u2f_emit
;
1330 bld_base
->op_actions
[TGSI_OPCODE_UMAD
].emit
= umad_emit
;
1331 bld_base
->op_actions
[TGSI_OPCODE_UMUL
].emit
= umul_emit
;
1332 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit
;
1333 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit
;
1335 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= fmax_emit
;
1336 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= fmin_emit
;
1338 bld_base
->op_actions
[TGSI_OPCODE_DADD
].emit
= add_emit
;
1339 bld_base
->op_actions
[TGSI_OPCODE_DMAX
].emit
= fmax_emit
;
1340 bld_base
->op_actions
[TGSI_OPCODE_DMIN
].emit
= fmin_emit
;
1341 bld_base
->op_actions
[TGSI_OPCODE_DMUL
].emit
= mul_emit
;
1342 bld_base
->op_actions
[TGSI_OPCODE_DDIV
].emit
= fdiv_emit
;
1344 bld_base
->op_actions
[TGSI_OPCODE_D2F
].emit
= d2f_emit
;
1345 bld_base
->op_actions
[TGSI_OPCODE_D2I
].emit
= d2i_emit
;
1346 bld_base
->op_actions
[TGSI_OPCODE_D2U
].emit
= d2u_emit
;
1348 bld_base
->op_actions
[TGSI_OPCODE_F2D
].emit
= f2d_emit
;
1349 bld_base
->op_actions
[TGSI_OPCODE_I2D
].emit
= i2d_emit
;
1350 bld_base
->op_actions
[TGSI_OPCODE_U2D
].emit
= u2d_emit
;
1352 bld_base
->op_actions
[TGSI_OPCODE_DMAD
].emit
= dmad_emit
;
1354 bld_base
->op_actions
[TGSI_OPCODE_DRCP
].emit
= drcp_emit
;
1355 bld_base
->op_actions
[TGSI_OPCODE_DFRAC
].emit
= dfrac_emit
;
1357 bld_base
->op_actions
[TGSI_OPCODE_U64MUL
].emit
= u64mul_emit
;
1359 bld_base
->op_actions
[TGSI_OPCODE_F2I64
].emit
= f2i64_emit
;
1360 bld_base
->op_actions
[TGSI_OPCODE_F2U64
].emit
= f2u64_emit
;
1362 bld_base
->op_actions
[TGSI_OPCODE_D2I64
].emit
= f2i64_emit
;
1363 bld_base
->op_actions
[TGSI_OPCODE_D2U64
].emit
= f2u64_emit
;
1365 bld_base
->op_actions
[TGSI_OPCODE_I2I64
].emit
= i2i64_emit
;
1366 bld_base
->op_actions
[TGSI_OPCODE_U2I64
].emit
= u2i64_emit
;
1368 bld_base
->op_actions
[TGSI_OPCODE_I642F
].emit
= i642f_emit
;
1369 bld_base
->op_actions
[TGSI_OPCODE_U642F
].emit
= u642f_emit
;
1371 bld_base
->op_actions
[TGSI_OPCODE_I642F
].emit
= i642f_emit
;
1372 bld_base
->op_actions
[TGSI_OPCODE_U642F
].emit
= u642f_emit
;
1374 bld_base
->op_actions
[TGSI_OPCODE_I642D
].emit
= i642d_emit
;
1375 bld_base
->op_actions
[TGSI_OPCODE_U642D
].emit
= u642d_emit
;
1379 /* CPU Only default actions */
1381 /* These actions are CPU only, because they could potentially output SSE
1385 /* TGSI_OPCODE_ADD (CPU Only) */
1388 const struct lp_build_tgsi_action
* action
,
1389 struct lp_build_tgsi_context
* bld_base
,
1390 struct lp_build_emit_data
* emit_data
)
1392 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->base
,
1393 emit_data
->args
[0], emit_data
->args
[1]);
1396 /* TGSI_OPCODE_AND (CPU Only) */
1399 const struct lp_build_tgsi_action
* action
,
1400 struct lp_build_tgsi_context
* bld_base
,
1401 struct lp_build_emit_data
* emit_data
)
1403 emit_data
->output
[emit_data
->chan
] = lp_build_and(&bld_base
->uint_bld
,
1404 emit_data
->args
[0], emit_data
->args
[1]);
1407 /* TGSI_OPCODE_ARL (CPU Only) */
1410 const struct lp_build_tgsi_action
* action
,
1411 struct lp_build_tgsi_context
* bld_base
,
1412 struct lp_build_emit_data
* emit_data
)
1415 tmp
= lp_build_floor(&bld_base
->base
,
1416 emit_data
->args
[0]);
1417 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
1418 bld_base
->uint_bld
.vec_type
, "");
1421 /* TGSI_OPCODE_ARR (CPU Only) */
1424 const struct lp_build_tgsi_action
* action
,
1425 struct lp_build_tgsi_context
* bld_base
,
1426 struct lp_build_emit_data
* emit_data
)
1428 emit_data
->output
[emit_data
->chan
] = lp_build_iround(&bld_base
->base
, emit_data
->args
[0]);
1431 /* TGSI_OPCODE_CEIL (CPU Only) */
1434 const struct lp_build_tgsi_action
* action
,
1435 struct lp_build_tgsi_context
* bld_base
,
1436 struct lp_build_emit_data
* emit_data
)
1438 emit_data
->output
[emit_data
->chan
] = lp_build_ceil(&bld_base
->base
,
1439 emit_data
->args
[0]);
1442 /* TGSI_OPCODE_CMP (CPU Only) */
1445 const struct lp_build_tgsi_action
* action
,
1446 struct lp_build_tgsi_context
* bld_base
,
1447 struct lp_build_emit_data
* emit_data
)
1449 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_LESS
,
1450 emit_data
->args
[0], bld_base
->base
.zero
);
1451 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1452 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1455 /* TGSI_OPCODE_UCMP (CPU Only) */
1458 const struct lp_build_tgsi_action
* action
,
1459 struct lp_build_tgsi_context
* bld_base
,
1460 struct lp_build_emit_data
* emit_data
)
1462 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1463 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1464 LLVMValueRef unsigned_cond
=
1465 LLVMBuildBitCast(builder
, emit_data
->args
[0], uint_bld
->vec_type
, "");
1466 LLVMValueRef cond
= lp_build_cmp(uint_bld
, PIPE_FUNC_NOTEQUAL
,
1469 emit_data
->output
[emit_data
->chan
] =
1470 lp_build_select(&bld_base
->base
,
1471 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1474 /* TGSI_OPCODE_COS (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_cos(&bld_base
->base
,
1482 emit_data
->args
[0]);
1485 /* TGSI_OPCODE_DIV (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
->base
,
1493 emit_data
->args
[0], emit_data
->args
[1]);
1496 /* TGSI_OPCODE_EX2 (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_exp2(&bld_base
->base
,
1504 emit_data
->args
[0]);
1507 /* TGSI_OPCODE_F2I (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_itrunc(&bld_base
->base
,
1515 emit_data
->args
[0]);
1518 /* TGSI_OPCODE_FSET Helper (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
,
1528 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1529 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1530 emit_data
->args
[0], emit_data
->args
[1]);
1533 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1534 emit_data
->args
[0], emit_data
->args
[1]);
1537 emit_data
->output
[emit_data
->chan
] = cond
;
1541 /* TGSI_OPCODE_FSEQ (CPU Only) */
1544 const struct lp_build_tgsi_action
* action
,
1545 struct lp_build_tgsi_context
* bld_base
,
1546 struct lp_build_emit_data
* emit_data
)
1548 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1551 /* TGSI_OPCODE_ISGE (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 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1561 /* TGSI_OPCODE_ISLT (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 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1571 /* TGSI_OPCODE_USNE (CPU Only) */
1575 const struct lp_build_tgsi_action
* action
,
1576 struct lp_build_tgsi_context
* bld_base
,
1577 struct lp_build_emit_data
* emit_data
)
1579 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1582 /* TGSI_OPCODE_FLR (CPU Only) */
1586 const struct lp_build_tgsi_action
* action
,
1587 struct lp_build_tgsi_context
* bld_base
,
1588 struct lp_build_emit_data
* emit_data
)
1590 emit_data
->output
[emit_data
->chan
] = lp_build_floor(&bld_base
->base
,
1591 emit_data
->args
[0]);
1594 /* TGSI_OPCODE_I2F (CPU Only) */
1597 const struct lp_build_tgsi_action
* action
,
1598 struct lp_build_tgsi_context
* bld_base
,
1599 struct lp_build_emit_data
* emit_data
)
1601 emit_data
->output
[emit_data
->chan
] = lp_build_int_to_float(&bld_base
->base
,
1602 emit_data
->args
[0]);
1605 /* TGSI_OPCODE_IABS (CPU Only) */
1608 const struct lp_build_tgsi_action
* action
,
1609 struct lp_build_tgsi_context
* bld_base
,
1610 struct lp_build_emit_data
* emit_data
)
1612 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int_bld
,
1613 emit_data
->args
[0]);
1616 /* TGSI_OPCODE_IDIV (CPU Only) */
1619 const struct lp_build_tgsi_action
* action
,
1620 struct lp_build_tgsi_context
* bld_base
,
1621 struct lp_build_emit_data
* emit_data
)
1623 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1624 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1625 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1626 bld_base
->uint_bld
.zero
);
1627 /* We want to make sure that we never divide/mod by zero to not
1628 * generate sigfpe. We don't want to crash just because the
1629 * shader is doing something weird. */
1630 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1632 emit_data
->args
[1], "");
1633 LLVMValueRef result
= lp_build_div(&bld_base
->int_bld
,
1634 emit_data
->args
[0], divisor
);
1635 LLVMValueRef not_div_mask
= LLVMBuildNot(builder
,
1637 /* idiv by zero doesn't have a guaranteed return value chose 0 for now. */
1638 emit_data
->output
[emit_data
->chan
] = LLVMBuildAnd(builder
,
1643 /* TGSI_OPCODE_INEG (CPU Only) */
1646 const struct lp_build_tgsi_action
* action
,
1647 struct lp_build_tgsi_context
* bld_base
,
1648 struct lp_build_emit_data
* emit_data
)
1650 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int_bld
,
1651 bld_base
->int_bld
.zero
,
1652 emit_data
->args
[0]);
1655 /* TGSI_OPCODE_ISET Helper (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
,
1663 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int_bld
, pipe_func
,
1664 emit_data
->args
[0], emit_data
->args
[1]);
1665 emit_data
->output
[emit_data
->chan
] = cond
;
1668 /* TGSI_OPCODE_IMAX (CPU Only) */
1671 const struct lp_build_tgsi_action
* action
,
1672 struct lp_build_tgsi_context
* bld_base
,
1673 struct lp_build_emit_data
* emit_data
)
1675 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int_bld
,
1676 emit_data
->args
[0], emit_data
->args
[1]);
1679 /* TGSI_OPCODE_IMIN (CPU Only) */
1682 const struct lp_build_tgsi_action
* action
,
1683 struct lp_build_tgsi_context
* bld_base
,
1684 struct lp_build_emit_data
* emit_data
)
1686 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int_bld
,
1687 emit_data
->args
[0], emit_data
->args
[1]);
1690 /* TGSI_OPCODE_ISGE (CPU Only) */
1693 const struct lp_build_tgsi_action
* action
,
1694 struct lp_build_tgsi_context
* bld_base
,
1695 struct lp_build_emit_data
* emit_data
)
1697 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1700 /* TGSI_OPCODE_ISHR (CPU Only) */
1703 const struct lp_build_tgsi_action
* action
,
1704 struct lp_build_tgsi_context
* bld_base
,
1705 struct lp_build_emit_data
* emit_data
)
1707 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
1708 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
1709 int_bld
->type
.width
- 1);
1710 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
1711 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
1715 /* TGSI_OPCODE_ISLT (CPU Only) */
1718 const struct lp_build_tgsi_action
* action
,
1719 struct lp_build_tgsi_context
* bld_base
,
1720 struct lp_build_emit_data
* emit_data
)
1722 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1726 /* TGSI_OPCODE_ISSG (CPU Only) */
1729 const struct lp_build_tgsi_action
* action
,
1730 struct lp_build_tgsi_context
* bld_base
,
1731 struct lp_build_emit_data
* emit_data
)
1733 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int_bld
,
1734 emit_data
->args
[0]);
1737 /* TGSI_OPCODE_LG2 (CPU Only) */
1740 const struct lp_build_tgsi_action
* action
,
1741 struct lp_build_tgsi_context
* bld_base
,
1742 struct lp_build_emit_data
* emit_data
)
1744 emit_data
->output
[emit_data
->chan
] = lp_build_log2_safe(&bld_base
->base
,
1745 emit_data
->args
[0]);
1748 /* TGSI_OPCODE_LOG (CPU Only) */
1751 const struct lp_build_tgsi_action
* action
,
1752 struct lp_build_tgsi_context
* bld_base
,
1753 struct lp_build_emit_data
* emit_data
)
1755 LLVMValueRef p_floor_log2
;
1757 LLVMValueRef p_log2
;
1758 LLVMValueRef src0
= emit_data
->args
[0];
1760 lp_build_log2_approx(&bld_base
->base
, src0
,
1761 &p_exp
, &p_floor_log2
, &p_log2
, FALSE
);
1763 emit_data
->output
[TGSI_CHAN_X
] = p_floor_log2
;
1765 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
1768 emit_data
->output
[TGSI_CHAN_Z
] = p_log2
;
1770 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
1774 /* TGSI_OPCODE_MAD (CPU Only) */
1778 const struct lp_build_tgsi_action
* action
,
1779 struct lp_build_tgsi_context
* bld_base
,
1780 struct lp_build_emit_data
* emit_data
)
1782 emit_data
->output
[emit_data
->chan
] =
1783 lp_build_mad(&bld_base
->base
,
1784 emit_data
->args
[0], emit_data
->args
[1], emit_data
->args
[2]);
1787 /* TGSI_OPCODE_MAX (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 emit_data
->output
[emit_data
->chan
] =
1796 lp_build_max_ext(&bld_base
->base
,
1797 emit_data
->args
[0], emit_data
->args
[1],
1798 GALLIVM_NAN_RETURN_OTHER
);
1801 /* TGSI_OPCODE_MIN (CPU Only) */
1804 const struct lp_build_tgsi_action
* action
,
1805 struct lp_build_tgsi_context
* bld_base
,
1806 struct lp_build_emit_data
* emit_data
)
1808 emit_data
->output
[emit_data
->chan
] =
1809 lp_build_min_ext(&bld_base
->base
,
1810 emit_data
->args
[0], emit_data
->args
[1],
1811 GALLIVM_NAN_RETURN_OTHER
);
1814 /* TGSI_OPCODE_MOD (CPU Only) */
1817 const struct lp_build_tgsi_action
* action
,
1818 struct lp_build_tgsi_context
* bld_base
,
1819 struct lp_build_emit_data
* emit_data
)
1821 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1822 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1823 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1824 bld_base
->uint_bld
.zero
);
1825 /* We want to make sure that we never divide/mod by zero to not
1826 * generate sigfpe. We don't want to crash just because the
1827 * shader is doing something weird. */
1828 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1830 emit_data
->args
[1], "");
1831 LLVMValueRef result
= lp_build_mod(&bld_base
->int_bld
,
1832 emit_data
->args
[0], divisor
);
1833 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1834 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1839 /* TGSI_OPCODE_NOT */
1842 const struct lp_build_tgsi_action
* action
,
1843 struct lp_build_tgsi_context
* bld_base
,
1844 struct lp_build_emit_data
* emit_data
)
1846 emit_data
->output
[emit_data
->chan
] = lp_build_not(&bld_base
->uint_bld
,
1847 emit_data
->args
[0]);
1850 /* TGSI_OPCODE_OR (CPU Only) */
1853 const struct lp_build_tgsi_action
* action
,
1854 struct lp_build_tgsi_context
* bld_base
,
1855 struct lp_build_emit_data
* emit_data
)
1857 emit_data
->output
[emit_data
->chan
] = lp_build_or(&bld_base
->uint_bld
,
1858 emit_data
->args
[0], emit_data
->args
[1]);
1861 /* TGSI_OPCODE_POW (CPU Only) */
1864 const struct lp_build_tgsi_action
* action
,
1865 struct lp_build_tgsi_context
* bld_base
,
1866 struct lp_build_emit_data
* emit_data
)
1868 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
1869 emit_data
->args
[0], emit_data
->args
[1]);
1873 /* TGSI_OPCODE_RCP (CPU Only) */
1877 const struct lp_build_tgsi_action
* action
,
1878 struct lp_build_tgsi_context
* bld_base
,
1879 struct lp_build_emit_data
* emit_data
)
1881 emit_data
->output
[emit_data
->chan
] = lp_build_rcp(&bld_base
->base
,
1882 emit_data
->args
[0]);
1885 /* Reciprical squareroot (CPU Only) */
1887 recip_sqrt_emit_cpu(
1888 const struct lp_build_tgsi_action
* action
,
1889 struct lp_build_tgsi_context
* bld_base
,
1890 struct lp_build_emit_data
* emit_data
)
1892 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->base
,
1893 emit_data
->args
[0]);
1898 const struct lp_build_tgsi_action
* action
,
1899 struct lp_build_tgsi_context
* bld_base
,
1900 struct lp_build_emit_data
* emit_data
)
1902 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->base
,
1903 emit_data
->args
[0]);
1907 /* TGSI_OPCODE_ROUND (CPU Only) */
1910 const struct lp_build_tgsi_action
* action
,
1911 struct lp_build_tgsi_context
* bld_base
,
1912 struct lp_build_emit_data
* emit_data
)
1914 emit_data
->output
[emit_data
->chan
] = lp_build_round(&bld_base
->base
,
1915 emit_data
->args
[0]);
1918 /* TGSI_OPCODE_SET Helper (CPU Only) */
1922 const struct lp_build_tgsi_action
* action
,
1923 struct lp_build_tgsi_context
* bld_base
,
1924 struct lp_build_emit_data
* emit_data
,
1929 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1930 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1931 emit_data
->args
[0], emit_data
->args
[1]);
1934 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1935 emit_data
->args
[0], emit_data
->args
[1]);
1938 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1941 bld_base
->base
.zero
);
1944 /* TGSI_OPCODE_SEQ (CPU Only) */
1948 const struct lp_build_tgsi_action
* action
,
1949 struct lp_build_tgsi_context
* bld_base
,
1950 struct lp_build_emit_data
* emit_data
)
1952 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1955 /* TGSI_OPCODE_SGE (CPU Only) */
1958 const struct lp_build_tgsi_action
* action
,
1959 struct lp_build_tgsi_context
* bld_base
,
1960 struct lp_build_emit_data
* emit_data
)
1962 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1965 /* TGSI_OPCODE_SGT (CPU Only)*/
1969 const struct lp_build_tgsi_action
* action
,
1970 struct lp_build_tgsi_context
* bld_base
,
1971 struct lp_build_emit_data
* emit_data
)
1973 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GREATER
);
1976 /* TGSI_OPCODE_SHL (CPU Only) */
1979 const struct lp_build_tgsi_action
* action
,
1980 struct lp_build_tgsi_context
* bld_base
,
1981 struct lp_build_emit_data
* emit_data
)
1983 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1984 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
1985 uint_bld
->type
.width
- 1);
1986 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
1987 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
1991 /* TGSI_OPCODE_SIN (CPU Only) */
1994 const struct lp_build_tgsi_action
* action
,
1995 struct lp_build_tgsi_context
* bld_base
,
1996 struct lp_build_emit_data
* emit_data
)
1998 emit_data
->output
[emit_data
->chan
] = lp_build_sin(&bld_base
->base
,
1999 emit_data
->args
[0]);
2002 /* TGSI_OPCODE_SLE (CPU Only) */
2005 const struct lp_build_tgsi_action
* action
,
2006 struct lp_build_tgsi_context
* bld_base
,
2007 struct lp_build_emit_data
* emit_data
)
2009 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LEQUAL
);
2012 /* TGSI_OPCODE_SLT (CPU Only) */
2015 const struct lp_build_tgsi_action
* action
,
2016 struct lp_build_tgsi_context
* bld_base
,
2017 struct lp_build_emit_data
* emit_data
)
2019 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2022 /* TGSI_OPCODE_SNE (CPU Only) */
2026 const struct lp_build_tgsi_action
* action
,
2027 struct lp_build_tgsi_context
* bld_base
,
2028 struct lp_build_emit_data
* emit_data
)
2030 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2033 /* TGSI_OPCODE_SSG (CPU Only) */
2037 const struct lp_build_tgsi_action
* action
,
2038 struct lp_build_tgsi_context
* bld_base
,
2039 struct lp_build_emit_data
* emit_data
)
2041 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->base
,
2042 emit_data
->args
[0]);
2045 /* TGSI_OPCODE_TRUNC (CPU Only) */
2049 const struct lp_build_tgsi_action
* action
,
2050 struct lp_build_tgsi_context
* bld_base
,
2051 struct lp_build_emit_data
* emit_data
)
2053 emit_data
->output
[emit_data
->chan
] = lp_build_trunc(&bld_base
->base
,
2054 emit_data
->args
[0]);
2057 /* TGSI_OPCODE_UADD (CPU Only) */
2060 const struct lp_build_tgsi_action
* action
,
2061 struct lp_build_tgsi_context
* bld_base
,
2062 struct lp_build_emit_data
* emit_data
)
2064 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint_bld
,
2065 emit_data
->args
[0], emit_data
->args
[1]);
2068 /* TGSI_OPCODE_UDIV (CPU Only) */
2071 const struct lp_build_tgsi_action
* action
,
2072 struct lp_build_tgsi_context
* bld_base
,
2073 struct lp_build_emit_data
* emit_data
)
2076 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2077 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
2078 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
2079 bld_base
->uint_bld
.zero
);
2080 /* We want to make sure that we never divide/mod by zero to not
2081 * generate sigfpe. We don't want to crash just because the
2082 * shader is doing something weird. */
2083 LLVMValueRef divisor
= LLVMBuildOr(builder
,
2085 emit_data
->args
[1], "");
2086 LLVMValueRef result
= lp_build_div(&bld_base
->uint_bld
,
2087 emit_data
->args
[0], divisor
);
2088 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
2089 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
2094 /* TGSI_OPCODE_UMAX (CPU Only) */
2097 const struct lp_build_tgsi_action
* action
,
2098 struct lp_build_tgsi_context
* bld_base
,
2099 struct lp_build_emit_data
* emit_data
)
2101 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint_bld
,
2102 emit_data
->args
[0], emit_data
->args
[1]);
2105 /* TGSI_OPCODE_UMIN (CPU Only) */
2108 const struct lp_build_tgsi_action
* action
,
2109 struct lp_build_tgsi_context
* bld_base
,
2110 struct lp_build_emit_data
* emit_data
)
2112 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint_bld
,
2113 emit_data
->args
[0], emit_data
->args
[1]);
2116 /* TGSI_OPCODE_UMOD (CPU Only) */
2119 const struct lp_build_tgsi_action
* action
,
2120 struct lp_build_tgsi_context
* bld_base
,
2121 struct lp_build_emit_data
* emit_data
)
2123 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2124 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
2125 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
2126 bld_base
->uint_bld
.zero
);
2127 /* We want to make sure that we never divide/mod by zero to not
2128 * generate sigfpe. We don't want to crash just because the
2129 * shader is doing something weird. */
2130 LLVMValueRef divisor
= LLVMBuildOr(builder
,
2132 emit_data
->args
[1], "");
2133 LLVMValueRef result
= lp_build_mod(&bld_base
->uint_bld
,
2134 emit_data
->args
[0], divisor
);
2135 /* umod by zero is guaranteed to return 0xffffffff */
2136 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
2141 /* TGSI_OPCODE_USET Helper (CPU Only) */
2144 const struct lp_build_tgsi_action
* action
,
2145 struct lp_build_tgsi_context
* bld_base
,
2146 struct lp_build_emit_data
* emit_data
,
2149 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint_bld
, pipe_func
,
2150 emit_data
->args
[0], emit_data
->args
[1]);
2151 emit_data
->output
[emit_data
->chan
] = cond
;
2155 /* TGSI_OPCODE_USEQ (CPU Only) */
2158 const struct lp_build_tgsi_action
* action
,
2159 struct lp_build_tgsi_context
* bld_base
,
2160 struct lp_build_emit_data
* emit_data
)
2162 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2165 /* TGSI_OPCODE_ISGE (CPU Only) */
2168 const struct lp_build_tgsi_action
* action
,
2169 struct lp_build_tgsi_context
* bld_base
,
2170 struct lp_build_emit_data
* emit_data
)
2172 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2175 /* TGSI_OPCODE_USHR (CPU Only) */
2178 const struct lp_build_tgsi_action
* action
,
2179 struct lp_build_tgsi_context
* bld_base
,
2180 struct lp_build_emit_data
* emit_data
)
2182 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
2183 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2184 uint_bld
->type
.width
- 1);
2185 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2186 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
2190 /* TGSI_OPCODE_ISLT (CPU Only) */
2193 const struct lp_build_tgsi_action
* action
,
2194 struct lp_build_tgsi_context
* bld_base
,
2195 struct lp_build_emit_data
* emit_data
)
2197 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2200 /* TGSI_OPCODE_USNE (CPU Only) */
2204 const struct lp_build_tgsi_action
* action
,
2205 struct lp_build_tgsi_context
* bld_base
,
2206 struct lp_build_emit_data
* emit_data
)
2208 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2211 /* TGSI_OPCODE_XOR */
2214 const struct lp_build_tgsi_action
* action
,
2215 struct lp_build_tgsi_context
* bld_base
,
2216 struct lp_build_emit_data
* emit_data
)
2218 emit_data
->output
[emit_data
->chan
] = lp_build_xor(&bld_base
->uint_bld
,
2220 emit_data
->args
[1]);
2223 /* TGSI_OPCODE_DABS (CPU Only) */
2226 const struct lp_build_tgsi_action
* action
,
2227 struct lp_build_tgsi_context
* bld_base
,
2228 struct lp_build_emit_data
* emit_data
)
2230 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->dbl_bld
,
2231 emit_data
->args
[0]);
2234 /* TGSI_OPCODE_DNEG (CPU Only) */
2237 const struct lp_build_tgsi_action
* action
,
2238 struct lp_build_tgsi_context
* bld_base
,
2239 struct lp_build_emit_data
* emit_data
)
2241 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->dbl_bld
,
2242 bld_base
->dbl_bld
.zero
,
2243 emit_data
->args
[0]);
2246 /* TGSI_OPCODE_DSET Helper (CPU Only) */
2249 const struct lp_build_tgsi_action
* action
,
2250 struct lp_build_tgsi_context
* bld_base
,
2251 struct lp_build_emit_data
* emit_data
,
2254 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2255 LLVMValueRef cond
= lp_build_cmp(&bld_base
->dbl_bld
, pipe_func
,
2256 emit_data
->args
[0], emit_data
->args
[1]);
2257 /* arguments were 64 bit but store as 32 bit */
2258 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2259 emit_data
->output
[emit_data
->chan
] = cond
;
2262 /* TGSI_OPCODE_DSEQ (CPU Only) */
2265 const struct lp_build_tgsi_action
* action
,
2266 struct lp_build_tgsi_context
* bld_base
,
2267 struct lp_build_emit_data
* emit_data
)
2269 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2272 /* TGSI_OPCODE_DSGE (CPU Only) */
2275 const struct lp_build_tgsi_action
* action
,
2276 struct lp_build_tgsi_context
* bld_base
,
2277 struct lp_build_emit_data
* emit_data
)
2279 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2282 /* TGSI_OPCODE_DSLT (CPU Only) */
2285 const struct lp_build_tgsi_action
* action
,
2286 struct lp_build_tgsi_context
* bld_base
,
2287 struct lp_build_emit_data
* emit_data
)
2289 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2292 /* TGSI_OPCODE_DSNE (CPU Only) */
2295 const struct lp_build_tgsi_action
* action
,
2296 struct lp_build_tgsi_context
* bld_base
,
2297 struct lp_build_emit_data
* emit_data
)
2299 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2302 /* Double Reciprocal squareroot (CPU Only) */
2304 drecip_sqrt_emit_cpu(
2305 const struct lp_build_tgsi_action
* action
,
2306 struct lp_build_tgsi_context
* bld_base
,
2307 struct lp_build_emit_data
* emit_data
)
2309 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->dbl_bld
,
2310 emit_data
->args
[0]);
2313 /* Double Squareroot (CPU Only) */
2316 const struct lp_build_tgsi_action
* action
,
2317 struct lp_build_tgsi_context
* bld_base
,
2318 struct lp_build_emit_data
* emit_data
)
2320 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->dbl_bld
,
2321 emit_data
->args
[0]);
2326 const struct lp_build_tgsi_action
* action
,
2327 struct lp_build_tgsi_context
* bld_base
,
2328 struct lp_build_emit_data
* emit_data
)
2330 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int64_bld
,
2331 emit_data
->args
[0]);
2336 const struct lp_build_tgsi_action
* action
,
2337 struct lp_build_tgsi_context
* bld_base
,
2338 struct lp_build_emit_data
* emit_data
)
2340 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int64_bld
,
2341 emit_data
->args
[0]);
2346 const struct lp_build_tgsi_action
* action
,
2347 struct lp_build_tgsi_context
* bld_base
,
2348 struct lp_build_emit_data
* emit_data
)
2350 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int64_bld
,
2351 bld_base
->int64_bld
.zero
,
2352 emit_data
->args
[0]);
2357 const struct lp_build_tgsi_action
* action
,
2358 struct lp_build_tgsi_context
* bld_base
,
2359 struct lp_build_emit_data
* emit_data
,
2362 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2363 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint64_bld
, pipe_func
,
2364 emit_data
->args
[0], emit_data
->args
[1]);
2365 /* arguments were 64 bit but store as 32 bit */
2366 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2367 emit_data
->output
[emit_data
->chan
] = cond
;
2372 const struct lp_build_tgsi_action
* action
,
2373 struct lp_build_tgsi_context
* bld_base
,
2374 struct lp_build_emit_data
* emit_data
)
2376 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2381 const struct lp_build_tgsi_action
* action
,
2382 struct lp_build_tgsi_context
* bld_base
,
2383 struct lp_build_emit_data
* emit_data
)
2385 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2390 const struct lp_build_tgsi_action
* action
,
2391 struct lp_build_tgsi_context
* bld_base
,
2392 struct lp_build_emit_data
* emit_data
)
2394 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2399 const struct lp_build_tgsi_action
* action
,
2400 struct lp_build_tgsi_context
* bld_base
,
2401 struct lp_build_emit_data
* emit_data
)
2403 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2408 const struct lp_build_tgsi_action
* action
,
2409 struct lp_build_tgsi_context
* bld_base
,
2410 struct lp_build_emit_data
* emit_data
,
2413 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2414 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int64_bld
, pipe_func
,
2415 emit_data
->args
[0], emit_data
->args
[1]);
2416 /* arguments were 64 bit but store as 32 bit */
2417 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2418 emit_data
->output
[emit_data
->chan
] = cond
;
2423 const struct lp_build_tgsi_action
* action
,
2424 struct lp_build_tgsi_context
* bld_base
,
2425 struct lp_build_emit_data
* emit_data
)
2427 i64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2432 const struct lp_build_tgsi_action
* action
,
2433 struct lp_build_tgsi_context
* bld_base
,
2434 struct lp_build_emit_data
* emit_data
)
2436 i64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2441 const struct lp_build_tgsi_action
* action
,
2442 struct lp_build_tgsi_context
* bld_base
,
2443 struct lp_build_emit_data
* emit_data
)
2445 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint64_bld
,
2446 emit_data
->args
[0], emit_data
->args
[1]);
2451 const struct lp_build_tgsi_action
* action
,
2452 struct lp_build_tgsi_context
* bld_base
,
2453 struct lp_build_emit_data
* emit_data
)
2455 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint64_bld
,
2456 emit_data
->args
[0], emit_data
->args
[1]);
2461 const struct lp_build_tgsi_action
* action
,
2462 struct lp_build_tgsi_context
* bld_base
,
2463 struct lp_build_emit_data
* emit_data
)
2465 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int64_bld
,
2466 emit_data
->args
[0], emit_data
->args
[1]);
2471 const struct lp_build_tgsi_action
* action
,
2472 struct lp_build_tgsi_context
* bld_base
,
2473 struct lp_build_emit_data
* emit_data
)
2475 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int64_bld
,
2476 emit_data
->args
[0], emit_data
->args
[1]);
2481 const struct lp_build_tgsi_action
* action
,
2482 struct lp_build_tgsi_context
* bld_base
,
2483 struct lp_build_emit_data
* emit_data
)
2485 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint64_bld
,
2486 emit_data
->args
[0], emit_data
->args
[1]);
2491 const struct lp_build_tgsi_action
* action
,
2492 struct lp_build_tgsi_context
* bld_base
,
2493 struct lp_build_emit_data
* emit_data
)
2495 struct lp_build_context
*uint_bld
= &bld_base
->uint64_bld
;
2496 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2497 uint_bld
->type
.width
- 1);
2498 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2499 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
2505 const struct lp_build_tgsi_action
* action
,
2506 struct lp_build_tgsi_context
* bld_base
,
2507 struct lp_build_emit_data
* emit_data
)
2509 struct lp_build_context
*int_bld
= &bld_base
->int64_bld
;
2510 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
2511 int_bld
->type
.width
- 1);
2512 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
2513 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
2519 const struct lp_build_tgsi_action
* action
,
2520 struct lp_build_tgsi_context
* bld_base
,
2521 struct lp_build_emit_data
* emit_data
)
2523 struct lp_build_context
*uint_bld
= &bld_base
->uint64_bld
;
2524 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2525 uint_bld
->type
.width
- 1);
2526 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2527 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
2532 lp_set_default_actions_cpu(
2533 struct lp_build_tgsi_context
* bld_base
)
2535 lp_set_default_actions(bld_base
);
2536 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit_cpu
;
2537 bld_base
->op_actions
[TGSI_OPCODE_AND
].emit
= and_emit_cpu
;
2538 bld_base
->op_actions
[TGSI_OPCODE_ARL
].emit
= arl_emit_cpu
;
2539 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit_cpu
;
2540 bld_base
->op_actions
[TGSI_OPCODE_CEIL
].emit
= ceil_emit_cpu
;
2541 bld_base
->op_actions
[TGSI_OPCODE_COS
].emit
= cos_emit_cpu
;
2542 bld_base
->op_actions
[TGSI_OPCODE_CMP
].emit
= cmp_emit_cpu
;
2543 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= div_emit_cpu
;
2544 bld_base
->op_actions
[TGSI_OPCODE_EX2
].emit
= ex2_emit_cpu
;
2545 bld_base
->op_actions
[TGSI_OPCODE_F2I
].emit
= f2i_emit_cpu
;
2546 bld_base
->op_actions
[TGSI_OPCODE_FLR
].emit
= flr_emit_cpu
;
2547 bld_base
->op_actions
[TGSI_OPCODE_FSEQ
].emit
= fseq_emit_cpu
;
2548 bld_base
->op_actions
[TGSI_OPCODE_FSGE
].emit
= fsge_emit_cpu
;
2549 bld_base
->op_actions
[TGSI_OPCODE_FSLT
].emit
= fslt_emit_cpu
;
2550 bld_base
->op_actions
[TGSI_OPCODE_FSNE
].emit
= fsne_emit_cpu
;
2552 bld_base
->op_actions
[TGSI_OPCODE_I2F
].emit
= i2f_emit_cpu
;
2553 bld_base
->op_actions
[TGSI_OPCODE_IABS
].emit
= iabs_emit_cpu
;
2554 bld_base
->op_actions
[TGSI_OPCODE_IDIV
].emit
= idiv_emit_cpu
;
2555 bld_base
->op_actions
[TGSI_OPCODE_INEG
].emit
= ineg_emit_cpu
;
2556 bld_base
->op_actions
[TGSI_OPCODE_IMAX
].emit
= imax_emit_cpu
;
2557 bld_base
->op_actions
[TGSI_OPCODE_IMIN
].emit
= imin_emit_cpu
;
2558 bld_base
->op_actions
[TGSI_OPCODE_ISGE
].emit
= isge_emit_cpu
;
2559 bld_base
->op_actions
[TGSI_OPCODE_ISHR
].emit
= ishr_emit_cpu
;
2560 bld_base
->op_actions
[TGSI_OPCODE_ISLT
].emit
= islt_emit_cpu
;
2561 bld_base
->op_actions
[TGSI_OPCODE_ISSG
].emit
= issg_emit_cpu
;
2562 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit_cpu
;
2563 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit_cpu
;
2565 bld_base
->op_actions
[TGSI_OPCODE_LG2
].emit
= lg2_emit_cpu
;
2566 bld_base
->op_actions
[TGSI_OPCODE_LOG
].emit
= log_emit_cpu
;
2567 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit_cpu
;
2568 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= max_emit_cpu
;
2569 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= min_emit_cpu
;
2570 bld_base
->op_actions
[TGSI_OPCODE_MOD
].emit
= mod_emit_cpu
;
2571 bld_base
->op_actions
[TGSI_OPCODE_NOT
].emit
= not_emit_cpu
;
2572 bld_base
->op_actions
[TGSI_OPCODE_OR
].emit
= or_emit_cpu
;
2573 bld_base
->op_actions
[TGSI_OPCODE_POW
].emit
= pow_emit_cpu
;
2574 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit_cpu
;
2575 bld_base
->op_actions
[TGSI_OPCODE_ROUND
].emit
= round_emit_cpu
;
2576 bld_base
->op_actions
[TGSI_OPCODE_SEQ
].emit
= seq_emit_cpu
;
2577 bld_base
->op_actions
[TGSI_OPCODE_SGE
].emit
= sge_emit_cpu
;
2578 bld_base
->op_actions
[TGSI_OPCODE_SGT
].emit
= sgt_emit_cpu
;
2579 bld_base
->op_actions
[TGSI_OPCODE_SIN
].emit
= sin_emit_cpu
;
2580 bld_base
->op_actions
[TGSI_OPCODE_SHL
].emit
= shl_emit_cpu
;
2581 bld_base
->op_actions
[TGSI_OPCODE_SLE
].emit
= sle_emit_cpu
;
2582 bld_base
->op_actions
[TGSI_OPCODE_SLT
].emit
= slt_emit_cpu
;
2583 bld_base
->op_actions
[TGSI_OPCODE_SNE
].emit
= sne_emit_cpu
;
2584 bld_base
->op_actions
[TGSI_OPCODE_SSG
].emit
= ssg_emit_cpu
;
2585 bld_base
->op_actions
[TGSI_OPCODE_TRUNC
].emit
= trunc_emit_cpu
;
2587 bld_base
->rsq_action
.emit
= recip_sqrt_emit_cpu
;
2588 bld_base
->sqrt_action
.emit
= sqrt_emit_cpu
;
2590 bld_base
->op_actions
[TGSI_OPCODE_UADD
].emit
= uadd_emit_cpu
;
2591 bld_base
->op_actions
[TGSI_OPCODE_UCMP
].emit
= ucmp_emit_cpu
;
2592 bld_base
->op_actions
[TGSI_OPCODE_UDIV
].emit
= udiv_emit_cpu
;
2593 bld_base
->op_actions
[TGSI_OPCODE_UMAX
].emit
= umax_emit_cpu
;
2594 bld_base
->op_actions
[TGSI_OPCODE_UMIN
].emit
= umin_emit_cpu
;
2595 bld_base
->op_actions
[TGSI_OPCODE_UMOD
].emit
= umod_emit_cpu
;
2596 bld_base
->op_actions
[TGSI_OPCODE_USEQ
].emit
= useq_emit_cpu
;
2597 bld_base
->op_actions
[TGSI_OPCODE_USGE
].emit
= usge_emit_cpu
;
2598 bld_base
->op_actions
[TGSI_OPCODE_USHR
].emit
= ushr_emit_cpu
;
2599 bld_base
->op_actions
[TGSI_OPCODE_USLT
].emit
= uslt_emit_cpu
;
2600 bld_base
->op_actions
[TGSI_OPCODE_USNE
].emit
= usne_emit_cpu
;
2602 bld_base
->op_actions
[TGSI_OPCODE_XOR
].emit
= xor_emit_cpu
;
2604 bld_base
->op_actions
[TGSI_OPCODE_DABS
].emit
= dabs_emit_cpu
;
2605 bld_base
->op_actions
[TGSI_OPCODE_DNEG
].emit
= dneg_emit_cpu
;
2606 bld_base
->op_actions
[TGSI_OPCODE_DSEQ
].emit
= dseq_emit_cpu
;
2607 bld_base
->op_actions
[TGSI_OPCODE_DSGE
].emit
= dsge_emit_cpu
;
2608 bld_base
->op_actions
[TGSI_OPCODE_DSLT
].emit
= dslt_emit_cpu
;
2609 bld_base
->op_actions
[TGSI_OPCODE_DSNE
].emit
= dsne_emit_cpu
;
2611 bld_base
->op_actions
[TGSI_OPCODE_DRSQ
].emit
= drecip_sqrt_emit_cpu
;
2612 bld_base
->op_actions
[TGSI_OPCODE_DSQRT
].emit
= dsqrt_emit_cpu
;
2614 bld_base
->op_actions
[TGSI_OPCODE_I64ABS
].emit
= i64abs_emit_cpu
;
2615 bld_base
->op_actions
[TGSI_OPCODE_I64SSG
].emit
= i64ssg_emit_cpu
;
2616 bld_base
->op_actions
[TGSI_OPCODE_I64NEG
].emit
= i64neg_emit_cpu
;
2618 bld_base
->op_actions
[TGSI_OPCODE_U64SEQ
].emit
= u64seq_emit_cpu
;
2619 bld_base
->op_actions
[TGSI_OPCODE_U64SNE
].emit
= u64sne_emit_cpu
;
2620 bld_base
->op_actions
[TGSI_OPCODE_U64SLT
].emit
= u64slt_emit_cpu
;
2621 bld_base
->op_actions
[TGSI_OPCODE_U64SGE
].emit
= u64sge_emit_cpu
;
2622 bld_base
->op_actions
[TGSI_OPCODE_I64SLT
].emit
= i64slt_emit_cpu
;
2623 bld_base
->op_actions
[TGSI_OPCODE_I64SGE
].emit
= i64sge_emit_cpu
;
2625 bld_base
->op_actions
[TGSI_OPCODE_U64MIN
].emit
= u64min_emit_cpu
;
2626 bld_base
->op_actions
[TGSI_OPCODE_U64MAX
].emit
= u64max_emit_cpu
;
2627 bld_base
->op_actions
[TGSI_OPCODE_I64MIN
].emit
= i64min_emit_cpu
;
2628 bld_base
->op_actions
[TGSI_OPCODE_I64MAX
].emit
= i64max_emit_cpu
;
2630 bld_base
->op_actions
[TGSI_OPCODE_U64ADD
].emit
= u64add_emit_cpu
;
2631 bld_base
->op_actions
[TGSI_OPCODE_U64MOD
].emit
= u64mod_emit_cpu
;
2632 bld_base
->op_actions
[TGSI_OPCODE_I64MOD
].emit
= i64mod_emit_cpu
;
2633 bld_base
->op_actions
[TGSI_OPCODE_U64DIV
].emit
= u64div_emit_cpu
;
2634 bld_base
->op_actions
[TGSI_OPCODE_I64DIV
].emit
= i64div_emit_cpu
;
2636 bld_base
->op_actions
[TGSI_OPCODE_U64SHL
].emit
= u64shl_emit_cpu
;
2637 bld_base
->op_actions
[TGSI_OPCODE_I64SHR
].emit
= i64shr_emit_cpu
;
2638 bld_base
->op_actions
[TGSI_OPCODE_U64SHR
].emit
= u64shr_emit_cpu
;