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_emit_llvm_unary(bld_base
, TGSI_OPCODE_ABS
,
503 emit_data
->args
[0] /* src0.x */);
505 /* log( abs( src0.x ) ) */
506 log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_LG2
,
509 /* floor( log( abs( src0.x ) ) ) */
510 flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
513 emit_data
->output
[TGSI_CHAN_X
] = flr_log_abs_x
;
516 ex2_flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_EX2
,
519 /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */
520 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
521 TGSI_OPCODE_DIV
, abs_x
, ex2_flr_log_abs_x
);
524 emit_data
->output
[TGSI_CHAN_Z
] = log_abs_x
;
527 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
530 static struct lp_build_tgsi_action log_action
= {
531 scalar_unary_fetch_args
, /* fetch_args */
535 /* TGSI_OPCODE_PK2H */
539 struct lp_build_tgsi_context
* bld_base
,
540 struct lp_build_emit_data
* emit_data
)
543 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
546 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
552 const struct lp_build_tgsi_action
*action
,
553 struct lp_build_tgsi_context
*bld_base
,
554 struct lp_build_emit_data
*emit_data
)
556 struct gallivm_state
*gallivm
= bld_base
->base
.gallivm
;
557 struct lp_type f16i_t
;
558 LLVMValueRef lo
, hi
, res
;
560 f16i_t
= lp_type_uint_vec(16, bld_base
->base
.type
.length
* 32);
561 lo
= lp_build_float_to_half(gallivm
, emit_data
->args
[0]);
562 hi
= lp_build_float_to_half(gallivm
, emit_data
->args
[1]);
563 /* maybe some interleave doubling vector width would be useful... */
564 lo
= lp_build_pad_vector(gallivm
, lo
, bld_base
->base
.type
.length
* 2);
565 hi
= lp_build_pad_vector(gallivm
, hi
, bld_base
->base
.type
.length
* 2);
566 res
= lp_build_interleave2(gallivm
, f16i_t
, lo
, hi
, 0);
568 emit_data
->output
[emit_data
->chan
] = res
;
571 static struct lp_build_tgsi_action pk2h_action
= {
572 pk2h_fetch_args
, /* fetch_args */
576 /* TGSI_OPCODE_UP2H */
580 const struct lp_build_tgsi_action
*action
,
581 struct lp_build_tgsi_context
*bld_base
,
582 struct lp_build_emit_data
*emit_data
)
584 struct gallivm_state
*gallivm
= bld_base
->base
.gallivm
;
585 LLVMBuilderRef builder
= gallivm
->builder
;
586 LLVMContextRef context
= gallivm
->context
;
587 LLVMValueRef lo
, hi
, res
[2], arg
;
588 unsigned nr
= bld_base
->base
.type
.length
;
589 LLVMTypeRef i16t
= LLVMVectorType(LLVMInt16TypeInContext(context
), nr
* 2);
591 arg
= LLVMBuildBitCast(builder
, emit_data
->args
[0], i16t
, "");
592 lo
= lp_build_uninterleave1(gallivm
, nr
* 2, arg
, 0);
593 hi
= lp_build_uninterleave1(gallivm
, nr
* 2, arg
, 1);
594 res
[0] = lp_build_half_to_float(gallivm
, lo
);
595 res
[1] = lp_build_half_to_float(gallivm
, hi
);
597 emit_data
->output
[0] = emit_data
->output
[2] = res
[0];
598 emit_data
->output
[1] = emit_data
->output
[3] = res
[1];
601 static struct lp_build_tgsi_action up2h_action
= {
602 scalar_unary_fetch_args
, /* fetch_args */
606 /* TGSI_OPCODE_LRP */
610 const struct lp_build_tgsi_action
* action
,
611 struct lp_build_tgsi_context
* bld_base
,
612 struct lp_build_emit_data
* emit_data
)
614 struct lp_build_context
*bld
= &bld_base
->base
;
615 LLVMValueRef inv
, a
, b
;
617 /* This uses the correct version: (1 - t)*a + t*b
619 * An alternative version is "a + t*(b-a)". The problem is this version
620 * doesn't return "b" for t = 1, because "a + (b-a)" isn't equal to "b"
621 * because of the floating-point rounding.
623 inv
= lp_build_sub(bld
, bld_base
->base
.one
, emit_data
->args
[0]);
624 a
= lp_build_mul(bld
, emit_data
->args
[1], emit_data
->args
[0]);
625 b
= lp_build_mul(bld
, emit_data
->args
[2], inv
);
626 emit_data
->output
[emit_data
->chan
] = lp_build_add(bld
, a
, b
);
629 /* TGSI_OPCODE_MAD */
633 const struct lp_build_tgsi_action
* action
,
634 struct lp_build_tgsi_context
* bld_base
,
635 struct lp_build_emit_data
* emit_data
)
638 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
641 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
642 TGSI_OPCODE_ADD
, tmp
, emit_data
->args
[2]);
645 /* TGSI_OPCODE_MOV */
649 const struct lp_build_tgsi_action
* action
,
650 struct lp_build_tgsi_context
* bld_base
,
651 struct lp_build_emit_data
* emit_data
)
653 emit_data
->output
[emit_data
->chan
] = emit_data
->args
[0];
656 /* TGSI_OPCODE_MUL */
659 const struct lp_build_tgsi_action
* action
,
660 struct lp_build_tgsi_context
* bld_base
,
661 struct lp_build_emit_data
* emit_data
)
663 emit_data
->output
[emit_data
->chan
] = LLVMBuildFMul(
664 bld_base
->base
.gallivm
->builder
,
665 emit_data
->args
[0], emit_data
->args
[1], "");
668 /*.TGSI_OPCODE_DIV.*/
669 static void fdiv_emit(
670 const struct lp_build_tgsi_action
* action
,
671 struct lp_build_tgsi_context
* bld_base
,
672 struct lp_build_emit_data
* emit_data
)
674 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
675 bld_base
->base
.gallivm
->builder
,
676 emit_data
->args
[0], emit_data
->args
[1], "");
679 /*.TGSI_OPCODE_RCP.*/
680 static void rcp_emit(
681 const struct lp_build_tgsi_action
* action
,
682 struct lp_build_tgsi_context
* bld_base
,
683 struct lp_build_emit_data
* emit_data
)
686 one
= lp_build_const_float(bld_base
->base
.gallivm
, 1.0f
);
687 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
688 TGSI_OPCODE_DIV
, one
, emit_data
->args
[0]);
691 /* TGSI_OPCODE_POW */
695 const struct lp_build_tgsi_action
* action
,
696 struct lp_build_tgsi_context
* bld_base
,
697 struct lp_build_emit_data
* emit_data
)
699 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
700 emit_data
->args
[0], emit_data
->args
[1]);
703 static struct lp_build_tgsi_action pow_action
= {
704 scalar_binary_fetch_args
, /* fetch_args */
708 /* TGSI_OPCODE_RSQ */
712 const struct lp_build_tgsi_action
* action
,
713 struct lp_build_tgsi_context
* bld_base
,
714 struct lp_build_emit_data
* emit_data
)
716 if (bld_base
->rsq_action
.emit
) {
717 bld_base
->rsq_action
.emit(&bld_base
->rsq_action
, bld_base
, emit_data
);
719 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
723 const struct lp_build_tgsi_action rsq_action
= {
724 scalar_unary_fetch_args
, /* fetch_args */
729 /* TGSI_OPCODE_SQRT */
733 const struct lp_build_tgsi_action
* action
,
734 struct lp_build_tgsi_context
* bld_base
,
735 struct lp_build_emit_data
* emit_data
)
737 if (bld_base
->sqrt_action
.emit
) {
738 bld_base
->sqrt_action
.emit(&bld_base
->sqrt_action
, bld_base
, emit_data
);
740 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
744 const struct lp_build_tgsi_action sqrt_action
= {
745 scalar_unary_fetch_args
, /* fetch_args */
749 /* TGSI_OPCODE_SCS */
752 const struct lp_build_tgsi_action
* action
,
753 struct lp_build_tgsi_context
* bld_base
,
754 struct lp_build_emit_data
* emit_data
)
757 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
758 TGSI_OPCODE_COS
, emit_data
->args
[0]);
760 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_unary(bld_base
,
761 TGSI_OPCODE_SIN
, emit_data
->args
[0]);
763 emit_data
->output
[TGSI_CHAN_Z
] = bld_base
->base
.zero
;
766 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
769 const struct lp_build_tgsi_action scs_action
= {
770 scalar_unary_fetch_args
, /* fetch_args */
774 /* TGSI_OPCODE_SUB */
777 const struct lp_build_tgsi_action
* action
,
778 struct lp_build_tgsi_context
* bld_base
,
779 struct lp_build_emit_data
* emit_data
)
781 emit_data
->output
[emit_data
->chan
] =
782 LLVMBuildFSub(bld_base
->base
.gallivm
->builder
,
784 emit_data
->args
[1], "");
787 /* TGSI_OPCODE_F2U */
790 const struct lp_build_tgsi_action
* action
,
791 struct lp_build_tgsi_context
* bld_base
,
792 struct lp_build_emit_data
* emit_data
)
794 emit_data
->output
[emit_data
->chan
] =
795 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
797 bld_base
->base
.int_vec_type
, "");
800 /* TGSI_OPCODE_U2F */
803 const struct lp_build_tgsi_action
* action
,
804 struct lp_build_tgsi_context
* bld_base
,
805 struct lp_build_emit_data
* emit_data
)
807 emit_data
->output
[emit_data
->chan
] =
808 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
810 bld_base
->base
.vec_type
, "");
815 const struct lp_build_tgsi_action
* action
,
816 struct lp_build_tgsi_context
* bld_base
,
817 struct lp_build_emit_data
* emit_data
)
820 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_UMUL
,
823 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
824 TGSI_OPCODE_UADD
, tmp
, emit_data
->args
[2]);
827 /* TGSI_OPCODE_UMUL */
830 const struct lp_build_tgsi_action
* action
,
831 struct lp_build_tgsi_context
* bld_base
,
832 struct lp_build_emit_data
* emit_data
)
834 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint_bld
,
835 emit_data
->args
[0], emit_data
->args
[1]);
838 /* TGSI_OPCODE_IMUL_HI */
841 const struct lp_build_tgsi_action
* action
,
842 struct lp_build_tgsi_context
* bld_base
,
843 struct lp_build_emit_data
* emit_data
)
845 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
846 LLVMValueRef hi_bits
;
848 assert(int_bld
->type
.width
== 32);
850 /* low result bits are tossed away */
851 lp_build_mul_32_lohi(int_bld
, emit_data
->args
[0],
852 emit_data
->args
[1], &hi_bits
);
853 emit_data
->output
[emit_data
->chan
] = hi_bits
;
858 const struct lp_build_tgsi_action
* action
,
859 struct lp_build_tgsi_context
* bld_base
,
860 struct lp_build_emit_data
* emit_data
)
862 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
863 LLVMValueRef hi_bits
;
865 assert(int_bld
->type
.width
== 32);
867 /* low result bits are tossed away */
868 lp_build_mul_32_lohi_cpu(int_bld
, emit_data
->args
[0],
869 emit_data
->args
[1], &hi_bits
);
870 emit_data
->output
[emit_data
->chan
] = hi_bits
;
873 /* TGSI_OPCODE_UMUL_HI */
876 const struct lp_build_tgsi_action
* action
,
877 struct lp_build_tgsi_context
* bld_base
,
878 struct lp_build_emit_data
* emit_data
)
880 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
881 LLVMValueRef hi_bits
;
883 assert(uint_bld
->type
.width
== 32);
885 /* low result bits are tossed away */
886 lp_build_mul_32_lohi(uint_bld
, emit_data
->args
[0],
887 emit_data
->args
[1], &hi_bits
);
888 emit_data
->output
[emit_data
->chan
] = hi_bits
;
893 const struct lp_build_tgsi_action
* action
,
894 struct lp_build_tgsi_context
* bld_base
,
895 struct lp_build_emit_data
* emit_data
)
897 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
898 LLVMValueRef hi_bits
;
900 assert(uint_bld
->type
.width
== 32);
902 /* low result bits are tossed away */
903 lp_build_mul_32_lohi_cpu(uint_bld
, emit_data
->args
[0],
904 emit_data
->args
[1], &hi_bits
);
905 emit_data
->output
[emit_data
->chan
] = hi_bits
;
908 /* TGSI_OPCODE_MAX */
909 static void fmax_emit(
910 const struct lp_build_tgsi_action
* action
,
911 struct lp_build_tgsi_context
* bld_base
,
912 struct lp_build_emit_data
* emit_data
)
914 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
915 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
916 LLVMBuildFCmp(builder
, LLVMRealUGE
,
917 emit_data
->args
[0], emit_data
->args
[1], ""),
918 emit_data
->args
[0], emit_data
->args
[1], "");
921 /* TGSI_OPCODE_MIN */
922 static void fmin_emit(
923 const struct lp_build_tgsi_action
* action
,
924 struct lp_build_tgsi_context
* bld_base
,
925 struct lp_build_emit_data
* emit_data
)
927 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
928 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
929 LLVMBuildFCmp(builder
, LLVMRealUGE
,
930 emit_data
->args
[0], emit_data
->args
[1], ""),
931 emit_data
->args
[1], emit_data
->args
[0], "");
934 /* TGSI_OPCODE_XPD */
938 struct lp_build_tgsi_context
* bld_base
,
939 struct lp_build_emit_data
* emit_data
)
941 dp_fetch_args(bld_base
, emit_data
, 3);
949 struct lp_build_tgsi_context
* bld_base
,
955 LLVMValueRef tmp0
, tmp1
;
957 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, a
, b
);
958 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, c
, d
);
960 return lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_SUB
, tmp0
, tmp1
);
965 const struct lp_build_tgsi_action
* action
,
966 struct lp_build_tgsi_context
* bld_base
,
967 struct lp_build_emit_data
* emit_data
)
969 emit_data
->output
[TGSI_CHAN_X
] = xpd_helper(bld_base
,
970 emit_data
->args
[1] /* src0.y */, emit_data
->args
[5] /* src1.z */,
971 emit_data
->args
[4] /* src1.y */, emit_data
->args
[2] /* src0.z */);
973 emit_data
->output
[TGSI_CHAN_Y
] = xpd_helper(bld_base
,
974 emit_data
->args
[2] /* src0.z */, emit_data
->args
[3] /* src1.x */,
975 emit_data
->args
[5] /* src1.z */, emit_data
->args
[0] /* src0.x */);
977 emit_data
->output
[TGSI_CHAN_Z
] = xpd_helper(bld_base
,
978 emit_data
->args
[0] /* src0.x */, emit_data
->args
[4] /* src1.y */,
979 emit_data
->args
[3] /* src1.x */, emit_data
->args
[1] /* src0.y */);
981 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
984 const struct lp_build_tgsi_action xpd_action
= {
985 xpd_fetch_args
, /* fetch_args */
989 /* TGSI_OPCODE_D2F */
992 const struct lp_build_tgsi_action
* action
,
993 struct lp_build_tgsi_context
* bld_base
,
994 struct lp_build_emit_data
* emit_data
)
996 emit_data
->output
[emit_data
->chan
] =
997 LLVMBuildFPTrunc(bld_base
->base
.gallivm
->builder
,
999 bld_base
->base
.vec_type
, "");
1002 /* TGSI_OPCODE_D2I */
1005 const struct lp_build_tgsi_action
* action
,
1006 struct lp_build_tgsi_context
* bld_base
,
1007 struct lp_build_emit_data
* emit_data
)
1009 emit_data
->output
[emit_data
->chan
] =
1010 LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
,
1012 bld_base
->base
.int_vec_type
, "");
1015 /* TGSI_OPCODE_D2U */
1018 const struct lp_build_tgsi_action
* action
,
1019 struct lp_build_tgsi_context
* bld_base
,
1020 struct lp_build_emit_data
* emit_data
)
1022 emit_data
->output
[emit_data
->chan
] =
1023 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
1025 bld_base
->base
.int_vec_type
, "");
1028 /* TGSI_OPCODE_F2D */
1031 const struct lp_build_tgsi_action
* action
,
1032 struct lp_build_tgsi_context
* bld_base
,
1033 struct lp_build_emit_data
* emit_data
)
1035 emit_data
->output
[emit_data
->chan
] =
1036 LLVMBuildFPExt(bld_base
->base
.gallivm
->builder
,
1038 bld_base
->dbl_bld
.vec_type
, "");
1041 /* TGSI_OPCODE_U2D */
1044 const struct lp_build_tgsi_action
* action
,
1045 struct lp_build_tgsi_context
* bld_base
,
1046 struct lp_build_emit_data
* emit_data
)
1048 emit_data
->output
[emit_data
->chan
] =
1049 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1051 bld_base
->dbl_bld
.vec_type
, "");
1054 /* TGSI_OPCODE_I2D */
1057 const struct lp_build_tgsi_action
* action
,
1058 struct lp_build_tgsi_context
* bld_base
,
1059 struct lp_build_emit_data
* emit_data
)
1061 emit_data
->output
[emit_data
->chan
] =
1062 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1064 bld_base
->dbl_bld
.vec_type
, "");
1067 /* TGSI_OPCODE_DMAD */
1070 const struct lp_build_tgsi_action
* action
,
1071 struct lp_build_tgsi_context
* bld_base
,
1072 struct lp_build_emit_data
* emit_data
)
1075 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_DMUL
,
1077 emit_data
->args
[1]);
1078 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
1079 TGSI_OPCODE_DADD
, tmp
, emit_data
->args
[2]);
1082 /*.TGSI_OPCODE_DRCP.*/
1083 static void drcp_emit(
1084 const struct lp_build_tgsi_action
* action
,
1085 struct lp_build_tgsi_context
* bld_base
,
1086 struct lp_build_emit_data
* emit_data
)
1089 one
= lp_build_const_vec(bld_base
->dbl_bld
.gallivm
, bld_base
->dbl_bld
.type
, 1.0f
);
1090 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
1091 bld_base
->base
.gallivm
->builder
,
1092 one
, emit_data
->args
[0], "");
1095 /* TGSI_OPCODE_DFRAC */
1096 static void dfrac_emit(
1097 const struct lp_build_tgsi_action
* action
,
1098 struct lp_build_tgsi_context
* bld_base
,
1099 struct lp_build_emit_data
* emit_data
)
1102 tmp
= lp_build_floor(&bld_base
->dbl_bld
,
1103 emit_data
->args
[0]);
1104 emit_data
->output
[emit_data
->chan
] = LLVMBuildFSub(bld_base
->base
.gallivm
->builder
,
1105 emit_data
->args
[0], tmp
, "");
1110 const struct lp_build_tgsi_action
* action
,
1111 struct lp_build_tgsi_context
* bld_base
,
1112 struct lp_build_emit_data
* emit_data
)
1114 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint64_bld
,
1115 emit_data
->args
[0], emit_data
->args
[1]);
1120 const struct lp_build_tgsi_action
* action
,
1121 struct lp_build_tgsi_context
* bld_base
,
1122 struct lp_build_emit_data
* emit_data
)
1124 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1125 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
1126 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1127 bld_base
->uint64_bld
.zero
);
1128 /* We want to make sure that we never divide/mod by zero to not
1129 * generate sigfpe. We don't want to crash just because the
1130 * shader is doing something weird. */
1131 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1133 emit_data
->args
[1], "");
1134 LLVMValueRef result
= lp_build_mod(&bld_base
->uint64_bld
,
1135 emit_data
->args
[0], divisor
);
1136 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1137 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1144 const struct lp_build_tgsi_action
* action
,
1145 struct lp_build_tgsi_context
* bld_base
,
1146 struct lp_build_emit_data
* emit_data
)
1148 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1149 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
1150 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1151 bld_base
->uint64_bld
.zero
);
1152 /* We want to make sure that we never divide/mod by zero to not
1153 * generate sigfpe. We don't want to crash just because the
1154 * shader is doing something weird. */
1155 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1157 emit_data
->args
[1], "");
1158 LLVMValueRef result
= lp_build_mod(&bld_base
->int64_bld
,
1159 emit_data
->args
[0], divisor
);
1160 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1161 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1168 const struct lp_build_tgsi_action
* action
,
1169 struct lp_build_tgsi_context
* bld_base
,
1170 struct lp_build_emit_data
* emit_data
)
1173 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1174 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
1175 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1176 bld_base
->uint64_bld
.zero
);
1177 /* We want to make sure that we never divide/mod by zero to not
1178 * generate sigfpe. We don't want to crash just because the
1179 * shader is doing something weird. */
1180 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1182 emit_data
->args
[1], "");
1183 LLVMValueRef result
= LLVMBuildUDiv(builder
,
1184 emit_data
->args
[0], divisor
, "");
1185 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1186 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1193 const struct lp_build_tgsi_action
* action
,
1194 struct lp_build_tgsi_context
* bld_base
,
1195 struct lp_build_emit_data
* emit_data
)
1198 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1199 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->int64_bld
,
1200 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1201 bld_base
->int64_bld
.zero
);
1202 /* We want to make sure that we never divide/mod by zero to not
1203 * generate sigfpe. We don't want to crash just because the
1204 * shader is doing something weird. */
1205 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1207 emit_data
->args
[1], "");
1208 LLVMValueRef result
= LLVMBuildSDiv(builder
,
1209 emit_data
->args
[0], divisor
, "");
1210 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1211 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1218 const struct lp_build_tgsi_action
* action
,
1219 struct lp_build_tgsi_context
* bld_base
,
1220 struct lp_build_emit_data
* emit_data
)
1222 emit_data
->output
[emit_data
->chan
] =
1223 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
1225 bld_base
->uint64_bld
.vec_type
, "");
1230 const struct lp_build_tgsi_action
* action
,
1231 struct lp_build_tgsi_context
* bld_base
,
1232 struct lp_build_emit_data
* emit_data
)
1234 emit_data
->output
[emit_data
->chan
] =
1235 LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
,
1237 bld_base
->int64_bld
.vec_type
, "");
1242 const struct lp_build_tgsi_action
* action
,
1243 struct lp_build_tgsi_context
* bld_base
,
1244 struct lp_build_emit_data
* emit_data
)
1246 emit_data
->output
[emit_data
->chan
] =
1247 LLVMBuildZExt(bld_base
->base
.gallivm
->builder
,
1249 bld_base
->uint64_bld
.vec_type
, "");
1254 const struct lp_build_tgsi_action
* action
,
1255 struct lp_build_tgsi_context
* bld_base
,
1256 struct lp_build_emit_data
* emit_data
)
1258 emit_data
->output
[emit_data
->chan
] =
1259 LLVMBuildSExt(bld_base
->base
.gallivm
->builder
,
1261 bld_base
->int64_bld
.vec_type
, "");
1266 const struct lp_build_tgsi_action
* action
,
1267 struct lp_build_tgsi_context
* bld_base
,
1268 struct lp_build_emit_data
* emit_data
)
1270 emit_data
->output
[emit_data
->chan
] =
1271 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1273 bld_base
->base
.vec_type
, "");
1278 const struct lp_build_tgsi_action
* action
,
1279 struct lp_build_tgsi_context
* bld_base
,
1280 struct lp_build_emit_data
* emit_data
)
1282 emit_data
->output
[emit_data
->chan
] =
1283 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1285 bld_base
->base
.vec_type
, "");
1290 const struct lp_build_tgsi_action
* action
,
1291 struct lp_build_tgsi_context
* bld_base
,
1292 struct lp_build_emit_data
* emit_data
)
1294 emit_data
->output
[emit_data
->chan
] =
1295 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1297 bld_base
->dbl_bld
.vec_type
, "");
1302 const struct lp_build_tgsi_action
* action
,
1303 struct lp_build_tgsi_context
* bld_base
,
1304 struct lp_build_emit_data
* emit_data
)
1306 emit_data
->output
[emit_data
->chan
] =
1307 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1309 bld_base
->dbl_bld
.vec_type
, "");
1313 lp_set_default_actions(struct lp_build_tgsi_context
* bld_base
)
1315 bld_base
->op_actions
[TGSI_OPCODE_DP2
] = dp2_action
;
1316 bld_base
->op_actions
[TGSI_OPCODE_DP3
] = dp3_action
;
1317 bld_base
->op_actions
[TGSI_OPCODE_DP4
] = dp4_action
;
1318 bld_base
->op_actions
[TGSI_OPCODE_DP2A
] = dp2a_action
;
1319 bld_base
->op_actions
[TGSI_OPCODE_DPH
] = dph_action
;
1320 bld_base
->op_actions
[TGSI_OPCODE_DST
] = dst_action
;
1321 bld_base
->op_actions
[TGSI_OPCODE_EXP
] = exp_action
;
1322 bld_base
->op_actions
[TGSI_OPCODE_LIT
] = lit_action
;
1323 bld_base
->op_actions
[TGSI_OPCODE_LOG
] = log_action
;
1324 bld_base
->op_actions
[TGSI_OPCODE_PK2H
] = pk2h_action
;
1325 bld_base
->op_actions
[TGSI_OPCODE_RSQ
] = rsq_action
;
1326 bld_base
->op_actions
[TGSI_OPCODE_SQRT
] = sqrt_action
;
1327 bld_base
->op_actions
[TGSI_OPCODE_POW
] = pow_action
;
1328 bld_base
->op_actions
[TGSI_OPCODE_SCS
] = scs_action
;
1329 bld_base
->op_actions
[TGSI_OPCODE_UP2H
] = up2h_action
;
1330 bld_base
->op_actions
[TGSI_OPCODE_XPD
] = xpd_action
;
1332 bld_base
->op_actions
[TGSI_OPCODE_BREAKC
].fetch_args
= scalar_unary_fetch_args
;
1333 bld_base
->op_actions
[TGSI_OPCODE_SWITCH
].fetch_args
= scalar_unary_fetch_args
;
1334 bld_base
->op_actions
[TGSI_OPCODE_CASE
].fetch_args
= scalar_unary_fetch_args
;
1335 bld_base
->op_actions
[TGSI_OPCODE_COS
].fetch_args
= scalar_unary_fetch_args
;
1336 bld_base
->op_actions
[TGSI_OPCODE_EX2
].fetch_args
= scalar_unary_fetch_args
;
1337 bld_base
->op_actions
[TGSI_OPCODE_IF
].fetch_args
= scalar_unary_fetch_args
;
1338 bld_base
->op_actions
[TGSI_OPCODE_UIF
].fetch_args
= scalar_unary_fetch_args
;
1339 bld_base
->op_actions
[TGSI_OPCODE_KILL_IF
].fetch_args
= kil_fetch_args
;
1340 bld_base
->op_actions
[TGSI_OPCODE_KILL
].fetch_args
= kilp_fetch_args
;
1341 bld_base
->op_actions
[TGSI_OPCODE_RCP
].fetch_args
= scalar_unary_fetch_args
;
1342 bld_base
->op_actions
[TGSI_OPCODE_SIN
].fetch_args
= scalar_unary_fetch_args
;
1343 bld_base
->op_actions
[TGSI_OPCODE_LG2
].fetch_args
= scalar_unary_fetch_args
;
1345 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit
;
1346 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit
;
1347 bld_base
->op_actions
[TGSI_OPCODE_CLAMP
].emit
= clamp_emit
;
1348 bld_base
->op_actions
[TGSI_OPCODE_END
].emit
= end_emit
;
1349 bld_base
->op_actions
[TGSI_OPCODE_FRC
].emit
= frc_emit
;
1350 bld_base
->op_actions
[TGSI_OPCODE_LRP
].emit
= lrp_emit
;
1351 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit
;
1352 bld_base
->op_actions
[TGSI_OPCODE_MOV
].emit
= mov_emit
;
1353 bld_base
->op_actions
[TGSI_OPCODE_MUL
].emit
= mul_emit
;
1354 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= fdiv_emit
;
1355 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit
;
1356 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit
;
1358 bld_base
->op_actions
[TGSI_OPCODE_UARL
].emit
= mov_emit
;
1359 bld_base
->op_actions
[TGSI_OPCODE_F2U
].emit
= f2u_emit
;
1360 bld_base
->op_actions
[TGSI_OPCODE_U2F
].emit
= u2f_emit
;
1361 bld_base
->op_actions
[TGSI_OPCODE_UMAD
].emit
= umad_emit
;
1362 bld_base
->op_actions
[TGSI_OPCODE_UMUL
].emit
= umul_emit
;
1363 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit
;
1364 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit
;
1366 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= fmax_emit
;
1367 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= fmin_emit
;
1369 bld_base
->op_actions
[TGSI_OPCODE_DADD
].emit
= add_emit
;
1370 bld_base
->op_actions
[TGSI_OPCODE_DMAX
].emit
= fmax_emit
;
1371 bld_base
->op_actions
[TGSI_OPCODE_DMIN
].emit
= fmin_emit
;
1372 bld_base
->op_actions
[TGSI_OPCODE_DMUL
].emit
= mul_emit
;
1374 bld_base
->op_actions
[TGSI_OPCODE_D2F
].emit
= d2f_emit
;
1375 bld_base
->op_actions
[TGSI_OPCODE_D2I
].emit
= d2i_emit
;
1376 bld_base
->op_actions
[TGSI_OPCODE_D2U
].emit
= d2u_emit
;
1378 bld_base
->op_actions
[TGSI_OPCODE_F2D
].emit
= f2d_emit
;
1379 bld_base
->op_actions
[TGSI_OPCODE_I2D
].emit
= i2d_emit
;
1380 bld_base
->op_actions
[TGSI_OPCODE_U2D
].emit
= u2d_emit
;
1382 bld_base
->op_actions
[TGSI_OPCODE_DMAD
].emit
= dmad_emit
;
1384 bld_base
->op_actions
[TGSI_OPCODE_DRCP
].emit
= drcp_emit
;
1385 bld_base
->op_actions
[TGSI_OPCODE_DFRAC
].emit
= dfrac_emit
;
1387 bld_base
->op_actions
[TGSI_OPCODE_U64MUL
].emit
= u64mul_emit
;
1389 bld_base
->op_actions
[TGSI_OPCODE_F2I64
].emit
= f2i64_emit
;
1390 bld_base
->op_actions
[TGSI_OPCODE_F2U64
].emit
= f2u64_emit
;
1392 bld_base
->op_actions
[TGSI_OPCODE_D2I64
].emit
= f2i64_emit
;
1393 bld_base
->op_actions
[TGSI_OPCODE_D2U64
].emit
= f2u64_emit
;
1395 bld_base
->op_actions
[TGSI_OPCODE_I2I64
].emit
= i2i64_emit
;
1396 bld_base
->op_actions
[TGSI_OPCODE_U2I64
].emit
= u2i64_emit
;
1398 bld_base
->op_actions
[TGSI_OPCODE_I642F
].emit
= i642f_emit
;
1399 bld_base
->op_actions
[TGSI_OPCODE_U642F
].emit
= u642f_emit
;
1401 bld_base
->op_actions
[TGSI_OPCODE_I642F
].emit
= i642f_emit
;
1402 bld_base
->op_actions
[TGSI_OPCODE_U642F
].emit
= u642f_emit
;
1404 bld_base
->op_actions
[TGSI_OPCODE_I642D
].emit
= i642d_emit
;
1405 bld_base
->op_actions
[TGSI_OPCODE_U642D
].emit
= u642d_emit
;
1409 /* CPU Only default actions */
1411 /* These actions are CPU only, because they could potentially output SSE
1415 /* TGSI_OPCODE_ABS (CPU Only)*/
1419 const struct lp_build_tgsi_action
* action
,
1420 struct lp_build_tgsi_context
* bld_base
,
1421 struct lp_build_emit_data
* emit_data
)
1423 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->base
,
1424 emit_data
->args
[0]);
1427 /* TGSI_OPCODE_ADD (CPU Only) */
1430 const struct lp_build_tgsi_action
* action
,
1431 struct lp_build_tgsi_context
* bld_base
,
1432 struct lp_build_emit_data
* emit_data
)
1434 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->base
,
1435 emit_data
->args
[0], emit_data
->args
[1]);
1438 /* TGSI_OPCODE_AND (CPU Only) */
1441 const struct lp_build_tgsi_action
* action
,
1442 struct lp_build_tgsi_context
* bld_base
,
1443 struct lp_build_emit_data
* emit_data
)
1445 emit_data
->output
[emit_data
->chan
] = lp_build_and(&bld_base
->uint_bld
,
1446 emit_data
->args
[0], emit_data
->args
[1]);
1449 /* TGSI_OPCODE_ARL (CPU Only) */
1452 const struct lp_build_tgsi_action
* action
,
1453 struct lp_build_tgsi_context
* bld_base
,
1454 struct lp_build_emit_data
* emit_data
)
1457 tmp
= lp_build_floor(&bld_base
->base
,
1458 emit_data
->args
[0]);
1459 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
1460 bld_base
->uint_bld
.vec_type
, "");
1463 /* TGSI_OPCODE_ARR (CPU Only) */
1466 const struct lp_build_tgsi_action
* action
,
1467 struct lp_build_tgsi_context
* bld_base
,
1468 struct lp_build_emit_data
* emit_data
)
1470 emit_data
->output
[emit_data
->chan
] = lp_build_iround(&bld_base
->base
, emit_data
->args
[0]);
1473 /* TGSI_OPCODE_CEIL (CPU Only) */
1476 const struct lp_build_tgsi_action
* action
,
1477 struct lp_build_tgsi_context
* bld_base
,
1478 struct lp_build_emit_data
* emit_data
)
1480 emit_data
->output
[emit_data
->chan
] = lp_build_ceil(&bld_base
->base
,
1481 emit_data
->args
[0]);
1484 /* TGSI_OPCODE_CMP (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 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_LESS
,
1492 emit_data
->args
[0], bld_base
->base
.zero
);
1493 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1494 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1497 /* TGSI_OPCODE_UCMP (CPU Only) */
1500 const struct lp_build_tgsi_action
* action
,
1501 struct lp_build_tgsi_context
* bld_base
,
1502 struct lp_build_emit_data
* emit_data
)
1504 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1505 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1506 LLVMValueRef unsigned_cond
=
1507 LLVMBuildBitCast(builder
, emit_data
->args
[0], uint_bld
->vec_type
, "");
1508 LLVMValueRef cond
= lp_build_cmp(uint_bld
, PIPE_FUNC_NOTEQUAL
,
1511 emit_data
->output
[emit_data
->chan
] =
1512 lp_build_select(&bld_base
->base
,
1513 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1516 /* TGSI_OPCODE_COS (CPU Only) */
1519 const struct lp_build_tgsi_action
* action
,
1520 struct lp_build_tgsi_context
* bld_base
,
1521 struct lp_build_emit_data
* emit_data
)
1523 emit_data
->output
[emit_data
->chan
] = lp_build_cos(&bld_base
->base
,
1524 emit_data
->args
[0]);
1527 /* TGSI_OPCODE_DIV (CPU Only) */
1530 const struct lp_build_tgsi_action
* action
,
1531 struct lp_build_tgsi_context
* bld_base
,
1532 struct lp_build_emit_data
* emit_data
)
1534 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->base
,
1535 emit_data
->args
[0], emit_data
->args
[1]);
1538 /* TGSI_OPCODE_EX2 (CPU Only) */
1541 const struct lp_build_tgsi_action
* action
,
1542 struct lp_build_tgsi_context
* bld_base
,
1543 struct lp_build_emit_data
* emit_data
)
1545 emit_data
->output
[emit_data
->chan
] = lp_build_exp2(&bld_base
->base
,
1546 emit_data
->args
[0]);
1549 /* TGSI_OPCODE_F2I (CPU Only) */
1552 const struct lp_build_tgsi_action
* action
,
1553 struct lp_build_tgsi_context
* bld_base
,
1554 struct lp_build_emit_data
* emit_data
)
1556 emit_data
->output
[emit_data
->chan
] = lp_build_itrunc(&bld_base
->base
,
1557 emit_data
->args
[0]);
1560 /* TGSI_OPCODE_FSET Helper (CPU Only) */
1563 const struct lp_build_tgsi_action
* action
,
1564 struct lp_build_tgsi_context
* bld_base
,
1565 struct lp_build_emit_data
* emit_data
,
1570 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1571 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1572 emit_data
->args
[0], emit_data
->args
[1]);
1575 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1576 emit_data
->args
[0], emit_data
->args
[1]);
1579 emit_data
->output
[emit_data
->chan
] = cond
;
1583 /* TGSI_OPCODE_FSEQ (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 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1593 /* TGSI_OPCODE_ISGE (CPU Only) */
1596 const struct lp_build_tgsi_action
* action
,
1597 struct lp_build_tgsi_context
* bld_base
,
1598 struct lp_build_emit_data
* emit_data
)
1600 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1603 /* TGSI_OPCODE_ISLT (CPU Only) */
1606 const struct lp_build_tgsi_action
* action
,
1607 struct lp_build_tgsi_context
* bld_base
,
1608 struct lp_build_emit_data
* emit_data
)
1610 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1613 /* TGSI_OPCODE_USNE (CPU Only) */
1617 const struct lp_build_tgsi_action
* action
,
1618 struct lp_build_tgsi_context
* bld_base
,
1619 struct lp_build_emit_data
* emit_data
)
1621 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1624 /* TGSI_OPCODE_FLR (CPU Only) */
1628 const struct lp_build_tgsi_action
* action
,
1629 struct lp_build_tgsi_context
* bld_base
,
1630 struct lp_build_emit_data
* emit_data
)
1632 emit_data
->output
[emit_data
->chan
] = lp_build_floor(&bld_base
->base
,
1633 emit_data
->args
[0]);
1636 /* TGSI_OPCODE_I2F (CPU Only) */
1639 const struct lp_build_tgsi_action
* action
,
1640 struct lp_build_tgsi_context
* bld_base
,
1641 struct lp_build_emit_data
* emit_data
)
1643 emit_data
->output
[emit_data
->chan
] = lp_build_int_to_float(&bld_base
->base
,
1644 emit_data
->args
[0]);
1647 /* TGSI_OPCODE_IABS (CPU Only) */
1650 const struct lp_build_tgsi_action
* action
,
1651 struct lp_build_tgsi_context
* bld_base
,
1652 struct lp_build_emit_data
* emit_data
)
1654 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int_bld
,
1655 emit_data
->args
[0]);
1658 /* TGSI_OPCODE_IDIV (CPU Only) */
1661 const struct lp_build_tgsi_action
* action
,
1662 struct lp_build_tgsi_context
* bld_base
,
1663 struct lp_build_emit_data
* emit_data
)
1665 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1666 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1667 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1668 bld_base
->uint_bld
.zero
);
1669 /* We want to make sure that we never divide/mod by zero to not
1670 * generate sigfpe. We don't want to crash just because the
1671 * shader is doing something weird. */
1672 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1674 emit_data
->args
[1], "");
1675 LLVMValueRef result
= lp_build_div(&bld_base
->int_bld
,
1676 emit_data
->args
[0], divisor
);
1677 LLVMValueRef not_div_mask
= LLVMBuildNot(builder
,
1679 /* idiv by zero doesn't have a guaranteed return value chose 0 for now. */
1680 emit_data
->output
[emit_data
->chan
] = LLVMBuildAnd(builder
,
1685 /* TGSI_OPCODE_INEG (CPU Only) */
1688 const struct lp_build_tgsi_action
* action
,
1689 struct lp_build_tgsi_context
* bld_base
,
1690 struct lp_build_emit_data
* emit_data
)
1692 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int_bld
,
1693 bld_base
->int_bld
.zero
,
1694 emit_data
->args
[0]);
1697 /* TGSI_OPCODE_ISET Helper (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
,
1705 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int_bld
, pipe_func
,
1706 emit_data
->args
[0], emit_data
->args
[1]);
1707 emit_data
->output
[emit_data
->chan
] = cond
;
1710 /* TGSI_OPCODE_IMAX (CPU Only) */
1713 const struct lp_build_tgsi_action
* action
,
1714 struct lp_build_tgsi_context
* bld_base
,
1715 struct lp_build_emit_data
* emit_data
)
1717 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int_bld
,
1718 emit_data
->args
[0], emit_data
->args
[1]);
1721 /* TGSI_OPCODE_IMIN (CPU Only) */
1724 const struct lp_build_tgsi_action
* action
,
1725 struct lp_build_tgsi_context
* bld_base
,
1726 struct lp_build_emit_data
* emit_data
)
1728 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int_bld
,
1729 emit_data
->args
[0], emit_data
->args
[1]);
1732 /* TGSI_OPCODE_ISGE (CPU Only) */
1735 const struct lp_build_tgsi_action
* action
,
1736 struct lp_build_tgsi_context
* bld_base
,
1737 struct lp_build_emit_data
* emit_data
)
1739 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1742 /* TGSI_OPCODE_ISHR (CPU Only) */
1745 const struct lp_build_tgsi_action
* action
,
1746 struct lp_build_tgsi_context
* bld_base
,
1747 struct lp_build_emit_data
* emit_data
)
1749 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
1750 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
1751 int_bld
->type
.width
- 1);
1752 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
1753 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
1757 /* TGSI_OPCODE_ISLT (CPU Only) */
1760 const struct lp_build_tgsi_action
* action
,
1761 struct lp_build_tgsi_context
* bld_base
,
1762 struct lp_build_emit_data
* emit_data
)
1764 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1768 /* TGSI_OPCODE_ISSG (CPU Only) */
1771 const struct lp_build_tgsi_action
* action
,
1772 struct lp_build_tgsi_context
* bld_base
,
1773 struct lp_build_emit_data
* emit_data
)
1775 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int_bld
,
1776 emit_data
->args
[0]);
1779 /* TGSI_OPCODE_LG2 (CPU Only) */
1782 const struct lp_build_tgsi_action
* action
,
1783 struct lp_build_tgsi_context
* bld_base
,
1784 struct lp_build_emit_data
* emit_data
)
1786 emit_data
->output
[emit_data
->chan
] = lp_build_log2_safe(&bld_base
->base
,
1787 emit_data
->args
[0]);
1790 /* TGSI_OPCODE_LOG (CPU Only) */
1793 const struct lp_build_tgsi_action
* action
,
1794 struct lp_build_tgsi_context
* bld_base
,
1795 struct lp_build_emit_data
* emit_data
)
1797 LLVMValueRef p_floor_log2
;
1799 LLVMValueRef p_log2
;
1800 LLVMValueRef src0
= emit_data
->args
[0];
1802 lp_build_log2_approx(&bld_base
->base
, src0
,
1803 &p_exp
, &p_floor_log2
, &p_log2
, FALSE
);
1805 emit_data
->output
[TGSI_CHAN_X
] = p_floor_log2
;
1807 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
1810 emit_data
->output
[TGSI_CHAN_Z
] = p_log2
;
1812 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
1816 /* TGSI_OPCODE_MAD (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_mad(&bld_base
->base
,
1826 emit_data
->args
[0], emit_data
->args
[1], emit_data
->args
[2]);
1829 /* TGSI_OPCODE_MAX (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_max_ext(&bld_base
->base
,
1839 emit_data
->args
[0], emit_data
->args
[1],
1840 GALLIVM_NAN_RETURN_OTHER
);
1843 /* TGSI_OPCODE_MIN (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 emit_data
->output
[emit_data
->chan
] =
1851 lp_build_min_ext(&bld_base
->base
,
1852 emit_data
->args
[0], emit_data
->args
[1],
1853 GALLIVM_NAN_RETURN_OTHER
);
1856 /* TGSI_OPCODE_MOD (CPU Only) */
1859 const struct lp_build_tgsi_action
* action
,
1860 struct lp_build_tgsi_context
* bld_base
,
1861 struct lp_build_emit_data
* emit_data
)
1863 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1864 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1865 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1866 bld_base
->uint_bld
.zero
);
1867 /* We want to make sure that we never divide/mod by zero to not
1868 * generate sigfpe. We don't want to crash just because the
1869 * shader is doing something weird. */
1870 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1872 emit_data
->args
[1], "");
1873 LLVMValueRef result
= lp_build_mod(&bld_base
->int_bld
,
1874 emit_data
->args
[0], divisor
);
1875 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1876 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1881 /* TGSI_OPCODE_NOT */
1884 const struct lp_build_tgsi_action
* action
,
1885 struct lp_build_tgsi_context
* bld_base
,
1886 struct lp_build_emit_data
* emit_data
)
1888 emit_data
->output
[emit_data
->chan
] = lp_build_not(&bld_base
->uint_bld
,
1889 emit_data
->args
[0]);
1892 /* TGSI_OPCODE_OR (CPU Only) */
1895 const struct lp_build_tgsi_action
* action
,
1896 struct lp_build_tgsi_context
* bld_base
,
1897 struct lp_build_emit_data
* emit_data
)
1899 emit_data
->output
[emit_data
->chan
] = lp_build_or(&bld_base
->uint_bld
,
1900 emit_data
->args
[0], emit_data
->args
[1]);
1903 /* TGSI_OPCODE_POW (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_pow(&bld_base
->base
,
1911 emit_data
->args
[0], emit_data
->args
[1]);
1915 /* TGSI_OPCODE_RCP (CPU Only) */
1919 const struct lp_build_tgsi_action
* action
,
1920 struct lp_build_tgsi_context
* bld_base
,
1921 struct lp_build_emit_data
* emit_data
)
1923 emit_data
->output
[emit_data
->chan
] = lp_build_rcp(&bld_base
->base
,
1924 emit_data
->args
[0]);
1927 /* Reciprical squareroot (CPU Only) */
1929 recip_sqrt_emit_cpu(
1930 const struct lp_build_tgsi_action
* action
,
1931 struct lp_build_tgsi_context
* bld_base
,
1932 struct lp_build_emit_data
* emit_data
)
1934 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->base
,
1935 emit_data
->args
[0]);
1940 const struct lp_build_tgsi_action
* action
,
1941 struct lp_build_tgsi_context
* bld_base
,
1942 struct lp_build_emit_data
* emit_data
)
1944 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->base
,
1945 emit_data
->args
[0]);
1949 /* TGSI_OPCODE_ROUND (CPU Only) */
1952 const struct lp_build_tgsi_action
* action
,
1953 struct lp_build_tgsi_context
* bld_base
,
1954 struct lp_build_emit_data
* emit_data
)
1956 emit_data
->output
[emit_data
->chan
] = lp_build_round(&bld_base
->base
,
1957 emit_data
->args
[0]);
1960 /* TGSI_OPCODE_SET Helper (CPU Only) */
1964 const struct lp_build_tgsi_action
* action
,
1965 struct lp_build_tgsi_context
* bld_base
,
1966 struct lp_build_emit_data
* emit_data
,
1971 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1972 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1973 emit_data
->args
[0], emit_data
->args
[1]);
1976 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1977 emit_data
->args
[0], emit_data
->args
[1]);
1980 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1983 bld_base
->base
.zero
);
1986 /* TGSI_OPCODE_SEQ (CPU Only) */
1990 const struct lp_build_tgsi_action
* action
,
1991 struct lp_build_tgsi_context
* bld_base
,
1992 struct lp_build_emit_data
* emit_data
)
1994 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1997 /* TGSI_OPCODE_SGE (CPU Only) */
2000 const struct lp_build_tgsi_action
* action
,
2001 struct lp_build_tgsi_context
* bld_base
,
2002 struct lp_build_emit_data
* emit_data
)
2004 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2007 /* TGSI_OPCODE_SGT (CPU Only)*/
2011 const struct lp_build_tgsi_action
* action
,
2012 struct lp_build_tgsi_context
* bld_base
,
2013 struct lp_build_emit_data
* emit_data
)
2015 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GREATER
);
2018 /* TGSI_OPCODE_SHL (CPU Only) */
2021 const struct lp_build_tgsi_action
* action
,
2022 struct lp_build_tgsi_context
* bld_base
,
2023 struct lp_build_emit_data
* emit_data
)
2025 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
2026 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2027 uint_bld
->type
.width
- 1);
2028 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2029 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
2033 /* TGSI_OPCODE_SIN (CPU Only) */
2036 const struct lp_build_tgsi_action
* action
,
2037 struct lp_build_tgsi_context
* bld_base
,
2038 struct lp_build_emit_data
* emit_data
)
2040 emit_data
->output
[emit_data
->chan
] = lp_build_sin(&bld_base
->base
,
2041 emit_data
->args
[0]);
2044 /* TGSI_OPCODE_SLE (CPU Only) */
2047 const struct lp_build_tgsi_action
* action
,
2048 struct lp_build_tgsi_context
* bld_base
,
2049 struct lp_build_emit_data
* emit_data
)
2051 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LEQUAL
);
2054 /* TGSI_OPCODE_SLT (CPU Only) */
2057 const struct lp_build_tgsi_action
* action
,
2058 struct lp_build_tgsi_context
* bld_base
,
2059 struct lp_build_emit_data
* emit_data
)
2061 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2064 /* TGSI_OPCODE_SNE (CPU Only) */
2068 const struct lp_build_tgsi_action
* action
,
2069 struct lp_build_tgsi_context
* bld_base
,
2070 struct lp_build_emit_data
* emit_data
)
2072 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2075 /* TGSI_OPCODE_SSG (CPU Only) */
2079 const struct lp_build_tgsi_action
* action
,
2080 struct lp_build_tgsi_context
* bld_base
,
2081 struct lp_build_emit_data
* emit_data
)
2083 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->base
,
2084 emit_data
->args
[0]);
2087 /* TGSI_OPCODE_SUB (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_sub(&bld_base
->base
,
2097 emit_data
->args
[1]);
2100 /* TGSI_OPCODE_TRUNC (CPU Only) */
2104 const struct lp_build_tgsi_action
* action
,
2105 struct lp_build_tgsi_context
* bld_base
,
2106 struct lp_build_emit_data
* emit_data
)
2108 emit_data
->output
[emit_data
->chan
] = lp_build_trunc(&bld_base
->base
,
2109 emit_data
->args
[0]);
2112 /* TGSI_OPCODE_UADD (CPU Only) */
2115 const struct lp_build_tgsi_action
* action
,
2116 struct lp_build_tgsi_context
* bld_base
,
2117 struct lp_build_emit_data
* emit_data
)
2119 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint_bld
,
2120 emit_data
->args
[0], emit_data
->args
[1]);
2123 /* TGSI_OPCODE_UDIV (CPU Only) */
2126 const struct lp_build_tgsi_action
* action
,
2127 struct lp_build_tgsi_context
* bld_base
,
2128 struct lp_build_emit_data
* emit_data
)
2131 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2132 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
2133 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
2134 bld_base
->uint_bld
.zero
);
2135 /* We want to make sure that we never divide/mod by zero to not
2136 * generate sigfpe. We don't want to crash just because the
2137 * shader is doing something weird. */
2138 LLVMValueRef divisor
= LLVMBuildOr(builder
,
2140 emit_data
->args
[1], "");
2141 LLVMValueRef result
= lp_build_div(&bld_base
->uint_bld
,
2142 emit_data
->args
[0], divisor
);
2143 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
2144 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
2149 /* TGSI_OPCODE_UMAX (CPU Only) */
2152 const struct lp_build_tgsi_action
* action
,
2153 struct lp_build_tgsi_context
* bld_base
,
2154 struct lp_build_emit_data
* emit_data
)
2156 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint_bld
,
2157 emit_data
->args
[0], emit_data
->args
[1]);
2160 /* TGSI_OPCODE_UMIN (CPU Only) */
2163 const struct lp_build_tgsi_action
* action
,
2164 struct lp_build_tgsi_context
* bld_base
,
2165 struct lp_build_emit_data
* emit_data
)
2167 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint_bld
,
2168 emit_data
->args
[0], emit_data
->args
[1]);
2171 /* TGSI_OPCODE_UMOD (CPU Only) */
2174 const struct lp_build_tgsi_action
* action
,
2175 struct lp_build_tgsi_context
* bld_base
,
2176 struct lp_build_emit_data
* emit_data
)
2178 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2179 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
2180 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
2181 bld_base
->uint_bld
.zero
);
2182 /* We want to make sure that we never divide/mod by zero to not
2183 * generate sigfpe. We don't want to crash just because the
2184 * shader is doing something weird. */
2185 LLVMValueRef divisor
= LLVMBuildOr(builder
,
2187 emit_data
->args
[1], "");
2188 LLVMValueRef result
= lp_build_mod(&bld_base
->uint_bld
,
2189 emit_data
->args
[0], divisor
);
2190 /* umod by zero is guaranteed to return 0xffffffff */
2191 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
2196 /* TGSI_OPCODE_USET Helper (CPU Only) */
2199 const struct lp_build_tgsi_action
* action
,
2200 struct lp_build_tgsi_context
* bld_base
,
2201 struct lp_build_emit_data
* emit_data
,
2204 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint_bld
, pipe_func
,
2205 emit_data
->args
[0], emit_data
->args
[1]);
2206 emit_data
->output
[emit_data
->chan
] = cond
;
2210 /* TGSI_OPCODE_USEQ (CPU Only) */
2213 const struct lp_build_tgsi_action
* action
,
2214 struct lp_build_tgsi_context
* bld_base
,
2215 struct lp_build_emit_data
* emit_data
)
2217 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2220 /* TGSI_OPCODE_ISGE (CPU Only) */
2223 const struct lp_build_tgsi_action
* action
,
2224 struct lp_build_tgsi_context
* bld_base
,
2225 struct lp_build_emit_data
* emit_data
)
2227 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2230 /* TGSI_OPCODE_USHR (CPU Only) */
2233 const struct lp_build_tgsi_action
* action
,
2234 struct lp_build_tgsi_context
* bld_base
,
2235 struct lp_build_emit_data
* emit_data
)
2237 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
2238 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2239 uint_bld
->type
.width
- 1);
2240 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2241 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
2245 /* TGSI_OPCODE_ISLT (CPU Only) */
2248 const struct lp_build_tgsi_action
* action
,
2249 struct lp_build_tgsi_context
* bld_base
,
2250 struct lp_build_emit_data
* emit_data
)
2252 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2255 /* TGSI_OPCODE_USNE (CPU Only) */
2259 const struct lp_build_tgsi_action
* action
,
2260 struct lp_build_tgsi_context
* bld_base
,
2261 struct lp_build_emit_data
* emit_data
)
2263 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2266 /* TGSI_OPCODE_XOR */
2269 const struct lp_build_tgsi_action
* action
,
2270 struct lp_build_tgsi_context
* bld_base
,
2271 struct lp_build_emit_data
* emit_data
)
2273 emit_data
->output
[emit_data
->chan
] = lp_build_xor(&bld_base
->uint_bld
,
2275 emit_data
->args
[1]);
2278 /* TGSI_OPCODE_DABS (CPU Only) */
2281 const struct lp_build_tgsi_action
* action
,
2282 struct lp_build_tgsi_context
* bld_base
,
2283 struct lp_build_emit_data
* emit_data
)
2285 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->dbl_bld
,
2286 emit_data
->args
[0]);
2289 /* TGSI_OPCODE_DNEG (CPU Only) */
2292 const struct lp_build_tgsi_action
* action
,
2293 struct lp_build_tgsi_context
* bld_base
,
2294 struct lp_build_emit_data
* emit_data
)
2296 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->dbl_bld
,
2297 bld_base
->dbl_bld
.zero
,
2298 emit_data
->args
[0]);
2301 /* TGSI_OPCODE_DSET Helper (CPU Only) */
2304 const struct lp_build_tgsi_action
* action
,
2305 struct lp_build_tgsi_context
* bld_base
,
2306 struct lp_build_emit_data
* emit_data
,
2309 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2310 LLVMValueRef cond
= lp_build_cmp(&bld_base
->dbl_bld
, pipe_func
,
2311 emit_data
->args
[0], emit_data
->args
[1]);
2312 /* arguments were 64 bit but store as 32 bit */
2313 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2314 emit_data
->output
[emit_data
->chan
] = cond
;
2317 /* TGSI_OPCODE_DSEQ (CPU Only) */
2320 const struct lp_build_tgsi_action
* action
,
2321 struct lp_build_tgsi_context
* bld_base
,
2322 struct lp_build_emit_data
* emit_data
)
2324 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2327 /* TGSI_OPCODE_DSGE (CPU Only) */
2330 const struct lp_build_tgsi_action
* action
,
2331 struct lp_build_tgsi_context
* bld_base
,
2332 struct lp_build_emit_data
* emit_data
)
2334 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2337 /* TGSI_OPCODE_DSLT (CPU Only) */
2340 const struct lp_build_tgsi_action
* action
,
2341 struct lp_build_tgsi_context
* bld_base
,
2342 struct lp_build_emit_data
* emit_data
)
2344 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2347 /* TGSI_OPCODE_DSNE (CPU Only) */
2350 const struct lp_build_tgsi_action
* action
,
2351 struct lp_build_tgsi_context
* bld_base
,
2352 struct lp_build_emit_data
* emit_data
)
2354 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2357 /* Double Reciprocal squareroot (CPU Only) */
2359 drecip_sqrt_emit_cpu(
2360 const struct lp_build_tgsi_action
* action
,
2361 struct lp_build_tgsi_context
* bld_base
,
2362 struct lp_build_emit_data
* emit_data
)
2364 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->dbl_bld
,
2365 emit_data
->args
[0]);
2368 /* Double Squareroot (CPU Only) */
2371 const struct lp_build_tgsi_action
* action
,
2372 struct lp_build_tgsi_context
* bld_base
,
2373 struct lp_build_emit_data
* emit_data
)
2375 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->dbl_bld
,
2376 emit_data
->args
[0]);
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 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int64_bld
,
2386 emit_data
->args
[0]);
2391 const struct lp_build_tgsi_action
* action
,
2392 struct lp_build_tgsi_context
* bld_base
,
2393 struct lp_build_emit_data
* emit_data
)
2395 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int64_bld
,
2396 emit_data
->args
[0]);
2401 const struct lp_build_tgsi_action
* action
,
2402 struct lp_build_tgsi_context
* bld_base
,
2403 struct lp_build_emit_data
* emit_data
)
2405 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int64_bld
,
2406 bld_base
->int64_bld
.zero
,
2407 emit_data
->args
[0]);
2412 const struct lp_build_tgsi_action
* action
,
2413 struct lp_build_tgsi_context
* bld_base
,
2414 struct lp_build_emit_data
* emit_data
,
2417 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2418 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint64_bld
, pipe_func
,
2419 emit_data
->args
[0], emit_data
->args
[1]);
2420 /* arguments were 64 bit but store as 32 bit */
2421 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2422 emit_data
->output
[emit_data
->chan
] = cond
;
2427 const struct lp_build_tgsi_action
* action
,
2428 struct lp_build_tgsi_context
* bld_base
,
2429 struct lp_build_emit_data
* emit_data
)
2431 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2436 const struct lp_build_tgsi_action
* action
,
2437 struct lp_build_tgsi_context
* bld_base
,
2438 struct lp_build_emit_data
* emit_data
)
2440 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2445 const struct lp_build_tgsi_action
* action
,
2446 struct lp_build_tgsi_context
* bld_base
,
2447 struct lp_build_emit_data
* emit_data
)
2449 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2454 const struct lp_build_tgsi_action
* action
,
2455 struct lp_build_tgsi_context
* bld_base
,
2456 struct lp_build_emit_data
* emit_data
)
2458 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2463 const struct lp_build_tgsi_action
* action
,
2464 struct lp_build_tgsi_context
* bld_base
,
2465 struct lp_build_emit_data
* emit_data
,
2468 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2469 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int64_bld
, pipe_func
,
2470 emit_data
->args
[0], emit_data
->args
[1]);
2471 /* arguments were 64 bit but store as 32 bit */
2472 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2473 emit_data
->output
[emit_data
->chan
] = cond
;
2478 const struct lp_build_tgsi_action
* action
,
2479 struct lp_build_tgsi_context
* bld_base
,
2480 struct lp_build_emit_data
* emit_data
)
2482 i64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2487 const struct lp_build_tgsi_action
* action
,
2488 struct lp_build_tgsi_context
* bld_base
,
2489 struct lp_build_emit_data
* emit_data
)
2491 i64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2496 const struct lp_build_tgsi_action
* action
,
2497 struct lp_build_tgsi_context
* bld_base
,
2498 struct lp_build_emit_data
* emit_data
)
2500 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint64_bld
,
2501 emit_data
->args
[0], emit_data
->args
[1]);
2506 const struct lp_build_tgsi_action
* action
,
2507 struct lp_build_tgsi_context
* bld_base
,
2508 struct lp_build_emit_data
* emit_data
)
2510 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint64_bld
,
2511 emit_data
->args
[0], emit_data
->args
[1]);
2516 const struct lp_build_tgsi_action
* action
,
2517 struct lp_build_tgsi_context
* bld_base
,
2518 struct lp_build_emit_data
* emit_data
)
2520 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int64_bld
,
2521 emit_data
->args
[0], emit_data
->args
[1]);
2526 const struct lp_build_tgsi_action
* action
,
2527 struct lp_build_tgsi_context
* bld_base
,
2528 struct lp_build_emit_data
* emit_data
)
2530 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int64_bld
,
2531 emit_data
->args
[0], emit_data
->args
[1]);
2536 const struct lp_build_tgsi_action
* action
,
2537 struct lp_build_tgsi_context
* bld_base
,
2538 struct lp_build_emit_data
* emit_data
)
2540 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint64_bld
,
2541 emit_data
->args
[0], emit_data
->args
[1]);
2546 const struct lp_build_tgsi_action
* action
,
2547 struct lp_build_tgsi_context
* bld_base
,
2548 struct lp_build_emit_data
* emit_data
)
2550 struct lp_build_context
*uint_bld
= &bld_base
->uint64_bld
;
2551 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2552 uint_bld
->type
.width
- 1);
2553 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2554 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
2560 const struct lp_build_tgsi_action
* action
,
2561 struct lp_build_tgsi_context
* bld_base
,
2562 struct lp_build_emit_data
* emit_data
)
2564 struct lp_build_context
*int_bld
= &bld_base
->int64_bld
;
2565 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
2566 int_bld
->type
.width
- 1);
2567 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
2568 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
2574 const struct lp_build_tgsi_action
* action
,
2575 struct lp_build_tgsi_context
* bld_base
,
2576 struct lp_build_emit_data
* emit_data
)
2578 struct lp_build_context
*uint_bld
= &bld_base
->uint64_bld
;
2579 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2580 uint_bld
->type
.width
- 1);
2581 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2582 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
2587 lp_set_default_actions_cpu(
2588 struct lp_build_tgsi_context
* bld_base
)
2590 lp_set_default_actions(bld_base
);
2591 bld_base
->op_actions
[TGSI_OPCODE_ABS
].emit
= abs_emit_cpu
;
2592 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit_cpu
;
2593 bld_base
->op_actions
[TGSI_OPCODE_AND
].emit
= and_emit_cpu
;
2594 bld_base
->op_actions
[TGSI_OPCODE_ARL
].emit
= arl_emit_cpu
;
2595 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit_cpu
;
2596 bld_base
->op_actions
[TGSI_OPCODE_CEIL
].emit
= ceil_emit_cpu
;
2597 bld_base
->op_actions
[TGSI_OPCODE_COS
].emit
= cos_emit_cpu
;
2598 bld_base
->op_actions
[TGSI_OPCODE_CMP
].emit
= cmp_emit_cpu
;
2599 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= div_emit_cpu
;
2600 bld_base
->op_actions
[TGSI_OPCODE_EX2
].emit
= ex2_emit_cpu
;
2601 bld_base
->op_actions
[TGSI_OPCODE_F2I
].emit
= f2i_emit_cpu
;
2602 bld_base
->op_actions
[TGSI_OPCODE_FLR
].emit
= flr_emit_cpu
;
2603 bld_base
->op_actions
[TGSI_OPCODE_FSEQ
].emit
= fseq_emit_cpu
;
2604 bld_base
->op_actions
[TGSI_OPCODE_FSGE
].emit
= fsge_emit_cpu
;
2605 bld_base
->op_actions
[TGSI_OPCODE_FSLT
].emit
= fslt_emit_cpu
;
2606 bld_base
->op_actions
[TGSI_OPCODE_FSNE
].emit
= fsne_emit_cpu
;
2608 bld_base
->op_actions
[TGSI_OPCODE_I2F
].emit
= i2f_emit_cpu
;
2609 bld_base
->op_actions
[TGSI_OPCODE_IABS
].emit
= iabs_emit_cpu
;
2610 bld_base
->op_actions
[TGSI_OPCODE_IDIV
].emit
= idiv_emit_cpu
;
2611 bld_base
->op_actions
[TGSI_OPCODE_INEG
].emit
= ineg_emit_cpu
;
2612 bld_base
->op_actions
[TGSI_OPCODE_IMAX
].emit
= imax_emit_cpu
;
2613 bld_base
->op_actions
[TGSI_OPCODE_IMIN
].emit
= imin_emit_cpu
;
2614 bld_base
->op_actions
[TGSI_OPCODE_ISGE
].emit
= isge_emit_cpu
;
2615 bld_base
->op_actions
[TGSI_OPCODE_ISHR
].emit
= ishr_emit_cpu
;
2616 bld_base
->op_actions
[TGSI_OPCODE_ISLT
].emit
= islt_emit_cpu
;
2617 bld_base
->op_actions
[TGSI_OPCODE_ISSG
].emit
= issg_emit_cpu
;
2618 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit_cpu
;
2619 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit_cpu
;
2621 bld_base
->op_actions
[TGSI_OPCODE_LG2
].emit
= lg2_emit_cpu
;
2622 bld_base
->op_actions
[TGSI_OPCODE_LOG
].emit
= log_emit_cpu
;
2623 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit_cpu
;
2624 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= max_emit_cpu
;
2625 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= min_emit_cpu
;
2626 bld_base
->op_actions
[TGSI_OPCODE_MOD
].emit
= mod_emit_cpu
;
2627 bld_base
->op_actions
[TGSI_OPCODE_NOT
].emit
= not_emit_cpu
;
2628 bld_base
->op_actions
[TGSI_OPCODE_OR
].emit
= or_emit_cpu
;
2629 bld_base
->op_actions
[TGSI_OPCODE_POW
].emit
= pow_emit_cpu
;
2630 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit_cpu
;
2631 bld_base
->op_actions
[TGSI_OPCODE_ROUND
].emit
= round_emit_cpu
;
2632 bld_base
->op_actions
[TGSI_OPCODE_SEQ
].emit
= seq_emit_cpu
;
2633 bld_base
->op_actions
[TGSI_OPCODE_SGE
].emit
= sge_emit_cpu
;
2634 bld_base
->op_actions
[TGSI_OPCODE_SGT
].emit
= sgt_emit_cpu
;
2635 bld_base
->op_actions
[TGSI_OPCODE_SIN
].emit
= sin_emit_cpu
;
2636 bld_base
->op_actions
[TGSI_OPCODE_SHL
].emit
= shl_emit_cpu
;
2637 bld_base
->op_actions
[TGSI_OPCODE_SLE
].emit
= sle_emit_cpu
;
2638 bld_base
->op_actions
[TGSI_OPCODE_SLT
].emit
= slt_emit_cpu
;
2639 bld_base
->op_actions
[TGSI_OPCODE_SNE
].emit
= sne_emit_cpu
;
2640 bld_base
->op_actions
[TGSI_OPCODE_SSG
].emit
= ssg_emit_cpu
;
2641 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit_cpu
;
2642 bld_base
->op_actions
[TGSI_OPCODE_TRUNC
].emit
= trunc_emit_cpu
;
2644 bld_base
->rsq_action
.emit
= recip_sqrt_emit_cpu
;
2645 bld_base
->sqrt_action
.emit
= sqrt_emit_cpu
;
2647 bld_base
->op_actions
[TGSI_OPCODE_UADD
].emit
= uadd_emit_cpu
;
2648 bld_base
->op_actions
[TGSI_OPCODE_UCMP
].emit
= ucmp_emit_cpu
;
2649 bld_base
->op_actions
[TGSI_OPCODE_UDIV
].emit
= udiv_emit_cpu
;
2650 bld_base
->op_actions
[TGSI_OPCODE_UMAX
].emit
= umax_emit_cpu
;
2651 bld_base
->op_actions
[TGSI_OPCODE_UMIN
].emit
= umin_emit_cpu
;
2652 bld_base
->op_actions
[TGSI_OPCODE_UMOD
].emit
= umod_emit_cpu
;
2653 bld_base
->op_actions
[TGSI_OPCODE_USEQ
].emit
= useq_emit_cpu
;
2654 bld_base
->op_actions
[TGSI_OPCODE_USGE
].emit
= usge_emit_cpu
;
2655 bld_base
->op_actions
[TGSI_OPCODE_USHR
].emit
= ushr_emit_cpu
;
2656 bld_base
->op_actions
[TGSI_OPCODE_USLT
].emit
= uslt_emit_cpu
;
2657 bld_base
->op_actions
[TGSI_OPCODE_USNE
].emit
= usne_emit_cpu
;
2659 bld_base
->op_actions
[TGSI_OPCODE_XOR
].emit
= xor_emit_cpu
;
2661 bld_base
->op_actions
[TGSI_OPCODE_DABS
].emit
= dabs_emit_cpu
;
2662 bld_base
->op_actions
[TGSI_OPCODE_DNEG
].emit
= dneg_emit_cpu
;
2663 bld_base
->op_actions
[TGSI_OPCODE_DSEQ
].emit
= dseq_emit_cpu
;
2664 bld_base
->op_actions
[TGSI_OPCODE_DSGE
].emit
= dsge_emit_cpu
;
2665 bld_base
->op_actions
[TGSI_OPCODE_DSLT
].emit
= dslt_emit_cpu
;
2666 bld_base
->op_actions
[TGSI_OPCODE_DSNE
].emit
= dsne_emit_cpu
;
2668 bld_base
->op_actions
[TGSI_OPCODE_DRSQ
].emit
= drecip_sqrt_emit_cpu
;
2669 bld_base
->op_actions
[TGSI_OPCODE_DSQRT
].emit
= dsqrt_emit_cpu
;
2671 bld_base
->op_actions
[TGSI_OPCODE_I64ABS
].emit
= i64abs_emit_cpu
;
2672 bld_base
->op_actions
[TGSI_OPCODE_I64SSG
].emit
= i64ssg_emit_cpu
;
2673 bld_base
->op_actions
[TGSI_OPCODE_I64NEG
].emit
= i64neg_emit_cpu
;
2675 bld_base
->op_actions
[TGSI_OPCODE_U64SEQ
].emit
= u64seq_emit_cpu
;
2676 bld_base
->op_actions
[TGSI_OPCODE_U64SNE
].emit
= u64sne_emit_cpu
;
2677 bld_base
->op_actions
[TGSI_OPCODE_U64SLT
].emit
= u64slt_emit_cpu
;
2678 bld_base
->op_actions
[TGSI_OPCODE_U64SGE
].emit
= u64sge_emit_cpu
;
2679 bld_base
->op_actions
[TGSI_OPCODE_I64SLT
].emit
= i64slt_emit_cpu
;
2680 bld_base
->op_actions
[TGSI_OPCODE_I64SGE
].emit
= i64sge_emit_cpu
;
2682 bld_base
->op_actions
[TGSI_OPCODE_U64MIN
].emit
= u64min_emit_cpu
;
2683 bld_base
->op_actions
[TGSI_OPCODE_U64MAX
].emit
= u64max_emit_cpu
;
2684 bld_base
->op_actions
[TGSI_OPCODE_I64MIN
].emit
= i64min_emit_cpu
;
2685 bld_base
->op_actions
[TGSI_OPCODE_I64MAX
].emit
= i64max_emit_cpu
;
2687 bld_base
->op_actions
[TGSI_OPCODE_U64ADD
].emit
= u64add_emit_cpu
;
2688 bld_base
->op_actions
[TGSI_OPCODE_U64MOD
].emit
= u64mod_emit_cpu
;
2689 bld_base
->op_actions
[TGSI_OPCODE_I64MOD
].emit
= i64mod_emit_cpu
;
2690 bld_base
->op_actions
[TGSI_OPCODE_U64DIV
].emit
= u64div_emit_cpu
;
2691 bld_base
->op_actions
[TGSI_OPCODE_I64DIV
].emit
= i64div_emit_cpu
;
2693 bld_base
->op_actions
[TGSI_OPCODE_U64SHL
].emit
= u64shl_emit_cpu
;
2694 bld_base
->op_actions
[TGSI_OPCODE_I64SHR
].emit
= i64shr_emit_cpu
;
2695 bld_base
->op_actions
[TGSI_OPCODE_U64SHR
].emit
= u64shr_emit_cpu
;