1 /**************************************************************************
3 * Copyright 2011-2012 Advanced Micro Devices, Inc.
4 * Copyright 2009 VMware, Inc.
5 * Copyright 2007-2008 VMware, Inc.
8 * Permission is hereby granted, free of charge, to any person obtaining a
9 * copy of this software and associated documentation files (the
10 * "Software"), to deal in the Software without restriction, including
11 * without limitation the rights to use, copy, modify, merge, publish,
12 * distribute, sub license, and/or sell copies of the Software, and to
13 * permit persons to whom the Software is furnished to do so, subject to
14 * the following conditions:
16 * The above copyright notice and this permission notice (including the
17 * next paragraph) shall be included in all copies or substantial portions
20 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
22 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
23 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
24 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
25 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
26 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
28 **************************************************************************/
32 * TGSI to LLVM IR translation.
34 * @author Jose Fonseca <jfonseca@vmware.com>
35 * @author Tom Stellard <thomas.stellard@amd.com>
37 * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell,
38 * Brian Paul, and others.
42 #include "lp_bld_tgsi_action.h"
44 #include "lp_bld_tgsi.h"
45 #include "lp_bld_arit.h"
46 #include "lp_bld_bitarit.h"
47 #include "lp_bld_const.h"
48 #include "lp_bld_conv.h"
49 #include "lp_bld_gather.h"
50 #include "lp_bld_logic.h"
51 #include "lp_bld_pack.h"
53 #include "tgsi/tgsi_exec.h"
55 /* XXX: The CPU only defaults should be repaced by generic ones. In most
56 * cases, the CPU defaults are just wrappers around a function in
57 * lp_build_arit.c and these functions should be inlined here and the CPU
58 * generic code should be removed and placed elsewhere.
63 /* Generic fetch_arg functions */
65 static void scalar_unary_fetch_args(
66 struct lp_build_tgsi_context
* bld_base
,
67 struct lp_build_emit_data
* emit_data
)
70 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, 0);
71 emit_data
->arg_count
= 1;
72 emit_data
->dst_type
= LLVMTypeOf(emit_data
->args
[0]);
75 static void scalar_binary_fetch_args(
76 struct lp_build_tgsi_context
* bld_base
,
77 struct lp_build_emit_data
* emit_data
)
80 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
83 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
85 emit_data
->arg_count
= 2;
86 emit_data
->dst_type
= LLVMTypeOf(emit_data
->args
[0]);
92 const struct lp_build_tgsi_action
* action
,
93 struct lp_build_tgsi_context
* bld_base
,
94 struct lp_build_emit_data
* emit_data
)
96 emit_data
->output
[emit_data
->chan
] = LLVMBuildFAdd(
97 bld_base
->base
.gallivm
->builder
,
98 emit_data
->args
[0], emit_data
->args
[1], "");
101 /* TGSI_OPCODE_ARR */
104 const struct lp_build_tgsi_action
* action
,
105 struct lp_build_tgsi_context
* bld_base
,
106 struct lp_build_emit_data
* emit_data
)
108 LLVMValueRef tmp
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_ROUND
, emit_data
->args
[0]);
109 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
110 bld_base
->uint_bld
.vec_type
, "");
117 struct lp_build_tgsi_context
* bld_base
,
118 struct lp_build_emit_data
* emit_data
,
119 unsigned dp_components
)
122 for (src
= 0; src
< 2; src
++) {
123 for (chan
= 0; chan
< dp_components
; chan
++) {
124 emit_data
->args
[(src
* dp_components
) + chan
] =
125 lp_build_emit_fetch(bld_base
, emit_data
->inst
, src
, chan
);
128 emit_data
->dst_type
= bld_base
->base
.elem_type
;
131 /* TGSI_OPCODE_DP2 */
134 struct lp_build_tgsi_context
* bld_base
,
135 struct lp_build_emit_data
* emit_data
)
137 dp_fetch_args(bld_base
, emit_data
, 2);
142 const struct lp_build_tgsi_action
* action
,
143 struct lp_build_tgsi_context
* bld_base
,
144 struct lp_build_emit_data
* emit_data
)
146 LLVMValueRef tmp0
, tmp1
;
147 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
148 emit_data
->args
[0] /* src0.x */,
149 emit_data
->args
[2] /* src1.x */);
150 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
151 emit_data
->args
[1] /* src0.y */,
152 emit_data
->args
[3] /* src1.y */);
153 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
154 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
157 static struct lp_build_tgsi_action dp2_action
= {
158 dp2_fetch_args
, /* fetch_args */
162 /* TGSI_OPCODE_DP3 */
165 struct lp_build_tgsi_context
* bld_base
,
166 struct lp_build_emit_data
* emit_data
)
168 dp_fetch_args(bld_base
, emit_data
, 3);
173 const struct lp_build_tgsi_action
* action
,
174 struct lp_build_tgsi_context
* bld_base
,
175 struct lp_build_emit_data
* emit_data
)
177 LLVMValueRef tmp0
, tmp1
;
178 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
179 emit_data
->args
[0] /* src0.x */,
180 emit_data
->args
[3] /* src1.x */);
181 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
182 emit_data
->args
[1] /* src0.y */,
183 emit_data
->args
[4] /* src1.y */);
184 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp1
, tmp0
);
185 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
186 emit_data
->args
[2] /* src0.z */,
187 emit_data
->args
[5] /* src1.z */);
188 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
189 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
192 static struct lp_build_tgsi_action dp3_action
= {
193 dp3_fetch_args
, /* fetch_args */
197 /* TGSI_OPCODDE_DP4 */
201 struct lp_build_tgsi_context
* bld_base
,
202 struct lp_build_emit_data
* emit_data
)
204 dp_fetch_args(bld_base
, emit_data
, 4);
209 const struct lp_build_tgsi_action
* action
,
210 struct lp_build_tgsi_context
* bld_base
,
211 struct lp_build_emit_data
* emit_data
)
213 LLVMValueRef tmp0
, tmp1
;
214 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
215 emit_data
->args
[0] /* src0.x */,
216 emit_data
->args
[4] /* src1.x */);
217 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
218 emit_data
->args
[1] /* src0.y */,
219 emit_data
->args
[5] /* src1.y */);
220 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp0
, tmp1
);
221 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
222 emit_data
->args
[2] /* src0.z */,
223 emit_data
->args
[6] /* src1.z */);
224 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp0
, tmp1
);
225 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
226 emit_data
->args
[3] /* src0.w */,
227 emit_data
->args
[7] /* src1.w */);
228 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
229 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
232 static struct lp_build_tgsi_action dp4_action
= {
233 dp4_fetch_args
, /* fetch_args */
237 /* TGSI_OPCODE_DST */
240 struct lp_build_tgsi_context
* bld_base
,
241 struct lp_build_emit_data
* emit_data
)
244 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
247 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
250 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
253 emit_data
->args
[3] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
259 const struct lp_build_tgsi_action
* action
,
260 struct lp_build_tgsi_context
* bld_base
,
261 struct lp_build_emit_data
* emit_data
)
264 emit_data
->output
[TGSI_CHAN_X
] = bld_base
->base
.one
;
267 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
269 emit_data
->args
[0] /* src0.y */,
270 emit_data
->args
[2] /* src1.y */);
272 emit_data
->output
[TGSI_CHAN_Z
] = emit_data
->args
[1]; /* src0.z */
275 emit_data
->output
[TGSI_CHAN_W
] = emit_data
->args
[3]; /* src1.w */
278 static struct lp_build_tgsi_action dst_action
= {
279 dst_fetch_args
, /* fetch_args */
283 /* TGSI_OPCODE_END */
286 const struct lp_build_tgsi_action
* action
,
287 struct lp_build_tgsi_context
* bld_base
,
288 struct lp_build_emit_data
* emit_data
)
293 /* TGSI_OPCODE_EXP */
297 const struct lp_build_tgsi_action
* action
,
298 struct lp_build_tgsi_context
* bld_base
,
299 struct lp_build_emit_data
* emit_data
)
301 LLVMValueRef floor_x
;
303 /* floor( src0.x ) */
304 floor_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
307 /* 2 ^ floor( src0.x ) */
308 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
309 TGSI_OPCODE_EX2
, floor_x
);
311 /* src0.x - floor( src0.x ) */
312 emit_data
->output
[TGSI_CHAN_Y
] =
313 lp_build_sub(&bld_base
->base
, emit_data
->args
[0] /* src0.x */, floor_x
);
316 emit_data
->output
[TGSI_CHAN_Z
] = lp_build_emit_llvm_unary(bld_base
,
317 TGSI_OPCODE_EX2
, emit_data
->args
[0] /* src0.x */);
319 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
322 const struct lp_build_tgsi_action exp_action
= {
323 scalar_unary_fetch_args
, /* fetch_args */
327 /* TGSI_OPCODE_FRC */
331 const struct lp_build_tgsi_action
* action
,
332 struct lp_build_tgsi_context
* bld_base
,
333 struct lp_build_emit_data
* emit_data
)
336 tmp
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
338 emit_data
->output
[emit_data
->chan
] =
339 lp_build_sub(&bld_base
->base
, emit_data
->args
[0], tmp
);
342 /* TGSI_OPCODE_KILL_IF */
346 struct lp_build_tgsi_context
* bld_base
,
347 struct lp_build_emit_data
* emit_data
)
350 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
353 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
356 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
359 emit_data
->args
[3] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
361 emit_data
->arg_count
= 4;
362 emit_data
->dst_type
= LLVMVoidTypeInContext(bld_base
->base
.gallivm
->context
);
365 /* TGSI_OPCODE_KILL */
369 struct lp_build_tgsi_context
* bld_base
,
370 struct lp_build_emit_data
* emit_data
)
372 emit_data
->dst_type
= LLVMVoidTypeInContext(bld_base
->base
.gallivm
->context
);
375 /* TGSI_OPCODE_LIT */
379 struct lp_build_tgsi_context
* bld_base
,
380 struct lp_build_emit_data
* emit_data
)
383 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_X
);
385 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_Y
);
387 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_W
);
388 emit_data
->arg_count
= 3;
393 const struct lp_build_tgsi_action
* action
,
394 struct lp_build_tgsi_context
* bld_base
,
395 struct lp_build_emit_data
* emit_data
)
397 LLVMValueRef tmp0
, tmp1
, tmp2
;
400 emit_data
->output
[TGSI_CHAN_X
] = bld_base
->base
.one
;
403 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
405 emit_data
->args
[0] /* src0.x */,
406 bld_base
->base
.zero
);
409 /* XMM[1] = SrcReg[0].yyyy */
410 tmp1
= emit_data
->args
[1];
411 /* XMM[1] = max(XMM[1], 0) */
412 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MAX
,
413 tmp1
, bld_base
->base
.zero
);
414 /* XMM[2] = SrcReg[0].wwww */
415 tmp2
= emit_data
->args
[2];
416 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_POW
,
418 tmp0
= emit_data
->args
[0];
419 emit_data
->output
[TGSI_CHAN_Z
] = lp_build_emit_llvm_ternary(bld_base
,
421 tmp0
, bld_base
->base
.zero
, tmp1
);
423 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
426 static struct lp_build_tgsi_action lit_action
= {
427 lit_fetch_args
, /* fetch_args */
431 /* TGSI_OPCODE_LOG */
435 const struct lp_build_tgsi_action
* action
,
436 struct lp_build_tgsi_context
* bld_base
,
437 struct lp_build_emit_data
* emit_data
)
440 LLVMValueRef abs_x
, log_abs_x
, flr_log_abs_x
, ex2_flr_log_abs_x
;
443 abs_x
= lp_build_abs(&bld_base
->base
, emit_data
->args
[0] /* src0.x */);
445 /* log( abs( src0.x ) ) */
446 log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_LG2
,
449 /* floor( log( abs( src0.x ) ) ) */
450 flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
453 emit_data
->output
[TGSI_CHAN_X
] = flr_log_abs_x
;
456 ex2_flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_EX2
,
459 /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */
460 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
461 TGSI_OPCODE_DIV
, abs_x
, ex2_flr_log_abs_x
);
464 emit_data
->output
[TGSI_CHAN_Z
] = log_abs_x
;
467 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
470 static struct lp_build_tgsi_action log_action
= {
471 scalar_unary_fetch_args
, /* fetch_args */
475 /* TGSI_OPCODE_PK2H */
479 struct lp_build_tgsi_context
* bld_base
,
480 struct lp_build_emit_data
* emit_data
)
483 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
486 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
492 const struct lp_build_tgsi_action
*action
,
493 struct lp_build_tgsi_context
*bld_base
,
494 struct lp_build_emit_data
*emit_data
)
496 struct gallivm_state
*gallivm
= bld_base
->base
.gallivm
;
497 struct lp_type f16i_t
;
498 LLVMValueRef lo
, hi
, res
;
500 f16i_t
= lp_type_uint_vec(16, bld_base
->base
.type
.length
* 32);
501 lo
= lp_build_float_to_half(gallivm
, emit_data
->args
[0]);
502 hi
= lp_build_float_to_half(gallivm
, emit_data
->args
[1]);
503 /* maybe some interleave doubling vector width would be useful... */
504 lo
= lp_build_pad_vector(gallivm
, lo
, bld_base
->base
.type
.length
* 2);
505 hi
= lp_build_pad_vector(gallivm
, hi
, bld_base
->base
.type
.length
* 2);
506 res
= lp_build_interleave2(gallivm
, f16i_t
, lo
, hi
, 0);
508 emit_data
->output
[emit_data
->chan
] = res
;
511 static struct lp_build_tgsi_action pk2h_action
= {
512 pk2h_fetch_args
, /* fetch_args */
516 /* TGSI_OPCODE_UP2H */
520 const struct lp_build_tgsi_action
*action
,
521 struct lp_build_tgsi_context
*bld_base
,
522 struct lp_build_emit_data
*emit_data
)
524 struct gallivm_state
*gallivm
= bld_base
->base
.gallivm
;
525 LLVMBuilderRef builder
= gallivm
->builder
;
526 LLVMContextRef context
= gallivm
->context
;
527 LLVMValueRef lo
, hi
, res
[2], arg
;
528 unsigned nr
= bld_base
->base
.type
.length
;
529 LLVMTypeRef i16t
= LLVMVectorType(LLVMInt16TypeInContext(context
), nr
* 2);
531 arg
= LLVMBuildBitCast(builder
, emit_data
->args
[0], i16t
, "");
532 lo
= lp_build_uninterleave1(gallivm
, nr
* 2, arg
, 0);
533 hi
= lp_build_uninterleave1(gallivm
, nr
* 2, arg
, 1);
534 res
[0] = lp_build_half_to_float(gallivm
, lo
);
535 res
[1] = lp_build_half_to_float(gallivm
, hi
);
537 emit_data
->output
[0] = emit_data
->output
[2] = res
[0];
538 emit_data
->output
[1] = emit_data
->output
[3] = res
[1];
541 static struct lp_build_tgsi_action up2h_action
= {
542 scalar_unary_fetch_args
, /* fetch_args */
546 /* TGSI_OPCODE_LRP */
550 const struct lp_build_tgsi_action
* action
,
551 struct lp_build_tgsi_context
* bld_base
,
552 struct lp_build_emit_data
* emit_data
)
554 struct lp_build_context
*bld
= &bld_base
->base
;
555 LLVMValueRef inv
, a
, b
;
557 /* This uses the correct version: (1 - t)*a + t*b
559 * An alternative version is "a + t*(b-a)". The problem is this version
560 * doesn't return "b" for t = 1, because "a + (b-a)" isn't equal to "b"
561 * because of the floating-point rounding.
563 inv
= lp_build_sub(bld
, bld_base
->base
.one
, emit_data
->args
[0]);
564 a
= lp_build_mul(bld
, emit_data
->args
[1], emit_data
->args
[0]);
565 b
= lp_build_mul(bld
, emit_data
->args
[2], inv
);
566 emit_data
->output
[emit_data
->chan
] = lp_build_add(bld
, a
, b
);
569 /* TGSI_OPCODE_MAD */
573 const struct lp_build_tgsi_action
* action
,
574 struct lp_build_tgsi_context
* bld_base
,
575 struct lp_build_emit_data
* emit_data
)
578 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
581 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
582 TGSI_OPCODE_ADD
, tmp
, emit_data
->args
[2]);
585 /* TGSI_OPCODE_MOV */
589 const struct lp_build_tgsi_action
* action
,
590 struct lp_build_tgsi_context
* bld_base
,
591 struct lp_build_emit_data
* emit_data
)
593 emit_data
->output
[emit_data
->chan
] = emit_data
->args
[0];
596 /* TGSI_OPCODE_MUL */
599 const struct lp_build_tgsi_action
* action
,
600 struct lp_build_tgsi_context
* bld_base
,
601 struct lp_build_emit_data
* emit_data
)
603 emit_data
->output
[emit_data
->chan
] = LLVMBuildFMul(
604 bld_base
->base
.gallivm
->builder
,
605 emit_data
->args
[0], emit_data
->args
[1], "");
608 /*.TGSI_OPCODE_DIV.*/
609 static void fdiv_emit(
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 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
615 bld_base
->base
.gallivm
->builder
,
616 emit_data
->args
[0], emit_data
->args
[1], "");
619 /*.TGSI_OPCODE_RCP.*/
620 static void rcp_emit(
621 const struct lp_build_tgsi_action
* action
,
622 struct lp_build_tgsi_context
* bld_base
,
623 struct lp_build_emit_data
* emit_data
)
626 one
= lp_build_const_float(bld_base
->base
.gallivm
, 1.0f
);
627 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
628 TGSI_OPCODE_DIV
, one
, emit_data
->args
[0]);
631 /* TGSI_OPCODE_POW */
635 const struct lp_build_tgsi_action
* action
,
636 struct lp_build_tgsi_context
* bld_base
,
637 struct lp_build_emit_data
* emit_data
)
639 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
640 emit_data
->args
[0], emit_data
->args
[1]);
643 static struct lp_build_tgsi_action pow_action
= {
644 scalar_binary_fetch_args
, /* fetch_args */
648 /* TGSI_OPCODE_RSQ */
652 const struct lp_build_tgsi_action
* action
,
653 struct lp_build_tgsi_context
* bld_base
,
654 struct lp_build_emit_data
* emit_data
)
656 if (bld_base
->rsq_action
.emit
) {
657 bld_base
->rsq_action
.emit(&bld_base
->rsq_action
, bld_base
, emit_data
);
659 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
663 const struct lp_build_tgsi_action rsq_action
= {
664 scalar_unary_fetch_args
, /* fetch_args */
669 /* TGSI_OPCODE_SQRT */
673 const struct lp_build_tgsi_action
* action
,
674 struct lp_build_tgsi_context
* bld_base
,
675 struct lp_build_emit_data
* emit_data
)
677 if (bld_base
->sqrt_action
.emit
) {
678 bld_base
->sqrt_action
.emit(&bld_base
->sqrt_action
, bld_base
, emit_data
);
680 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
684 const struct lp_build_tgsi_action sqrt_action
= {
685 scalar_unary_fetch_args
, /* fetch_args */
689 /* TGSI_OPCODE_F2U */
692 const struct lp_build_tgsi_action
* action
,
693 struct lp_build_tgsi_context
* bld_base
,
694 struct lp_build_emit_data
* emit_data
)
696 emit_data
->output
[emit_data
->chan
] =
697 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
699 bld_base
->base
.int_vec_type
, "");
702 /* TGSI_OPCODE_U2F */
705 const struct lp_build_tgsi_action
* action
,
706 struct lp_build_tgsi_context
* bld_base
,
707 struct lp_build_emit_data
* emit_data
)
709 emit_data
->output
[emit_data
->chan
] =
710 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
712 bld_base
->base
.vec_type
, "");
717 const struct lp_build_tgsi_action
* action
,
718 struct lp_build_tgsi_context
* bld_base
,
719 struct lp_build_emit_data
* emit_data
)
722 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_UMUL
,
725 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
726 TGSI_OPCODE_UADD
, tmp
, emit_data
->args
[2]);
729 /* TGSI_OPCODE_UMUL */
732 const struct lp_build_tgsi_action
* action
,
733 struct lp_build_tgsi_context
* bld_base
,
734 struct lp_build_emit_data
* emit_data
)
736 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint_bld
,
737 emit_data
->args
[0], emit_data
->args
[1]);
740 /* TGSI_OPCODE_IMUL_HI */
743 const struct lp_build_tgsi_action
* action
,
744 struct lp_build_tgsi_context
* bld_base
,
745 struct lp_build_emit_data
* emit_data
)
747 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
748 LLVMValueRef hi_bits
;
750 assert(int_bld
->type
.width
== 32);
752 /* low result bits are tossed away */
753 lp_build_mul_32_lohi(int_bld
, emit_data
->args
[0],
754 emit_data
->args
[1], &hi_bits
);
755 emit_data
->output
[emit_data
->chan
] = hi_bits
;
760 const struct lp_build_tgsi_action
* action
,
761 struct lp_build_tgsi_context
* bld_base
,
762 struct lp_build_emit_data
* emit_data
)
764 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
765 LLVMValueRef hi_bits
;
767 assert(int_bld
->type
.width
== 32);
769 /* low result bits are tossed away */
770 lp_build_mul_32_lohi_cpu(int_bld
, emit_data
->args
[0],
771 emit_data
->args
[1], &hi_bits
);
772 emit_data
->output
[emit_data
->chan
] = hi_bits
;
775 /* TGSI_OPCODE_UMUL_HI */
778 const struct lp_build_tgsi_action
* action
,
779 struct lp_build_tgsi_context
* bld_base
,
780 struct lp_build_emit_data
* emit_data
)
782 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
783 LLVMValueRef hi_bits
;
785 assert(uint_bld
->type
.width
== 32);
787 /* low result bits are tossed away */
788 lp_build_mul_32_lohi(uint_bld
, emit_data
->args
[0],
789 emit_data
->args
[1], &hi_bits
);
790 emit_data
->output
[emit_data
->chan
] = hi_bits
;
795 const struct lp_build_tgsi_action
* action
,
796 struct lp_build_tgsi_context
* bld_base
,
797 struct lp_build_emit_data
* emit_data
)
799 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
800 LLVMValueRef hi_bits
;
802 assert(uint_bld
->type
.width
== 32);
804 /* low result bits are tossed away */
805 lp_build_mul_32_lohi_cpu(uint_bld
, emit_data
->args
[0],
806 emit_data
->args
[1], &hi_bits
);
807 emit_data
->output
[emit_data
->chan
] = hi_bits
;
810 /* TGSI_OPCODE_MAX */
811 static void fmax_emit(
812 const struct lp_build_tgsi_action
* action
,
813 struct lp_build_tgsi_context
* bld_base
,
814 struct lp_build_emit_data
* emit_data
)
816 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
817 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
818 LLVMBuildFCmp(builder
, LLVMRealUGE
,
819 emit_data
->args
[0], emit_data
->args
[1], ""),
820 emit_data
->args
[0], emit_data
->args
[1], "");
823 /* TGSI_OPCODE_MIN */
824 static void fmin_emit(
825 const struct lp_build_tgsi_action
* action
,
826 struct lp_build_tgsi_context
* bld_base
,
827 struct lp_build_emit_data
* emit_data
)
829 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
830 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
831 LLVMBuildFCmp(builder
, LLVMRealUGE
,
832 emit_data
->args
[0], emit_data
->args
[1], ""),
833 emit_data
->args
[1], emit_data
->args
[0], "");
836 /* TGSI_OPCODE_D2F */
839 const struct lp_build_tgsi_action
* action
,
840 struct lp_build_tgsi_context
* bld_base
,
841 struct lp_build_emit_data
* emit_data
)
843 emit_data
->output
[emit_data
->chan
] =
844 LLVMBuildFPTrunc(bld_base
->base
.gallivm
->builder
,
846 bld_base
->base
.vec_type
, "");
849 /* TGSI_OPCODE_D2I */
852 const struct lp_build_tgsi_action
* action
,
853 struct lp_build_tgsi_context
* bld_base
,
854 struct lp_build_emit_data
* emit_data
)
856 emit_data
->output
[emit_data
->chan
] =
857 LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
,
859 bld_base
->base
.int_vec_type
, "");
862 /* TGSI_OPCODE_D2U */
865 const struct lp_build_tgsi_action
* action
,
866 struct lp_build_tgsi_context
* bld_base
,
867 struct lp_build_emit_data
* emit_data
)
869 emit_data
->output
[emit_data
->chan
] =
870 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
872 bld_base
->base
.int_vec_type
, "");
875 /* TGSI_OPCODE_F2D */
878 const struct lp_build_tgsi_action
* action
,
879 struct lp_build_tgsi_context
* bld_base
,
880 struct lp_build_emit_data
* emit_data
)
882 emit_data
->output
[emit_data
->chan
] =
883 LLVMBuildFPExt(bld_base
->base
.gallivm
->builder
,
885 bld_base
->dbl_bld
.vec_type
, "");
888 /* TGSI_OPCODE_U2D */
891 const struct lp_build_tgsi_action
* action
,
892 struct lp_build_tgsi_context
* bld_base
,
893 struct lp_build_emit_data
* emit_data
)
895 emit_data
->output
[emit_data
->chan
] =
896 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
898 bld_base
->dbl_bld
.vec_type
, "");
901 /* TGSI_OPCODE_I2D */
904 const struct lp_build_tgsi_action
* action
,
905 struct lp_build_tgsi_context
* bld_base
,
906 struct lp_build_emit_data
* emit_data
)
908 emit_data
->output
[emit_data
->chan
] =
909 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
911 bld_base
->dbl_bld
.vec_type
, "");
914 /* TGSI_OPCODE_DMAD */
917 const struct lp_build_tgsi_action
* action
,
918 struct lp_build_tgsi_context
* bld_base
,
919 struct lp_build_emit_data
* emit_data
)
922 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_DMUL
,
925 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
926 TGSI_OPCODE_DADD
, tmp
, emit_data
->args
[2]);
929 /*.TGSI_OPCODE_DRCP.*/
930 static void drcp_emit(
931 const struct lp_build_tgsi_action
* action
,
932 struct lp_build_tgsi_context
* bld_base
,
933 struct lp_build_emit_data
* emit_data
)
936 one
= lp_build_const_vec(bld_base
->dbl_bld
.gallivm
, bld_base
->dbl_bld
.type
, 1.0f
);
937 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
938 bld_base
->base
.gallivm
->builder
,
939 one
, emit_data
->args
[0], "");
942 /* TGSI_OPCODE_DFRAC */
943 static void dfrac_emit(
944 const struct lp_build_tgsi_action
* action
,
945 struct lp_build_tgsi_context
* bld_base
,
946 struct lp_build_emit_data
* emit_data
)
949 tmp
= lp_build_floor(&bld_base
->dbl_bld
,
951 emit_data
->output
[emit_data
->chan
] = LLVMBuildFSub(bld_base
->base
.gallivm
->builder
,
952 emit_data
->args
[0], tmp
, "");
957 const struct lp_build_tgsi_action
* action
,
958 struct lp_build_tgsi_context
* bld_base
,
959 struct lp_build_emit_data
* emit_data
)
961 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint64_bld
,
962 emit_data
->args
[0], emit_data
->args
[1]);
967 const struct lp_build_tgsi_action
* action
,
968 struct lp_build_tgsi_context
* bld_base
,
969 struct lp_build_emit_data
* emit_data
)
971 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
972 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
973 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
974 bld_base
->uint64_bld
.zero
);
975 /* We want to make sure that we never divide/mod by zero to not
976 * generate sigfpe. We don't want to crash just because the
977 * shader is doing something weird. */
978 LLVMValueRef divisor
= LLVMBuildOr(builder
,
980 emit_data
->args
[1], "");
981 LLVMValueRef result
= lp_build_mod(&bld_base
->uint64_bld
,
982 emit_data
->args
[0], divisor
);
983 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
984 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
991 const struct lp_build_tgsi_action
* action
,
992 struct lp_build_tgsi_context
* bld_base
,
993 struct lp_build_emit_data
* emit_data
)
995 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
996 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
997 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
998 bld_base
->uint64_bld
.zero
);
999 /* We want to make sure that we never divide/mod by zero to not
1000 * generate sigfpe. We don't want to crash just because the
1001 * shader is doing something weird. */
1002 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1004 emit_data
->args
[1], "");
1005 LLVMValueRef result
= lp_build_mod(&bld_base
->int64_bld
,
1006 emit_data
->args
[0], divisor
);
1007 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1008 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1015 const struct lp_build_tgsi_action
* action
,
1016 struct lp_build_tgsi_context
* bld_base
,
1017 struct lp_build_emit_data
* emit_data
)
1020 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1021 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint64_bld
,
1022 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1023 bld_base
->uint64_bld
.zero
);
1024 /* We want to make sure that we never divide/mod by zero to not
1025 * generate sigfpe. We don't want to crash just because the
1026 * shader is doing something weird. */
1027 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1029 emit_data
->args
[1], "");
1030 LLVMValueRef result
= LLVMBuildUDiv(builder
,
1031 emit_data
->args
[0], divisor
, "");
1032 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1033 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1040 const struct lp_build_tgsi_action
* action
,
1041 struct lp_build_tgsi_context
* bld_base
,
1042 struct lp_build_emit_data
* emit_data
)
1045 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1046 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->int64_bld
,
1047 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1048 bld_base
->int64_bld
.zero
);
1049 /* We want to make sure that we never divide/mod by zero to not
1050 * generate sigfpe. We don't want to crash just because the
1051 * shader is doing something weird. */
1052 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1054 emit_data
->args
[1], "");
1055 LLVMValueRef result
= LLVMBuildSDiv(builder
,
1056 emit_data
->args
[0], divisor
, "");
1057 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1058 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1065 const struct lp_build_tgsi_action
* action
,
1066 struct lp_build_tgsi_context
* bld_base
,
1067 struct lp_build_emit_data
* emit_data
)
1069 emit_data
->output
[emit_data
->chan
] =
1070 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
1072 bld_base
->uint64_bld
.vec_type
, "");
1077 const struct lp_build_tgsi_action
* action
,
1078 struct lp_build_tgsi_context
* bld_base
,
1079 struct lp_build_emit_data
* emit_data
)
1081 emit_data
->output
[emit_data
->chan
] =
1082 LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
,
1084 bld_base
->int64_bld
.vec_type
, "");
1089 const struct lp_build_tgsi_action
* action
,
1090 struct lp_build_tgsi_context
* bld_base
,
1091 struct lp_build_emit_data
* emit_data
)
1093 emit_data
->output
[emit_data
->chan
] =
1094 LLVMBuildZExt(bld_base
->base
.gallivm
->builder
,
1096 bld_base
->uint64_bld
.vec_type
, "");
1101 const struct lp_build_tgsi_action
* action
,
1102 struct lp_build_tgsi_context
* bld_base
,
1103 struct lp_build_emit_data
* emit_data
)
1105 emit_data
->output
[emit_data
->chan
] =
1106 LLVMBuildSExt(bld_base
->base
.gallivm
->builder
,
1108 bld_base
->int64_bld
.vec_type
, "");
1113 const struct lp_build_tgsi_action
* action
,
1114 struct lp_build_tgsi_context
* bld_base
,
1115 struct lp_build_emit_data
* emit_data
)
1117 emit_data
->output
[emit_data
->chan
] =
1118 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1120 bld_base
->base
.vec_type
, "");
1125 const struct lp_build_tgsi_action
* action
,
1126 struct lp_build_tgsi_context
* bld_base
,
1127 struct lp_build_emit_data
* emit_data
)
1129 emit_data
->output
[emit_data
->chan
] =
1130 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1132 bld_base
->base
.vec_type
, "");
1137 const struct lp_build_tgsi_action
* action
,
1138 struct lp_build_tgsi_context
* bld_base
,
1139 struct lp_build_emit_data
* emit_data
)
1141 emit_data
->output
[emit_data
->chan
] =
1142 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
1144 bld_base
->dbl_bld
.vec_type
, "");
1149 const struct lp_build_tgsi_action
* action
,
1150 struct lp_build_tgsi_context
* bld_base
,
1151 struct lp_build_emit_data
* emit_data
)
1153 emit_data
->output
[emit_data
->chan
] =
1154 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
1156 bld_base
->dbl_bld
.vec_type
, "");
1160 lp_set_default_actions(struct lp_build_tgsi_context
* bld_base
)
1162 bld_base
->op_actions
[TGSI_OPCODE_DP2
] = dp2_action
;
1163 bld_base
->op_actions
[TGSI_OPCODE_DP3
] = dp3_action
;
1164 bld_base
->op_actions
[TGSI_OPCODE_DP4
] = dp4_action
;
1165 bld_base
->op_actions
[TGSI_OPCODE_DST
] = dst_action
;
1166 bld_base
->op_actions
[TGSI_OPCODE_EXP
] = exp_action
;
1167 bld_base
->op_actions
[TGSI_OPCODE_LIT
] = lit_action
;
1168 bld_base
->op_actions
[TGSI_OPCODE_LOG
] = log_action
;
1169 bld_base
->op_actions
[TGSI_OPCODE_PK2H
] = pk2h_action
;
1170 bld_base
->op_actions
[TGSI_OPCODE_RSQ
] = rsq_action
;
1171 bld_base
->op_actions
[TGSI_OPCODE_SQRT
] = sqrt_action
;
1172 bld_base
->op_actions
[TGSI_OPCODE_POW
] = pow_action
;
1173 bld_base
->op_actions
[TGSI_OPCODE_UP2H
] = up2h_action
;
1175 bld_base
->op_actions
[TGSI_OPCODE_SWITCH
].fetch_args
= scalar_unary_fetch_args
;
1176 bld_base
->op_actions
[TGSI_OPCODE_CASE
].fetch_args
= scalar_unary_fetch_args
;
1177 bld_base
->op_actions
[TGSI_OPCODE_COS
].fetch_args
= scalar_unary_fetch_args
;
1178 bld_base
->op_actions
[TGSI_OPCODE_EX2
].fetch_args
= scalar_unary_fetch_args
;
1179 bld_base
->op_actions
[TGSI_OPCODE_IF
].fetch_args
= scalar_unary_fetch_args
;
1180 bld_base
->op_actions
[TGSI_OPCODE_UIF
].fetch_args
= scalar_unary_fetch_args
;
1181 bld_base
->op_actions
[TGSI_OPCODE_KILL_IF
].fetch_args
= kil_fetch_args
;
1182 bld_base
->op_actions
[TGSI_OPCODE_KILL
].fetch_args
= kilp_fetch_args
;
1183 bld_base
->op_actions
[TGSI_OPCODE_RCP
].fetch_args
= scalar_unary_fetch_args
;
1184 bld_base
->op_actions
[TGSI_OPCODE_SIN
].fetch_args
= scalar_unary_fetch_args
;
1185 bld_base
->op_actions
[TGSI_OPCODE_LG2
].fetch_args
= scalar_unary_fetch_args
;
1187 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit
;
1188 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit
;
1189 bld_base
->op_actions
[TGSI_OPCODE_END
].emit
= end_emit
;
1190 bld_base
->op_actions
[TGSI_OPCODE_FRC
].emit
= frc_emit
;
1191 bld_base
->op_actions
[TGSI_OPCODE_LRP
].emit
= lrp_emit
;
1192 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit
;
1193 bld_base
->op_actions
[TGSI_OPCODE_MOV
].emit
= mov_emit
;
1194 bld_base
->op_actions
[TGSI_OPCODE_MUL
].emit
= mul_emit
;
1195 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= fdiv_emit
;
1196 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit
;
1198 bld_base
->op_actions
[TGSI_OPCODE_UARL
].emit
= mov_emit
;
1199 bld_base
->op_actions
[TGSI_OPCODE_F2U
].emit
= f2u_emit
;
1200 bld_base
->op_actions
[TGSI_OPCODE_U2F
].emit
= u2f_emit
;
1201 bld_base
->op_actions
[TGSI_OPCODE_UMAD
].emit
= umad_emit
;
1202 bld_base
->op_actions
[TGSI_OPCODE_UMUL
].emit
= umul_emit
;
1203 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit
;
1204 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit
;
1206 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= fmax_emit
;
1207 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= fmin_emit
;
1209 bld_base
->op_actions
[TGSI_OPCODE_DADD
].emit
= add_emit
;
1210 bld_base
->op_actions
[TGSI_OPCODE_DMAX
].emit
= fmax_emit
;
1211 bld_base
->op_actions
[TGSI_OPCODE_DMIN
].emit
= fmin_emit
;
1212 bld_base
->op_actions
[TGSI_OPCODE_DMUL
].emit
= mul_emit
;
1213 bld_base
->op_actions
[TGSI_OPCODE_DDIV
].emit
= fdiv_emit
;
1215 bld_base
->op_actions
[TGSI_OPCODE_D2F
].emit
= d2f_emit
;
1216 bld_base
->op_actions
[TGSI_OPCODE_D2I
].emit
= d2i_emit
;
1217 bld_base
->op_actions
[TGSI_OPCODE_D2U
].emit
= d2u_emit
;
1219 bld_base
->op_actions
[TGSI_OPCODE_F2D
].emit
= f2d_emit
;
1220 bld_base
->op_actions
[TGSI_OPCODE_I2D
].emit
= i2d_emit
;
1221 bld_base
->op_actions
[TGSI_OPCODE_U2D
].emit
= u2d_emit
;
1223 bld_base
->op_actions
[TGSI_OPCODE_DMAD
].emit
= dmad_emit
;
1225 bld_base
->op_actions
[TGSI_OPCODE_DRCP
].emit
= drcp_emit
;
1226 bld_base
->op_actions
[TGSI_OPCODE_DFRAC
].emit
= dfrac_emit
;
1228 bld_base
->op_actions
[TGSI_OPCODE_U64MUL
].emit
= u64mul_emit
;
1230 bld_base
->op_actions
[TGSI_OPCODE_F2I64
].emit
= f2i64_emit
;
1231 bld_base
->op_actions
[TGSI_OPCODE_F2U64
].emit
= f2u64_emit
;
1233 bld_base
->op_actions
[TGSI_OPCODE_D2I64
].emit
= f2i64_emit
;
1234 bld_base
->op_actions
[TGSI_OPCODE_D2U64
].emit
= f2u64_emit
;
1236 bld_base
->op_actions
[TGSI_OPCODE_I2I64
].emit
= i2i64_emit
;
1237 bld_base
->op_actions
[TGSI_OPCODE_U2I64
].emit
= u2i64_emit
;
1239 bld_base
->op_actions
[TGSI_OPCODE_I642F
].emit
= i642f_emit
;
1240 bld_base
->op_actions
[TGSI_OPCODE_U642F
].emit
= u642f_emit
;
1242 bld_base
->op_actions
[TGSI_OPCODE_I642F
].emit
= i642f_emit
;
1243 bld_base
->op_actions
[TGSI_OPCODE_U642F
].emit
= u642f_emit
;
1245 bld_base
->op_actions
[TGSI_OPCODE_I642D
].emit
= i642d_emit
;
1246 bld_base
->op_actions
[TGSI_OPCODE_U642D
].emit
= u642d_emit
;
1250 /* CPU Only default actions */
1252 /* These actions are CPU only, because they could potentially output SSE
1256 /* TGSI_OPCODE_ADD (CPU Only) */
1259 const struct lp_build_tgsi_action
* action
,
1260 struct lp_build_tgsi_context
* bld_base
,
1261 struct lp_build_emit_data
* emit_data
)
1263 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->base
,
1264 emit_data
->args
[0], emit_data
->args
[1]);
1267 /* TGSI_OPCODE_AND (CPU Only) */
1270 const struct lp_build_tgsi_action
* action
,
1271 struct lp_build_tgsi_context
* bld_base
,
1272 struct lp_build_emit_data
* emit_data
)
1274 emit_data
->output
[emit_data
->chan
] = lp_build_and(&bld_base
->uint_bld
,
1275 emit_data
->args
[0], emit_data
->args
[1]);
1278 /* TGSI_OPCODE_ARL (CPU Only) */
1281 const struct lp_build_tgsi_action
* action
,
1282 struct lp_build_tgsi_context
* bld_base
,
1283 struct lp_build_emit_data
* emit_data
)
1286 tmp
= lp_build_floor(&bld_base
->base
,
1287 emit_data
->args
[0]);
1288 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
1289 bld_base
->uint_bld
.vec_type
, "");
1292 /* TGSI_OPCODE_ARR (CPU Only) */
1295 const struct lp_build_tgsi_action
* action
,
1296 struct lp_build_tgsi_context
* bld_base
,
1297 struct lp_build_emit_data
* emit_data
)
1299 emit_data
->output
[emit_data
->chan
] = lp_build_iround(&bld_base
->base
, emit_data
->args
[0]);
1302 /* TGSI_OPCODE_CEIL (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_ceil(&bld_base
->base
,
1310 emit_data
->args
[0]);
1313 /* TGSI_OPCODE_CMP (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 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_LESS
,
1321 emit_data
->args
[0], bld_base
->base
.zero
);
1322 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1323 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1326 /* TGSI_OPCODE_UCMP (CPU Only) */
1329 const struct lp_build_tgsi_action
* action
,
1330 struct lp_build_tgsi_context
* bld_base
,
1331 struct lp_build_emit_data
* emit_data
)
1333 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1334 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1335 LLVMValueRef unsigned_cond
=
1336 LLVMBuildBitCast(builder
, emit_data
->args
[0], uint_bld
->vec_type
, "");
1337 LLVMValueRef cond
= lp_build_cmp(uint_bld
, PIPE_FUNC_NOTEQUAL
,
1340 emit_data
->output
[emit_data
->chan
] =
1341 lp_build_select(&bld_base
->base
,
1342 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1345 /* TGSI_OPCODE_COS (CPU Only) */
1348 const struct lp_build_tgsi_action
* action
,
1349 struct lp_build_tgsi_context
* bld_base
,
1350 struct lp_build_emit_data
* emit_data
)
1352 emit_data
->output
[emit_data
->chan
] = lp_build_cos(&bld_base
->base
,
1353 emit_data
->args
[0]);
1356 /* TGSI_OPCODE_DIV (CPU Only) */
1359 const struct lp_build_tgsi_action
* action
,
1360 struct lp_build_tgsi_context
* bld_base
,
1361 struct lp_build_emit_data
* emit_data
)
1363 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->base
,
1364 emit_data
->args
[0], emit_data
->args
[1]);
1367 /* TGSI_OPCODE_EX2 (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 emit_data
->output
[emit_data
->chan
] = lp_build_exp2(&bld_base
->base
,
1375 emit_data
->args
[0]);
1378 /* TGSI_OPCODE_F2I (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 emit_data
->output
[emit_data
->chan
] = lp_build_itrunc(&bld_base
->base
,
1386 emit_data
->args
[0]);
1389 /* TGSI_OPCODE_FSET Helper (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
,
1399 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1400 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1401 emit_data
->args
[0], emit_data
->args
[1]);
1404 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1405 emit_data
->args
[0], emit_data
->args
[1]);
1408 emit_data
->output
[emit_data
->chan
] = cond
;
1412 /* TGSI_OPCODE_FSEQ (CPU Only) */
1415 const struct lp_build_tgsi_action
* action
,
1416 struct lp_build_tgsi_context
* bld_base
,
1417 struct lp_build_emit_data
* emit_data
)
1419 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1422 /* TGSI_OPCODE_ISGE (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 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1432 /* TGSI_OPCODE_ISLT (CPU Only) */
1435 const struct lp_build_tgsi_action
* action
,
1436 struct lp_build_tgsi_context
* bld_base
,
1437 struct lp_build_emit_data
* emit_data
)
1439 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1442 /* TGSI_OPCODE_USNE (CPU Only) */
1446 const struct lp_build_tgsi_action
* action
,
1447 struct lp_build_tgsi_context
* bld_base
,
1448 struct lp_build_emit_data
* emit_data
)
1450 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1453 /* TGSI_OPCODE_FLR (CPU Only) */
1457 const struct lp_build_tgsi_action
* action
,
1458 struct lp_build_tgsi_context
* bld_base
,
1459 struct lp_build_emit_data
* emit_data
)
1461 emit_data
->output
[emit_data
->chan
] = lp_build_floor(&bld_base
->base
,
1462 emit_data
->args
[0]);
1465 /* TGSI_OPCODE_I2F (CPU Only) */
1468 const struct lp_build_tgsi_action
* action
,
1469 struct lp_build_tgsi_context
* bld_base
,
1470 struct lp_build_emit_data
* emit_data
)
1472 emit_data
->output
[emit_data
->chan
] = lp_build_int_to_float(&bld_base
->base
,
1473 emit_data
->args
[0]);
1476 /* TGSI_OPCODE_IABS (CPU Only) */
1479 const struct lp_build_tgsi_action
* action
,
1480 struct lp_build_tgsi_context
* bld_base
,
1481 struct lp_build_emit_data
* emit_data
)
1483 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int_bld
,
1484 emit_data
->args
[0]);
1487 /* TGSI_OPCODE_IDIV (CPU Only) */
1490 const struct lp_build_tgsi_action
* action
,
1491 struct lp_build_tgsi_context
* bld_base
,
1492 struct lp_build_emit_data
* emit_data
)
1494 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1495 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1496 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1497 bld_base
->uint_bld
.zero
);
1498 /* We want to make sure that we never divide/mod by zero to not
1499 * generate sigfpe. We don't want to crash just because the
1500 * shader is doing something weird. */
1501 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1503 emit_data
->args
[1], "");
1504 LLVMValueRef result
= lp_build_div(&bld_base
->int_bld
,
1505 emit_data
->args
[0], divisor
);
1506 LLVMValueRef not_div_mask
= LLVMBuildNot(builder
,
1508 /* idiv by zero doesn't have a guaranteed return value chose 0 for now. */
1509 emit_data
->output
[emit_data
->chan
] = LLVMBuildAnd(builder
,
1514 /* TGSI_OPCODE_INEG (CPU Only) */
1517 const struct lp_build_tgsi_action
* action
,
1518 struct lp_build_tgsi_context
* bld_base
,
1519 struct lp_build_emit_data
* emit_data
)
1521 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int_bld
,
1522 bld_base
->int_bld
.zero
,
1523 emit_data
->args
[0]);
1526 /* TGSI_OPCODE_ISET Helper (CPU Only) */
1529 const struct lp_build_tgsi_action
* action
,
1530 struct lp_build_tgsi_context
* bld_base
,
1531 struct lp_build_emit_data
* emit_data
,
1534 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int_bld
, pipe_func
,
1535 emit_data
->args
[0], emit_data
->args
[1]);
1536 emit_data
->output
[emit_data
->chan
] = cond
;
1539 /* TGSI_OPCODE_IMAX (CPU Only) */
1542 const struct lp_build_tgsi_action
* action
,
1543 struct lp_build_tgsi_context
* bld_base
,
1544 struct lp_build_emit_data
* emit_data
)
1546 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int_bld
,
1547 emit_data
->args
[0], emit_data
->args
[1]);
1550 /* TGSI_OPCODE_IMIN (CPU Only) */
1553 const struct lp_build_tgsi_action
* action
,
1554 struct lp_build_tgsi_context
* bld_base
,
1555 struct lp_build_emit_data
* emit_data
)
1557 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int_bld
,
1558 emit_data
->args
[0], emit_data
->args
[1]);
1561 /* TGSI_OPCODE_ISGE (CPU Only) */
1564 const struct lp_build_tgsi_action
* action
,
1565 struct lp_build_tgsi_context
* bld_base
,
1566 struct lp_build_emit_data
* emit_data
)
1568 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1571 /* TGSI_OPCODE_ISHR (CPU Only) */
1574 const struct lp_build_tgsi_action
* action
,
1575 struct lp_build_tgsi_context
* bld_base
,
1576 struct lp_build_emit_data
* emit_data
)
1578 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
1579 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
1580 int_bld
->type
.width
- 1);
1581 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
1582 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
1586 /* TGSI_OPCODE_ISLT (CPU Only) */
1589 const struct lp_build_tgsi_action
* action
,
1590 struct lp_build_tgsi_context
* bld_base
,
1591 struct lp_build_emit_data
* emit_data
)
1593 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1597 /* TGSI_OPCODE_ISSG (CPU Only) */
1600 const struct lp_build_tgsi_action
* action
,
1601 struct lp_build_tgsi_context
* bld_base
,
1602 struct lp_build_emit_data
* emit_data
)
1604 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int_bld
,
1605 emit_data
->args
[0]);
1608 /* TGSI_OPCODE_LG2 (CPU Only) */
1611 const struct lp_build_tgsi_action
* action
,
1612 struct lp_build_tgsi_context
* bld_base
,
1613 struct lp_build_emit_data
* emit_data
)
1615 emit_data
->output
[emit_data
->chan
] = lp_build_log2_safe(&bld_base
->base
,
1616 emit_data
->args
[0]);
1619 /* TGSI_OPCODE_LOG (CPU Only) */
1622 const struct lp_build_tgsi_action
* action
,
1623 struct lp_build_tgsi_context
* bld_base
,
1624 struct lp_build_emit_data
* emit_data
)
1626 LLVMValueRef p_floor_log2
;
1628 LLVMValueRef p_log2
;
1629 LLVMValueRef src0
= emit_data
->args
[0];
1631 lp_build_log2_approx(&bld_base
->base
, src0
,
1632 &p_exp
, &p_floor_log2
, &p_log2
, FALSE
);
1634 emit_data
->output
[TGSI_CHAN_X
] = p_floor_log2
;
1636 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
1639 emit_data
->output
[TGSI_CHAN_Z
] = p_log2
;
1641 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
1645 /* TGSI_OPCODE_MAD (CPU Only) */
1649 const struct lp_build_tgsi_action
* action
,
1650 struct lp_build_tgsi_context
* bld_base
,
1651 struct lp_build_emit_data
* emit_data
)
1653 emit_data
->output
[emit_data
->chan
] =
1654 lp_build_mad(&bld_base
->base
,
1655 emit_data
->args
[0], emit_data
->args
[1], emit_data
->args
[2]);
1658 /* TGSI_OPCODE_MAX (CPU Only) */
1662 const struct lp_build_tgsi_action
* action
,
1663 struct lp_build_tgsi_context
* bld_base
,
1664 struct lp_build_emit_data
* emit_data
)
1666 emit_data
->output
[emit_data
->chan
] =
1667 lp_build_max_ext(&bld_base
->base
,
1668 emit_data
->args
[0], emit_data
->args
[1],
1669 GALLIVM_NAN_RETURN_OTHER
);
1672 /* TGSI_OPCODE_MIN (CPU Only) */
1675 const struct lp_build_tgsi_action
* action
,
1676 struct lp_build_tgsi_context
* bld_base
,
1677 struct lp_build_emit_data
* emit_data
)
1679 emit_data
->output
[emit_data
->chan
] =
1680 lp_build_min_ext(&bld_base
->base
,
1681 emit_data
->args
[0], emit_data
->args
[1],
1682 GALLIVM_NAN_RETURN_OTHER
);
1685 /* TGSI_OPCODE_MOD (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 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1693 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1694 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1695 bld_base
->uint_bld
.zero
);
1696 /* We want to make sure that we never divide/mod by zero to not
1697 * generate sigfpe. We don't want to crash just because the
1698 * shader is doing something weird. */
1699 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1701 emit_data
->args
[1], "");
1702 LLVMValueRef result
= lp_build_mod(&bld_base
->int_bld
,
1703 emit_data
->args
[0], divisor
);
1704 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1705 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1710 /* TGSI_OPCODE_NOT */
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_not(&bld_base
->uint_bld
,
1718 emit_data
->args
[0]);
1721 /* TGSI_OPCODE_OR (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_or(&bld_base
->uint_bld
,
1729 emit_data
->args
[0], emit_data
->args
[1]);
1732 /* TGSI_OPCODE_POW (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 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
1740 emit_data
->args
[0], emit_data
->args
[1]);
1744 /* TGSI_OPCODE_RCP (CPU Only) */
1748 const struct lp_build_tgsi_action
* action
,
1749 struct lp_build_tgsi_context
* bld_base
,
1750 struct lp_build_emit_data
* emit_data
)
1752 emit_data
->output
[emit_data
->chan
] = lp_build_rcp(&bld_base
->base
,
1753 emit_data
->args
[0]);
1756 /* Reciprical squareroot (CPU Only) */
1758 recip_sqrt_emit_cpu(
1759 const struct lp_build_tgsi_action
* action
,
1760 struct lp_build_tgsi_context
* bld_base
,
1761 struct lp_build_emit_data
* emit_data
)
1763 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->base
,
1764 emit_data
->args
[0]);
1769 const struct lp_build_tgsi_action
* action
,
1770 struct lp_build_tgsi_context
* bld_base
,
1771 struct lp_build_emit_data
* emit_data
)
1773 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->base
,
1774 emit_data
->args
[0]);
1778 /* TGSI_OPCODE_ROUND (CPU Only) */
1781 const struct lp_build_tgsi_action
* action
,
1782 struct lp_build_tgsi_context
* bld_base
,
1783 struct lp_build_emit_data
* emit_data
)
1785 emit_data
->output
[emit_data
->chan
] = lp_build_round(&bld_base
->base
,
1786 emit_data
->args
[0]);
1789 /* TGSI_OPCODE_SET Helper (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
,
1800 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1801 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1802 emit_data
->args
[0], emit_data
->args
[1]);
1805 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1806 emit_data
->args
[0], emit_data
->args
[1]);
1809 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1812 bld_base
->base
.zero
);
1815 /* TGSI_OPCODE_SEQ (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_EQUAL
);
1826 /* TGSI_OPCODE_SGE (CPU Only) */
1829 const struct lp_build_tgsi_action
* action
,
1830 struct lp_build_tgsi_context
* bld_base
,
1831 struct lp_build_emit_data
* emit_data
)
1833 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1836 /* TGSI_OPCODE_SGT (CPU Only)*/
1840 const struct lp_build_tgsi_action
* action
,
1841 struct lp_build_tgsi_context
* bld_base
,
1842 struct lp_build_emit_data
* emit_data
)
1844 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GREATER
);
1847 /* TGSI_OPCODE_SHL (CPU Only) */
1850 const struct lp_build_tgsi_action
* action
,
1851 struct lp_build_tgsi_context
* bld_base
,
1852 struct lp_build_emit_data
* emit_data
)
1854 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1855 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
1856 uint_bld
->type
.width
- 1);
1857 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
1858 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
1862 /* TGSI_OPCODE_SIN (CPU Only) */
1865 const struct lp_build_tgsi_action
* action
,
1866 struct lp_build_tgsi_context
* bld_base
,
1867 struct lp_build_emit_data
* emit_data
)
1869 emit_data
->output
[emit_data
->chan
] = lp_build_sin(&bld_base
->base
,
1870 emit_data
->args
[0]);
1873 /* TGSI_OPCODE_SLE (CPU Only) */
1876 const struct lp_build_tgsi_action
* action
,
1877 struct lp_build_tgsi_context
* bld_base
,
1878 struct lp_build_emit_data
* emit_data
)
1880 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LEQUAL
);
1883 /* TGSI_OPCODE_SLT (CPU Only) */
1886 const struct lp_build_tgsi_action
* action
,
1887 struct lp_build_tgsi_context
* bld_base
,
1888 struct lp_build_emit_data
* emit_data
)
1890 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1893 /* TGSI_OPCODE_SNE (CPU Only) */
1897 const struct lp_build_tgsi_action
* action
,
1898 struct lp_build_tgsi_context
* bld_base
,
1899 struct lp_build_emit_data
* emit_data
)
1901 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1904 /* TGSI_OPCODE_SSG (CPU Only) */
1908 const struct lp_build_tgsi_action
* action
,
1909 struct lp_build_tgsi_context
* bld_base
,
1910 struct lp_build_emit_data
* emit_data
)
1912 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->base
,
1913 emit_data
->args
[0]);
1916 /* TGSI_OPCODE_TRUNC (CPU Only) */
1920 const struct lp_build_tgsi_action
* action
,
1921 struct lp_build_tgsi_context
* bld_base
,
1922 struct lp_build_emit_data
* emit_data
)
1924 emit_data
->output
[emit_data
->chan
] = lp_build_trunc(&bld_base
->base
,
1925 emit_data
->args
[0]);
1928 /* TGSI_OPCODE_UADD (CPU Only) */
1931 const struct lp_build_tgsi_action
* action
,
1932 struct lp_build_tgsi_context
* bld_base
,
1933 struct lp_build_emit_data
* emit_data
)
1935 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint_bld
,
1936 emit_data
->args
[0], emit_data
->args
[1]);
1939 /* TGSI_OPCODE_UDIV (CPU Only) */
1942 const struct lp_build_tgsi_action
* action
,
1943 struct lp_build_tgsi_context
* bld_base
,
1944 struct lp_build_emit_data
* emit_data
)
1947 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1948 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1949 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1950 bld_base
->uint_bld
.zero
);
1951 /* We want to make sure that we never divide/mod by zero to not
1952 * generate sigfpe. We don't want to crash just because the
1953 * shader is doing something weird. */
1954 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1956 emit_data
->args
[1], "");
1957 LLVMValueRef result
= lp_build_div(&bld_base
->uint_bld
,
1958 emit_data
->args
[0], divisor
);
1959 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1960 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1965 /* TGSI_OPCODE_UMAX (CPU Only) */
1968 const struct lp_build_tgsi_action
* action
,
1969 struct lp_build_tgsi_context
* bld_base
,
1970 struct lp_build_emit_data
* emit_data
)
1972 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint_bld
,
1973 emit_data
->args
[0], emit_data
->args
[1]);
1976 /* TGSI_OPCODE_UMIN (CPU Only) */
1979 const struct lp_build_tgsi_action
* action
,
1980 struct lp_build_tgsi_context
* bld_base
,
1981 struct lp_build_emit_data
* emit_data
)
1983 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint_bld
,
1984 emit_data
->args
[0], emit_data
->args
[1]);
1987 /* TGSI_OPCODE_UMOD (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 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1995 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1996 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1997 bld_base
->uint_bld
.zero
);
1998 /* We want to make sure that we never divide/mod by zero to not
1999 * generate sigfpe. We don't want to crash just because the
2000 * shader is doing something weird. */
2001 LLVMValueRef divisor
= LLVMBuildOr(builder
,
2003 emit_data
->args
[1], "");
2004 LLVMValueRef result
= lp_build_mod(&bld_base
->uint_bld
,
2005 emit_data
->args
[0], divisor
);
2006 /* umod by zero is guaranteed to return 0xffffffff */
2007 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
2012 /* TGSI_OPCODE_USET Helper (CPU Only) */
2015 const struct lp_build_tgsi_action
* action
,
2016 struct lp_build_tgsi_context
* bld_base
,
2017 struct lp_build_emit_data
* emit_data
,
2020 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint_bld
, pipe_func
,
2021 emit_data
->args
[0], emit_data
->args
[1]);
2022 emit_data
->output
[emit_data
->chan
] = cond
;
2026 /* TGSI_OPCODE_USEQ (CPU Only) */
2029 const struct lp_build_tgsi_action
* action
,
2030 struct lp_build_tgsi_context
* bld_base
,
2031 struct lp_build_emit_data
* emit_data
)
2033 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2036 /* TGSI_OPCODE_ISGE (CPU Only) */
2039 const struct lp_build_tgsi_action
* action
,
2040 struct lp_build_tgsi_context
* bld_base
,
2041 struct lp_build_emit_data
* emit_data
)
2043 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2046 /* TGSI_OPCODE_USHR (CPU Only) */
2049 const struct lp_build_tgsi_action
* action
,
2050 struct lp_build_tgsi_context
* bld_base
,
2051 struct lp_build_emit_data
* emit_data
)
2053 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
2054 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2055 uint_bld
->type
.width
- 1);
2056 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2057 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
2061 /* TGSI_OPCODE_ISLT (CPU Only) */
2064 const struct lp_build_tgsi_action
* action
,
2065 struct lp_build_tgsi_context
* bld_base
,
2066 struct lp_build_emit_data
* emit_data
)
2068 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2071 /* TGSI_OPCODE_USNE (CPU Only) */
2075 const struct lp_build_tgsi_action
* action
,
2076 struct lp_build_tgsi_context
* bld_base
,
2077 struct lp_build_emit_data
* emit_data
)
2079 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2082 /* TGSI_OPCODE_XOR */
2085 const struct lp_build_tgsi_action
* action
,
2086 struct lp_build_tgsi_context
* bld_base
,
2087 struct lp_build_emit_data
* emit_data
)
2089 emit_data
->output
[emit_data
->chan
] = lp_build_xor(&bld_base
->uint_bld
,
2091 emit_data
->args
[1]);
2094 /* TGSI_OPCODE_DABS (CPU Only) */
2097 const struct lp_build_tgsi_action
* action
,
2098 struct lp_build_tgsi_context
* bld_base
,
2099 struct lp_build_emit_data
* emit_data
)
2101 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->dbl_bld
,
2102 emit_data
->args
[0]);
2105 /* TGSI_OPCODE_DNEG (CPU Only) */
2108 const struct lp_build_tgsi_action
* action
,
2109 struct lp_build_tgsi_context
* bld_base
,
2110 struct lp_build_emit_data
* emit_data
)
2112 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->dbl_bld
,
2113 bld_base
->dbl_bld
.zero
,
2114 emit_data
->args
[0]);
2117 /* TGSI_OPCODE_DSET Helper (CPU Only) */
2120 const struct lp_build_tgsi_action
* action
,
2121 struct lp_build_tgsi_context
* bld_base
,
2122 struct lp_build_emit_data
* emit_data
,
2125 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2126 LLVMValueRef cond
= lp_build_cmp(&bld_base
->dbl_bld
, pipe_func
,
2127 emit_data
->args
[0], emit_data
->args
[1]);
2128 /* arguments were 64 bit but store as 32 bit */
2129 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2130 emit_data
->output
[emit_data
->chan
] = cond
;
2133 /* TGSI_OPCODE_DSEQ (CPU Only) */
2136 const struct lp_build_tgsi_action
* action
,
2137 struct lp_build_tgsi_context
* bld_base
,
2138 struct lp_build_emit_data
* emit_data
)
2140 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2143 /* TGSI_OPCODE_DSGE (CPU Only) */
2146 const struct lp_build_tgsi_action
* action
,
2147 struct lp_build_tgsi_context
* bld_base
,
2148 struct lp_build_emit_data
* emit_data
)
2150 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2153 /* TGSI_OPCODE_DSLT (CPU Only) */
2156 const struct lp_build_tgsi_action
* action
,
2157 struct lp_build_tgsi_context
* bld_base
,
2158 struct lp_build_emit_data
* emit_data
)
2160 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2163 /* TGSI_OPCODE_DSNE (CPU Only) */
2166 const struct lp_build_tgsi_action
* action
,
2167 struct lp_build_tgsi_context
* bld_base
,
2168 struct lp_build_emit_data
* emit_data
)
2170 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2173 /* Double Reciprocal squareroot (CPU Only) */
2175 drecip_sqrt_emit_cpu(
2176 const struct lp_build_tgsi_action
* action
,
2177 struct lp_build_tgsi_context
* bld_base
,
2178 struct lp_build_emit_data
* emit_data
)
2180 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->dbl_bld
,
2181 emit_data
->args
[0]);
2184 /* Double Squareroot (CPU Only) */
2187 const struct lp_build_tgsi_action
* action
,
2188 struct lp_build_tgsi_context
* bld_base
,
2189 struct lp_build_emit_data
* emit_data
)
2191 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->dbl_bld
,
2192 emit_data
->args
[0]);
2197 const struct lp_build_tgsi_action
* action
,
2198 struct lp_build_tgsi_context
* bld_base
,
2199 struct lp_build_emit_data
* emit_data
)
2201 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int64_bld
,
2202 emit_data
->args
[0]);
2207 const struct lp_build_tgsi_action
* action
,
2208 struct lp_build_tgsi_context
* bld_base
,
2209 struct lp_build_emit_data
* emit_data
)
2211 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int64_bld
,
2212 emit_data
->args
[0]);
2217 const struct lp_build_tgsi_action
* action
,
2218 struct lp_build_tgsi_context
* bld_base
,
2219 struct lp_build_emit_data
* emit_data
)
2221 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int64_bld
,
2222 bld_base
->int64_bld
.zero
,
2223 emit_data
->args
[0]);
2228 const struct lp_build_tgsi_action
* action
,
2229 struct lp_build_tgsi_context
* bld_base
,
2230 struct lp_build_emit_data
* emit_data
,
2233 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2234 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint64_bld
, pipe_func
,
2235 emit_data
->args
[0], emit_data
->args
[1]);
2236 /* arguments were 64 bit but store as 32 bit */
2237 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2238 emit_data
->output
[emit_data
->chan
] = cond
;
2243 const struct lp_build_tgsi_action
* action
,
2244 struct lp_build_tgsi_context
* bld_base
,
2245 struct lp_build_emit_data
* emit_data
)
2247 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2252 const struct lp_build_tgsi_action
* action
,
2253 struct lp_build_tgsi_context
* bld_base
,
2254 struct lp_build_emit_data
* emit_data
)
2256 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2261 const struct lp_build_tgsi_action
* action
,
2262 struct lp_build_tgsi_context
* bld_base
,
2263 struct lp_build_emit_data
* emit_data
)
2265 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2270 const struct lp_build_tgsi_action
* action
,
2271 struct lp_build_tgsi_context
* bld_base
,
2272 struct lp_build_emit_data
* emit_data
)
2274 u64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2279 const struct lp_build_tgsi_action
* action
,
2280 struct lp_build_tgsi_context
* bld_base
,
2281 struct lp_build_emit_data
* emit_data
,
2284 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
2285 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int64_bld
, pipe_func
,
2286 emit_data
->args
[0], emit_data
->args
[1]);
2287 /* arguments were 64 bit but store as 32 bit */
2288 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
2289 emit_data
->output
[emit_data
->chan
] = cond
;
2294 const struct lp_build_tgsi_action
* action
,
2295 struct lp_build_tgsi_context
* bld_base
,
2296 struct lp_build_emit_data
* emit_data
)
2298 i64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2303 const struct lp_build_tgsi_action
* action
,
2304 struct lp_build_tgsi_context
* bld_base
,
2305 struct lp_build_emit_data
* emit_data
)
2307 i64set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2312 const struct lp_build_tgsi_action
* action
,
2313 struct lp_build_tgsi_context
* bld_base
,
2314 struct lp_build_emit_data
* emit_data
)
2316 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint64_bld
,
2317 emit_data
->args
[0], emit_data
->args
[1]);
2322 const struct lp_build_tgsi_action
* action
,
2323 struct lp_build_tgsi_context
* bld_base
,
2324 struct lp_build_emit_data
* emit_data
)
2326 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint64_bld
,
2327 emit_data
->args
[0], emit_data
->args
[1]);
2332 const struct lp_build_tgsi_action
* action
,
2333 struct lp_build_tgsi_context
* bld_base
,
2334 struct lp_build_emit_data
* emit_data
)
2336 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int64_bld
,
2337 emit_data
->args
[0], emit_data
->args
[1]);
2342 const struct lp_build_tgsi_action
* action
,
2343 struct lp_build_tgsi_context
* bld_base
,
2344 struct lp_build_emit_data
* emit_data
)
2346 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int64_bld
,
2347 emit_data
->args
[0], emit_data
->args
[1]);
2352 const struct lp_build_tgsi_action
* action
,
2353 struct lp_build_tgsi_context
* bld_base
,
2354 struct lp_build_emit_data
* emit_data
)
2356 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint64_bld
,
2357 emit_data
->args
[0], emit_data
->args
[1]);
2362 const struct lp_build_tgsi_action
* action
,
2363 struct lp_build_tgsi_context
* bld_base
,
2364 struct lp_build_emit_data
* emit_data
)
2366 struct lp_build_context
*uint_bld
= &bld_base
->uint64_bld
;
2367 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2368 uint_bld
->type
.width
- 1);
2369 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2370 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
2376 const struct lp_build_tgsi_action
* action
,
2377 struct lp_build_tgsi_context
* bld_base
,
2378 struct lp_build_emit_data
* emit_data
)
2380 struct lp_build_context
*int_bld
= &bld_base
->int64_bld
;
2381 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
2382 int_bld
->type
.width
- 1);
2383 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
2384 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
2390 const struct lp_build_tgsi_action
* action
,
2391 struct lp_build_tgsi_context
* bld_base
,
2392 struct lp_build_emit_data
* emit_data
)
2394 struct lp_build_context
*uint_bld
= &bld_base
->uint64_bld
;
2395 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
2396 uint_bld
->type
.width
- 1);
2397 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
2398 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
2401 static void bfi_emit_cpu(const struct lp_build_tgsi_action
*action
,
2402 struct lp_build_tgsi_context
*bld_base
,
2403 struct lp_build_emit_data
*emit_data
) {
2405 * def bfi(base, insert, offset, bits):
2406 * if offset < 0 or bits < 0 or offset + bits > 32:
2408 * # << defined such that mask == ~0 when bits == 32, offset == 0
2409 * mask = ((1 << bits) - 1) << offset
2410 * return ((insert << offset) & mask) | (base & ~mask)
2412 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
2413 LLVMValueRef one_shl_bits_dec_one
= lp_build_sub(
2414 uint_bld
, lp_build_shl(uint_bld
, uint_bld
->one
, emit_data
->args
[3]),
2417 lp_build_shl(uint_bld
, one_shl_bits_dec_one
, emit_data
->args
[2]);
2418 LLVMValueRef insert_shl_offset
=
2419 lp_build_shl(uint_bld
, emit_data
->args
[1], emit_data
->args
[2]);
2420 LLVMValueRef insert_shl_offset_and_mask
=
2421 lp_build_and(uint_bld
, insert_shl_offset
, mask
);
2422 LLVMValueRef base_and_not_mask
=
2423 lp_build_and(uint_bld
, emit_data
->args
[0], lp_build_not(uint_bld
, mask
));
2425 emit_data
->output
[emit_data
->chan
] =
2426 lp_build_or(uint_bld
, insert_shl_offset_and_mask
, base_and_not_mask
);
2429 static void lsb_emit_cpu(const struct lp_build_tgsi_action
*action
,
2430 struct lp_build_tgsi_context
*bld_base
,
2431 struct lp_build_emit_data
*emit_data
) {
2432 struct lp_build_context
*uint_bld
= &bld_base
->int_bld
;
2434 LLVMValueRef result
= lp_build_cttz(uint_bld
, emit_data
->args
[0]);
2436 lp_build_cmp(uint_bld
, PIPE_FUNC_LESS
, result
,
2437 lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
, 32));
2438 emit_data
->output
[emit_data
->chan
] = lp_build_select(
2439 uint_bld
, cond
, result
,
2440 lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
, -1));
2443 static void umsb_emit_cpu(const struct lp_build_tgsi_action
*action
,
2444 struct lp_build_tgsi_context
*bld_base
,
2445 struct lp_build_emit_data
*emit_data
) {
2446 struct lp_build_context
*uint_bld
= &bld_base
->int_bld
;
2447 emit_data
->output
[emit_data
->chan
] = lp_build_sub(
2448 uint_bld
, lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
, 31),
2449 lp_build_ctlz(uint_bld
, emit_data
->args
[0]));
2452 static void imsb_emit_cpu(const struct lp_build_tgsi_action
*action
,
2453 struct lp_build_tgsi_context
*bld_base
,
2454 struct lp_build_emit_data
*emit_data
) {
2455 struct lp_build_context
*uint_bld
= &bld_base
->int_bld
;
2458 lp_build_cmp(uint_bld
, PIPE_FUNC_LESS
, emit_data
->args
[0],
2459 lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
, 0));
2460 emit_data
->args
[0] = lp_build_select(
2461 uint_bld
, cond
, lp_build_not(uint_bld
, emit_data
->args
[0]),
2462 emit_data
->args
[0]);
2463 umsb_emit_cpu(action
, bld_base
, emit_data
);
2466 static void popc_emit_cpu(const struct lp_build_tgsi_action
*action
,
2467 struct lp_build_tgsi_context
*bld_base
,
2468 struct lp_build_emit_data
*emit_data
) {
2469 struct lp_build_context
*uint_bld
= &bld_base
->int_bld
;
2470 emit_data
->output
[emit_data
->chan
] =
2471 lp_build_popcount(uint_bld
, emit_data
->args
[0]);
2474 static void ibfe_emit_cpu(const struct lp_build_tgsi_action
*action
,
2475 struct lp_build_tgsi_context
*bld_base
,
2476 struct lp_build_emit_data
*emit_data
) {
2477 /* def ibfe(value, offset, bits):
2478 * if offset < 0 or bits < 0 or offset + bits > 32:
2480 * if bits == 0: return 0
2481 * # Note: >> sign-extends
2482 * return (value << (32 - offset - bits)) >> (32 - bits)
2484 struct lp_build_context
*uint_bld
= &bld_base
->int_bld
;
2486 LLVMValueRef r_32_sub_bits
= lp_build_sub(
2487 uint_bld
, lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
, 32),
2488 emit_data
->args
[2]);
2489 LLVMValueRef temp1
=
2490 lp_build_sub(uint_bld
, r_32_sub_bits
, emit_data
->args
[1]);
2491 LLVMValueRef temp2
= lp_build_shl(uint_bld
, emit_data
->args
[0], temp1
);
2493 lp_build_cmp(uint_bld
, PIPE_FUNC_EQUAL
, emit_data
->args
[2],
2494 lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
, 0));
2495 emit_data
->output
[emit_data
->chan
] = lp_build_select(
2496 uint_bld
, cond
, lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
, 0),
2497 lp_build_shr(uint_bld
, temp2
, r_32_sub_bits
));
2500 static void ubfe_emit_cpu(const struct lp_build_tgsi_action
*action
,
2501 struct lp_build_tgsi_context
*bld_base
,
2502 struct lp_build_emit_data
*emit_data
) {
2503 /* def ubfe(value, offset, bits):
2504 * if offset < 0 or bits < 0 or offset + bits > 32:
2506 * if bits == 0: return 0
2507 * # Note: >> does not sign-extend
2508 * return (value << (32 - offset - bits)) >> (32 - bits)
2510 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
2512 LLVMValueRef r_32_sub_bits
= lp_build_sub(
2513 uint_bld
, lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
, 32),
2514 emit_data
->args
[2]);
2515 LLVMValueRef temp1
=
2516 lp_build_sub(uint_bld
, r_32_sub_bits
, emit_data
->args
[1]);
2517 LLVMValueRef temp2
= lp_build_shl(uint_bld
, emit_data
->args
[0], temp1
);
2518 emit_data
->output
[emit_data
->chan
] =
2519 lp_build_shr(uint_bld
, temp2
, r_32_sub_bits
);
2522 static void brev_emit_cpu(const struct lp_build_tgsi_action
*action
,
2523 struct lp_build_tgsi_context
*bld_base
,
2524 struct lp_build_emit_data
*emit_data
) {
2525 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
2526 emit_data
->output
[emit_data
->chan
] =
2527 lp_build_bitfield_reverse(uint_bld
, emit_data
->args
[0]);
2531 lp_set_default_actions_cpu(
2532 struct lp_build_tgsi_context
* bld_base
)
2534 lp_set_default_actions(bld_base
);
2535 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit_cpu
;
2536 bld_base
->op_actions
[TGSI_OPCODE_AND
].emit
= and_emit_cpu
;
2537 bld_base
->op_actions
[TGSI_OPCODE_ARL
].emit
= arl_emit_cpu
;
2538 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit_cpu
;
2539 bld_base
->op_actions
[TGSI_OPCODE_CEIL
].emit
= ceil_emit_cpu
;
2540 bld_base
->op_actions
[TGSI_OPCODE_COS
].emit
= cos_emit_cpu
;
2541 bld_base
->op_actions
[TGSI_OPCODE_CMP
].emit
= cmp_emit_cpu
;
2542 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= div_emit_cpu
;
2543 bld_base
->op_actions
[TGSI_OPCODE_EX2
].emit
= ex2_emit_cpu
;
2544 bld_base
->op_actions
[TGSI_OPCODE_F2I
].emit
= f2i_emit_cpu
;
2545 bld_base
->op_actions
[TGSI_OPCODE_FLR
].emit
= flr_emit_cpu
;
2546 bld_base
->op_actions
[TGSI_OPCODE_FSEQ
].emit
= fseq_emit_cpu
;
2547 bld_base
->op_actions
[TGSI_OPCODE_FSGE
].emit
= fsge_emit_cpu
;
2548 bld_base
->op_actions
[TGSI_OPCODE_FSLT
].emit
= fslt_emit_cpu
;
2549 bld_base
->op_actions
[TGSI_OPCODE_FSNE
].emit
= fsne_emit_cpu
;
2551 bld_base
->op_actions
[TGSI_OPCODE_I2F
].emit
= i2f_emit_cpu
;
2552 bld_base
->op_actions
[TGSI_OPCODE_IABS
].emit
= iabs_emit_cpu
;
2553 bld_base
->op_actions
[TGSI_OPCODE_IDIV
].emit
= idiv_emit_cpu
;
2554 bld_base
->op_actions
[TGSI_OPCODE_INEG
].emit
= ineg_emit_cpu
;
2555 bld_base
->op_actions
[TGSI_OPCODE_IMAX
].emit
= imax_emit_cpu
;
2556 bld_base
->op_actions
[TGSI_OPCODE_IMIN
].emit
= imin_emit_cpu
;
2557 bld_base
->op_actions
[TGSI_OPCODE_ISGE
].emit
= isge_emit_cpu
;
2558 bld_base
->op_actions
[TGSI_OPCODE_ISHR
].emit
= ishr_emit_cpu
;
2559 bld_base
->op_actions
[TGSI_OPCODE_ISLT
].emit
= islt_emit_cpu
;
2560 bld_base
->op_actions
[TGSI_OPCODE_ISSG
].emit
= issg_emit_cpu
;
2561 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit_cpu
;
2562 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit_cpu
;
2564 bld_base
->op_actions
[TGSI_OPCODE_LG2
].emit
= lg2_emit_cpu
;
2565 bld_base
->op_actions
[TGSI_OPCODE_LOG
].emit
= log_emit_cpu
;
2566 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit_cpu
;
2567 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= max_emit_cpu
;
2568 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= min_emit_cpu
;
2569 bld_base
->op_actions
[TGSI_OPCODE_MOD
].emit
= mod_emit_cpu
;
2570 bld_base
->op_actions
[TGSI_OPCODE_NOT
].emit
= not_emit_cpu
;
2571 bld_base
->op_actions
[TGSI_OPCODE_OR
].emit
= or_emit_cpu
;
2572 bld_base
->op_actions
[TGSI_OPCODE_POW
].emit
= pow_emit_cpu
;
2573 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit_cpu
;
2574 bld_base
->op_actions
[TGSI_OPCODE_ROUND
].emit
= round_emit_cpu
;
2575 bld_base
->op_actions
[TGSI_OPCODE_SEQ
].emit
= seq_emit_cpu
;
2576 bld_base
->op_actions
[TGSI_OPCODE_SGE
].emit
= sge_emit_cpu
;
2577 bld_base
->op_actions
[TGSI_OPCODE_SGT
].emit
= sgt_emit_cpu
;
2578 bld_base
->op_actions
[TGSI_OPCODE_SIN
].emit
= sin_emit_cpu
;
2579 bld_base
->op_actions
[TGSI_OPCODE_SHL
].emit
= shl_emit_cpu
;
2580 bld_base
->op_actions
[TGSI_OPCODE_SLE
].emit
= sle_emit_cpu
;
2581 bld_base
->op_actions
[TGSI_OPCODE_SLT
].emit
= slt_emit_cpu
;
2582 bld_base
->op_actions
[TGSI_OPCODE_SNE
].emit
= sne_emit_cpu
;
2583 bld_base
->op_actions
[TGSI_OPCODE_SSG
].emit
= ssg_emit_cpu
;
2584 bld_base
->op_actions
[TGSI_OPCODE_TRUNC
].emit
= trunc_emit_cpu
;
2586 bld_base
->rsq_action
.emit
= recip_sqrt_emit_cpu
;
2587 bld_base
->sqrt_action
.emit
= sqrt_emit_cpu
;
2589 bld_base
->op_actions
[TGSI_OPCODE_UADD
].emit
= uadd_emit_cpu
;
2590 bld_base
->op_actions
[TGSI_OPCODE_UCMP
].emit
= ucmp_emit_cpu
;
2591 bld_base
->op_actions
[TGSI_OPCODE_UDIV
].emit
= udiv_emit_cpu
;
2592 bld_base
->op_actions
[TGSI_OPCODE_UMAX
].emit
= umax_emit_cpu
;
2593 bld_base
->op_actions
[TGSI_OPCODE_UMIN
].emit
= umin_emit_cpu
;
2594 bld_base
->op_actions
[TGSI_OPCODE_UMOD
].emit
= umod_emit_cpu
;
2595 bld_base
->op_actions
[TGSI_OPCODE_USEQ
].emit
= useq_emit_cpu
;
2596 bld_base
->op_actions
[TGSI_OPCODE_USGE
].emit
= usge_emit_cpu
;
2597 bld_base
->op_actions
[TGSI_OPCODE_USHR
].emit
= ushr_emit_cpu
;
2598 bld_base
->op_actions
[TGSI_OPCODE_USLT
].emit
= uslt_emit_cpu
;
2599 bld_base
->op_actions
[TGSI_OPCODE_USNE
].emit
= usne_emit_cpu
;
2601 bld_base
->op_actions
[TGSI_OPCODE_XOR
].emit
= xor_emit_cpu
;
2603 bld_base
->op_actions
[TGSI_OPCODE_DABS
].emit
= dabs_emit_cpu
;
2604 bld_base
->op_actions
[TGSI_OPCODE_DNEG
].emit
= dneg_emit_cpu
;
2605 bld_base
->op_actions
[TGSI_OPCODE_DSEQ
].emit
= dseq_emit_cpu
;
2606 bld_base
->op_actions
[TGSI_OPCODE_DSGE
].emit
= dsge_emit_cpu
;
2607 bld_base
->op_actions
[TGSI_OPCODE_DSLT
].emit
= dslt_emit_cpu
;
2608 bld_base
->op_actions
[TGSI_OPCODE_DSNE
].emit
= dsne_emit_cpu
;
2610 bld_base
->op_actions
[TGSI_OPCODE_DRSQ
].emit
= drecip_sqrt_emit_cpu
;
2611 bld_base
->op_actions
[TGSI_OPCODE_DSQRT
].emit
= dsqrt_emit_cpu
;
2613 bld_base
->op_actions
[TGSI_OPCODE_I64ABS
].emit
= i64abs_emit_cpu
;
2614 bld_base
->op_actions
[TGSI_OPCODE_I64SSG
].emit
= i64ssg_emit_cpu
;
2615 bld_base
->op_actions
[TGSI_OPCODE_I64NEG
].emit
= i64neg_emit_cpu
;
2617 bld_base
->op_actions
[TGSI_OPCODE_U64SEQ
].emit
= u64seq_emit_cpu
;
2618 bld_base
->op_actions
[TGSI_OPCODE_U64SNE
].emit
= u64sne_emit_cpu
;
2619 bld_base
->op_actions
[TGSI_OPCODE_U64SLT
].emit
= u64slt_emit_cpu
;
2620 bld_base
->op_actions
[TGSI_OPCODE_U64SGE
].emit
= u64sge_emit_cpu
;
2621 bld_base
->op_actions
[TGSI_OPCODE_I64SLT
].emit
= i64slt_emit_cpu
;
2622 bld_base
->op_actions
[TGSI_OPCODE_I64SGE
].emit
= i64sge_emit_cpu
;
2624 bld_base
->op_actions
[TGSI_OPCODE_U64MIN
].emit
= u64min_emit_cpu
;
2625 bld_base
->op_actions
[TGSI_OPCODE_U64MAX
].emit
= u64max_emit_cpu
;
2626 bld_base
->op_actions
[TGSI_OPCODE_I64MIN
].emit
= i64min_emit_cpu
;
2627 bld_base
->op_actions
[TGSI_OPCODE_I64MAX
].emit
= i64max_emit_cpu
;
2629 bld_base
->op_actions
[TGSI_OPCODE_U64ADD
].emit
= u64add_emit_cpu
;
2630 bld_base
->op_actions
[TGSI_OPCODE_U64MOD
].emit
= u64mod_emit_cpu
;
2631 bld_base
->op_actions
[TGSI_OPCODE_I64MOD
].emit
= i64mod_emit_cpu
;
2632 bld_base
->op_actions
[TGSI_OPCODE_U64DIV
].emit
= u64div_emit_cpu
;
2633 bld_base
->op_actions
[TGSI_OPCODE_I64DIV
].emit
= i64div_emit_cpu
;
2635 bld_base
->op_actions
[TGSI_OPCODE_U64SHL
].emit
= u64shl_emit_cpu
;
2636 bld_base
->op_actions
[TGSI_OPCODE_I64SHR
].emit
= i64shr_emit_cpu
;
2637 bld_base
->op_actions
[TGSI_OPCODE_U64SHR
].emit
= u64shr_emit_cpu
;
2639 bld_base
->op_actions
[TGSI_OPCODE_BFI
].emit
= bfi_emit_cpu
;
2640 bld_base
->op_actions
[TGSI_OPCODE_POPC
].emit
= popc_emit_cpu
;
2641 bld_base
->op_actions
[TGSI_OPCODE_LSB
].emit
= lsb_emit_cpu
;
2642 bld_base
->op_actions
[TGSI_OPCODE_IMSB
].emit
= imsb_emit_cpu
;
2643 bld_base
->op_actions
[TGSI_OPCODE_UMSB
].emit
= umsb_emit_cpu
;
2644 bld_base
->op_actions
[TGSI_OPCODE_IBFE
].emit
= ibfe_emit_cpu
;
2645 bld_base
->op_actions
[TGSI_OPCODE_UBFE
].emit
= ubfe_emit_cpu
;
2646 bld_base
->op_actions
[TGSI_OPCODE_BREV
].emit
= brev_emit_cpu
;