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 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
846 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
847 struct lp_type type
= int_bld
->type
;
848 LLVMValueRef src0
, src1
;
852 assert(type
.width
== 32);
854 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
855 src0
= LLVMBuildSExt(builder
, emit_data
->args
[0], typeRef
, "");
856 src1
= LLVMBuildSExt(builder
, emit_data
->args
[1], typeRef
, "");
857 dst64
= LLVMBuildMul(builder
, src0
, src1
, "");
858 dst64
= LLVMBuildAShr(
860 lp_build_const_vec(bld_base
->base
.gallivm
, type
, 32), "");
862 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
863 emit_data
->output
[emit_data
->chan
] =
864 LLVMBuildTrunc(builder
, dst64
, typeRef
, "");
867 /* TGSI_OPCODE_UMUL_HI */
870 const struct lp_build_tgsi_action
* action
,
871 struct lp_build_tgsi_context
* bld_base
,
872 struct lp_build_emit_data
* emit_data
)
874 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
875 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
876 struct lp_type type
= uint_bld
->type
;
877 LLVMValueRef src0
, src1
;
881 assert(type
.width
== 32);
883 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
884 src0
= LLVMBuildZExt(builder
, emit_data
->args
[0], typeRef
, "");
885 src1
= LLVMBuildZExt(builder
, emit_data
->args
[1], typeRef
, "");
886 dst64
= LLVMBuildMul(builder
, src0
, src1
, "");
887 dst64
= LLVMBuildLShr(
889 lp_build_const_vec(bld_base
->base
.gallivm
, type
, 32), "");
891 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
892 emit_data
->output
[emit_data
->chan
] =
893 LLVMBuildTrunc(builder
, dst64
, typeRef
, "");
896 /* TGSI_OPCODE_MAX */
897 static void fmax_emit(
898 const struct lp_build_tgsi_action
* action
,
899 struct lp_build_tgsi_context
* bld_base
,
900 struct lp_build_emit_data
* emit_data
)
902 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
903 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
904 LLVMBuildFCmp(builder
, LLVMRealUGE
,
905 emit_data
->args
[0], emit_data
->args
[1], ""),
906 emit_data
->args
[0], emit_data
->args
[1], "");
909 /* TGSI_OPCODE_MIN */
910 static void fmin_emit(
911 const struct lp_build_tgsi_action
* action
,
912 struct lp_build_tgsi_context
* bld_base
,
913 struct lp_build_emit_data
* emit_data
)
915 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
916 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
917 LLVMBuildFCmp(builder
, LLVMRealUGE
,
918 emit_data
->args
[0], emit_data
->args
[1], ""),
919 emit_data
->args
[1], emit_data
->args
[0], "");
922 /* TGSI_OPCODE_XPD */
926 struct lp_build_tgsi_context
* bld_base
,
927 struct lp_build_emit_data
* emit_data
)
929 dp_fetch_args(bld_base
, emit_data
, 3);
937 struct lp_build_tgsi_context
* bld_base
,
943 LLVMValueRef tmp0
, tmp1
;
945 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, a
, b
);
946 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, c
, d
);
948 return lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_SUB
, tmp0
, tmp1
);
953 const struct lp_build_tgsi_action
* action
,
954 struct lp_build_tgsi_context
* bld_base
,
955 struct lp_build_emit_data
* emit_data
)
957 emit_data
->output
[TGSI_CHAN_X
] = xpd_helper(bld_base
,
958 emit_data
->args
[1] /* src0.y */, emit_data
->args
[5] /* src1.z */,
959 emit_data
->args
[4] /* src1.y */, emit_data
->args
[2] /* src0.z */);
961 emit_data
->output
[TGSI_CHAN_Y
] = xpd_helper(bld_base
,
962 emit_data
->args
[2] /* src0.z */, emit_data
->args
[3] /* src1.x */,
963 emit_data
->args
[5] /* src1.z */, emit_data
->args
[0] /* src0.x */);
965 emit_data
->output
[TGSI_CHAN_Z
] = xpd_helper(bld_base
,
966 emit_data
->args
[0] /* src0.x */, emit_data
->args
[4] /* src1.y */,
967 emit_data
->args
[3] /* src1.x */, emit_data
->args
[1] /* src0.y */);
969 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
972 const struct lp_build_tgsi_action xpd_action
= {
973 xpd_fetch_args
, /* fetch_args */
977 /* TGSI_OPCODE_D2F */
980 const struct lp_build_tgsi_action
* action
,
981 struct lp_build_tgsi_context
* bld_base
,
982 struct lp_build_emit_data
* emit_data
)
984 emit_data
->output
[emit_data
->chan
] =
985 LLVMBuildFPTrunc(bld_base
->base
.gallivm
->builder
,
987 bld_base
->base
.vec_type
, "");
990 /* TGSI_OPCODE_D2I */
993 const struct lp_build_tgsi_action
* action
,
994 struct lp_build_tgsi_context
* bld_base
,
995 struct lp_build_emit_data
* emit_data
)
997 emit_data
->output
[emit_data
->chan
] =
998 LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
,
1000 bld_base
->base
.int_vec_type
, "");
1003 /* TGSI_OPCODE_D2U */
1006 const struct lp_build_tgsi_action
* action
,
1007 struct lp_build_tgsi_context
* bld_base
,
1008 struct lp_build_emit_data
* emit_data
)
1010 emit_data
->output
[emit_data
->chan
] =
1011 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
1013 bld_base
->base
.int_vec_type
, "");
1016 /* TGSI_OPCODE_F2D */
1019 const struct lp_build_tgsi_action
* action
,
1020 struct lp_build_tgsi_context
* bld_base
,
1021 struct lp_build_emit_data
* emit_data
)
1023 emit_data
->output
[emit_data
->chan
] =
1024 LLVMBuildFPExt(bld_base
->base
.gallivm
->builder
,
1026 bld_base
->dbl_bld
.vec_type
, "");
1029 /* TGSI_OPCODE_U2D */
1032 const struct lp_build_tgsi_action
* action
,
1033 struct lp_build_tgsi_context
* bld_base
,
1034 struct lp_build_emit_data
* emit_data
)
1036 emit_data
->output
[emit_data
->chan
] =
1037 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1039 bld_base
->dbl_bld
.vec_type
, "");
1042 /* TGSI_OPCODE_I2D */
1045 const struct lp_build_tgsi_action
* action
,
1046 struct lp_build_tgsi_context
* bld_base
,
1047 struct lp_build_emit_data
* emit_data
)
1049 emit_data
->output
[emit_data
->chan
] =
1050 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1052 bld_base
->dbl_bld
.vec_type
, "");
1055 /* TGSI_OPCODE_DMAD */
1058 const struct lp_build_tgsi_action
* action
,
1059 struct lp_build_tgsi_context
* bld_base
,
1060 struct lp_build_emit_data
* emit_data
)
1063 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_DMUL
,
1065 emit_data
->args
[1]);
1066 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
1067 TGSI_OPCODE_DADD
, tmp
, emit_data
->args
[2]);
1070 /*.TGSI_OPCODE_DRCP.*/
1071 static void drcp_emit(
1072 const struct lp_build_tgsi_action
* action
,
1073 struct lp_build_tgsi_context
* bld_base
,
1074 struct lp_build_emit_data
* emit_data
)
1077 one
= lp_build_const_vec(bld_base
->dbl_bld
.gallivm
, bld_base
->dbl_bld
.type
, 1.0f
);
1078 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
1079 bld_base
->base
.gallivm
->builder
,
1080 one
, emit_data
->args
[0], "");
1083 /* TGSI_OPCODE_DFRAC */
1084 static void dfrac_emit(
1085 const struct lp_build_tgsi_action
* action
,
1086 struct lp_build_tgsi_context
* bld_base
,
1087 struct lp_build_emit_data
* emit_data
)
1090 tmp
= lp_build_floor(&bld_base
->dbl_bld
,
1091 emit_data
->args
[0]);
1092 emit_data
->output
[emit_data
->chan
] = LLVMBuildFSub(bld_base
->base
.gallivm
->builder
,
1093 emit_data
->args
[0], tmp
, "");
1097 lp_set_default_actions(struct lp_build_tgsi_context
* bld_base
)
1099 bld_base
->op_actions
[TGSI_OPCODE_DP2
] = dp2_action
;
1100 bld_base
->op_actions
[TGSI_OPCODE_DP3
] = dp3_action
;
1101 bld_base
->op_actions
[TGSI_OPCODE_DP4
] = dp4_action
;
1102 bld_base
->op_actions
[TGSI_OPCODE_DP2A
] = dp2a_action
;
1103 bld_base
->op_actions
[TGSI_OPCODE_DPH
] = dph_action
;
1104 bld_base
->op_actions
[TGSI_OPCODE_DST
] = dst_action
;
1105 bld_base
->op_actions
[TGSI_OPCODE_EXP
] = exp_action
;
1106 bld_base
->op_actions
[TGSI_OPCODE_LIT
] = lit_action
;
1107 bld_base
->op_actions
[TGSI_OPCODE_LOG
] = log_action
;
1108 bld_base
->op_actions
[TGSI_OPCODE_PK2H
] = pk2h_action
;
1109 bld_base
->op_actions
[TGSI_OPCODE_RSQ
] = rsq_action
;
1110 bld_base
->op_actions
[TGSI_OPCODE_SQRT
] = sqrt_action
;
1111 bld_base
->op_actions
[TGSI_OPCODE_POW
] = pow_action
;
1112 bld_base
->op_actions
[TGSI_OPCODE_SCS
] = scs_action
;
1113 bld_base
->op_actions
[TGSI_OPCODE_UP2H
] = up2h_action
;
1114 bld_base
->op_actions
[TGSI_OPCODE_XPD
] = xpd_action
;
1116 bld_base
->op_actions
[TGSI_OPCODE_BREAKC
].fetch_args
= scalar_unary_fetch_args
;
1117 bld_base
->op_actions
[TGSI_OPCODE_SWITCH
].fetch_args
= scalar_unary_fetch_args
;
1118 bld_base
->op_actions
[TGSI_OPCODE_CASE
].fetch_args
= scalar_unary_fetch_args
;
1119 bld_base
->op_actions
[TGSI_OPCODE_COS
].fetch_args
= scalar_unary_fetch_args
;
1120 bld_base
->op_actions
[TGSI_OPCODE_EX2
].fetch_args
= scalar_unary_fetch_args
;
1121 bld_base
->op_actions
[TGSI_OPCODE_IF
].fetch_args
= scalar_unary_fetch_args
;
1122 bld_base
->op_actions
[TGSI_OPCODE_UIF
].fetch_args
= scalar_unary_fetch_args
;
1123 bld_base
->op_actions
[TGSI_OPCODE_KILL_IF
].fetch_args
= kil_fetch_args
;
1124 bld_base
->op_actions
[TGSI_OPCODE_KILL
].fetch_args
= kilp_fetch_args
;
1125 bld_base
->op_actions
[TGSI_OPCODE_RCP
].fetch_args
= scalar_unary_fetch_args
;
1126 bld_base
->op_actions
[TGSI_OPCODE_SIN
].fetch_args
= scalar_unary_fetch_args
;
1127 bld_base
->op_actions
[TGSI_OPCODE_LG2
].fetch_args
= scalar_unary_fetch_args
;
1129 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit
;
1130 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit
;
1131 bld_base
->op_actions
[TGSI_OPCODE_CLAMP
].emit
= clamp_emit
;
1132 bld_base
->op_actions
[TGSI_OPCODE_END
].emit
= end_emit
;
1133 bld_base
->op_actions
[TGSI_OPCODE_FRC
].emit
= frc_emit
;
1134 bld_base
->op_actions
[TGSI_OPCODE_LRP
].emit
= lrp_emit
;
1135 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit
;
1136 bld_base
->op_actions
[TGSI_OPCODE_MOV
].emit
= mov_emit
;
1137 bld_base
->op_actions
[TGSI_OPCODE_MUL
].emit
= mul_emit
;
1138 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= fdiv_emit
;
1139 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit
;
1140 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit
;
1142 bld_base
->op_actions
[TGSI_OPCODE_UARL
].emit
= mov_emit
;
1143 bld_base
->op_actions
[TGSI_OPCODE_F2U
].emit
= f2u_emit
;
1144 bld_base
->op_actions
[TGSI_OPCODE_U2F
].emit
= u2f_emit
;
1145 bld_base
->op_actions
[TGSI_OPCODE_UMAD
].emit
= umad_emit
;
1146 bld_base
->op_actions
[TGSI_OPCODE_UMUL
].emit
= umul_emit
;
1147 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit
;
1148 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit
;
1150 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= fmax_emit
;
1151 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= fmin_emit
;
1153 bld_base
->op_actions
[TGSI_OPCODE_DADD
].emit
= add_emit
;
1154 bld_base
->op_actions
[TGSI_OPCODE_DMAX
].emit
= fmax_emit
;
1155 bld_base
->op_actions
[TGSI_OPCODE_DMIN
].emit
= fmin_emit
;
1156 bld_base
->op_actions
[TGSI_OPCODE_DMUL
].emit
= mul_emit
;
1158 bld_base
->op_actions
[TGSI_OPCODE_D2F
].emit
= d2f_emit
;
1159 bld_base
->op_actions
[TGSI_OPCODE_D2I
].emit
= d2i_emit
;
1160 bld_base
->op_actions
[TGSI_OPCODE_D2U
].emit
= d2u_emit
;
1162 bld_base
->op_actions
[TGSI_OPCODE_F2D
].emit
= f2d_emit
;
1163 bld_base
->op_actions
[TGSI_OPCODE_I2D
].emit
= i2d_emit
;
1164 bld_base
->op_actions
[TGSI_OPCODE_U2D
].emit
= u2d_emit
;
1166 bld_base
->op_actions
[TGSI_OPCODE_DMAD
].emit
= dmad_emit
;
1168 bld_base
->op_actions
[TGSI_OPCODE_DRCP
].emit
= drcp_emit
;
1169 bld_base
->op_actions
[TGSI_OPCODE_DFRAC
].emit
= dfrac_emit
;
1173 /* CPU Only default actions */
1175 /* These actions are CPU only, because they could potentially output SSE
1179 /* TGSI_OPCODE_ABS (CPU Only)*/
1183 const struct lp_build_tgsi_action
* action
,
1184 struct lp_build_tgsi_context
* bld_base
,
1185 struct lp_build_emit_data
* emit_data
)
1187 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->base
,
1188 emit_data
->args
[0]);
1191 /* TGSI_OPCODE_ADD (CPU Only) */
1194 const struct lp_build_tgsi_action
* action
,
1195 struct lp_build_tgsi_context
* bld_base
,
1196 struct lp_build_emit_data
* emit_data
)
1198 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->base
,
1199 emit_data
->args
[0], emit_data
->args
[1]);
1202 /* TGSI_OPCODE_AND (CPU Only) */
1205 const struct lp_build_tgsi_action
* action
,
1206 struct lp_build_tgsi_context
* bld_base
,
1207 struct lp_build_emit_data
* emit_data
)
1209 emit_data
->output
[emit_data
->chan
] = lp_build_and(&bld_base
->uint_bld
,
1210 emit_data
->args
[0], emit_data
->args
[1]);
1213 /* TGSI_OPCODE_ARL (CPU Only) */
1216 const struct lp_build_tgsi_action
* action
,
1217 struct lp_build_tgsi_context
* bld_base
,
1218 struct lp_build_emit_data
* emit_data
)
1221 tmp
= lp_build_floor(&bld_base
->base
,
1222 emit_data
->args
[0]);
1223 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
1224 bld_base
->uint_bld
.vec_type
, "");
1227 /* TGSI_OPCODE_ARR (CPU Only) */
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
] = lp_build_iround(&bld_base
->base
, emit_data
->args
[0]);
1237 /* TGSI_OPCODE_CEIL (CPU Only) */
1240 const struct lp_build_tgsi_action
* action
,
1241 struct lp_build_tgsi_context
* bld_base
,
1242 struct lp_build_emit_data
* emit_data
)
1244 emit_data
->output
[emit_data
->chan
] = lp_build_ceil(&bld_base
->base
,
1245 emit_data
->args
[0]);
1248 /* TGSI_OPCODE_CMP (CPU Only) */
1251 const struct lp_build_tgsi_action
* action
,
1252 struct lp_build_tgsi_context
* bld_base
,
1253 struct lp_build_emit_data
* emit_data
)
1255 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_LESS
,
1256 emit_data
->args
[0], bld_base
->base
.zero
);
1257 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1258 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1261 /* TGSI_OPCODE_UCMP (CPU Only) */
1264 const struct lp_build_tgsi_action
* action
,
1265 struct lp_build_tgsi_context
* bld_base
,
1266 struct lp_build_emit_data
* emit_data
)
1268 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1269 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1270 LLVMValueRef unsigned_cond
=
1271 LLVMBuildBitCast(builder
, emit_data
->args
[0], uint_bld
->vec_type
, "");
1272 LLVMValueRef cond
= lp_build_cmp(uint_bld
, PIPE_FUNC_NOTEQUAL
,
1275 emit_data
->output
[emit_data
->chan
] =
1276 lp_build_select(&bld_base
->base
,
1277 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1280 /* TGSI_OPCODE_COS (CPU Only) */
1283 const struct lp_build_tgsi_action
* action
,
1284 struct lp_build_tgsi_context
* bld_base
,
1285 struct lp_build_emit_data
* emit_data
)
1287 emit_data
->output
[emit_data
->chan
] = lp_build_cos(&bld_base
->base
,
1288 emit_data
->args
[0]);
1291 /* TGSI_OPCODE_DIV (CPU Only) */
1294 const struct lp_build_tgsi_action
* action
,
1295 struct lp_build_tgsi_context
* bld_base
,
1296 struct lp_build_emit_data
* emit_data
)
1298 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->base
,
1299 emit_data
->args
[0], emit_data
->args
[1]);
1302 /* TGSI_OPCODE_EX2 (CPU Only) */
1305 const struct lp_build_tgsi_action
* action
,
1306 struct lp_build_tgsi_context
* bld_base
,
1307 struct lp_build_emit_data
* emit_data
)
1309 emit_data
->output
[emit_data
->chan
] = lp_build_exp2(&bld_base
->base
,
1310 emit_data
->args
[0]);
1313 /* TGSI_OPCODE_F2I (CPU Only) */
1316 const struct lp_build_tgsi_action
* action
,
1317 struct lp_build_tgsi_context
* bld_base
,
1318 struct lp_build_emit_data
* emit_data
)
1320 emit_data
->output
[emit_data
->chan
] = lp_build_itrunc(&bld_base
->base
,
1321 emit_data
->args
[0]);
1324 /* TGSI_OPCODE_FSET Helper (CPU Only) */
1327 const struct lp_build_tgsi_action
* action
,
1328 struct lp_build_tgsi_context
* bld_base
,
1329 struct lp_build_emit_data
* emit_data
,
1334 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1335 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1336 emit_data
->args
[0], emit_data
->args
[1]);
1339 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1340 emit_data
->args
[0], emit_data
->args
[1]);
1343 emit_data
->output
[emit_data
->chan
] = cond
;
1347 /* TGSI_OPCODE_FSEQ (CPU Only) */
1350 const struct lp_build_tgsi_action
* action
,
1351 struct lp_build_tgsi_context
* bld_base
,
1352 struct lp_build_emit_data
* emit_data
)
1354 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1357 /* TGSI_OPCODE_ISGE (CPU Only) */
1360 const struct lp_build_tgsi_action
* action
,
1361 struct lp_build_tgsi_context
* bld_base
,
1362 struct lp_build_emit_data
* emit_data
)
1364 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1367 /* TGSI_OPCODE_ISLT (CPU Only) */
1370 const struct lp_build_tgsi_action
* action
,
1371 struct lp_build_tgsi_context
* bld_base
,
1372 struct lp_build_emit_data
* emit_data
)
1374 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1377 /* TGSI_OPCODE_USNE (CPU Only) */
1381 const struct lp_build_tgsi_action
* action
,
1382 struct lp_build_tgsi_context
* bld_base
,
1383 struct lp_build_emit_data
* emit_data
)
1385 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1388 /* TGSI_OPCODE_FLR (CPU Only) */
1392 const struct lp_build_tgsi_action
* action
,
1393 struct lp_build_tgsi_context
* bld_base
,
1394 struct lp_build_emit_data
* emit_data
)
1396 emit_data
->output
[emit_data
->chan
] = lp_build_floor(&bld_base
->base
,
1397 emit_data
->args
[0]);
1400 /* TGSI_OPCODE_I2F (CPU Only) */
1403 const struct lp_build_tgsi_action
* action
,
1404 struct lp_build_tgsi_context
* bld_base
,
1405 struct lp_build_emit_data
* emit_data
)
1407 emit_data
->output
[emit_data
->chan
] = lp_build_int_to_float(&bld_base
->base
,
1408 emit_data
->args
[0]);
1411 /* TGSI_OPCODE_IABS (CPU Only) */
1414 const struct lp_build_tgsi_action
* action
,
1415 struct lp_build_tgsi_context
* bld_base
,
1416 struct lp_build_emit_data
* emit_data
)
1418 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int_bld
,
1419 emit_data
->args
[0]);
1422 /* TGSI_OPCODE_IDIV (CPU Only) */
1425 const struct lp_build_tgsi_action
* action
,
1426 struct lp_build_tgsi_context
* bld_base
,
1427 struct lp_build_emit_data
* emit_data
)
1429 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1430 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1431 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1432 bld_base
->uint_bld
.zero
);
1433 /* We want to make sure that we never divide/mod by zero to not
1434 * generate sigfpe. We don't want to crash just because the
1435 * shader is doing something weird. */
1436 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1438 emit_data
->args
[1], "");
1439 LLVMValueRef result
= lp_build_div(&bld_base
->int_bld
,
1440 emit_data
->args
[0], divisor
);
1441 LLVMValueRef not_div_mask
= LLVMBuildNot(builder
,
1443 /* idiv by zero doesn't have a guaranteed return value chose 0 for now. */
1444 emit_data
->output
[emit_data
->chan
] = LLVMBuildAnd(builder
,
1449 /* TGSI_OPCODE_INEG (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
)
1456 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int_bld
,
1457 bld_base
->int_bld
.zero
,
1458 emit_data
->args
[0]);
1461 /* TGSI_OPCODE_ISET Helper (CPU Only) */
1464 const struct lp_build_tgsi_action
* action
,
1465 struct lp_build_tgsi_context
* bld_base
,
1466 struct lp_build_emit_data
* emit_data
,
1469 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int_bld
, pipe_func
,
1470 emit_data
->args
[0], emit_data
->args
[1]);
1471 emit_data
->output
[emit_data
->chan
] = cond
;
1474 /* TGSI_OPCODE_IMAX (CPU Only) */
1477 const struct lp_build_tgsi_action
* action
,
1478 struct lp_build_tgsi_context
* bld_base
,
1479 struct lp_build_emit_data
* emit_data
)
1481 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int_bld
,
1482 emit_data
->args
[0], emit_data
->args
[1]);
1485 /* TGSI_OPCODE_IMIN (CPU Only) */
1488 const struct lp_build_tgsi_action
* action
,
1489 struct lp_build_tgsi_context
* bld_base
,
1490 struct lp_build_emit_data
* emit_data
)
1492 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int_bld
,
1493 emit_data
->args
[0], emit_data
->args
[1]);
1496 /* TGSI_OPCODE_ISGE (CPU Only) */
1499 const struct lp_build_tgsi_action
* action
,
1500 struct lp_build_tgsi_context
* bld_base
,
1501 struct lp_build_emit_data
* emit_data
)
1503 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1506 /* TGSI_OPCODE_ISHR (CPU Only) */
1509 const struct lp_build_tgsi_action
* action
,
1510 struct lp_build_tgsi_context
* bld_base
,
1511 struct lp_build_emit_data
* emit_data
)
1513 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
1514 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
1515 int_bld
->type
.width
- 1);
1516 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
1517 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
1521 /* TGSI_OPCODE_ISLT (CPU Only) */
1524 const struct lp_build_tgsi_action
* action
,
1525 struct lp_build_tgsi_context
* bld_base
,
1526 struct lp_build_emit_data
* emit_data
)
1528 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1532 /* TGSI_OPCODE_ISSG (CPU Only) */
1535 const struct lp_build_tgsi_action
* action
,
1536 struct lp_build_tgsi_context
* bld_base
,
1537 struct lp_build_emit_data
* emit_data
)
1539 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int_bld
,
1540 emit_data
->args
[0]);
1543 /* TGSI_OPCODE_LG2 (CPU Only) */
1546 const struct lp_build_tgsi_action
* action
,
1547 struct lp_build_tgsi_context
* bld_base
,
1548 struct lp_build_emit_data
* emit_data
)
1550 emit_data
->output
[emit_data
->chan
] = lp_build_log2_safe(&bld_base
->base
,
1551 emit_data
->args
[0]);
1554 /* TGSI_OPCODE_LOG (CPU Only) */
1557 const struct lp_build_tgsi_action
* action
,
1558 struct lp_build_tgsi_context
* bld_base
,
1559 struct lp_build_emit_data
* emit_data
)
1561 LLVMValueRef p_floor_log2
;
1563 LLVMValueRef p_log2
;
1564 LLVMValueRef src0
= emit_data
->args
[0];
1566 lp_build_log2_approx(&bld_base
->base
, src0
,
1567 &p_exp
, &p_floor_log2
, &p_log2
, FALSE
);
1569 emit_data
->output
[TGSI_CHAN_X
] = p_floor_log2
;
1571 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
1574 emit_data
->output
[TGSI_CHAN_Z
] = p_log2
;
1576 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
1580 /* TGSI_OPCODE_MAX (CPU Only) */
1584 const struct lp_build_tgsi_action
* action
,
1585 struct lp_build_tgsi_context
* bld_base
,
1586 struct lp_build_emit_data
* emit_data
)
1588 emit_data
->output
[emit_data
->chan
] =
1589 lp_build_max_ext(&bld_base
->base
,
1590 emit_data
->args
[0], emit_data
->args
[1],
1591 GALLIVM_NAN_RETURN_OTHER
);
1594 /* TGSI_OPCODE_MIN (CPU Only) */
1597 const struct lp_build_tgsi_action
* action
,
1598 struct lp_build_tgsi_context
* bld_base
,
1599 struct lp_build_emit_data
* emit_data
)
1601 emit_data
->output
[emit_data
->chan
] =
1602 lp_build_min_ext(&bld_base
->base
,
1603 emit_data
->args
[0], emit_data
->args
[1],
1604 GALLIVM_NAN_RETURN_OTHER
);
1607 /* TGSI_OPCODE_MOD (CPU Only) */
1610 const struct lp_build_tgsi_action
* action
,
1611 struct lp_build_tgsi_context
* bld_base
,
1612 struct lp_build_emit_data
* emit_data
)
1614 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1615 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1616 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1617 bld_base
->uint_bld
.zero
);
1618 /* We want to make sure that we never divide/mod by zero to not
1619 * generate sigfpe. We don't want to crash just because the
1620 * shader is doing something weird. */
1621 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1623 emit_data
->args
[1], "");
1624 LLVMValueRef result
= lp_build_mod(&bld_base
->int_bld
,
1625 emit_data
->args
[0], divisor
);
1626 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1627 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1632 /* TGSI_OPCODE_NOT */
1635 const struct lp_build_tgsi_action
* action
,
1636 struct lp_build_tgsi_context
* bld_base
,
1637 struct lp_build_emit_data
* emit_data
)
1639 emit_data
->output
[emit_data
->chan
] = lp_build_not(&bld_base
->uint_bld
,
1640 emit_data
->args
[0]);
1643 /* TGSI_OPCODE_OR (CPU Only) */
1646 const struct lp_build_tgsi_action
* action
,
1647 struct lp_build_tgsi_context
* bld_base
,
1648 struct lp_build_emit_data
* emit_data
)
1650 emit_data
->output
[emit_data
->chan
] = lp_build_or(&bld_base
->uint_bld
,
1651 emit_data
->args
[0], emit_data
->args
[1]);
1654 /* TGSI_OPCODE_POW (CPU Only) */
1657 const struct lp_build_tgsi_action
* action
,
1658 struct lp_build_tgsi_context
* bld_base
,
1659 struct lp_build_emit_data
* emit_data
)
1661 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
1662 emit_data
->args
[0], emit_data
->args
[1]);
1666 /* TGSI_OPCODE_RCP (CPU Only) */
1670 const struct lp_build_tgsi_action
* action
,
1671 struct lp_build_tgsi_context
* bld_base
,
1672 struct lp_build_emit_data
* emit_data
)
1674 emit_data
->output
[emit_data
->chan
] = lp_build_rcp(&bld_base
->base
,
1675 emit_data
->args
[0]);
1678 /* Reciprical squareroot (CPU Only) */
1680 recip_sqrt_emit_cpu(
1681 const struct lp_build_tgsi_action
* action
,
1682 struct lp_build_tgsi_context
* bld_base
,
1683 struct lp_build_emit_data
* emit_data
)
1685 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->base
,
1686 emit_data
->args
[0]);
1691 const struct lp_build_tgsi_action
* action
,
1692 struct lp_build_tgsi_context
* bld_base
,
1693 struct lp_build_emit_data
* emit_data
)
1695 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->base
,
1696 emit_data
->args
[0]);
1700 /* TGSI_OPCODE_ROUND (CPU Only) */
1703 const struct lp_build_tgsi_action
* action
,
1704 struct lp_build_tgsi_context
* bld_base
,
1705 struct lp_build_emit_data
* emit_data
)
1707 emit_data
->output
[emit_data
->chan
] = lp_build_round(&bld_base
->base
,
1708 emit_data
->args
[0]);
1711 /* TGSI_OPCODE_SET Helper (CPU Only) */
1715 const struct lp_build_tgsi_action
* action
,
1716 struct lp_build_tgsi_context
* bld_base
,
1717 struct lp_build_emit_data
* emit_data
,
1722 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1723 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1724 emit_data
->args
[0], emit_data
->args
[1]);
1727 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1728 emit_data
->args
[0], emit_data
->args
[1]);
1731 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1734 bld_base
->base
.zero
);
1737 /* TGSI_OPCODE_SEQ (CPU Only) */
1741 const struct lp_build_tgsi_action
* action
,
1742 struct lp_build_tgsi_context
* bld_base
,
1743 struct lp_build_emit_data
* emit_data
)
1745 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1748 /* TGSI_OPCODE_SGE (CPU Only) */
1751 const struct lp_build_tgsi_action
* action
,
1752 struct lp_build_tgsi_context
* bld_base
,
1753 struct lp_build_emit_data
* emit_data
)
1755 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1758 /* TGSI_OPCODE_SGT (CPU Only)*/
1762 const struct lp_build_tgsi_action
* action
,
1763 struct lp_build_tgsi_context
* bld_base
,
1764 struct lp_build_emit_data
* emit_data
)
1766 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GREATER
);
1769 /* TGSI_OPCODE_SHL (CPU Only) */
1772 const struct lp_build_tgsi_action
* action
,
1773 struct lp_build_tgsi_context
* bld_base
,
1774 struct lp_build_emit_data
* emit_data
)
1776 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1777 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
1778 uint_bld
->type
.width
- 1);
1779 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
1780 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
1784 /* TGSI_OPCODE_SIN (CPU Only) */
1787 const struct lp_build_tgsi_action
* action
,
1788 struct lp_build_tgsi_context
* bld_base
,
1789 struct lp_build_emit_data
* emit_data
)
1791 emit_data
->output
[emit_data
->chan
] = lp_build_sin(&bld_base
->base
,
1792 emit_data
->args
[0]);
1795 /* TGSI_OPCODE_SLE (CPU Only) */
1798 const struct lp_build_tgsi_action
* action
,
1799 struct lp_build_tgsi_context
* bld_base
,
1800 struct lp_build_emit_data
* emit_data
)
1802 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LEQUAL
);
1805 /* TGSI_OPCODE_SLT (CPU Only) */
1808 const struct lp_build_tgsi_action
* action
,
1809 struct lp_build_tgsi_context
* bld_base
,
1810 struct lp_build_emit_data
* emit_data
)
1812 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1815 /* TGSI_OPCODE_SNE (CPU Only) */
1819 const struct lp_build_tgsi_action
* action
,
1820 struct lp_build_tgsi_context
* bld_base
,
1821 struct lp_build_emit_data
* emit_data
)
1823 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1826 /* TGSI_OPCODE_SSG (CPU Only) */
1830 const struct lp_build_tgsi_action
* action
,
1831 struct lp_build_tgsi_context
* bld_base
,
1832 struct lp_build_emit_data
* emit_data
)
1834 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->base
,
1835 emit_data
->args
[0]);
1838 /* TGSI_OPCODE_SUB (CPU Only) */
1842 const struct lp_build_tgsi_action
* action
,
1843 struct lp_build_tgsi_context
* bld_base
,
1844 struct lp_build_emit_data
* emit_data
)
1846 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->base
,
1848 emit_data
->args
[1]);
1851 /* TGSI_OPCODE_TRUNC (CPU Only) */
1855 const struct lp_build_tgsi_action
* action
,
1856 struct lp_build_tgsi_context
* bld_base
,
1857 struct lp_build_emit_data
* emit_data
)
1859 emit_data
->output
[emit_data
->chan
] = lp_build_trunc(&bld_base
->base
,
1860 emit_data
->args
[0]);
1863 /* TGSI_OPCODE_UADD (CPU Only) */
1866 const struct lp_build_tgsi_action
* action
,
1867 struct lp_build_tgsi_context
* bld_base
,
1868 struct lp_build_emit_data
* emit_data
)
1870 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint_bld
,
1871 emit_data
->args
[0], emit_data
->args
[1]);
1874 /* TGSI_OPCODE_UDIV (CPU Only) */
1877 const struct lp_build_tgsi_action
* action
,
1878 struct lp_build_tgsi_context
* bld_base
,
1879 struct lp_build_emit_data
* emit_data
)
1882 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1883 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1884 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1885 bld_base
->uint_bld
.zero
);
1886 /* We want to make sure that we never divide/mod by zero to not
1887 * generate sigfpe. We don't want to crash just because the
1888 * shader is doing something weird. */
1889 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1891 emit_data
->args
[1], "");
1892 LLVMValueRef result
= lp_build_div(&bld_base
->uint_bld
,
1893 emit_data
->args
[0], divisor
);
1894 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1895 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1900 /* TGSI_OPCODE_UMAX (CPU Only) */
1903 const struct lp_build_tgsi_action
* action
,
1904 struct lp_build_tgsi_context
* bld_base
,
1905 struct lp_build_emit_data
* emit_data
)
1907 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint_bld
,
1908 emit_data
->args
[0], emit_data
->args
[1]);
1911 /* TGSI_OPCODE_UMIN (CPU Only) */
1914 const struct lp_build_tgsi_action
* action
,
1915 struct lp_build_tgsi_context
* bld_base
,
1916 struct lp_build_emit_data
* emit_data
)
1918 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint_bld
,
1919 emit_data
->args
[0], emit_data
->args
[1]);
1922 /* TGSI_OPCODE_UMOD (CPU Only) */
1925 const struct lp_build_tgsi_action
* action
,
1926 struct lp_build_tgsi_context
* bld_base
,
1927 struct lp_build_emit_data
* emit_data
)
1929 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1930 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1931 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1932 bld_base
->uint_bld
.zero
);
1933 /* We want to make sure that we never divide/mod by zero to not
1934 * generate sigfpe. We don't want to crash just because the
1935 * shader is doing something weird. */
1936 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1938 emit_data
->args
[1], "");
1939 LLVMValueRef result
= lp_build_mod(&bld_base
->uint_bld
,
1940 emit_data
->args
[0], divisor
);
1941 /* umod by zero is guaranteed to return 0xffffffff */
1942 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1947 /* TGSI_OPCODE_USET Helper (CPU Only) */
1950 const struct lp_build_tgsi_action
* action
,
1951 struct lp_build_tgsi_context
* bld_base
,
1952 struct lp_build_emit_data
* emit_data
,
1955 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint_bld
, pipe_func
,
1956 emit_data
->args
[0], emit_data
->args
[1]);
1957 emit_data
->output
[emit_data
->chan
] = cond
;
1961 /* TGSI_OPCODE_USEQ (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
)
1968 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1971 /* TGSI_OPCODE_ISGE (CPU Only) */
1974 const struct lp_build_tgsi_action
* action
,
1975 struct lp_build_tgsi_context
* bld_base
,
1976 struct lp_build_emit_data
* emit_data
)
1978 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1981 /* TGSI_OPCODE_USHR (CPU Only) */
1984 const struct lp_build_tgsi_action
* action
,
1985 struct lp_build_tgsi_context
* bld_base
,
1986 struct lp_build_emit_data
* emit_data
)
1988 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1989 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
1990 uint_bld
->type
.width
- 1);
1991 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
1992 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
1996 /* TGSI_OPCODE_ISLT (CPU Only) */
1999 const struct lp_build_tgsi_action
* action
,
2000 struct lp_build_tgsi_context
* bld_base
,
2001 struct lp_build_emit_data
* emit_data
)
2003 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2006 /* TGSI_OPCODE_USNE (CPU Only) */
2010 const struct lp_build_tgsi_action
* action
,
2011 struct lp_build_tgsi_context
* bld_base
,
2012 struct lp_build_emit_data
* emit_data
)
2014 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2017 /* TGSI_OPCODE_XOR */
2020 const struct lp_build_tgsi_action
* action
,
2021 struct lp_build_tgsi_context
* bld_base
,
2022 struct lp_build_emit_data
* emit_data
)
2024 emit_data
->output
[emit_data
->chan
] = lp_build_xor(&bld_base
->uint_bld
,
2026 emit_data
->args
[1]);
2029 /* TGSI_OPCODE_DABS (CPU Only) */
2032 const struct lp_build_tgsi_action
* action
,
2033 struct lp_build_tgsi_context
* bld_base
,
2034 struct lp_build_emit_data
* emit_data
)
2036 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->dbl_bld
,
2037 emit_data
->args
[0]);
2040 /* TGSI_OPCODE_DNEG (CPU Only) */
2043 const struct lp_build_tgsi_action
* action
,
2044 struct lp_build_tgsi_context
* bld_base
,
2045 struct lp_build_emit_data
* emit_data
)
2047 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->dbl_bld
,
2048 bld_base
->dbl_bld
.zero
,
2049 emit_data
->args
[0]);
2052 /* TGSI_OPCODE_DSET Helper (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
,
2060 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2061 LLVMValueRef cond
= lp_build_cmp(&bld_base
->dbl_bld
, pipe_func
,
2062 emit_data
->args
[0], emit_data
->args
[1]);
2063 /* arguments were 64 bit but store as 32 bit */
2064 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2065 emit_data
->output
[emit_data
->chan
] = cond
;
2068 /* TGSI_OPCODE_DSEQ (CPU Only) */
2071 const struct lp_build_tgsi_action
* action
,
2072 struct lp_build_tgsi_context
* bld_base
,
2073 struct lp_build_emit_data
* emit_data
)
2075 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2078 /* TGSI_OPCODE_DSGE (CPU Only) */
2081 const struct lp_build_tgsi_action
* action
,
2082 struct lp_build_tgsi_context
* bld_base
,
2083 struct lp_build_emit_data
* emit_data
)
2085 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2088 /* TGSI_OPCODE_DSLT (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 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2098 /* TGSI_OPCODE_DSNE (CPU Only) */
2101 const struct lp_build_tgsi_action
* action
,
2102 struct lp_build_tgsi_context
* bld_base
,
2103 struct lp_build_emit_data
* emit_data
)
2105 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2108 /* Double Reciprocal squareroot (CPU Only) */
2110 drecip_sqrt_emit_cpu(
2111 const struct lp_build_tgsi_action
* action
,
2112 struct lp_build_tgsi_context
* bld_base
,
2113 struct lp_build_emit_data
* emit_data
)
2115 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->dbl_bld
,
2116 emit_data
->args
[0]);
2119 /* Double Squareroot (CPU Only) */
2122 const struct lp_build_tgsi_action
* action
,
2123 struct lp_build_tgsi_context
* bld_base
,
2124 struct lp_build_emit_data
* emit_data
)
2126 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->dbl_bld
,
2127 emit_data
->args
[0]);
2131 lp_set_default_actions_cpu(
2132 struct lp_build_tgsi_context
* bld_base
)
2134 lp_set_default_actions(bld_base
);
2135 bld_base
->op_actions
[TGSI_OPCODE_ABS
].emit
= abs_emit_cpu
;
2136 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit_cpu
;
2137 bld_base
->op_actions
[TGSI_OPCODE_AND
].emit
= and_emit_cpu
;
2138 bld_base
->op_actions
[TGSI_OPCODE_ARL
].emit
= arl_emit_cpu
;
2139 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit_cpu
;
2140 bld_base
->op_actions
[TGSI_OPCODE_CEIL
].emit
= ceil_emit_cpu
;
2141 bld_base
->op_actions
[TGSI_OPCODE_COS
].emit
= cos_emit_cpu
;
2142 bld_base
->op_actions
[TGSI_OPCODE_CMP
].emit
= cmp_emit_cpu
;
2143 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= div_emit_cpu
;
2144 bld_base
->op_actions
[TGSI_OPCODE_EX2
].emit
= ex2_emit_cpu
;
2145 bld_base
->op_actions
[TGSI_OPCODE_F2I
].emit
= f2i_emit_cpu
;
2146 bld_base
->op_actions
[TGSI_OPCODE_FLR
].emit
= flr_emit_cpu
;
2147 bld_base
->op_actions
[TGSI_OPCODE_FSEQ
].emit
= fseq_emit_cpu
;
2148 bld_base
->op_actions
[TGSI_OPCODE_FSGE
].emit
= fsge_emit_cpu
;
2149 bld_base
->op_actions
[TGSI_OPCODE_FSLT
].emit
= fslt_emit_cpu
;
2150 bld_base
->op_actions
[TGSI_OPCODE_FSNE
].emit
= fsne_emit_cpu
;
2152 bld_base
->op_actions
[TGSI_OPCODE_I2F
].emit
= i2f_emit_cpu
;
2153 bld_base
->op_actions
[TGSI_OPCODE_IABS
].emit
= iabs_emit_cpu
;
2154 bld_base
->op_actions
[TGSI_OPCODE_IDIV
].emit
= idiv_emit_cpu
;
2155 bld_base
->op_actions
[TGSI_OPCODE_INEG
].emit
= ineg_emit_cpu
;
2156 bld_base
->op_actions
[TGSI_OPCODE_IMAX
].emit
= imax_emit_cpu
;
2157 bld_base
->op_actions
[TGSI_OPCODE_IMIN
].emit
= imin_emit_cpu
;
2158 bld_base
->op_actions
[TGSI_OPCODE_ISGE
].emit
= isge_emit_cpu
;
2159 bld_base
->op_actions
[TGSI_OPCODE_ISHR
].emit
= ishr_emit_cpu
;
2160 bld_base
->op_actions
[TGSI_OPCODE_ISLT
].emit
= islt_emit_cpu
;
2161 bld_base
->op_actions
[TGSI_OPCODE_ISSG
].emit
= issg_emit_cpu
;
2163 bld_base
->op_actions
[TGSI_OPCODE_LG2
].emit
= lg2_emit_cpu
;
2164 bld_base
->op_actions
[TGSI_OPCODE_LOG
].emit
= log_emit_cpu
;
2165 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= max_emit_cpu
;
2166 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= min_emit_cpu
;
2167 bld_base
->op_actions
[TGSI_OPCODE_MOD
].emit
= mod_emit_cpu
;
2168 bld_base
->op_actions
[TGSI_OPCODE_NOT
].emit
= not_emit_cpu
;
2169 bld_base
->op_actions
[TGSI_OPCODE_OR
].emit
= or_emit_cpu
;
2170 bld_base
->op_actions
[TGSI_OPCODE_POW
].emit
= pow_emit_cpu
;
2171 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit_cpu
;
2172 bld_base
->op_actions
[TGSI_OPCODE_ROUND
].emit
= round_emit_cpu
;
2173 bld_base
->op_actions
[TGSI_OPCODE_SEQ
].emit
= seq_emit_cpu
;
2174 bld_base
->op_actions
[TGSI_OPCODE_SGE
].emit
= sge_emit_cpu
;
2175 bld_base
->op_actions
[TGSI_OPCODE_SGT
].emit
= sgt_emit_cpu
;
2176 bld_base
->op_actions
[TGSI_OPCODE_SIN
].emit
= sin_emit_cpu
;
2177 bld_base
->op_actions
[TGSI_OPCODE_SHL
].emit
= shl_emit_cpu
;
2178 bld_base
->op_actions
[TGSI_OPCODE_SLE
].emit
= sle_emit_cpu
;
2179 bld_base
->op_actions
[TGSI_OPCODE_SLT
].emit
= slt_emit_cpu
;
2180 bld_base
->op_actions
[TGSI_OPCODE_SNE
].emit
= sne_emit_cpu
;
2181 bld_base
->op_actions
[TGSI_OPCODE_SSG
].emit
= ssg_emit_cpu
;
2182 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit_cpu
;
2183 bld_base
->op_actions
[TGSI_OPCODE_TRUNC
].emit
= trunc_emit_cpu
;
2185 bld_base
->rsq_action
.emit
= recip_sqrt_emit_cpu
;
2186 bld_base
->sqrt_action
.emit
= sqrt_emit_cpu
;
2188 bld_base
->op_actions
[TGSI_OPCODE_UADD
].emit
= uadd_emit_cpu
;
2189 bld_base
->op_actions
[TGSI_OPCODE_UCMP
].emit
= ucmp_emit_cpu
;
2190 bld_base
->op_actions
[TGSI_OPCODE_UDIV
].emit
= udiv_emit_cpu
;
2191 bld_base
->op_actions
[TGSI_OPCODE_UMAX
].emit
= umax_emit_cpu
;
2192 bld_base
->op_actions
[TGSI_OPCODE_UMIN
].emit
= umin_emit_cpu
;
2193 bld_base
->op_actions
[TGSI_OPCODE_UMOD
].emit
= umod_emit_cpu
;
2194 bld_base
->op_actions
[TGSI_OPCODE_USEQ
].emit
= useq_emit_cpu
;
2195 bld_base
->op_actions
[TGSI_OPCODE_USGE
].emit
= usge_emit_cpu
;
2196 bld_base
->op_actions
[TGSI_OPCODE_USHR
].emit
= ushr_emit_cpu
;
2197 bld_base
->op_actions
[TGSI_OPCODE_USLT
].emit
= uslt_emit_cpu
;
2198 bld_base
->op_actions
[TGSI_OPCODE_USNE
].emit
= usne_emit_cpu
;
2200 bld_base
->op_actions
[TGSI_OPCODE_XOR
].emit
= xor_emit_cpu
;
2202 bld_base
->op_actions
[TGSI_OPCODE_DABS
].emit
= dabs_emit_cpu
;
2203 bld_base
->op_actions
[TGSI_OPCODE_DNEG
].emit
= dneg_emit_cpu
;
2204 bld_base
->op_actions
[TGSI_OPCODE_DSEQ
].emit
= dseq_emit_cpu
;
2205 bld_base
->op_actions
[TGSI_OPCODE_DSGE
].emit
= dsge_emit_cpu
;
2206 bld_base
->op_actions
[TGSI_OPCODE_DSLT
].emit
= dslt_emit_cpu
;
2207 bld_base
->op_actions
[TGSI_OPCODE_DSNE
].emit
= dsne_emit_cpu
;
2209 bld_base
->op_actions
[TGSI_OPCODE_DRSQ
].emit
= drecip_sqrt_emit_cpu
;
2210 bld_base
->op_actions
[TGSI_OPCODE_DSQRT
].emit
= dsqrt_emit_cpu
;