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
, "");
113 /* TGSI_OPCODE_CLAMP */
116 const struct lp_build_tgsi_action
* action
,
117 struct lp_build_tgsi_context
* bld_base
,
118 struct lp_build_emit_data
* emit_data
)
121 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MAX
,
124 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
125 TGSI_OPCODE_MIN
, tmp
, emit_data
->args
[2]);
132 struct lp_build_tgsi_context
* bld_base
,
133 struct lp_build_emit_data
* emit_data
,
134 unsigned dp_components
)
137 for (src
= 0; src
< 2; src
++) {
138 for (chan
= 0; chan
< dp_components
; chan
++) {
139 emit_data
->args
[(src
* dp_components
) + chan
] =
140 lp_build_emit_fetch(bld_base
, emit_data
->inst
, src
, chan
);
143 emit_data
->dst_type
= bld_base
->base
.elem_type
;
146 /* TGSI_OPCODE_DP2 */
149 struct lp_build_tgsi_context
* bld_base
,
150 struct lp_build_emit_data
* emit_data
)
152 dp_fetch_args(bld_base
, emit_data
, 2);
157 const struct lp_build_tgsi_action
* action
,
158 struct lp_build_tgsi_context
* bld_base
,
159 struct lp_build_emit_data
* emit_data
)
161 LLVMValueRef tmp0
, tmp1
;
162 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
163 emit_data
->args
[0] /* src0.x */,
164 emit_data
->args
[2] /* src1.x */);
165 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
166 emit_data
->args
[1] /* src0.y */,
167 emit_data
->args
[3] /* src1.y */);
168 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
169 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
172 static struct lp_build_tgsi_action dp2_action
= {
173 dp2_fetch_args
, /* fetch_args */
177 /* TGSI_OPCODE_DP2A */
180 struct lp_build_tgsi_context
* bld_base
,
181 struct lp_build_emit_data
* emit_data
)
183 dp_fetch_args(bld_base
, emit_data
, 2);
184 emit_data
->args
[5] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
190 const struct lp_build_tgsi_action
* action
,
191 struct lp_build_tgsi_context
* bld_base
,
192 struct lp_build_emit_data
* emit_data
)
195 tmp
= lp_build_emit_llvm(bld_base
, TGSI_OPCODE_DP2
, emit_data
);
196 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
,
197 emit_data
->args
[5], tmp
);
200 static struct lp_build_tgsi_action dp2a_action
= {
201 dp2a_fetch_args
, /* fetch_args */
205 /* TGSI_OPCODE_DP3 */
208 struct lp_build_tgsi_context
* bld_base
,
209 struct lp_build_emit_data
* emit_data
)
211 dp_fetch_args(bld_base
, emit_data
, 3);
216 const struct lp_build_tgsi_action
* action
,
217 struct lp_build_tgsi_context
* bld_base
,
218 struct lp_build_emit_data
* emit_data
)
220 LLVMValueRef tmp0
, tmp1
;
221 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
222 emit_data
->args
[0] /* src0.x */,
223 emit_data
->args
[3] /* src1.x */);
224 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
225 emit_data
->args
[1] /* src0.y */,
226 emit_data
->args
[4] /* src1.y */);
227 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp1
, tmp0
);
228 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
229 emit_data
->args
[2] /* src0.z */,
230 emit_data
->args
[5] /* src1.z */);
231 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
232 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
235 static struct lp_build_tgsi_action dp3_action
= {
236 dp3_fetch_args
, /* fetch_args */
240 /* TGSI_OPCODDE_DP4 */
244 struct lp_build_tgsi_context
* bld_base
,
245 struct lp_build_emit_data
* emit_data
)
247 dp_fetch_args(bld_base
, emit_data
, 4);
252 const struct lp_build_tgsi_action
* action
,
253 struct lp_build_tgsi_context
* bld_base
,
254 struct lp_build_emit_data
* emit_data
)
256 LLVMValueRef tmp0
, tmp1
;
257 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
258 emit_data
->args
[0] /* src0.x */,
259 emit_data
->args
[4] /* src1.x */);
260 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
261 emit_data
->args
[1] /* src0.y */,
262 emit_data
->args
[5] /* src1.y */);
263 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp0
, tmp1
);
264 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
265 emit_data
->args
[2] /* src0.z */,
266 emit_data
->args
[6] /* src1.z */);
267 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp0
, tmp1
);
268 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
269 emit_data
->args
[3] /* src0.w */,
270 emit_data
->args
[7] /* src1.w */);
271 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
272 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
275 static struct lp_build_tgsi_action dp4_action
= {
276 dp4_fetch_args
, /* fetch_args */
280 /* TGSI_OPCODE_DPH */
283 struct lp_build_tgsi_context
* bld_base
,
284 struct lp_build_emit_data
* emit_data
)
286 dp_fetch_args(bld_base
, emit_data
, 4);
288 emit_data
->args
[3] = bld_base
->base
.one
;
291 const struct lp_build_tgsi_action dph_action
= {
292 dph_fetch_args
, /* fetch_args */
296 /* TGSI_OPCODE_DST */
299 struct lp_build_tgsi_context
* bld_base
,
300 struct lp_build_emit_data
* emit_data
)
303 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
306 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
309 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
312 emit_data
->args
[3] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
318 const struct lp_build_tgsi_action
* action
,
319 struct lp_build_tgsi_context
* bld_base
,
320 struct lp_build_emit_data
* emit_data
)
323 emit_data
->output
[TGSI_CHAN_X
] = bld_base
->base
.one
;
326 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
328 emit_data
->args
[0] /* src0.y */,
329 emit_data
->args
[2] /* src1.y */);
331 emit_data
->output
[TGSI_CHAN_Z
] = emit_data
->args
[1]; /* src0.z */
334 emit_data
->output
[TGSI_CHAN_W
] = emit_data
->args
[3]; /* src1.w */
337 static struct lp_build_tgsi_action dst_action
= {
338 dst_fetch_args
, /* fetch_args */
342 /* TGSI_OPCODE_END */
345 const struct lp_build_tgsi_action
* action
,
346 struct lp_build_tgsi_context
* bld_base
,
347 struct lp_build_emit_data
* emit_data
)
352 /* TGSI_OPCODE_EXP */
356 const struct lp_build_tgsi_action
* action
,
357 struct lp_build_tgsi_context
* bld_base
,
358 struct lp_build_emit_data
* emit_data
)
360 LLVMValueRef floor_x
;
362 /* floor( src0.x ) */
363 floor_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
366 /* 2 ^ floor( src0.x ) */
367 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
368 TGSI_OPCODE_EX2
, floor_x
);
370 /* src0.x - floor( src0.x ) */
371 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
372 TGSI_OPCODE_SUB
, emit_data
->args
[0] /* src0.x */, floor_x
);
375 emit_data
->output
[TGSI_CHAN_Z
] = lp_build_emit_llvm_unary(bld_base
,
376 TGSI_OPCODE_EX2
, emit_data
->args
[0] /* src0.x */);
378 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
381 const struct lp_build_tgsi_action exp_action
= {
382 scalar_unary_fetch_args
, /* fetch_args */
386 /* TGSI_OPCODE_FRC */
390 const struct lp_build_tgsi_action
* action
,
391 struct lp_build_tgsi_context
* bld_base
,
392 struct lp_build_emit_data
* emit_data
)
395 tmp
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
397 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
398 TGSI_OPCODE_SUB
, emit_data
->args
[0], tmp
);
401 /* TGSI_OPCODE_KILL_IF */
405 struct lp_build_tgsi_context
* bld_base
,
406 struct lp_build_emit_data
* emit_data
)
409 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
412 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
415 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
418 emit_data
->args
[3] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
420 emit_data
->arg_count
= 4;
421 emit_data
->dst_type
= LLVMVoidTypeInContext(bld_base
->base
.gallivm
->context
);
424 /* TGSI_OPCODE_KILL */
428 struct lp_build_tgsi_context
* bld_base
,
429 struct lp_build_emit_data
* emit_data
)
431 emit_data
->dst_type
= LLVMVoidTypeInContext(bld_base
->base
.gallivm
->context
);
434 /* TGSI_OPCODE_LIT */
438 struct lp_build_tgsi_context
* bld_base
,
439 struct lp_build_emit_data
* emit_data
)
442 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_X
);
444 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_Y
);
446 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_W
);
447 emit_data
->arg_count
= 3;
452 const struct lp_build_tgsi_action
* action
,
453 struct lp_build_tgsi_context
* bld_base
,
454 struct lp_build_emit_data
* emit_data
)
456 LLVMValueRef tmp0
, tmp1
, tmp2
;
459 emit_data
->output
[TGSI_CHAN_X
] = bld_base
->base
.one
;
462 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
464 emit_data
->args
[0] /* src0.x */,
465 bld_base
->base
.zero
);
468 /* XMM[1] = SrcReg[0].yyyy */
469 tmp1
= emit_data
->args
[1];
470 /* XMM[1] = max(XMM[1], 0) */
471 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MAX
,
472 tmp1
, bld_base
->base
.zero
);
473 /* XMM[2] = SrcReg[0].wwww */
474 tmp2
= emit_data
->args
[2];
475 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_POW
,
477 tmp0
= emit_data
->args
[0];
478 emit_data
->output
[TGSI_CHAN_Z
] = lp_build_emit_llvm_ternary(bld_base
,
480 tmp0
, bld_base
->base
.zero
, tmp1
);
482 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
485 static struct lp_build_tgsi_action lit_action
= {
486 lit_fetch_args
, /* fetch_args */
490 /* TGSI_OPCODE_LOG */
494 const struct lp_build_tgsi_action
* action
,
495 struct lp_build_tgsi_context
* bld_base
,
496 struct lp_build_emit_data
* emit_data
)
499 LLVMValueRef abs_x
, log_abs_x
, flr_log_abs_x
, ex2_flr_log_abs_x
;
502 abs_x
= lp_build_abs(&bld_base
->base
, emit_data
->args
[0] /* src0.x */);
504 /* log( abs( src0.x ) ) */
505 log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_LG2
,
508 /* floor( log( abs( src0.x ) ) ) */
509 flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
512 emit_data
->output
[TGSI_CHAN_X
] = flr_log_abs_x
;
515 ex2_flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_EX2
,
518 /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */
519 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
520 TGSI_OPCODE_DIV
, abs_x
, ex2_flr_log_abs_x
);
523 emit_data
->output
[TGSI_CHAN_Z
] = log_abs_x
;
526 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
529 static struct lp_build_tgsi_action log_action
= {
530 scalar_unary_fetch_args
, /* fetch_args */
534 /* TGSI_OPCODE_PK2H */
538 struct lp_build_tgsi_context
* bld_base
,
539 struct lp_build_emit_data
* emit_data
)
542 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
545 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
551 const struct lp_build_tgsi_action
*action
,
552 struct lp_build_tgsi_context
*bld_base
,
553 struct lp_build_emit_data
*emit_data
)
555 struct gallivm_state
*gallivm
= bld_base
->base
.gallivm
;
556 struct lp_type f16i_t
;
557 LLVMValueRef lo
, hi
, res
;
559 f16i_t
= lp_type_uint_vec(16, bld_base
->base
.type
.length
* 32);
560 lo
= lp_build_float_to_half(gallivm
, emit_data
->args
[0]);
561 hi
= lp_build_float_to_half(gallivm
, emit_data
->args
[1]);
562 /* maybe some interleave doubling vector width would be useful... */
563 lo
= lp_build_pad_vector(gallivm
, lo
, bld_base
->base
.type
.length
* 2);
564 hi
= lp_build_pad_vector(gallivm
, hi
, bld_base
->base
.type
.length
* 2);
565 res
= lp_build_interleave2(gallivm
, f16i_t
, lo
, hi
, 0);
567 emit_data
->output
[emit_data
->chan
] = res
;
570 static struct lp_build_tgsi_action pk2h_action
= {
571 pk2h_fetch_args
, /* fetch_args */
575 /* TGSI_OPCODE_UP2H */
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 struct gallivm_state
*gallivm
= bld_base
->base
.gallivm
;
584 LLVMBuilderRef builder
= gallivm
->builder
;
585 LLVMContextRef context
= gallivm
->context
;
586 LLVMValueRef lo
, hi
, res
[2], arg
;
587 unsigned nr
= bld_base
->base
.type
.length
;
588 LLVMTypeRef i16t
= LLVMVectorType(LLVMInt16TypeInContext(context
), nr
* 2);
590 arg
= LLVMBuildBitCast(builder
, emit_data
->args
[0], i16t
, "");
591 lo
= lp_build_uninterleave1(gallivm
, nr
* 2, arg
, 0);
592 hi
= lp_build_uninterleave1(gallivm
, nr
* 2, arg
, 1);
593 res
[0] = lp_build_half_to_float(gallivm
, lo
);
594 res
[1] = lp_build_half_to_float(gallivm
, hi
);
596 emit_data
->output
[0] = emit_data
->output
[2] = res
[0];
597 emit_data
->output
[1] = emit_data
->output
[3] = res
[1];
600 static struct lp_build_tgsi_action up2h_action
= {
601 scalar_unary_fetch_args
, /* fetch_args */
605 /* TGSI_OPCODE_LRP */
609 const struct lp_build_tgsi_action
* action
,
610 struct lp_build_tgsi_context
* bld_base
,
611 struct lp_build_emit_data
* emit_data
)
613 struct lp_build_context
*bld
= &bld_base
->base
;
614 LLVMValueRef inv
, a
, b
;
616 /* This uses the correct version: (1 - t)*a + t*b
618 * An alternative version is "a + t*(b-a)". The problem is this version
619 * doesn't return "b" for t = 1, because "a + (b-a)" isn't equal to "b"
620 * because of the floating-point rounding.
622 inv
= lp_build_sub(bld
, bld_base
->base
.one
, emit_data
->args
[0]);
623 a
= lp_build_mul(bld
, emit_data
->args
[1], emit_data
->args
[0]);
624 b
= lp_build_mul(bld
, emit_data
->args
[2], inv
);
625 emit_data
->output
[emit_data
->chan
] = lp_build_add(bld
, a
, b
);
628 /* TGSI_OPCODE_MAD */
632 const struct lp_build_tgsi_action
* action
,
633 struct lp_build_tgsi_context
* bld_base
,
634 struct lp_build_emit_data
* emit_data
)
637 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
640 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
641 TGSI_OPCODE_ADD
, tmp
, emit_data
->args
[2]);
644 /* TGSI_OPCODE_MOV */
648 const struct lp_build_tgsi_action
* action
,
649 struct lp_build_tgsi_context
* bld_base
,
650 struct lp_build_emit_data
* emit_data
)
652 emit_data
->output
[emit_data
->chan
] = emit_data
->args
[0];
655 /* TGSI_OPCODE_MUL */
658 const struct lp_build_tgsi_action
* action
,
659 struct lp_build_tgsi_context
* bld_base
,
660 struct lp_build_emit_data
* emit_data
)
662 emit_data
->output
[emit_data
->chan
] = LLVMBuildFMul(
663 bld_base
->base
.gallivm
->builder
,
664 emit_data
->args
[0], emit_data
->args
[1], "");
667 /*.TGSI_OPCODE_DIV.*/
668 static void fdiv_emit(
669 const struct lp_build_tgsi_action
* action
,
670 struct lp_build_tgsi_context
* bld_base
,
671 struct lp_build_emit_data
* emit_data
)
673 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
674 bld_base
->base
.gallivm
->builder
,
675 emit_data
->args
[0], emit_data
->args
[1], "");
678 /*.TGSI_OPCODE_RCP.*/
679 static void rcp_emit(
680 const struct lp_build_tgsi_action
* action
,
681 struct lp_build_tgsi_context
* bld_base
,
682 struct lp_build_emit_data
* emit_data
)
685 one
= lp_build_const_float(bld_base
->base
.gallivm
, 1.0f
);
686 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
687 TGSI_OPCODE_DIV
, one
, emit_data
->args
[0]);
690 /* TGSI_OPCODE_POW */
694 const struct lp_build_tgsi_action
* action
,
695 struct lp_build_tgsi_context
* bld_base
,
696 struct lp_build_emit_data
* emit_data
)
698 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
699 emit_data
->args
[0], emit_data
->args
[1]);
702 static struct lp_build_tgsi_action pow_action
= {
703 scalar_binary_fetch_args
, /* fetch_args */
707 /* TGSI_OPCODE_RSQ */
711 const struct lp_build_tgsi_action
* action
,
712 struct lp_build_tgsi_context
* bld_base
,
713 struct lp_build_emit_data
* emit_data
)
715 if (bld_base
->rsq_action
.emit
) {
716 bld_base
->rsq_action
.emit(&bld_base
->rsq_action
, bld_base
, emit_data
);
718 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
722 const struct lp_build_tgsi_action rsq_action
= {
723 scalar_unary_fetch_args
, /* fetch_args */
728 /* TGSI_OPCODE_SQRT */
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 if (bld_base
->sqrt_action
.emit
) {
737 bld_base
->sqrt_action
.emit(&bld_base
->sqrt_action
, bld_base
, emit_data
);
739 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
743 const struct lp_build_tgsi_action sqrt_action
= {
744 scalar_unary_fetch_args
, /* fetch_args */
748 /* TGSI_OPCODE_SCS */
751 const struct lp_build_tgsi_action
* action
,
752 struct lp_build_tgsi_context
* bld_base
,
753 struct lp_build_emit_data
* emit_data
)
756 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
757 TGSI_OPCODE_COS
, emit_data
->args
[0]);
759 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_unary(bld_base
,
760 TGSI_OPCODE_SIN
, emit_data
->args
[0]);
762 emit_data
->output
[TGSI_CHAN_Z
] = bld_base
->base
.zero
;
765 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
768 const struct lp_build_tgsi_action scs_action
= {
769 scalar_unary_fetch_args
, /* fetch_args */
773 /* TGSI_OPCODE_SUB */
776 const struct lp_build_tgsi_action
* action
,
777 struct lp_build_tgsi_context
* bld_base
,
778 struct lp_build_emit_data
* emit_data
)
780 emit_data
->output
[emit_data
->chan
] =
781 LLVMBuildFSub(bld_base
->base
.gallivm
->builder
,
783 emit_data
->args
[1], "");
786 /* TGSI_OPCODE_F2U */
789 const struct lp_build_tgsi_action
* action
,
790 struct lp_build_tgsi_context
* bld_base
,
791 struct lp_build_emit_data
* emit_data
)
793 emit_data
->output
[emit_data
->chan
] =
794 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
796 bld_base
->base
.int_vec_type
, "");
799 /* TGSI_OPCODE_U2F */
802 const struct lp_build_tgsi_action
* action
,
803 struct lp_build_tgsi_context
* bld_base
,
804 struct lp_build_emit_data
* emit_data
)
806 emit_data
->output
[emit_data
->chan
] =
807 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
809 bld_base
->base
.vec_type
, "");
814 const struct lp_build_tgsi_action
* action
,
815 struct lp_build_tgsi_context
* bld_base
,
816 struct lp_build_emit_data
* emit_data
)
819 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_UMUL
,
822 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
823 TGSI_OPCODE_UADD
, tmp
, emit_data
->args
[2]);
826 /* TGSI_OPCODE_UMUL */
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 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint_bld
,
834 emit_data
->args
[0], emit_data
->args
[1]);
837 /* TGSI_OPCODE_IMUL_HI */
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 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
845 LLVMValueRef hi_bits
;
847 assert(int_bld
->type
.width
== 32);
849 /* low result bits are tossed away */
850 lp_build_mul_32_lohi(int_bld
, emit_data
->args
[0],
851 emit_data
->args
[1], &hi_bits
);
852 emit_data
->output
[emit_data
->chan
] = hi_bits
;
857 const struct lp_build_tgsi_action
* action
,
858 struct lp_build_tgsi_context
* bld_base
,
859 struct lp_build_emit_data
* emit_data
)
861 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
862 LLVMValueRef hi_bits
;
864 assert(int_bld
->type
.width
== 32);
866 /* low result bits are tossed away */
867 lp_build_mul_32_lohi_cpu(int_bld
, emit_data
->args
[0],
868 emit_data
->args
[1], &hi_bits
);
869 emit_data
->output
[emit_data
->chan
] = hi_bits
;
872 /* TGSI_OPCODE_UMUL_HI */
875 const struct lp_build_tgsi_action
* action
,
876 struct lp_build_tgsi_context
* bld_base
,
877 struct lp_build_emit_data
* emit_data
)
879 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
880 LLVMValueRef hi_bits
;
882 assert(uint_bld
->type
.width
== 32);
884 /* low result bits are tossed away */
885 lp_build_mul_32_lohi(uint_bld
, emit_data
->args
[0],
886 emit_data
->args
[1], &hi_bits
);
887 emit_data
->output
[emit_data
->chan
] = hi_bits
;
892 const struct lp_build_tgsi_action
* action
,
893 struct lp_build_tgsi_context
* bld_base
,
894 struct lp_build_emit_data
* emit_data
)
896 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
897 LLVMValueRef hi_bits
;
899 assert(uint_bld
->type
.width
== 32);
901 /* low result bits are tossed away */
902 lp_build_mul_32_lohi_cpu(uint_bld
, emit_data
->args
[0],
903 emit_data
->args
[1], &hi_bits
);
904 emit_data
->output
[emit_data
->chan
] = hi_bits
;
907 /* TGSI_OPCODE_MAX */
908 static void fmax_emit(
909 const struct lp_build_tgsi_action
* action
,
910 struct lp_build_tgsi_context
* bld_base
,
911 struct lp_build_emit_data
* emit_data
)
913 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
914 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
915 LLVMBuildFCmp(builder
, LLVMRealUGE
,
916 emit_data
->args
[0], emit_data
->args
[1], ""),
917 emit_data
->args
[0], emit_data
->args
[1], "");
920 /* TGSI_OPCODE_MIN */
921 static void fmin_emit(
922 const struct lp_build_tgsi_action
* action
,
923 struct lp_build_tgsi_context
* bld_base
,
924 struct lp_build_emit_data
* emit_data
)
926 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
927 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
928 LLVMBuildFCmp(builder
, LLVMRealUGE
,
929 emit_data
->args
[0], emit_data
->args
[1], ""),
930 emit_data
->args
[1], emit_data
->args
[0], "");
933 /* TGSI_OPCODE_XPD */
937 struct lp_build_tgsi_context
* bld_base
,
938 struct lp_build_emit_data
* emit_data
)
940 dp_fetch_args(bld_base
, emit_data
, 3);
948 struct lp_build_tgsi_context
* bld_base
,
954 LLVMValueRef tmp0
, tmp1
;
956 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, a
, b
);
957 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, c
, d
);
959 return lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_SUB
, tmp0
, tmp1
);
964 const struct lp_build_tgsi_action
* action
,
965 struct lp_build_tgsi_context
* bld_base
,
966 struct lp_build_emit_data
* emit_data
)
968 emit_data
->output
[TGSI_CHAN_X
] = xpd_helper(bld_base
,
969 emit_data
->args
[1] /* src0.y */, emit_data
->args
[5] /* src1.z */,
970 emit_data
->args
[4] /* src1.y */, emit_data
->args
[2] /* src0.z */);
972 emit_data
->output
[TGSI_CHAN_Y
] = xpd_helper(bld_base
,
973 emit_data
->args
[2] /* src0.z */, emit_data
->args
[3] /* src1.x */,
974 emit_data
->args
[5] /* src1.z */, emit_data
->args
[0] /* src0.x */);
976 emit_data
->output
[TGSI_CHAN_Z
] = xpd_helper(bld_base
,
977 emit_data
->args
[0] /* src0.x */, emit_data
->args
[4] /* src1.y */,
978 emit_data
->args
[3] /* src1.x */, emit_data
->args
[1] /* src0.y */);
980 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
983 const struct lp_build_tgsi_action xpd_action
= {
984 xpd_fetch_args
, /* fetch_args */
988 /* TGSI_OPCODE_D2F */
991 const struct lp_build_tgsi_action
* action
,
992 struct lp_build_tgsi_context
* bld_base
,
993 struct lp_build_emit_data
* emit_data
)
995 emit_data
->output
[emit_data
->chan
] =
996 LLVMBuildFPTrunc(bld_base
->base
.gallivm
->builder
,
998 bld_base
->base
.vec_type
, "");
1001 /* TGSI_OPCODE_D2I */
1004 const struct lp_build_tgsi_action
* action
,
1005 struct lp_build_tgsi_context
* bld_base
,
1006 struct lp_build_emit_data
* emit_data
)
1008 emit_data
->output
[emit_data
->chan
] =
1009 LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
,
1011 bld_base
->base
.int_vec_type
, "");
1014 /* TGSI_OPCODE_D2U */
1017 const struct lp_build_tgsi_action
* action
,
1018 struct lp_build_tgsi_context
* bld_base
,
1019 struct lp_build_emit_data
* emit_data
)
1021 emit_data
->output
[emit_data
->chan
] =
1022 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
1024 bld_base
->base
.int_vec_type
, "");
1027 /* TGSI_OPCODE_F2D */
1030 const struct lp_build_tgsi_action
* action
,
1031 struct lp_build_tgsi_context
* bld_base
,
1032 struct lp_build_emit_data
* emit_data
)
1034 emit_data
->output
[emit_data
->chan
] =
1035 LLVMBuildFPExt(bld_base
->base
.gallivm
->builder
,
1037 bld_base
->dbl_bld
.vec_type
, "");
1040 /* TGSI_OPCODE_U2D */
1043 const struct lp_build_tgsi_action
* action
,
1044 struct lp_build_tgsi_context
* bld_base
,
1045 struct lp_build_emit_data
* emit_data
)
1047 emit_data
->output
[emit_data
->chan
] =
1048 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1050 bld_base
->dbl_bld
.vec_type
, "");
1053 /* TGSI_OPCODE_I2D */
1056 const struct lp_build_tgsi_action
* action
,
1057 struct lp_build_tgsi_context
* bld_base
,
1058 struct lp_build_emit_data
* emit_data
)
1060 emit_data
->output
[emit_data
->chan
] =
1061 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1063 bld_base
->dbl_bld
.vec_type
, "");
1066 /* TGSI_OPCODE_DMAD */
1069 const struct lp_build_tgsi_action
* action
,
1070 struct lp_build_tgsi_context
* bld_base
,
1071 struct lp_build_emit_data
* emit_data
)
1074 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_DMUL
,
1076 emit_data
->args
[1]);
1077 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
1078 TGSI_OPCODE_DADD
, tmp
, emit_data
->args
[2]);
1081 /*.TGSI_OPCODE_DRCP.*/
1082 static void drcp_emit(
1083 const struct lp_build_tgsi_action
* action
,
1084 struct lp_build_tgsi_context
* bld_base
,
1085 struct lp_build_emit_data
* emit_data
)
1088 one
= lp_build_const_vec(bld_base
->dbl_bld
.gallivm
, bld_base
->dbl_bld
.type
, 1.0f
);
1089 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
1090 bld_base
->base
.gallivm
->builder
,
1091 one
, emit_data
->args
[0], "");
1094 /* TGSI_OPCODE_DFRAC */
1095 static void dfrac_emit(
1096 const struct lp_build_tgsi_action
* action
,
1097 struct lp_build_tgsi_context
* bld_base
,
1098 struct lp_build_emit_data
* emit_data
)
1101 tmp
= lp_build_floor(&bld_base
->dbl_bld
,
1102 emit_data
->args
[0]);
1103 emit_data
->output
[emit_data
->chan
] = LLVMBuildFSub(bld_base
->base
.gallivm
->builder
,
1104 emit_data
->args
[0], tmp
, "");
1109 const struct lp_build_tgsi_action
* action
,
1110 struct lp_build_tgsi_context
* bld_base
,
1111 struct lp_build_emit_data
* emit_data
)
1113 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint64_bld
,
1114 emit_data
->args
[0], emit_data
->args
[1]);
1119 const struct lp_build_tgsi_action
* action
,
1120 struct lp_build_tgsi_context
* bld_base
,
1121 struct lp_build_emit_data
* emit_data
)
1123 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1124 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
1125 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1126 bld_base
->uint64_bld
.zero
);
1127 /* We want to make sure that we never divide/mod by zero to not
1128 * generate sigfpe. We don't want to crash just because the
1129 * shader is doing something weird. */
1130 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1132 emit_data
->args
[1], "");
1133 LLVMValueRef result
= lp_build_mod(&bld_base
->uint64_bld
,
1134 emit_data
->args
[0], divisor
);
1135 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1136 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1143 const struct lp_build_tgsi_action
* action
,
1144 struct lp_build_tgsi_context
* bld_base
,
1145 struct lp_build_emit_data
* emit_data
)
1147 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1148 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
1149 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1150 bld_base
->uint64_bld
.zero
);
1151 /* We want to make sure that we never divide/mod by zero to not
1152 * generate sigfpe. We don't want to crash just because the
1153 * shader is doing something weird. */
1154 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1156 emit_data
->args
[1], "");
1157 LLVMValueRef result
= lp_build_mod(&bld_base
->int64_bld
,
1158 emit_data
->args
[0], divisor
);
1159 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1160 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1167 const struct lp_build_tgsi_action
* action
,
1168 struct lp_build_tgsi_context
* bld_base
,
1169 struct lp_build_emit_data
* emit_data
)
1172 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1173 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
1174 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1175 bld_base
->uint64_bld
.zero
);
1176 /* We want to make sure that we never divide/mod by zero to not
1177 * generate sigfpe. We don't want to crash just because the
1178 * shader is doing something weird. */
1179 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1181 emit_data
->args
[1], "");
1182 LLVMValueRef result
= LLVMBuildUDiv(builder
,
1183 emit_data
->args
[0], divisor
, "");
1184 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1185 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1192 const struct lp_build_tgsi_action
* action
,
1193 struct lp_build_tgsi_context
* bld_base
,
1194 struct lp_build_emit_data
* emit_data
)
1197 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1198 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->int64_bld
,
1199 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1200 bld_base
->int64_bld
.zero
);
1201 /* We want to make sure that we never divide/mod by zero to not
1202 * generate sigfpe. We don't want to crash just because the
1203 * shader is doing something weird. */
1204 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1206 emit_data
->args
[1], "");
1207 LLVMValueRef result
= LLVMBuildSDiv(builder
,
1208 emit_data
->args
[0], divisor
, "");
1209 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1210 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1217 const struct lp_build_tgsi_action
* action
,
1218 struct lp_build_tgsi_context
* bld_base
,
1219 struct lp_build_emit_data
* emit_data
)
1221 emit_data
->output
[emit_data
->chan
] =
1222 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
1224 bld_base
->uint64_bld
.vec_type
, "");
1229 const struct lp_build_tgsi_action
* action
,
1230 struct lp_build_tgsi_context
* bld_base
,
1231 struct lp_build_emit_data
* emit_data
)
1233 emit_data
->output
[emit_data
->chan
] =
1234 LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
,
1236 bld_base
->int64_bld
.vec_type
, "");
1241 const struct lp_build_tgsi_action
* action
,
1242 struct lp_build_tgsi_context
* bld_base
,
1243 struct lp_build_emit_data
* emit_data
)
1245 emit_data
->output
[emit_data
->chan
] =
1246 LLVMBuildZExt(bld_base
->base
.gallivm
->builder
,
1248 bld_base
->uint64_bld
.vec_type
, "");
1253 const struct lp_build_tgsi_action
* action
,
1254 struct lp_build_tgsi_context
* bld_base
,
1255 struct lp_build_emit_data
* emit_data
)
1257 emit_data
->output
[emit_data
->chan
] =
1258 LLVMBuildSExt(bld_base
->base
.gallivm
->builder
,
1260 bld_base
->int64_bld
.vec_type
, "");
1265 const struct lp_build_tgsi_action
* action
,
1266 struct lp_build_tgsi_context
* bld_base
,
1267 struct lp_build_emit_data
* emit_data
)
1269 emit_data
->output
[emit_data
->chan
] =
1270 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1272 bld_base
->base
.vec_type
, "");
1277 const struct lp_build_tgsi_action
* action
,
1278 struct lp_build_tgsi_context
* bld_base
,
1279 struct lp_build_emit_data
* emit_data
)
1281 emit_data
->output
[emit_data
->chan
] =
1282 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1284 bld_base
->base
.vec_type
, "");
1289 const struct lp_build_tgsi_action
* action
,
1290 struct lp_build_tgsi_context
* bld_base
,
1291 struct lp_build_emit_data
* emit_data
)
1293 emit_data
->output
[emit_data
->chan
] =
1294 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1296 bld_base
->dbl_bld
.vec_type
, "");
1301 const struct lp_build_tgsi_action
* action
,
1302 struct lp_build_tgsi_context
* bld_base
,
1303 struct lp_build_emit_data
* emit_data
)
1305 emit_data
->output
[emit_data
->chan
] =
1306 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1308 bld_base
->dbl_bld
.vec_type
, "");
1312 lp_set_default_actions(struct lp_build_tgsi_context
* bld_base
)
1314 bld_base
->op_actions
[TGSI_OPCODE_DP2
] = dp2_action
;
1315 bld_base
->op_actions
[TGSI_OPCODE_DP3
] = dp3_action
;
1316 bld_base
->op_actions
[TGSI_OPCODE_DP4
] = dp4_action
;
1317 bld_base
->op_actions
[TGSI_OPCODE_DP2A
] = dp2a_action
;
1318 bld_base
->op_actions
[TGSI_OPCODE_DPH
] = dph_action
;
1319 bld_base
->op_actions
[TGSI_OPCODE_DST
] = dst_action
;
1320 bld_base
->op_actions
[TGSI_OPCODE_EXP
] = exp_action
;
1321 bld_base
->op_actions
[TGSI_OPCODE_LIT
] = lit_action
;
1322 bld_base
->op_actions
[TGSI_OPCODE_LOG
] = log_action
;
1323 bld_base
->op_actions
[TGSI_OPCODE_PK2H
] = pk2h_action
;
1324 bld_base
->op_actions
[TGSI_OPCODE_RSQ
] = rsq_action
;
1325 bld_base
->op_actions
[TGSI_OPCODE_SQRT
] = sqrt_action
;
1326 bld_base
->op_actions
[TGSI_OPCODE_POW
] = pow_action
;
1327 bld_base
->op_actions
[TGSI_OPCODE_SCS
] = scs_action
;
1328 bld_base
->op_actions
[TGSI_OPCODE_UP2H
] = up2h_action
;
1329 bld_base
->op_actions
[TGSI_OPCODE_XPD
] = xpd_action
;
1331 bld_base
->op_actions
[TGSI_OPCODE_BREAKC
].fetch_args
= scalar_unary_fetch_args
;
1332 bld_base
->op_actions
[TGSI_OPCODE_SWITCH
].fetch_args
= scalar_unary_fetch_args
;
1333 bld_base
->op_actions
[TGSI_OPCODE_CASE
].fetch_args
= scalar_unary_fetch_args
;
1334 bld_base
->op_actions
[TGSI_OPCODE_COS
].fetch_args
= scalar_unary_fetch_args
;
1335 bld_base
->op_actions
[TGSI_OPCODE_EX2
].fetch_args
= scalar_unary_fetch_args
;
1336 bld_base
->op_actions
[TGSI_OPCODE_IF
].fetch_args
= scalar_unary_fetch_args
;
1337 bld_base
->op_actions
[TGSI_OPCODE_UIF
].fetch_args
= scalar_unary_fetch_args
;
1338 bld_base
->op_actions
[TGSI_OPCODE_KILL_IF
].fetch_args
= kil_fetch_args
;
1339 bld_base
->op_actions
[TGSI_OPCODE_KILL
].fetch_args
= kilp_fetch_args
;
1340 bld_base
->op_actions
[TGSI_OPCODE_RCP
].fetch_args
= scalar_unary_fetch_args
;
1341 bld_base
->op_actions
[TGSI_OPCODE_SIN
].fetch_args
= scalar_unary_fetch_args
;
1342 bld_base
->op_actions
[TGSI_OPCODE_LG2
].fetch_args
= scalar_unary_fetch_args
;
1344 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit
;
1345 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit
;
1346 bld_base
->op_actions
[TGSI_OPCODE_CLAMP
].emit
= clamp_emit
;
1347 bld_base
->op_actions
[TGSI_OPCODE_END
].emit
= end_emit
;
1348 bld_base
->op_actions
[TGSI_OPCODE_FRC
].emit
= frc_emit
;
1349 bld_base
->op_actions
[TGSI_OPCODE_LRP
].emit
= lrp_emit
;
1350 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit
;
1351 bld_base
->op_actions
[TGSI_OPCODE_MOV
].emit
= mov_emit
;
1352 bld_base
->op_actions
[TGSI_OPCODE_MUL
].emit
= mul_emit
;
1353 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= fdiv_emit
;
1354 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit
;
1355 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit
;
1357 bld_base
->op_actions
[TGSI_OPCODE_UARL
].emit
= mov_emit
;
1358 bld_base
->op_actions
[TGSI_OPCODE_F2U
].emit
= f2u_emit
;
1359 bld_base
->op_actions
[TGSI_OPCODE_U2F
].emit
= u2f_emit
;
1360 bld_base
->op_actions
[TGSI_OPCODE_UMAD
].emit
= umad_emit
;
1361 bld_base
->op_actions
[TGSI_OPCODE_UMUL
].emit
= umul_emit
;
1362 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit
;
1363 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit
;
1365 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= fmax_emit
;
1366 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= fmin_emit
;
1368 bld_base
->op_actions
[TGSI_OPCODE_DADD
].emit
= add_emit
;
1369 bld_base
->op_actions
[TGSI_OPCODE_DMAX
].emit
= fmax_emit
;
1370 bld_base
->op_actions
[TGSI_OPCODE_DMIN
].emit
= fmin_emit
;
1371 bld_base
->op_actions
[TGSI_OPCODE_DMUL
].emit
= mul_emit
;
1373 bld_base
->op_actions
[TGSI_OPCODE_D2F
].emit
= d2f_emit
;
1374 bld_base
->op_actions
[TGSI_OPCODE_D2I
].emit
= d2i_emit
;
1375 bld_base
->op_actions
[TGSI_OPCODE_D2U
].emit
= d2u_emit
;
1377 bld_base
->op_actions
[TGSI_OPCODE_F2D
].emit
= f2d_emit
;
1378 bld_base
->op_actions
[TGSI_OPCODE_I2D
].emit
= i2d_emit
;
1379 bld_base
->op_actions
[TGSI_OPCODE_U2D
].emit
= u2d_emit
;
1381 bld_base
->op_actions
[TGSI_OPCODE_DMAD
].emit
= dmad_emit
;
1383 bld_base
->op_actions
[TGSI_OPCODE_DRCP
].emit
= drcp_emit
;
1384 bld_base
->op_actions
[TGSI_OPCODE_DFRAC
].emit
= dfrac_emit
;
1386 bld_base
->op_actions
[TGSI_OPCODE_U64MUL
].emit
= u64mul_emit
;
1388 bld_base
->op_actions
[TGSI_OPCODE_F2I64
].emit
= f2i64_emit
;
1389 bld_base
->op_actions
[TGSI_OPCODE_F2U64
].emit
= f2u64_emit
;
1391 bld_base
->op_actions
[TGSI_OPCODE_D2I64
].emit
= f2i64_emit
;
1392 bld_base
->op_actions
[TGSI_OPCODE_D2U64
].emit
= f2u64_emit
;
1394 bld_base
->op_actions
[TGSI_OPCODE_I2I64
].emit
= i2i64_emit
;
1395 bld_base
->op_actions
[TGSI_OPCODE_U2I64
].emit
= u2i64_emit
;
1397 bld_base
->op_actions
[TGSI_OPCODE_I642F
].emit
= i642f_emit
;
1398 bld_base
->op_actions
[TGSI_OPCODE_U642F
].emit
= u642f_emit
;
1400 bld_base
->op_actions
[TGSI_OPCODE_I642F
].emit
= i642f_emit
;
1401 bld_base
->op_actions
[TGSI_OPCODE_U642F
].emit
= u642f_emit
;
1403 bld_base
->op_actions
[TGSI_OPCODE_I642D
].emit
= i642d_emit
;
1404 bld_base
->op_actions
[TGSI_OPCODE_U642D
].emit
= u642d_emit
;
1408 /* CPU Only default actions */
1410 /* These actions are CPU only, because they could potentially output SSE
1414 /* TGSI_OPCODE_ADD (CPU Only) */
1417 const struct lp_build_tgsi_action
* action
,
1418 struct lp_build_tgsi_context
* bld_base
,
1419 struct lp_build_emit_data
* emit_data
)
1421 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->base
,
1422 emit_data
->args
[0], emit_data
->args
[1]);
1425 /* TGSI_OPCODE_AND (CPU Only) */
1428 const struct lp_build_tgsi_action
* action
,
1429 struct lp_build_tgsi_context
* bld_base
,
1430 struct lp_build_emit_data
* emit_data
)
1432 emit_data
->output
[emit_data
->chan
] = lp_build_and(&bld_base
->uint_bld
,
1433 emit_data
->args
[0], emit_data
->args
[1]);
1436 /* TGSI_OPCODE_ARL (CPU Only) */
1439 const struct lp_build_tgsi_action
* action
,
1440 struct lp_build_tgsi_context
* bld_base
,
1441 struct lp_build_emit_data
* emit_data
)
1444 tmp
= lp_build_floor(&bld_base
->base
,
1445 emit_data
->args
[0]);
1446 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
1447 bld_base
->uint_bld
.vec_type
, "");
1450 /* TGSI_OPCODE_ARR (CPU Only) */
1453 const struct lp_build_tgsi_action
* action
,
1454 struct lp_build_tgsi_context
* bld_base
,
1455 struct lp_build_emit_data
* emit_data
)
1457 emit_data
->output
[emit_data
->chan
] = lp_build_iround(&bld_base
->base
, emit_data
->args
[0]);
1460 /* TGSI_OPCODE_CEIL (CPU Only) */
1463 const struct lp_build_tgsi_action
* action
,
1464 struct lp_build_tgsi_context
* bld_base
,
1465 struct lp_build_emit_data
* emit_data
)
1467 emit_data
->output
[emit_data
->chan
] = lp_build_ceil(&bld_base
->base
,
1468 emit_data
->args
[0]);
1471 /* TGSI_OPCODE_CMP (CPU Only) */
1474 const struct lp_build_tgsi_action
* action
,
1475 struct lp_build_tgsi_context
* bld_base
,
1476 struct lp_build_emit_data
* emit_data
)
1478 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_LESS
,
1479 emit_data
->args
[0], bld_base
->base
.zero
);
1480 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1481 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1484 /* TGSI_OPCODE_UCMP (CPU Only) */
1487 const struct lp_build_tgsi_action
* action
,
1488 struct lp_build_tgsi_context
* bld_base
,
1489 struct lp_build_emit_data
* emit_data
)
1491 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1492 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1493 LLVMValueRef unsigned_cond
=
1494 LLVMBuildBitCast(builder
, emit_data
->args
[0], uint_bld
->vec_type
, "");
1495 LLVMValueRef cond
= lp_build_cmp(uint_bld
, PIPE_FUNC_NOTEQUAL
,
1498 emit_data
->output
[emit_data
->chan
] =
1499 lp_build_select(&bld_base
->base
,
1500 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1503 /* TGSI_OPCODE_COS (CPU Only) */
1506 const struct lp_build_tgsi_action
* action
,
1507 struct lp_build_tgsi_context
* bld_base
,
1508 struct lp_build_emit_data
* emit_data
)
1510 emit_data
->output
[emit_data
->chan
] = lp_build_cos(&bld_base
->base
,
1511 emit_data
->args
[0]);
1514 /* TGSI_OPCODE_DIV (CPU Only) */
1517 const struct lp_build_tgsi_action
* action
,
1518 struct lp_build_tgsi_context
* bld_base
,
1519 struct lp_build_emit_data
* emit_data
)
1521 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->base
,
1522 emit_data
->args
[0], emit_data
->args
[1]);
1525 /* TGSI_OPCODE_EX2 (CPU Only) */
1528 const struct lp_build_tgsi_action
* action
,
1529 struct lp_build_tgsi_context
* bld_base
,
1530 struct lp_build_emit_data
* emit_data
)
1532 emit_data
->output
[emit_data
->chan
] = lp_build_exp2(&bld_base
->base
,
1533 emit_data
->args
[0]);
1536 /* TGSI_OPCODE_F2I (CPU Only) */
1539 const struct lp_build_tgsi_action
* action
,
1540 struct lp_build_tgsi_context
* bld_base
,
1541 struct lp_build_emit_data
* emit_data
)
1543 emit_data
->output
[emit_data
->chan
] = lp_build_itrunc(&bld_base
->base
,
1544 emit_data
->args
[0]);
1547 /* TGSI_OPCODE_FSET Helper (CPU Only) */
1550 const struct lp_build_tgsi_action
* action
,
1551 struct lp_build_tgsi_context
* bld_base
,
1552 struct lp_build_emit_data
* emit_data
,
1557 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1558 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1559 emit_data
->args
[0], emit_data
->args
[1]);
1562 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1563 emit_data
->args
[0], emit_data
->args
[1]);
1566 emit_data
->output
[emit_data
->chan
] = cond
;
1570 /* TGSI_OPCODE_FSEQ (CPU Only) */
1573 const struct lp_build_tgsi_action
* action
,
1574 struct lp_build_tgsi_context
* bld_base
,
1575 struct lp_build_emit_data
* emit_data
)
1577 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1580 /* TGSI_OPCODE_ISGE (CPU Only) */
1583 const struct lp_build_tgsi_action
* action
,
1584 struct lp_build_tgsi_context
* bld_base
,
1585 struct lp_build_emit_data
* emit_data
)
1587 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1590 /* TGSI_OPCODE_ISLT (CPU Only) */
1593 const struct lp_build_tgsi_action
* action
,
1594 struct lp_build_tgsi_context
* bld_base
,
1595 struct lp_build_emit_data
* emit_data
)
1597 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1600 /* TGSI_OPCODE_USNE (CPU Only) */
1604 const struct lp_build_tgsi_action
* action
,
1605 struct lp_build_tgsi_context
* bld_base
,
1606 struct lp_build_emit_data
* emit_data
)
1608 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1611 /* TGSI_OPCODE_FLR (CPU Only) */
1615 const struct lp_build_tgsi_action
* action
,
1616 struct lp_build_tgsi_context
* bld_base
,
1617 struct lp_build_emit_data
* emit_data
)
1619 emit_data
->output
[emit_data
->chan
] = lp_build_floor(&bld_base
->base
,
1620 emit_data
->args
[0]);
1623 /* TGSI_OPCODE_I2F (CPU Only) */
1626 const struct lp_build_tgsi_action
* action
,
1627 struct lp_build_tgsi_context
* bld_base
,
1628 struct lp_build_emit_data
* emit_data
)
1630 emit_data
->output
[emit_data
->chan
] = lp_build_int_to_float(&bld_base
->base
,
1631 emit_data
->args
[0]);
1634 /* TGSI_OPCODE_IABS (CPU Only) */
1637 const struct lp_build_tgsi_action
* action
,
1638 struct lp_build_tgsi_context
* bld_base
,
1639 struct lp_build_emit_data
* emit_data
)
1641 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int_bld
,
1642 emit_data
->args
[0]);
1645 /* TGSI_OPCODE_IDIV (CPU Only) */
1648 const struct lp_build_tgsi_action
* action
,
1649 struct lp_build_tgsi_context
* bld_base
,
1650 struct lp_build_emit_data
* emit_data
)
1652 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1653 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1654 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1655 bld_base
->uint_bld
.zero
);
1656 /* We want to make sure that we never divide/mod by zero to not
1657 * generate sigfpe. We don't want to crash just because the
1658 * shader is doing something weird. */
1659 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1661 emit_data
->args
[1], "");
1662 LLVMValueRef result
= lp_build_div(&bld_base
->int_bld
,
1663 emit_data
->args
[0], divisor
);
1664 LLVMValueRef not_div_mask
= LLVMBuildNot(builder
,
1666 /* idiv by zero doesn't have a guaranteed return value chose 0 for now. */
1667 emit_data
->output
[emit_data
->chan
] = LLVMBuildAnd(builder
,
1672 /* TGSI_OPCODE_INEG (CPU Only) */
1675 const struct lp_build_tgsi_action
* action
,
1676 struct lp_build_tgsi_context
* bld_base
,
1677 struct lp_build_emit_data
* emit_data
)
1679 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int_bld
,
1680 bld_base
->int_bld
.zero
,
1681 emit_data
->args
[0]);
1684 /* TGSI_OPCODE_ISET Helper (CPU Only) */
1687 const struct lp_build_tgsi_action
* action
,
1688 struct lp_build_tgsi_context
* bld_base
,
1689 struct lp_build_emit_data
* emit_data
,
1692 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int_bld
, pipe_func
,
1693 emit_data
->args
[0], emit_data
->args
[1]);
1694 emit_data
->output
[emit_data
->chan
] = cond
;
1697 /* TGSI_OPCODE_IMAX (CPU Only) */
1700 const struct lp_build_tgsi_action
* action
,
1701 struct lp_build_tgsi_context
* bld_base
,
1702 struct lp_build_emit_data
* emit_data
)
1704 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int_bld
,
1705 emit_data
->args
[0], emit_data
->args
[1]);
1708 /* TGSI_OPCODE_IMIN (CPU Only) */
1711 const struct lp_build_tgsi_action
* action
,
1712 struct lp_build_tgsi_context
* bld_base
,
1713 struct lp_build_emit_data
* emit_data
)
1715 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int_bld
,
1716 emit_data
->args
[0], emit_data
->args
[1]);
1719 /* TGSI_OPCODE_ISGE (CPU Only) */
1722 const struct lp_build_tgsi_action
* action
,
1723 struct lp_build_tgsi_context
* bld_base
,
1724 struct lp_build_emit_data
* emit_data
)
1726 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1729 /* TGSI_OPCODE_ISHR (CPU Only) */
1732 const struct lp_build_tgsi_action
* action
,
1733 struct lp_build_tgsi_context
* bld_base
,
1734 struct lp_build_emit_data
* emit_data
)
1736 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
1737 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
1738 int_bld
->type
.width
- 1);
1739 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
1740 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
1744 /* TGSI_OPCODE_ISLT (CPU Only) */
1747 const struct lp_build_tgsi_action
* action
,
1748 struct lp_build_tgsi_context
* bld_base
,
1749 struct lp_build_emit_data
* emit_data
)
1751 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1755 /* TGSI_OPCODE_ISSG (CPU Only) */
1758 const struct lp_build_tgsi_action
* action
,
1759 struct lp_build_tgsi_context
* bld_base
,
1760 struct lp_build_emit_data
* emit_data
)
1762 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int_bld
,
1763 emit_data
->args
[0]);
1766 /* TGSI_OPCODE_LG2 (CPU Only) */
1769 const struct lp_build_tgsi_action
* action
,
1770 struct lp_build_tgsi_context
* bld_base
,
1771 struct lp_build_emit_data
* emit_data
)
1773 emit_data
->output
[emit_data
->chan
] = lp_build_log2_safe(&bld_base
->base
,
1774 emit_data
->args
[0]);
1777 /* TGSI_OPCODE_LOG (CPU Only) */
1780 const struct lp_build_tgsi_action
* action
,
1781 struct lp_build_tgsi_context
* bld_base
,
1782 struct lp_build_emit_data
* emit_data
)
1784 LLVMValueRef p_floor_log2
;
1786 LLVMValueRef p_log2
;
1787 LLVMValueRef src0
= emit_data
->args
[0];
1789 lp_build_log2_approx(&bld_base
->base
, src0
,
1790 &p_exp
, &p_floor_log2
, &p_log2
, FALSE
);
1792 emit_data
->output
[TGSI_CHAN_X
] = p_floor_log2
;
1794 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
1797 emit_data
->output
[TGSI_CHAN_Z
] = p_log2
;
1799 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
1803 /* TGSI_OPCODE_MAD (CPU Only) */
1807 const struct lp_build_tgsi_action
* action
,
1808 struct lp_build_tgsi_context
* bld_base
,
1809 struct lp_build_emit_data
* emit_data
)
1811 emit_data
->output
[emit_data
->chan
] =
1812 lp_build_mad(&bld_base
->base
,
1813 emit_data
->args
[0], emit_data
->args
[1], emit_data
->args
[2]);
1816 /* TGSI_OPCODE_MAX (CPU Only) */
1820 const struct lp_build_tgsi_action
* action
,
1821 struct lp_build_tgsi_context
* bld_base
,
1822 struct lp_build_emit_data
* emit_data
)
1824 emit_data
->output
[emit_data
->chan
] =
1825 lp_build_max_ext(&bld_base
->base
,
1826 emit_data
->args
[0], emit_data
->args
[1],
1827 GALLIVM_NAN_RETURN_OTHER
);
1830 /* TGSI_OPCODE_MIN (CPU Only) */
1833 const struct lp_build_tgsi_action
* action
,
1834 struct lp_build_tgsi_context
* bld_base
,
1835 struct lp_build_emit_data
* emit_data
)
1837 emit_data
->output
[emit_data
->chan
] =
1838 lp_build_min_ext(&bld_base
->base
,
1839 emit_data
->args
[0], emit_data
->args
[1],
1840 GALLIVM_NAN_RETURN_OTHER
);
1843 /* TGSI_OPCODE_MOD (CPU Only) */
1846 const struct lp_build_tgsi_action
* action
,
1847 struct lp_build_tgsi_context
* bld_base
,
1848 struct lp_build_emit_data
* emit_data
)
1850 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1851 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1852 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1853 bld_base
->uint_bld
.zero
);
1854 /* We want to make sure that we never divide/mod by zero to not
1855 * generate sigfpe. We don't want to crash just because the
1856 * shader is doing something weird. */
1857 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1859 emit_data
->args
[1], "");
1860 LLVMValueRef result
= lp_build_mod(&bld_base
->int_bld
,
1861 emit_data
->args
[0], divisor
);
1862 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1863 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1868 /* TGSI_OPCODE_NOT */
1871 const struct lp_build_tgsi_action
* action
,
1872 struct lp_build_tgsi_context
* bld_base
,
1873 struct lp_build_emit_data
* emit_data
)
1875 emit_data
->output
[emit_data
->chan
] = lp_build_not(&bld_base
->uint_bld
,
1876 emit_data
->args
[0]);
1879 /* TGSI_OPCODE_OR (CPU Only) */
1882 const struct lp_build_tgsi_action
* action
,
1883 struct lp_build_tgsi_context
* bld_base
,
1884 struct lp_build_emit_data
* emit_data
)
1886 emit_data
->output
[emit_data
->chan
] = lp_build_or(&bld_base
->uint_bld
,
1887 emit_data
->args
[0], emit_data
->args
[1]);
1890 /* TGSI_OPCODE_POW (CPU Only) */
1893 const struct lp_build_tgsi_action
* action
,
1894 struct lp_build_tgsi_context
* bld_base
,
1895 struct lp_build_emit_data
* emit_data
)
1897 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
1898 emit_data
->args
[0], emit_data
->args
[1]);
1902 /* TGSI_OPCODE_RCP (CPU Only) */
1906 const struct lp_build_tgsi_action
* action
,
1907 struct lp_build_tgsi_context
* bld_base
,
1908 struct lp_build_emit_data
* emit_data
)
1910 emit_data
->output
[emit_data
->chan
] = lp_build_rcp(&bld_base
->base
,
1911 emit_data
->args
[0]);
1914 /* Reciprical squareroot (CPU Only) */
1916 recip_sqrt_emit_cpu(
1917 const struct lp_build_tgsi_action
* action
,
1918 struct lp_build_tgsi_context
* bld_base
,
1919 struct lp_build_emit_data
* emit_data
)
1921 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->base
,
1922 emit_data
->args
[0]);
1927 const struct lp_build_tgsi_action
* action
,
1928 struct lp_build_tgsi_context
* bld_base
,
1929 struct lp_build_emit_data
* emit_data
)
1931 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->base
,
1932 emit_data
->args
[0]);
1936 /* TGSI_OPCODE_ROUND (CPU Only) */
1939 const struct lp_build_tgsi_action
* action
,
1940 struct lp_build_tgsi_context
* bld_base
,
1941 struct lp_build_emit_data
* emit_data
)
1943 emit_data
->output
[emit_data
->chan
] = lp_build_round(&bld_base
->base
,
1944 emit_data
->args
[0]);
1947 /* TGSI_OPCODE_SET Helper (CPU Only) */
1951 const struct lp_build_tgsi_action
* action
,
1952 struct lp_build_tgsi_context
* bld_base
,
1953 struct lp_build_emit_data
* emit_data
,
1958 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1959 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1960 emit_data
->args
[0], emit_data
->args
[1]);
1963 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1964 emit_data
->args
[0], emit_data
->args
[1]);
1967 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1970 bld_base
->base
.zero
);
1973 /* TGSI_OPCODE_SEQ (CPU Only) */
1977 const struct lp_build_tgsi_action
* action
,
1978 struct lp_build_tgsi_context
* bld_base
,
1979 struct lp_build_emit_data
* emit_data
)
1981 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1984 /* TGSI_OPCODE_SGE (CPU Only) */
1987 const struct lp_build_tgsi_action
* action
,
1988 struct lp_build_tgsi_context
* bld_base
,
1989 struct lp_build_emit_data
* emit_data
)
1991 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1994 /* TGSI_OPCODE_SGT (CPU Only)*/
1998 const struct lp_build_tgsi_action
* action
,
1999 struct lp_build_tgsi_context
* bld_base
,
2000 struct lp_build_emit_data
* emit_data
)
2002 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GREATER
);
2005 /* TGSI_OPCODE_SHL (CPU Only) */
2008 const struct lp_build_tgsi_action
* action
,
2009 struct lp_build_tgsi_context
* bld_base
,
2010 struct lp_build_emit_data
* emit_data
)
2012 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
2013 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2014 uint_bld
->type
.width
- 1);
2015 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2016 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
2020 /* TGSI_OPCODE_SIN (CPU Only) */
2023 const struct lp_build_tgsi_action
* action
,
2024 struct lp_build_tgsi_context
* bld_base
,
2025 struct lp_build_emit_data
* emit_data
)
2027 emit_data
->output
[emit_data
->chan
] = lp_build_sin(&bld_base
->base
,
2028 emit_data
->args
[0]);
2031 /* TGSI_OPCODE_SLE (CPU Only) */
2034 const struct lp_build_tgsi_action
* action
,
2035 struct lp_build_tgsi_context
* bld_base
,
2036 struct lp_build_emit_data
* emit_data
)
2038 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LEQUAL
);
2041 /* TGSI_OPCODE_SLT (CPU Only) */
2044 const struct lp_build_tgsi_action
* action
,
2045 struct lp_build_tgsi_context
* bld_base
,
2046 struct lp_build_emit_data
* emit_data
)
2048 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2051 /* TGSI_OPCODE_SNE (CPU Only) */
2055 const struct lp_build_tgsi_action
* action
,
2056 struct lp_build_tgsi_context
* bld_base
,
2057 struct lp_build_emit_data
* emit_data
)
2059 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2062 /* TGSI_OPCODE_SSG (CPU Only) */
2066 const struct lp_build_tgsi_action
* action
,
2067 struct lp_build_tgsi_context
* bld_base
,
2068 struct lp_build_emit_data
* emit_data
)
2070 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->base
,
2071 emit_data
->args
[0]);
2074 /* TGSI_OPCODE_SUB (CPU Only) */
2078 const struct lp_build_tgsi_action
* action
,
2079 struct lp_build_tgsi_context
* bld_base
,
2080 struct lp_build_emit_data
* emit_data
)
2082 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->base
,
2084 emit_data
->args
[1]);
2087 /* TGSI_OPCODE_TRUNC (CPU Only) */
2091 const struct lp_build_tgsi_action
* action
,
2092 struct lp_build_tgsi_context
* bld_base
,
2093 struct lp_build_emit_data
* emit_data
)
2095 emit_data
->output
[emit_data
->chan
] = lp_build_trunc(&bld_base
->base
,
2096 emit_data
->args
[0]);
2099 /* TGSI_OPCODE_UADD (CPU Only) */
2102 const struct lp_build_tgsi_action
* action
,
2103 struct lp_build_tgsi_context
* bld_base
,
2104 struct lp_build_emit_data
* emit_data
)
2106 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint_bld
,
2107 emit_data
->args
[0], emit_data
->args
[1]);
2110 /* TGSI_OPCODE_UDIV (CPU Only) */
2113 const struct lp_build_tgsi_action
* action
,
2114 struct lp_build_tgsi_context
* bld_base
,
2115 struct lp_build_emit_data
* emit_data
)
2118 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2119 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
2120 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
2121 bld_base
->uint_bld
.zero
);
2122 /* We want to make sure that we never divide/mod by zero to not
2123 * generate sigfpe. We don't want to crash just because the
2124 * shader is doing something weird. */
2125 LLVMValueRef divisor
= LLVMBuildOr(builder
,
2127 emit_data
->args
[1], "");
2128 LLVMValueRef result
= lp_build_div(&bld_base
->uint_bld
,
2129 emit_data
->args
[0], divisor
);
2130 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
2131 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
2136 /* TGSI_OPCODE_UMAX (CPU Only) */
2139 const struct lp_build_tgsi_action
* action
,
2140 struct lp_build_tgsi_context
* bld_base
,
2141 struct lp_build_emit_data
* emit_data
)
2143 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint_bld
,
2144 emit_data
->args
[0], emit_data
->args
[1]);
2147 /* TGSI_OPCODE_UMIN (CPU Only) */
2150 const struct lp_build_tgsi_action
* action
,
2151 struct lp_build_tgsi_context
* bld_base
,
2152 struct lp_build_emit_data
* emit_data
)
2154 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint_bld
,
2155 emit_data
->args
[0], emit_data
->args
[1]);
2158 /* TGSI_OPCODE_UMOD (CPU Only) */
2161 const struct lp_build_tgsi_action
* action
,
2162 struct lp_build_tgsi_context
* bld_base
,
2163 struct lp_build_emit_data
* emit_data
)
2165 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2166 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
2167 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
2168 bld_base
->uint_bld
.zero
);
2169 /* We want to make sure that we never divide/mod by zero to not
2170 * generate sigfpe. We don't want to crash just because the
2171 * shader is doing something weird. */
2172 LLVMValueRef divisor
= LLVMBuildOr(builder
,
2174 emit_data
->args
[1], "");
2175 LLVMValueRef result
= lp_build_mod(&bld_base
->uint_bld
,
2176 emit_data
->args
[0], divisor
);
2177 /* umod by zero is guaranteed to return 0xffffffff */
2178 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
2183 /* TGSI_OPCODE_USET Helper (CPU Only) */
2186 const struct lp_build_tgsi_action
* action
,
2187 struct lp_build_tgsi_context
* bld_base
,
2188 struct lp_build_emit_data
* emit_data
,
2191 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint_bld
, pipe_func
,
2192 emit_data
->args
[0], emit_data
->args
[1]);
2193 emit_data
->output
[emit_data
->chan
] = cond
;
2197 /* TGSI_OPCODE_USEQ (CPU Only) */
2200 const struct lp_build_tgsi_action
* action
,
2201 struct lp_build_tgsi_context
* bld_base
,
2202 struct lp_build_emit_data
* emit_data
)
2204 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2207 /* TGSI_OPCODE_ISGE (CPU Only) */
2210 const struct lp_build_tgsi_action
* action
,
2211 struct lp_build_tgsi_context
* bld_base
,
2212 struct lp_build_emit_data
* emit_data
)
2214 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2217 /* TGSI_OPCODE_USHR (CPU Only) */
2220 const struct lp_build_tgsi_action
* action
,
2221 struct lp_build_tgsi_context
* bld_base
,
2222 struct lp_build_emit_data
* emit_data
)
2224 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
2225 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2226 uint_bld
->type
.width
- 1);
2227 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2228 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
2232 /* TGSI_OPCODE_ISLT (CPU Only) */
2235 const struct lp_build_tgsi_action
* action
,
2236 struct lp_build_tgsi_context
* bld_base
,
2237 struct lp_build_emit_data
* emit_data
)
2239 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2242 /* TGSI_OPCODE_USNE (CPU Only) */
2246 const struct lp_build_tgsi_action
* action
,
2247 struct lp_build_tgsi_context
* bld_base
,
2248 struct lp_build_emit_data
* emit_data
)
2250 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2253 /* TGSI_OPCODE_XOR */
2256 const struct lp_build_tgsi_action
* action
,
2257 struct lp_build_tgsi_context
* bld_base
,
2258 struct lp_build_emit_data
* emit_data
)
2260 emit_data
->output
[emit_data
->chan
] = lp_build_xor(&bld_base
->uint_bld
,
2262 emit_data
->args
[1]);
2265 /* TGSI_OPCODE_DABS (CPU Only) */
2268 const struct lp_build_tgsi_action
* action
,
2269 struct lp_build_tgsi_context
* bld_base
,
2270 struct lp_build_emit_data
* emit_data
)
2272 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->dbl_bld
,
2273 emit_data
->args
[0]);
2276 /* TGSI_OPCODE_DNEG (CPU Only) */
2279 const struct lp_build_tgsi_action
* action
,
2280 struct lp_build_tgsi_context
* bld_base
,
2281 struct lp_build_emit_data
* emit_data
)
2283 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->dbl_bld
,
2284 bld_base
->dbl_bld
.zero
,
2285 emit_data
->args
[0]);
2288 /* TGSI_OPCODE_DSET Helper (CPU Only) */
2291 const struct lp_build_tgsi_action
* action
,
2292 struct lp_build_tgsi_context
* bld_base
,
2293 struct lp_build_emit_data
* emit_data
,
2296 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2297 LLVMValueRef cond
= lp_build_cmp(&bld_base
->dbl_bld
, pipe_func
,
2298 emit_data
->args
[0], emit_data
->args
[1]);
2299 /* arguments were 64 bit but store as 32 bit */
2300 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2301 emit_data
->output
[emit_data
->chan
] = cond
;
2304 /* TGSI_OPCODE_DSEQ (CPU Only) */
2307 const struct lp_build_tgsi_action
* action
,
2308 struct lp_build_tgsi_context
* bld_base
,
2309 struct lp_build_emit_data
* emit_data
)
2311 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2314 /* TGSI_OPCODE_DSGE (CPU Only) */
2317 const struct lp_build_tgsi_action
* action
,
2318 struct lp_build_tgsi_context
* bld_base
,
2319 struct lp_build_emit_data
* emit_data
)
2321 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2324 /* TGSI_OPCODE_DSLT (CPU Only) */
2327 const struct lp_build_tgsi_action
* action
,
2328 struct lp_build_tgsi_context
* bld_base
,
2329 struct lp_build_emit_data
* emit_data
)
2331 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2334 /* TGSI_OPCODE_DSNE (CPU Only) */
2337 const struct lp_build_tgsi_action
* action
,
2338 struct lp_build_tgsi_context
* bld_base
,
2339 struct lp_build_emit_data
* emit_data
)
2341 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2344 /* Double Reciprocal squareroot (CPU Only) */
2346 drecip_sqrt_emit_cpu(
2347 const struct lp_build_tgsi_action
* action
,
2348 struct lp_build_tgsi_context
* bld_base
,
2349 struct lp_build_emit_data
* emit_data
)
2351 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->dbl_bld
,
2352 emit_data
->args
[0]);
2355 /* Double Squareroot (CPU Only) */
2358 const struct lp_build_tgsi_action
* action
,
2359 struct lp_build_tgsi_context
* bld_base
,
2360 struct lp_build_emit_data
* emit_data
)
2362 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->dbl_bld
,
2363 emit_data
->args
[0]);
2368 const struct lp_build_tgsi_action
* action
,
2369 struct lp_build_tgsi_context
* bld_base
,
2370 struct lp_build_emit_data
* emit_data
)
2372 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int64_bld
,
2373 emit_data
->args
[0]);
2378 const struct lp_build_tgsi_action
* action
,
2379 struct lp_build_tgsi_context
* bld_base
,
2380 struct lp_build_emit_data
* emit_data
)
2382 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int64_bld
,
2383 emit_data
->args
[0]);
2388 const struct lp_build_tgsi_action
* action
,
2389 struct lp_build_tgsi_context
* bld_base
,
2390 struct lp_build_emit_data
* emit_data
)
2392 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int64_bld
,
2393 bld_base
->int64_bld
.zero
,
2394 emit_data
->args
[0]);
2399 const struct lp_build_tgsi_action
* action
,
2400 struct lp_build_tgsi_context
* bld_base
,
2401 struct lp_build_emit_data
* emit_data
,
2404 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2405 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint64_bld
, pipe_func
,
2406 emit_data
->args
[0], emit_data
->args
[1]);
2407 /* arguments were 64 bit but store as 32 bit */
2408 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2409 emit_data
->output
[emit_data
->chan
] = cond
;
2414 const struct lp_build_tgsi_action
* action
,
2415 struct lp_build_tgsi_context
* bld_base
,
2416 struct lp_build_emit_data
* emit_data
)
2418 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
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 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
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 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
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 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2450 const struct lp_build_tgsi_action
* action
,
2451 struct lp_build_tgsi_context
* bld_base
,
2452 struct lp_build_emit_data
* emit_data
,
2455 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2456 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int64_bld
, pipe_func
,
2457 emit_data
->args
[0], emit_data
->args
[1]);
2458 /* arguments were 64 bit but store as 32 bit */
2459 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2460 emit_data
->output
[emit_data
->chan
] = cond
;
2465 const struct lp_build_tgsi_action
* action
,
2466 struct lp_build_tgsi_context
* bld_base
,
2467 struct lp_build_emit_data
* emit_data
)
2469 i64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2474 const struct lp_build_tgsi_action
* action
,
2475 struct lp_build_tgsi_context
* bld_base
,
2476 struct lp_build_emit_data
* emit_data
)
2478 i64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2483 const struct lp_build_tgsi_action
* action
,
2484 struct lp_build_tgsi_context
* bld_base
,
2485 struct lp_build_emit_data
* emit_data
)
2487 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint64_bld
,
2488 emit_data
->args
[0], emit_data
->args
[1]);
2493 const struct lp_build_tgsi_action
* action
,
2494 struct lp_build_tgsi_context
* bld_base
,
2495 struct lp_build_emit_data
* emit_data
)
2497 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint64_bld
,
2498 emit_data
->args
[0], emit_data
->args
[1]);
2503 const struct lp_build_tgsi_action
* action
,
2504 struct lp_build_tgsi_context
* bld_base
,
2505 struct lp_build_emit_data
* emit_data
)
2507 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int64_bld
,
2508 emit_data
->args
[0], emit_data
->args
[1]);
2513 const struct lp_build_tgsi_action
* action
,
2514 struct lp_build_tgsi_context
* bld_base
,
2515 struct lp_build_emit_data
* emit_data
)
2517 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int64_bld
,
2518 emit_data
->args
[0], emit_data
->args
[1]);
2523 const struct lp_build_tgsi_action
* action
,
2524 struct lp_build_tgsi_context
* bld_base
,
2525 struct lp_build_emit_data
* emit_data
)
2527 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint64_bld
,
2528 emit_data
->args
[0], emit_data
->args
[1]);
2533 const struct lp_build_tgsi_action
* action
,
2534 struct lp_build_tgsi_context
* bld_base
,
2535 struct lp_build_emit_data
* emit_data
)
2537 struct lp_build_context
*uint_bld
= &bld_base
->uint64_bld
;
2538 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2539 uint_bld
->type
.width
- 1);
2540 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2541 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
2547 const struct lp_build_tgsi_action
* action
,
2548 struct lp_build_tgsi_context
* bld_base
,
2549 struct lp_build_emit_data
* emit_data
)
2551 struct lp_build_context
*int_bld
= &bld_base
->int64_bld
;
2552 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
2553 int_bld
->type
.width
- 1);
2554 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
2555 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
2561 const struct lp_build_tgsi_action
* action
,
2562 struct lp_build_tgsi_context
* bld_base
,
2563 struct lp_build_emit_data
* emit_data
)
2565 struct lp_build_context
*uint_bld
= &bld_base
->uint64_bld
;
2566 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2567 uint_bld
->type
.width
- 1);
2568 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2569 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
2574 lp_set_default_actions_cpu(
2575 struct lp_build_tgsi_context
* bld_base
)
2577 lp_set_default_actions(bld_base
);
2578 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit_cpu
;
2579 bld_base
->op_actions
[TGSI_OPCODE_AND
].emit
= and_emit_cpu
;
2580 bld_base
->op_actions
[TGSI_OPCODE_ARL
].emit
= arl_emit_cpu
;
2581 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit_cpu
;
2582 bld_base
->op_actions
[TGSI_OPCODE_CEIL
].emit
= ceil_emit_cpu
;
2583 bld_base
->op_actions
[TGSI_OPCODE_COS
].emit
= cos_emit_cpu
;
2584 bld_base
->op_actions
[TGSI_OPCODE_CMP
].emit
= cmp_emit_cpu
;
2585 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= div_emit_cpu
;
2586 bld_base
->op_actions
[TGSI_OPCODE_EX2
].emit
= ex2_emit_cpu
;
2587 bld_base
->op_actions
[TGSI_OPCODE_F2I
].emit
= f2i_emit_cpu
;
2588 bld_base
->op_actions
[TGSI_OPCODE_FLR
].emit
= flr_emit_cpu
;
2589 bld_base
->op_actions
[TGSI_OPCODE_FSEQ
].emit
= fseq_emit_cpu
;
2590 bld_base
->op_actions
[TGSI_OPCODE_FSGE
].emit
= fsge_emit_cpu
;
2591 bld_base
->op_actions
[TGSI_OPCODE_FSLT
].emit
= fslt_emit_cpu
;
2592 bld_base
->op_actions
[TGSI_OPCODE_FSNE
].emit
= fsne_emit_cpu
;
2594 bld_base
->op_actions
[TGSI_OPCODE_I2F
].emit
= i2f_emit_cpu
;
2595 bld_base
->op_actions
[TGSI_OPCODE_IABS
].emit
= iabs_emit_cpu
;
2596 bld_base
->op_actions
[TGSI_OPCODE_IDIV
].emit
= idiv_emit_cpu
;
2597 bld_base
->op_actions
[TGSI_OPCODE_INEG
].emit
= ineg_emit_cpu
;
2598 bld_base
->op_actions
[TGSI_OPCODE_IMAX
].emit
= imax_emit_cpu
;
2599 bld_base
->op_actions
[TGSI_OPCODE_IMIN
].emit
= imin_emit_cpu
;
2600 bld_base
->op_actions
[TGSI_OPCODE_ISGE
].emit
= isge_emit_cpu
;
2601 bld_base
->op_actions
[TGSI_OPCODE_ISHR
].emit
= ishr_emit_cpu
;
2602 bld_base
->op_actions
[TGSI_OPCODE_ISLT
].emit
= islt_emit_cpu
;
2603 bld_base
->op_actions
[TGSI_OPCODE_ISSG
].emit
= issg_emit_cpu
;
2604 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit_cpu
;
2605 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit_cpu
;
2607 bld_base
->op_actions
[TGSI_OPCODE_LG2
].emit
= lg2_emit_cpu
;
2608 bld_base
->op_actions
[TGSI_OPCODE_LOG
].emit
= log_emit_cpu
;
2609 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit_cpu
;
2610 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= max_emit_cpu
;
2611 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= min_emit_cpu
;
2612 bld_base
->op_actions
[TGSI_OPCODE_MOD
].emit
= mod_emit_cpu
;
2613 bld_base
->op_actions
[TGSI_OPCODE_NOT
].emit
= not_emit_cpu
;
2614 bld_base
->op_actions
[TGSI_OPCODE_OR
].emit
= or_emit_cpu
;
2615 bld_base
->op_actions
[TGSI_OPCODE_POW
].emit
= pow_emit_cpu
;
2616 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit_cpu
;
2617 bld_base
->op_actions
[TGSI_OPCODE_ROUND
].emit
= round_emit_cpu
;
2618 bld_base
->op_actions
[TGSI_OPCODE_SEQ
].emit
= seq_emit_cpu
;
2619 bld_base
->op_actions
[TGSI_OPCODE_SGE
].emit
= sge_emit_cpu
;
2620 bld_base
->op_actions
[TGSI_OPCODE_SGT
].emit
= sgt_emit_cpu
;
2621 bld_base
->op_actions
[TGSI_OPCODE_SIN
].emit
= sin_emit_cpu
;
2622 bld_base
->op_actions
[TGSI_OPCODE_SHL
].emit
= shl_emit_cpu
;
2623 bld_base
->op_actions
[TGSI_OPCODE_SLE
].emit
= sle_emit_cpu
;
2624 bld_base
->op_actions
[TGSI_OPCODE_SLT
].emit
= slt_emit_cpu
;
2625 bld_base
->op_actions
[TGSI_OPCODE_SNE
].emit
= sne_emit_cpu
;
2626 bld_base
->op_actions
[TGSI_OPCODE_SSG
].emit
= ssg_emit_cpu
;
2627 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit_cpu
;
2628 bld_base
->op_actions
[TGSI_OPCODE_TRUNC
].emit
= trunc_emit_cpu
;
2630 bld_base
->rsq_action
.emit
= recip_sqrt_emit_cpu
;
2631 bld_base
->sqrt_action
.emit
= sqrt_emit_cpu
;
2633 bld_base
->op_actions
[TGSI_OPCODE_UADD
].emit
= uadd_emit_cpu
;
2634 bld_base
->op_actions
[TGSI_OPCODE_UCMP
].emit
= ucmp_emit_cpu
;
2635 bld_base
->op_actions
[TGSI_OPCODE_UDIV
].emit
= udiv_emit_cpu
;
2636 bld_base
->op_actions
[TGSI_OPCODE_UMAX
].emit
= umax_emit_cpu
;
2637 bld_base
->op_actions
[TGSI_OPCODE_UMIN
].emit
= umin_emit_cpu
;
2638 bld_base
->op_actions
[TGSI_OPCODE_UMOD
].emit
= umod_emit_cpu
;
2639 bld_base
->op_actions
[TGSI_OPCODE_USEQ
].emit
= useq_emit_cpu
;
2640 bld_base
->op_actions
[TGSI_OPCODE_USGE
].emit
= usge_emit_cpu
;
2641 bld_base
->op_actions
[TGSI_OPCODE_USHR
].emit
= ushr_emit_cpu
;
2642 bld_base
->op_actions
[TGSI_OPCODE_USLT
].emit
= uslt_emit_cpu
;
2643 bld_base
->op_actions
[TGSI_OPCODE_USNE
].emit
= usne_emit_cpu
;
2645 bld_base
->op_actions
[TGSI_OPCODE_XOR
].emit
= xor_emit_cpu
;
2647 bld_base
->op_actions
[TGSI_OPCODE_DABS
].emit
= dabs_emit_cpu
;
2648 bld_base
->op_actions
[TGSI_OPCODE_DNEG
].emit
= dneg_emit_cpu
;
2649 bld_base
->op_actions
[TGSI_OPCODE_DSEQ
].emit
= dseq_emit_cpu
;
2650 bld_base
->op_actions
[TGSI_OPCODE_DSGE
].emit
= dsge_emit_cpu
;
2651 bld_base
->op_actions
[TGSI_OPCODE_DSLT
].emit
= dslt_emit_cpu
;
2652 bld_base
->op_actions
[TGSI_OPCODE_DSNE
].emit
= dsne_emit_cpu
;
2654 bld_base
->op_actions
[TGSI_OPCODE_DRSQ
].emit
= drecip_sqrt_emit_cpu
;
2655 bld_base
->op_actions
[TGSI_OPCODE_DSQRT
].emit
= dsqrt_emit_cpu
;
2657 bld_base
->op_actions
[TGSI_OPCODE_I64ABS
].emit
= i64abs_emit_cpu
;
2658 bld_base
->op_actions
[TGSI_OPCODE_I64SSG
].emit
= i64ssg_emit_cpu
;
2659 bld_base
->op_actions
[TGSI_OPCODE_I64NEG
].emit
= i64neg_emit_cpu
;
2661 bld_base
->op_actions
[TGSI_OPCODE_U64SEQ
].emit
= u64seq_emit_cpu
;
2662 bld_base
->op_actions
[TGSI_OPCODE_U64SNE
].emit
= u64sne_emit_cpu
;
2663 bld_base
->op_actions
[TGSI_OPCODE_U64SLT
].emit
= u64slt_emit_cpu
;
2664 bld_base
->op_actions
[TGSI_OPCODE_U64SGE
].emit
= u64sge_emit_cpu
;
2665 bld_base
->op_actions
[TGSI_OPCODE_I64SLT
].emit
= i64slt_emit_cpu
;
2666 bld_base
->op_actions
[TGSI_OPCODE_I64SGE
].emit
= i64sge_emit_cpu
;
2668 bld_base
->op_actions
[TGSI_OPCODE_U64MIN
].emit
= u64min_emit_cpu
;
2669 bld_base
->op_actions
[TGSI_OPCODE_U64MAX
].emit
= u64max_emit_cpu
;
2670 bld_base
->op_actions
[TGSI_OPCODE_I64MIN
].emit
= i64min_emit_cpu
;
2671 bld_base
->op_actions
[TGSI_OPCODE_I64MAX
].emit
= i64max_emit_cpu
;
2673 bld_base
->op_actions
[TGSI_OPCODE_U64ADD
].emit
= u64add_emit_cpu
;
2674 bld_base
->op_actions
[TGSI_OPCODE_U64MOD
].emit
= u64mod_emit_cpu
;
2675 bld_base
->op_actions
[TGSI_OPCODE_I64MOD
].emit
= i64mod_emit_cpu
;
2676 bld_base
->op_actions
[TGSI_OPCODE_U64DIV
].emit
= u64div_emit_cpu
;
2677 bld_base
->op_actions
[TGSI_OPCODE_I64DIV
].emit
= i64div_emit_cpu
;
2679 bld_base
->op_actions
[TGSI_OPCODE_U64SHL
].emit
= u64shl_emit_cpu
;
2680 bld_base
->op_actions
[TGSI_OPCODE_I64SHR
].emit
= i64shr_emit_cpu
;
2681 bld_base
->op_actions
[TGSI_OPCODE_U64SHR
].emit
= u64shr_emit_cpu
;