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_gather.h"
49 #include "lp_bld_logic.h"
51 #include "tgsi/tgsi_exec.h"
53 /* XXX: The CPU only defaults should be repaced by generic ones. In most
54 * cases, the CPU defaults are just wrappers around a function in
55 * lp_build_arit.c and these functions should be inlined here and the CPU
56 * generic code should be removed and placed elsewhere.
61 /* Generic fetch_arg functions */
63 static void scalar_unary_fetch_args(
64 struct lp_build_tgsi_context
* bld_base
,
65 struct lp_build_emit_data
* emit_data
)
68 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, 0);
69 emit_data
->arg_count
= 1;
70 emit_data
->dst_type
= LLVMTypeOf(emit_data
->args
[0]);
73 static void scalar_binary_fetch_args(
74 struct lp_build_tgsi_context
* bld_base
,
75 struct lp_build_emit_data
* emit_data
)
78 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
81 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
83 emit_data
->arg_count
= 2;
84 emit_data
->dst_type
= LLVMTypeOf(emit_data
->args
[0]);
90 const struct lp_build_tgsi_action
* action
,
91 struct lp_build_tgsi_context
* bld_base
,
92 struct lp_build_emit_data
* emit_data
)
94 emit_data
->output
[emit_data
->chan
] = LLVMBuildFAdd(
95 bld_base
->base
.gallivm
->builder
,
96 emit_data
->args
[0], emit_data
->args
[1], "");
102 const struct lp_build_tgsi_action
* action
,
103 struct lp_build_tgsi_context
* bld_base
,
104 struct lp_build_emit_data
* emit_data
)
106 LLVMValueRef tmp
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_ROUND
, emit_data
->args
[0]);
107 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
108 bld_base
->uint_bld
.vec_type
, "");
111 /* TGSI_OPCODE_CLAMP */
114 const struct lp_build_tgsi_action
* action
,
115 struct lp_build_tgsi_context
* bld_base
,
116 struct lp_build_emit_data
* emit_data
)
119 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MAX
,
122 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
123 TGSI_OPCODE_MIN
, tmp
, emit_data
->args
[2]);
130 struct lp_build_tgsi_context
* bld_base
,
131 struct lp_build_emit_data
* emit_data
,
132 unsigned dp_components
)
135 for (src
= 0; src
< 2; src
++) {
136 for (chan
= 0; chan
< dp_components
; chan
++) {
137 emit_data
->args
[(src
* dp_components
) + chan
] =
138 lp_build_emit_fetch(bld_base
, emit_data
->inst
, src
, chan
);
141 emit_data
->dst_type
= bld_base
->base
.elem_type
;
144 /* TGSI_OPCODE_DP2 */
147 struct lp_build_tgsi_context
* bld_base
,
148 struct lp_build_emit_data
* emit_data
)
150 dp_fetch_args(bld_base
, emit_data
, 2);
155 const struct lp_build_tgsi_action
* action
,
156 struct lp_build_tgsi_context
* bld_base
,
157 struct lp_build_emit_data
* emit_data
)
159 LLVMValueRef tmp0
, tmp1
;
160 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
161 emit_data
->args
[0] /* src0.x */,
162 emit_data
->args
[2] /* src1.x */);
163 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
164 emit_data
->args
[1] /* src0.y */,
165 emit_data
->args
[3] /* src1.y */);
166 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
167 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
170 static struct lp_build_tgsi_action dp2_action
= {
171 dp2_fetch_args
, /* fetch_args */
175 /* TGSI_OPCODE_DP2A */
178 struct lp_build_tgsi_context
* bld_base
,
179 struct lp_build_emit_data
* emit_data
)
181 dp_fetch_args(bld_base
, emit_data
, 2);
182 emit_data
->args
[5] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
188 const struct lp_build_tgsi_action
* action
,
189 struct lp_build_tgsi_context
* bld_base
,
190 struct lp_build_emit_data
* emit_data
)
193 tmp
= lp_build_emit_llvm(bld_base
, TGSI_OPCODE_DP2
, emit_data
);
194 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
,
195 emit_data
->args
[5], tmp
);
198 static struct lp_build_tgsi_action dp2a_action
= {
199 dp2a_fetch_args
, /* fetch_args */
203 /* TGSI_OPCODE_DP3 */
206 struct lp_build_tgsi_context
* bld_base
,
207 struct lp_build_emit_data
* emit_data
)
209 dp_fetch_args(bld_base
, emit_data
, 3);
214 const struct lp_build_tgsi_action
* action
,
215 struct lp_build_tgsi_context
* bld_base
,
216 struct lp_build_emit_data
* emit_data
)
218 LLVMValueRef tmp0
, tmp1
;
219 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
220 emit_data
->args
[0] /* src0.x */,
221 emit_data
->args
[3] /* src1.x */);
222 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
223 emit_data
->args
[1] /* src0.y */,
224 emit_data
->args
[4] /* src1.y */);
225 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp1
, tmp0
);
226 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
227 emit_data
->args
[2] /* src0.z */,
228 emit_data
->args
[5] /* src1.z */);
229 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
230 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
233 static struct lp_build_tgsi_action dp3_action
= {
234 dp3_fetch_args
, /* fetch_args */
238 /* TGSI_OPCODDE_DP4 */
242 struct lp_build_tgsi_context
* bld_base
,
243 struct lp_build_emit_data
* emit_data
)
245 dp_fetch_args(bld_base
, emit_data
, 4);
250 const struct lp_build_tgsi_action
* action
,
251 struct lp_build_tgsi_context
* bld_base
,
252 struct lp_build_emit_data
* emit_data
)
254 LLVMValueRef tmp0
, tmp1
;
255 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
256 emit_data
->args
[0] /* src0.x */,
257 emit_data
->args
[4] /* src1.x */);
258 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
259 emit_data
->args
[1] /* src0.y */,
260 emit_data
->args
[5] /* src1.y */);
261 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp0
, tmp1
);
262 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
263 emit_data
->args
[2] /* src0.z */,
264 emit_data
->args
[6] /* src1.z */);
265 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_ADD
, tmp0
, tmp1
);
266 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
267 emit_data
->args
[3] /* src0.w */,
268 emit_data
->args
[7] /* src1.w */);
269 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
270 TGSI_OPCODE_ADD
, tmp0
, tmp1
);
273 static struct lp_build_tgsi_action dp4_action
= {
274 dp4_fetch_args
, /* fetch_args */
278 /* TGSI_OPCODE_DPH */
281 struct lp_build_tgsi_context
* bld_base
,
282 struct lp_build_emit_data
* emit_data
)
284 dp_fetch_args(bld_base
, emit_data
, 4);
286 emit_data
->args
[3] = bld_base
->base
.one
;
289 const struct lp_build_tgsi_action dph_action
= {
290 dph_fetch_args
, /* fetch_args */
294 /* TGSI_OPCODE_DST */
297 struct lp_build_tgsi_context
* bld_base
,
298 struct lp_build_emit_data
* emit_data
)
301 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
304 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
307 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
310 emit_data
->args
[3] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
316 const struct lp_build_tgsi_action
* action
,
317 struct lp_build_tgsi_context
* bld_base
,
318 struct lp_build_emit_data
* emit_data
)
321 emit_data
->output
[TGSI_CHAN_X
] = bld_base
->base
.one
;
324 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
326 emit_data
->args
[0] /* src0.y */,
327 emit_data
->args
[2] /* src1.y */);
329 emit_data
->output
[TGSI_CHAN_Z
] = emit_data
->args
[1]; /* src0.z */
332 emit_data
->output
[TGSI_CHAN_W
] = emit_data
->args
[3]; /* src1.w */
335 static struct lp_build_tgsi_action dst_action
= {
336 dst_fetch_args
, /* fetch_args */
340 /* TGSI_OPCODE_END */
343 const struct lp_build_tgsi_action
* action
,
344 struct lp_build_tgsi_context
* bld_base
,
345 struct lp_build_emit_data
* emit_data
)
350 /* TGSI_OPCODE_EXP */
354 const struct lp_build_tgsi_action
* action
,
355 struct lp_build_tgsi_context
* bld_base
,
356 struct lp_build_emit_data
* emit_data
)
358 LLVMValueRef floor_x
;
360 /* floor( src0.x ) */
361 floor_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
364 /* 2 ^ floor( src0.x ) */
365 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
366 TGSI_OPCODE_EX2
, floor_x
);
368 /* src0.x - floor( src0.x ) */
369 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
370 TGSI_OPCODE_SUB
, emit_data
->args
[0] /* src0.x */, floor_x
);
373 emit_data
->output
[TGSI_CHAN_Z
] = lp_build_emit_llvm_unary(bld_base
,
374 TGSI_OPCODE_EX2
, emit_data
->args
[0] /* src0.x */);
376 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
379 const struct lp_build_tgsi_action exp_action
= {
380 scalar_unary_fetch_args
, /* fetch_args */
384 /* TGSI_OPCODE_FRC */
388 const struct lp_build_tgsi_action
* action
,
389 struct lp_build_tgsi_context
* bld_base
,
390 struct lp_build_emit_data
* emit_data
)
393 tmp
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
395 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
396 TGSI_OPCODE_SUB
, emit_data
->args
[0], tmp
);
399 /* TGSI_OPCODE_KILL_IF */
403 struct lp_build_tgsi_context
* bld_base
,
404 struct lp_build_emit_data
* emit_data
)
407 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
410 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
413 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
416 emit_data
->args
[3] = lp_build_emit_fetch(bld_base
, emit_data
->inst
,
418 emit_data
->arg_count
= 4;
419 emit_data
->dst_type
= LLVMVoidTypeInContext(bld_base
->base
.gallivm
->context
);
422 /* TGSI_OPCODE_KILL */
426 struct lp_build_tgsi_context
* bld_base
,
427 struct lp_build_emit_data
* emit_data
)
429 emit_data
->dst_type
= LLVMVoidTypeInContext(bld_base
->base
.gallivm
->context
);
432 /* TGSI_OPCODE_LIT */
436 struct lp_build_tgsi_context
* bld_base
,
437 struct lp_build_emit_data
* emit_data
)
440 emit_data
->args
[0] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_X
);
442 emit_data
->args
[1] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_Y
);
444 emit_data
->args
[2] = lp_build_emit_fetch(bld_base
, emit_data
->inst
, 0, TGSI_CHAN_W
);
445 emit_data
->arg_count
= 3;
450 const struct lp_build_tgsi_action
* action
,
451 struct lp_build_tgsi_context
* bld_base
,
452 struct lp_build_emit_data
* emit_data
)
454 LLVMValueRef tmp0
, tmp1
, tmp2
;
457 emit_data
->output
[TGSI_CHAN_X
] = bld_base
->base
.one
;
460 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
462 emit_data
->args
[0] /* src0.x */,
463 bld_base
->base
.zero
);
466 /* XMM[1] = SrcReg[0].yyyy */
467 tmp1
= emit_data
->args
[1];
468 /* XMM[1] = max(XMM[1], 0) */
469 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MAX
,
470 tmp1
, bld_base
->base
.zero
);
471 /* XMM[2] = SrcReg[0].wwww */
472 tmp2
= emit_data
->args
[2];
473 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_POW
,
475 tmp0
= emit_data
->args
[0];
476 emit_data
->output
[TGSI_CHAN_Z
] = lp_build_emit_llvm_ternary(bld_base
,
478 tmp0
, bld_base
->base
.zero
, tmp1
);
480 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
483 static struct lp_build_tgsi_action lit_action
= {
484 lit_fetch_args
, /* fetch_args */
488 /* TGSI_OPCODE_LOG */
492 const struct lp_build_tgsi_action
* action
,
493 struct lp_build_tgsi_context
* bld_base
,
494 struct lp_build_emit_data
* emit_data
)
497 LLVMValueRef abs_x
, log_abs_x
, flr_log_abs_x
, ex2_flr_log_abs_x
;
500 abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_ABS
,
501 emit_data
->args
[0] /* src0.x */);
503 /* log( abs( src0.x ) ) */
504 log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_LG2
,
507 /* floor( log( abs( src0.x ) ) ) */
508 flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_FLR
,
511 emit_data
->output
[TGSI_CHAN_X
] = flr_log_abs_x
;
514 ex2_flr_log_abs_x
= lp_build_emit_llvm_unary(bld_base
, TGSI_OPCODE_EX2
,
517 /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */
518 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
519 TGSI_OPCODE_DIV
, abs_x
, ex2_flr_log_abs_x
);
522 emit_data
->output
[TGSI_CHAN_Z
] = log_abs_x
;
525 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
528 static struct lp_build_tgsi_action log_action
= {
529 scalar_unary_fetch_args
, /* fetch_args */
533 /* TGSI_OPCODE_LRP */
537 const struct lp_build_tgsi_action
* action
,
538 struct lp_build_tgsi_context
* bld_base
,
539 struct lp_build_emit_data
* emit_data
)
541 struct lp_build_context
*bld
= &bld_base
->base
;
542 LLVMValueRef inv
, a
, b
;
544 /* This uses the correct version: (1 - t)*a + t*b
546 * An alternative version is "a + t*(b-a)". The problem is this version
547 * doesn't return "b" for t = 1, because "a + (b-a)" isn't equal to "b"
548 * because of the floating-point rounding.
550 inv
= lp_build_sub(bld
, bld_base
->base
.one
, emit_data
->args
[0]);
551 a
= lp_build_mul(bld
, emit_data
->args
[1], emit_data
->args
[0]);
552 b
= lp_build_mul(bld
, emit_data
->args
[2], inv
);
553 emit_data
->output
[emit_data
->chan
] = lp_build_add(bld
, a
, b
);
556 /* TGSI_OPCODE_MAD */
560 const struct lp_build_tgsi_action
* action
,
561 struct lp_build_tgsi_context
* bld_base
,
562 struct lp_build_emit_data
* emit_data
)
565 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
,
568 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
569 TGSI_OPCODE_ADD
, tmp
, emit_data
->args
[2]);
572 /* TGSI_OPCODE_MOV */
576 const struct lp_build_tgsi_action
* action
,
577 struct lp_build_tgsi_context
* bld_base
,
578 struct lp_build_emit_data
* emit_data
)
580 emit_data
->output
[emit_data
->chan
] = emit_data
->args
[0];
583 /* TGSI_OPCODE_MUL */
586 const struct lp_build_tgsi_action
* action
,
587 struct lp_build_tgsi_context
* bld_base
,
588 struct lp_build_emit_data
* emit_data
)
590 emit_data
->output
[emit_data
->chan
] = LLVMBuildFMul(
591 bld_base
->base
.gallivm
->builder
,
592 emit_data
->args
[0], emit_data
->args
[1], "");
595 /*.TGSI_OPCODE_DIV.*/
596 static void fdiv_emit(
597 const struct lp_build_tgsi_action
* action
,
598 struct lp_build_tgsi_context
* bld_base
,
599 struct lp_build_emit_data
* emit_data
)
601 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
602 bld_base
->base
.gallivm
->builder
,
603 emit_data
->args
[0], emit_data
->args
[1], "");
606 /*.TGSI_OPCODE_RCP.*/
607 static void rcp_emit(
608 const struct lp_build_tgsi_action
* action
,
609 struct lp_build_tgsi_context
* bld_base
,
610 struct lp_build_emit_data
* emit_data
)
613 one
= lp_build_const_float(bld_base
->base
.gallivm
, 1.0f
);
614 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
615 TGSI_OPCODE_DIV
, one
, emit_data
->args
[0]);
618 /* TGSI_OPCODE_POW */
622 const struct lp_build_tgsi_action
* action
,
623 struct lp_build_tgsi_context
* bld_base
,
624 struct lp_build_emit_data
* emit_data
)
626 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
627 emit_data
->args
[0], emit_data
->args
[1]);
630 static struct lp_build_tgsi_action pow_action
= {
631 scalar_binary_fetch_args
, /* fetch_args */
635 /* TGSI_OPCODE_RSQ */
639 const struct lp_build_tgsi_action
* action
,
640 struct lp_build_tgsi_context
* bld_base
,
641 struct lp_build_emit_data
* emit_data
)
643 if (bld_base
->rsq_action
.emit
) {
644 bld_base
->rsq_action
.emit(&bld_base
->rsq_action
, bld_base
, emit_data
);
646 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
650 const struct lp_build_tgsi_action rsq_action
= {
651 scalar_unary_fetch_args
, /* fetch_args */
656 /* TGSI_OPCODE_SQRT */
660 const struct lp_build_tgsi_action
* action
,
661 struct lp_build_tgsi_context
* bld_base
,
662 struct lp_build_emit_data
* emit_data
)
664 if (bld_base
->sqrt_action
.emit
) {
665 bld_base
->sqrt_action
.emit(&bld_base
->sqrt_action
, bld_base
, emit_data
);
667 emit_data
->output
[emit_data
->chan
] = bld_base
->base
.undef
;
671 const struct lp_build_tgsi_action sqrt_action
= {
672 scalar_unary_fetch_args
, /* fetch_args */
676 /* TGSI_OPCODE_SCS */
679 const struct lp_build_tgsi_action
* action
,
680 struct lp_build_tgsi_context
* bld_base
,
681 struct lp_build_emit_data
* emit_data
)
684 emit_data
->output
[TGSI_CHAN_X
] = lp_build_emit_llvm_unary(bld_base
,
685 TGSI_OPCODE_COS
, emit_data
->args
[0]);
687 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_unary(bld_base
,
688 TGSI_OPCODE_SIN
, emit_data
->args
[0]);
690 emit_data
->output
[TGSI_CHAN_Z
] = bld_base
->base
.zero
;
693 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
696 const struct lp_build_tgsi_action scs_action
= {
697 scalar_unary_fetch_args
, /* fetch_args */
701 /* TGSI_OPCODE_SUB */
704 const struct lp_build_tgsi_action
* action
,
705 struct lp_build_tgsi_context
* bld_base
,
706 struct lp_build_emit_data
* emit_data
)
708 emit_data
->output
[emit_data
->chan
] =
709 LLVMBuildFSub(bld_base
->base
.gallivm
->builder
,
711 emit_data
->args
[1], "");
714 /* TGSI_OPCODE_F2U */
717 const struct lp_build_tgsi_action
* action
,
718 struct lp_build_tgsi_context
* bld_base
,
719 struct lp_build_emit_data
* emit_data
)
721 emit_data
->output
[emit_data
->chan
] =
722 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
724 bld_base
->base
.int_vec_type
, "");
727 /* TGSI_OPCODE_U2F */
730 const struct lp_build_tgsi_action
* action
,
731 struct lp_build_tgsi_context
* bld_base
,
732 struct lp_build_emit_data
* emit_data
)
734 emit_data
->output
[emit_data
->chan
] =
735 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
737 bld_base
->base
.vec_type
, "");
742 const struct lp_build_tgsi_action
* action
,
743 struct lp_build_tgsi_context
* bld_base
,
744 struct lp_build_emit_data
* emit_data
)
747 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_UMUL
,
750 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
751 TGSI_OPCODE_UADD
, tmp
, emit_data
->args
[2]);
754 /* TGSI_OPCODE_UMUL */
757 const struct lp_build_tgsi_action
* action
,
758 struct lp_build_tgsi_context
* bld_base
,
759 struct lp_build_emit_data
* emit_data
)
761 emit_data
->output
[emit_data
->chan
] = lp_build_mul(&bld_base
->uint_bld
,
762 emit_data
->args
[0], emit_data
->args
[1]);
765 /* TGSI_OPCODE_IMUL_HI */
768 const struct lp_build_tgsi_action
* action
,
769 struct lp_build_tgsi_context
* bld_base
,
770 struct lp_build_emit_data
* emit_data
)
772 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
773 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
774 struct lp_type type
= int_bld
->type
;
775 LLVMValueRef src0
, src1
;
779 assert(type
.width
== 32);
781 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
782 src0
= LLVMBuildSExt(builder
, emit_data
->args
[0], typeRef
, "");
783 src1
= LLVMBuildSExt(builder
, emit_data
->args
[1], typeRef
, "");
784 dst64
= LLVMBuildMul(builder
, src0
, src1
, "");
785 dst64
= LLVMBuildAShr(
787 lp_build_const_vec(bld_base
->base
.gallivm
, type
, 32), "");
789 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
790 emit_data
->output
[emit_data
->chan
] =
791 LLVMBuildTrunc(builder
, dst64
, typeRef
, "");
794 /* TGSI_OPCODE_UMUL_HI */
797 const struct lp_build_tgsi_action
* action
,
798 struct lp_build_tgsi_context
* bld_base
,
799 struct lp_build_emit_data
* emit_data
)
801 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
802 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
803 struct lp_type type
= uint_bld
->type
;
804 LLVMValueRef src0
, src1
;
808 assert(type
.width
== 32);
810 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
811 src0
= LLVMBuildZExt(builder
, emit_data
->args
[0], typeRef
, "");
812 src1
= LLVMBuildZExt(builder
, emit_data
->args
[1], typeRef
, "");
813 dst64
= LLVMBuildMul(builder
, src0
, src1
, "");
814 dst64
= LLVMBuildLShr(
816 lp_build_const_vec(bld_base
->base
.gallivm
, type
, 32), "");
818 typeRef
= lp_build_vec_type(bld_base
->base
.gallivm
, type
);
819 emit_data
->output
[emit_data
->chan
] =
820 LLVMBuildTrunc(builder
, dst64
, typeRef
, "");
823 /* TGSI_OPCODE_MAX */
824 static void fmax_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
[0], emit_data
->args
[1], "");
836 /* TGSI_OPCODE_MIN */
837 static void fmin_emit(
838 const struct lp_build_tgsi_action
* action
,
839 struct lp_build_tgsi_context
* bld_base
,
840 struct lp_build_emit_data
* emit_data
)
842 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
843 emit_data
->output
[emit_data
->chan
] = LLVMBuildSelect(builder
,
844 LLVMBuildFCmp(builder
, LLVMRealUGE
,
845 emit_data
->args
[0], emit_data
->args
[1], ""),
846 emit_data
->args
[1], emit_data
->args
[0], "");
849 /* TGSI_OPCODE_XPD */
853 struct lp_build_tgsi_context
* bld_base
,
854 struct lp_build_emit_data
* emit_data
)
856 dp_fetch_args(bld_base
, emit_data
, 3);
864 struct lp_build_tgsi_context
* bld_base
,
870 LLVMValueRef tmp0
, tmp1
;
872 tmp0
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, a
, b
);
873 tmp1
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_MUL
, c
, d
);
875 return lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_SUB
, tmp0
, tmp1
);
880 const struct lp_build_tgsi_action
* action
,
881 struct lp_build_tgsi_context
* bld_base
,
882 struct lp_build_emit_data
* emit_data
)
884 emit_data
->output
[TGSI_CHAN_X
] = xpd_helper(bld_base
,
885 emit_data
->args
[1] /* src0.y */, emit_data
->args
[5] /* src1.z */,
886 emit_data
->args
[4] /* src1.y */, emit_data
->args
[2] /* src0.z */);
888 emit_data
->output
[TGSI_CHAN_Y
] = xpd_helper(bld_base
,
889 emit_data
->args
[2] /* src0.z */, emit_data
->args
[3] /* src1.x */,
890 emit_data
->args
[5] /* src1.z */, emit_data
->args
[0] /* src0.x */);
892 emit_data
->output
[TGSI_CHAN_Z
] = xpd_helper(bld_base
,
893 emit_data
->args
[0] /* src0.x */, emit_data
->args
[4] /* src1.y */,
894 emit_data
->args
[3] /* src1.x */, emit_data
->args
[1] /* src0.y */);
896 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
899 const struct lp_build_tgsi_action xpd_action
= {
900 xpd_fetch_args
, /* fetch_args */
904 /* TGSI_OPCODE_D2F */
907 const struct lp_build_tgsi_action
* action
,
908 struct lp_build_tgsi_context
* bld_base
,
909 struct lp_build_emit_data
* emit_data
)
911 emit_data
->output
[emit_data
->chan
] =
912 LLVMBuildFPTrunc(bld_base
->base
.gallivm
->builder
,
914 bld_base
->base
.vec_type
, "");
917 /* TGSI_OPCODE_D2I */
920 const struct lp_build_tgsi_action
* action
,
921 struct lp_build_tgsi_context
* bld_base
,
922 struct lp_build_emit_data
* emit_data
)
924 emit_data
->output
[emit_data
->chan
] =
925 LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
,
927 bld_base
->base
.int_vec_type
, "");
930 /* TGSI_OPCODE_D2U */
933 const struct lp_build_tgsi_action
* action
,
934 struct lp_build_tgsi_context
* bld_base
,
935 struct lp_build_emit_data
* emit_data
)
937 emit_data
->output
[emit_data
->chan
] =
938 LLVMBuildFPToUI(bld_base
->base
.gallivm
->builder
,
940 bld_base
->base
.int_vec_type
, "");
943 /* TGSI_OPCODE_F2D */
946 const struct lp_build_tgsi_action
* action
,
947 struct lp_build_tgsi_context
* bld_base
,
948 struct lp_build_emit_data
* emit_data
)
950 emit_data
->output
[emit_data
->chan
] =
951 LLVMBuildFPExt(bld_base
->base
.gallivm
->builder
,
953 bld_base
->dbl_bld
.vec_type
, "");
956 /* TGSI_OPCODE_U2D */
959 const struct lp_build_tgsi_action
* action
,
960 struct lp_build_tgsi_context
* bld_base
,
961 struct lp_build_emit_data
* emit_data
)
963 emit_data
->output
[emit_data
->chan
] =
964 LLVMBuildUIToFP(bld_base
->base
.gallivm
->builder
,
966 bld_base
->dbl_bld
.vec_type
, "");
969 /* TGSI_OPCODE_I2D */
972 const struct lp_build_tgsi_action
* action
,
973 struct lp_build_tgsi_context
* bld_base
,
974 struct lp_build_emit_data
* emit_data
)
976 emit_data
->output
[emit_data
->chan
] =
977 LLVMBuildSIToFP(bld_base
->base
.gallivm
->builder
,
979 bld_base
->dbl_bld
.vec_type
, "");
982 /* TGSI_OPCODE_DMAD */
985 const struct lp_build_tgsi_action
* action
,
986 struct lp_build_tgsi_context
* bld_base
,
987 struct lp_build_emit_data
* emit_data
)
990 tmp
= lp_build_emit_llvm_binary(bld_base
, TGSI_OPCODE_DMUL
,
993 emit_data
->output
[emit_data
->chan
] = lp_build_emit_llvm_binary(bld_base
,
994 TGSI_OPCODE_DADD
, tmp
, emit_data
->args
[2]);
997 /*.TGSI_OPCODE_DRCP.*/
998 static void drcp_emit(
999 const struct lp_build_tgsi_action
* action
,
1000 struct lp_build_tgsi_context
* bld_base
,
1001 struct lp_build_emit_data
* emit_data
)
1004 one
= lp_build_const_vec(bld_base
->dbl_bld
.gallivm
, bld_base
->dbl_bld
.type
, 1.0f
);
1005 emit_data
->output
[emit_data
->chan
] = LLVMBuildFDiv(
1006 bld_base
->base
.gallivm
->builder
,
1007 one
, emit_data
->args
[0], "");
1010 /* TGSI_OPCODE_DFRAC */
1011 static void dfrac_emit(
1012 const struct lp_build_tgsi_action
* action
,
1013 struct lp_build_tgsi_context
* bld_base
,
1014 struct lp_build_emit_data
* emit_data
)
1017 tmp
= lp_build_floor(&bld_base
->dbl_bld
,
1018 emit_data
->args
[0]);
1019 emit_data
->output
[emit_data
->chan
] = LLVMBuildFSub(bld_base
->base
.gallivm
->builder
,
1020 emit_data
->args
[0], tmp
, "");
1024 lp_set_default_actions(struct lp_build_tgsi_context
* bld_base
)
1026 bld_base
->op_actions
[TGSI_OPCODE_DP2
] = dp2_action
;
1027 bld_base
->op_actions
[TGSI_OPCODE_DP3
] = dp3_action
;
1028 bld_base
->op_actions
[TGSI_OPCODE_DP4
] = dp4_action
;
1029 bld_base
->op_actions
[TGSI_OPCODE_DP2A
] = dp2a_action
;
1030 bld_base
->op_actions
[TGSI_OPCODE_DPH
] = dph_action
;
1031 bld_base
->op_actions
[TGSI_OPCODE_DST
] = dst_action
;
1032 bld_base
->op_actions
[TGSI_OPCODE_EXP
] = exp_action
;
1033 bld_base
->op_actions
[TGSI_OPCODE_LIT
] = lit_action
;
1034 bld_base
->op_actions
[TGSI_OPCODE_LOG
] = log_action
;
1035 bld_base
->op_actions
[TGSI_OPCODE_RSQ
] = rsq_action
;
1036 bld_base
->op_actions
[TGSI_OPCODE_SQRT
] = sqrt_action
;
1037 bld_base
->op_actions
[TGSI_OPCODE_POW
] = pow_action
;
1038 bld_base
->op_actions
[TGSI_OPCODE_SCS
] = scs_action
;
1039 bld_base
->op_actions
[TGSI_OPCODE_XPD
] = xpd_action
;
1041 bld_base
->op_actions
[TGSI_OPCODE_BREAKC
].fetch_args
= scalar_unary_fetch_args
;
1042 bld_base
->op_actions
[TGSI_OPCODE_SWITCH
].fetch_args
= scalar_unary_fetch_args
;
1043 bld_base
->op_actions
[TGSI_OPCODE_CASE
].fetch_args
= scalar_unary_fetch_args
;
1044 bld_base
->op_actions
[TGSI_OPCODE_COS
].fetch_args
= scalar_unary_fetch_args
;
1045 bld_base
->op_actions
[TGSI_OPCODE_EX2
].fetch_args
= scalar_unary_fetch_args
;
1046 bld_base
->op_actions
[TGSI_OPCODE_IF
].fetch_args
= scalar_unary_fetch_args
;
1047 bld_base
->op_actions
[TGSI_OPCODE_UIF
].fetch_args
= scalar_unary_fetch_args
;
1048 bld_base
->op_actions
[TGSI_OPCODE_KILL_IF
].fetch_args
= kil_fetch_args
;
1049 bld_base
->op_actions
[TGSI_OPCODE_KILL
].fetch_args
= kilp_fetch_args
;
1050 bld_base
->op_actions
[TGSI_OPCODE_RCP
].fetch_args
= scalar_unary_fetch_args
;
1051 bld_base
->op_actions
[TGSI_OPCODE_SIN
].fetch_args
= scalar_unary_fetch_args
;
1052 bld_base
->op_actions
[TGSI_OPCODE_LG2
].fetch_args
= scalar_unary_fetch_args
;
1054 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit
;
1055 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit
;
1056 bld_base
->op_actions
[TGSI_OPCODE_CLAMP
].emit
= clamp_emit
;
1057 bld_base
->op_actions
[TGSI_OPCODE_END
].emit
= end_emit
;
1058 bld_base
->op_actions
[TGSI_OPCODE_FRC
].emit
= frc_emit
;
1059 bld_base
->op_actions
[TGSI_OPCODE_LRP
].emit
= lrp_emit
;
1060 bld_base
->op_actions
[TGSI_OPCODE_MAD
].emit
= mad_emit
;
1061 bld_base
->op_actions
[TGSI_OPCODE_MOV
].emit
= mov_emit
;
1062 bld_base
->op_actions
[TGSI_OPCODE_MUL
].emit
= mul_emit
;
1063 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= fdiv_emit
;
1064 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit
;
1065 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit
;
1067 bld_base
->op_actions
[TGSI_OPCODE_UARL
].emit
= mov_emit
;
1068 bld_base
->op_actions
[TGSI_OPCODE_F2U
].emit
= f2u_emit
;
1069 bld_base
->op_actions
[TGSI_OPCODE_U2F
].emit
= u2f_emit
;
1070 bld_base
->op_actions
[TGSI_OPCODE_UMAD
].emit
= umad_emit
;
1071 bld_base
->op_actions
[TGSI_OPCODE_UMUL
].emit
= umul_emit
;
1072 bld_base
->op_actions
[TGSI_OPCODE_IMUL_HI
].emit
= imul_hi_emit
;
1073 bld_base
->op_actions
[TGSI_OPCODE_UMUL_HI
].emit
= umul_hi_emit
;
1075 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= fmax_emit
;
1076 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= fmin_emit
;
1078 bld_base
->op_actions
[TGSI_OPCODE_DADD
].emit
= add_emit
;
1079 bld_base
->op_actions
[TGSI_OPCODE_DMAX
].emit
= fmax_emit
;
1080 bld_base
->op_actions
[TGSI_OPCODE_DMIN
].emit
= fmin_emit
;
1081 bld_base
->op_actions
[TGSI_OPCODE_DMUL
].emit
= mul_emit
;
1083 bld_base
->op_actions
[TGSI_OPCODE_D2F
].emit
= d2f_emit
;
1084 bld_base
->op_actions
[TGSI_OPCODE_D2I
].emit
= d2i_emit
;
1085 bld_base
->op_actions
[TGSI_OPCODE_D2U
].emit
= d2u_emit
;
1087 bld_base
->op_actions
[TGSI_OPCODE_F2D
].emit
= f2d_emit
;
1088 bld_base
->op_actions
[TGSI_OPCODE_I2D
].emit
= i2d_emit
;
1089 bld_base
->op_actions
[TGSI_OPCODE_U2D
].emit
= u2d_emit
;
1091 bld_base
->op_actions
[TGSI_OPCODE_DMAD
].emit
= dmad_emit
;
1093 bld_base
->op_actions
[TGSI_OPCODE_DRCP
].emit
= drcp_emit
;
1094 bld_base
->op_actions
[TGSI_OPCODE_DFRAC
].emit
= dfrac_emit
;
1098 /* CPU Only default actions */
1100 /* These actions are CPU only, because they could potentially output SSE
1104 /* TGSI_OPCODE_ABS (CPU Only)*/
1108 const struct lp_build_tgsi_action
* action
,
1109 struct lp_build_tgsi_context
* bld_base
,
1110 struct lp_build_emit_data
* emit_data
)
1112 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->base
,
1113 emit_data
->args
[0]);
1116 /* TGSI_OPCODE_ADD (CPU Only) */
1119 const struct lp_build_tgsi_action
* action
,
1120 struct lp_build_tgsi_context
* bld_base
,
1121 struct lp_build_emit_data
* emit_data
)
1123 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->base
,
1124 emit_data
->args
[0], emit_data
->args
[1]);
1127 /* TGSI_OPCODE_AND (CPU Only) */
1130 const struct lp_build_tgsi_action
* action
,
1131 struct lp_build_tgsi_context
* bld_base
,
1132 struct lp_build_emit_data
* emit_data
)
1134 emit_data
->output
[emit_data
->chan
] = lp_build_and(&bld_base
->uint_bld
,
1135 emit_data
->args
[0], emit_data
->args
[1]);
1138 /* TGSI_OPCODE_ARL (CPU Only) */
1141 const struct lp_build_tgsi_action
* action
,
1142 struct lp_build_tgsi_context
* bld_base
,
1143 struct lp_build_emit_data
* emit_data
)
1146 tmp
= lp_build_floor(&bld_base
->base
,
1147 emit_data
->args
[0]);
1148 emit_data
->output
[emit_data
->chan
] = LLVMBuildFPToSI(bld_base
->base
.gallivm
->builder
, tmp
,
1149 bld_base
->uint_bld
.vec_type
, "");
1152 /* TGSI_OPCODE_ARR (CPU Only) */
1155 const struct lp_build_tgsi_action
* action
,
1156 struct lp_build_tgsi_context
* bld_base
,
1157 struct lp_build_emit_data
* emit_data
)
1159 emit_data
->output
[emit_data
->chan
] = lp_build_iround(&bld_base
->base
, emit_data
->args
[0]);
1162 /* TGSI_OPCODE_CEIL (CPU Only) */
1165 const struct lp_build_tgsi_action
* action
,
1166 struct lp_build_tgsi_context
* bld_base
,
1167 struct lp_build_emit_data
* emit_data
)
1169 emit_data
->output
[emit_data
->chan
] = lp_build_ceil(&bld_base
->base
,
1170 emit_data
->args
[0]);
1173 /* TGSI_OPCODE_CMP (CPU Only) */
1176 const struct lp_build_tgsi_action
* action
,
1177 struct lp_build_tgsi_context
* bld_base
,
1178 struct lp_build_emit_data
* emit_data
)
1180 LLVMValueRef cond
= lp_build_cmp(&bld_base
->base
, PIPE_FUNC_LESS
,
1181 emit_data
->args
[0], bld_base
->base
.zero
);
1182 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1183 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1186 /* TGSI_OPCODE_UCMP (CPU Only) */
1189 const struct lp_build_tgsi_action
* action
,
1190 struct lp_build_tgsi_context
* bld_base
,
1191 struct lp_build_emit_data
* emit_data
)
1193 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1194 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1195 LLVMValueRef unsigned_cond
=
1196 LLVMBuildBitCast(builder
, emit_data
->args
[0], uint_bld
->vec_type
, "");
1197 LLVMValueRef cond
= lp_build_cmp(uint_bld
, PIPE_FUNC_NOTEQUAL
,
1200 emit_data
->output
[emit_data
->chan
] =
1201 lp_build_select(&bld_base
->base
,
1202 cond
, emit_data
->args
[1], emit_data
->args
[2]);
1205 /* TGSI_OPCODE_COS (CPU Only) */
1208 const struct lp_build_tgsi_action
* action
,
1209 struct lp_build_tgsi_context
* bld_base
,
1210 struct lp_build_emit_data
* emit_data
)
1212 emit_data
->output
[emit_data
->chan
] = lp_build_cos(&bld_base
->base
,
1213 emit_data
->args
[0]);
1216 /* TGSI_OPCODE_DIV (CPU Only) */
1219 const struct lp_build_tgsi_action
* action
,
1220 struct lp_build_tgsi_context
* bld_base
,
1221 struct lp_build_emit_data
* emit_data
)
1223 emit_data
->output
[emit_data
->chan
] = lp_build_div(&bld_base
->base
,
1224 emit_data
->args
[0], emit_data
->args
[1]);
1227 /* TGSI_OPCODE_EX2 (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_exp2(&bld_base
->base
,
1235 emit_data
->args
[0]);
1238 /* TGSI_OPCODE_F2I (CPU Only) */
1241 const struct lp_build_tgsi_action
* action
,
1242 struct lp_build_tgsi_context
* bld_base
,
1243 struct lp_build_emit_data
* emit_data
)
1245 emit_data
->output
[emit_data
->chan
] = lp_build_itrunc(&bld_base
->base
,
1246 emit_data
->args
[0]);
1249 /* TGSI_OPCODE_FSET Helper (CPU Only) */
1252 const struct lp_build_tgsi_action
* action
,
1253 struct lp_build_tgsi_context
* bld_base
,
1254 struct lp_build_emit_data
* emit_data
,
1259 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1260 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1261 emit_data
->args
[0], emit_data
->args
[1]);
1264 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1265 emit_data
->args
[0], emit_data
->args
[1]);
1268 emit_data
->output
[emit_data
->chan
] = cond
;
1272 /* TGSI_OPCODE_FSEQ (CPU Only) */
1275 const struct lp_build_tgsi_action
* action
,
1276 struct lp_build_tgsi_context
* bld_base
,
1277 struct lp_build_emit_data
* emit_data
)
1279 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1282 /* TGSI_OPCODE_ISGE (CPU Only) */
1285 const struct lp_build_tgsi_action
* action
,
1286 struct lp_build_tgsi_context
* bld_base
,
1287 struct lp_build_emit_data
* emit_data
)
1289 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1292 /* TGSI_OPCODE_ISLT (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 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1302 /* TGSI_OPCODE_USNE (CPU Only) */
1306 const struct lp_build_tgsi_action
* action
,
1307 struct lp_build_tgsi_context
* bld_base
,
1308 struct lp_build_emit_data
* emit_data
)
1310 fset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1313 /* TGSI_OPCODE_FLR (CPU Only) */
1317 const struct lp_build_tgsi_action
* action
,
1318 struct lp_build_tgsi_context
* bld_base
,
1319 struct lp_build_emit_data
* emit_data
)
1321 emit_data
->output
[emit_data
->chan
] = lp_build_floor(&bld_base
->base
,
1322 emit_data
->args
[0]);
1325 /* TGSI_OPCODE_I2F (CPU Only) */
1328 const struct lp_build_tgsi_action
* action
,
1329 struct lp_build_tgsi_context
* bld_base
,
1330 struct lp_build_emit_data
* emit_data
)
1332 emit_data
->output
[emit_data
->chan
] = lp_build_int_to_float(&bld_base
->base
,
1333 emit_data
->args
[0]);
1336 /* TGSI_OPCODE_IABS (CPU Only) */
1339 const struct lp_build_tgsi_action
* action
,
1340 struct lp_build_tgsi_context
* bld_base
,
1341 struct lp_build_emit_data
* emit_data
)
1343 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->int_bld
,
1344 emit_data
->args
[0]);
1347 /* TGSI_OPCODE_IDIV (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 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1355 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1356 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1357 bld_base
->uint_bld
.zero
);
1358 /* We want to make sure that we never divide/mod by zero to not
1359 * generate sigfpe. We don't want to crash just because the
1360 * shader is doing something weird. */
1361 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1363 emit_data
->args
[1], "");
1364 LLVMValueRef result
= lp_build_div(&bld_base
->int_bld
,
1365 emit_data
->args
[0], divisor
);
1366 LLVMValueRef not_div_mask
= LLVMBuildNot(builder
,
1368 /* idiv by zero doesn't have a guaranteed return value chose 0 for now. */
1369 emit_data
->output
[emit_data
->chan
] = LLVMBuildAnd(builder
,
1374 /* TGSI_OPCODE_INEG (CPU Only) */
1377 const struct lp_build_tgsi_action
* action
,
1378 struct lp_build_tgsi_context
* bld_base
,
1379 struct lp_build_emit_data
* emit_data
)
1381 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->int_bld
,
1382 bld_base
->int_bld
.zero
,
1383 emit_data
->args
[0]);
1386 /* TGSI_OPCODE_ISET Helper (CPU Only) */
1389 const struct lp_build_tgsi_action
* action
,
1390 struct lp_build_tgsi_context
* bld_base
,
1391 struct lp_build_emit_data
* emit_data
,
1394 LLVMValueRef cond
= lp_build_cmp(&bld_base
->int_bld
, pipe_func
,
1395 emit_data
->args
[0], emit_data
->args
[1]);
1396 emit_data
->output
[emit_data
->chan
] = cond
;
1399 /* TGSI_OPCODE_IMAX (CPU Only) */
1402 const struct lp_build_tgsi_action
* action
,
1403 struct lp_build_tgsi_context
* bld_base
,
1404 struct lp_build_emit_data
* emit_data
)
1406 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->int_bld
,
1407 emit_data
->args
[0], emit_data
->args
[1]);
1410 /* TGSI_OPCODE_IMIN (CPU Only) */
1413 const struct lp_build_tgsi_action
* action
,
1414 struct lp_build_tgsi_context
* bld_base
,
1415 struct lp_build_emit_data
* emit_data
)
1417 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->int_bld
,
1418 emit_data
->args
[0], emit_data
->args
[1]);
1421 /* TGSI_OPCODE_ISGE (CPU Only) */
1424 const struct lp_build_tgsi_action
* action
,
1425 struct lp_build_tgsi_context
* bld_base
,
1426 struct lp_build_emit_data
* emit_data
)
1428 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1431 /* TGSI_OPCODE_ISHR (CPU Only) */
1434 const struct lp_build_tgsi_action
* action
,
1435 struct lp_build_tgsi_context
* bld_base
,
1436 struct lp_build_emit_data
* emit_data
)
1438 struct lp_build_context
*int_bld
= &bld_base
->int_bld
;
1439 LLVMValueRef mask
= lp_build_const_vec(int_bld
->gallivm
, int_bld
->type
,
1440 int_bld
->type
.width
- 1);
1441 LLVMValueRef masked_count
= lp_build_and(int_bld
, emit_data
->args
[1], mask
);
1442 emit_data
->output
[emit_data
->chan
] = lp_build_shr(int_bld
, emit_data
->args
[0],
1446 /* TGSI_OPCODE_ISLT (CPU Only) */
1449 const struct lp_build_tgsi_action
* action
,
1450 struct lp_build_tgsi_context
* bld_base
,
1451 struct lp_build_emit_data
* emit_data
)
1453 iset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1457 /* TGSI_OPCODE_ISSG (CPU Only) */
1460 const struct lp_build_tgsi_action
* action
,
1461 struct lp_build_tgsi_context
* bld_base
,
1462 struct lp_build_emit_data
* emit_data
)
1464 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->int_bld
,
1465 emit_data
->args
[0]);
1468 /* TGSI_OPCODE_LG2 (CPU Only) */
1471 const struct lp_build_tgsi_action
* action
,
1472 struct lp_build_tgsi_context
* bld_base
,
1473 struct lp_build_emit_data
* emit_data
)
1475 emit_data
->output
[emit_data
->chan
] = lp_build_log2_safe(&bld_base
->base
,
1476 emit_data
->args
[0]);
1479 /* TGSI_OPCODE_LOG (CPU Only) */
1482 const struct lp_build_tgsi_action
* action
,
1483 struct lp_build_tgsi_context
* bld_base
,
1484 struct lp_build_emit_data
* emit_data
)
1486 LLVMValueRef p_floor_log2
;
1488 LLVMValueRef p_log2
;
1489 LLVMValueRef src0
= emit_data
->args
[0];
1491 lp_build_log2_approx(&bld_base
->base
, src0
,
1492 &p_exp
, &p_floor_log2
, &p_log2
, FALSE
);
1494 emit_data
->output
[TGSI_CHAN_X
] = p_floor_log2
;
1496 emit_data
->output
[TGSI_CHAN_Y
] = lp_build_emit_llvm_binary(bld_base
,
1499 emit_data
->output
[TGSI_CHAN_Z
] = p_log2
;
1501 emit_data
->output
[TGSI_CHAN_W
] = bld_base
->base
.one
;
1505 /* TGSI_OPCODE_MAX (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 emit_data
->output
[emit_data
->chan
] =
1514 lp_build_max_ext(&bld_base
->base
,
1515 emit_data
->args
[0], emit_data
->args
[1],
1516 GALLIVM_NAN_RETURN_OTHER
);
1519 /* TGSI_OPCODE_MIN (CPU Only) */
1522 const struct lp_build_tgsi_action
* action
,
1523 struct lp_build_tgsi_context
* bld_base
,
1524 struct lp_build_emit_data
* emit_data
)
1526 emit_data
->output
[emit_data
->chan
] =
1527 lp_build_min_ext(&bld_base
->base
,
1528 emit_data
->args
[0], emit_data
->args
[1],
1529 GALLIVM_NAN_RETURN_OTHER
);
1532 /* TGSI_OPCODE_MOD (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 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1540 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1541 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1542 bld_base
->uint_bld
.zero
);
1543 /* We want to make sure that we never divide/mod by zero to not
1544 * generate sigfpe. We don't want to crash just because the
1545 * shader is doing something weird. */
1546 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1548 emit_data
->args
[1], "");
1549 LLVMValueRef result
= lp_build_mod(&bld_base
->int_bld
,
1550 emit_data
->args
[0], divisor
);
1551 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1552 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1557 /* TGSI_OPCODE_NOT */
1560 const struct lp_build_tgsi_action
* action
,
1561 struct lp_build_tgsi_context
* bld_base
,
1562 struct lp_build_emit_data
* emit_data
)
1564 emit_data
->output
[emit_data
->chan
] = lp_build_not(&bld_base
->uint_bld
,
1565 emit_data
->args
[0]);
1568 /* TGSI_OPCODE_OR (CPU Only) */
1571 const struct lp_build_tgsi_action
* action
,
1572 struct lp_build_tgsi_context
* bld_base
,
1573 struct lp_build_emit_data
* emit_data
)
1575 emit_data
->output
[emit_data
->chan
] = lp_build_or(&bld_base
->uint_bld
,
1576 emit_data
->args
[0], emit_data
->args
[1]);
1579 /* TGSI_OPCODE_POW (CPU Only) */
1582 const struct lp_build_tgsi_action
* action
,
1583 struct lp_build_tgsi_context
* bld_base
,
1584 struct lp_build_emit_data
* emit_data
)
1586 emit_data
->output
[emit_data
->chan
] = lp_build_pow(&bld_base
->base
,
1587 emit_data
->args
[0], emit_data
->args
[1]);
1591 /* TGSI_OPCODE_RCP (CPU Only) */
1595 const struct lp_build_tgsi_action
* action
,
1596 struct lp_build_tgsi_context
* bld_base
,
1597 struct lp_build_emit_data
* emit_data
)
1599 emit_data
->output
[emit_data
->chan
] = lp_build_rcp(&bld_base
->base
,
1600 emit_data
->args
[0]);
1603 /* Reciprical squareroot (CPU Only) */
1605 recip_sqrt_emit_cpu(
1606 const struct lp_build_tgsi_action
* action
,
1607 struct lp_build_tgsi_context
* bld_base
,
1608 struct lp_build_emit_data
* emit_data
)
1610 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->base
,
1611 emit_data
->args
[0]);
1616 const struct lp_build_tgsi_action
* action
,
1617 struct lp_build_tgsi_context
* bld_base
,
1618 struct lp_build_emit_data
* emit_data
)
1620 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->base
,
1621 emit_data
->args
[0]);
1625 /* TGSI_OPCODE_ROUND (CPU Only) */
1628 const struct lp_build_tgsi_action
* action
,
1629 struct lp_build_tgsi_context
* bld_base
,
1630 struct lp_build_emit_data
* emit_data
)
1632 emit_data
->output
[emit_data
->chan
] = lp_build_round(&bld_base
->base
,
1633 emit_data
->args
[0]);
1636 /* TGSI_OPCODE_SET Helper (CPU Only) */
1640 const struct lp_build_tgsi_action
* action
,
1641 struct lp_build_tgsi_context
* bld_base
,
1642 struct lp_build_emit_data
* emit_data
,
1647 if (pipe_func
!= PIPE_FUNC_NOTEQUAL
) {
1648 cond
= lp_build_cmp_ordered(&bld_base
->base
, pipe_func
,
1649 emit_data
->args
[0], emit_data
->args
[1]);
1652 cond
= lp_build_cmp(&bld_base
->base
, pipe_func
,
1653 emit_data
->args
[0], emit_data
->args
[1]);
1656 emit_data
->output
[emit_data
->chan
] = lp_build_select(&bld_base
->base
,
1659 bld_base
->base
.zero
);
1662 /* TGSI_OPCODE_SEQ (CPU Only) */
1666 const struct lp_build_tgsi_action
* action
,
1667 struct lp_build_tgsi_context
* bld_base
,
1668 struct lp_build_emit_data
* emit_data
)
1670 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1673 /* TGSI_OPCODE_SGE (CPU Only) */
1676 const struct lp_build_tgsi_action
* action
,
1677 struct lp_build_tgsi_context
* bld_base
,
1678 struct lp_build_emit_data
* emit_data
)
1680 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1683 /* TGSI_OPCODE_SGT (CPU Only)*/
1687 const struct lp_build_tgsi_action
* action
,
1688 struct lp_build_tgsi_context
* bld_base
,
1689 struct lp_build_emit_data
* emit_data
)
1691 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GREATER
);
1694 /* TGSI_OPCODE_SHL (CPU Only) */
1697 const struct lp_build_tgsi_action
* action
,
1698 struct lp_build_tgsi_context
* bld_base
,
1699 struct lp_build_emit_data
* emit_data
)
1701 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1702 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
1703 uint_bld
->type
.width
- 1);
1704 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
1705 emit_data
->output
[emit_data
->chan
] = lp_build_shl(uint_bld
, emit_data
->args
[0],
1709 /* TGSI_OPCODE_SIN (CPU Only) */
1712 const struct lp_build_tgsi_action
* action
,
1713 struct lp_build_tgsi_context
* bld_base
,
1714 struct lp_build_emit_data
* emit_data
)
1716 emit_data
->output
[emit_data
->chan
] = lp_build_sin(&bld_base
->base
,
1717 emit_data
->args
[0]);
1720 /* TGSI_OPCODE_SLE (CPU Only) */
1723 const struct lp_build_tgsi_action
* action
,
1724 struct lp_build_tgsi_context
* bld_base
,
1725 struct lp_build_emit_data
* emit_data
)
1727 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LEQUAL
);
1730 /* TGSI_OPCODE_SLT (CPU Only) */
1733 const struct lp_build_tgsi_action
* action
,
1734 struct lp_build_tgsi_context
* bld_base
,
1735 struct lp_build_emit_data
* emit_data
)
1737 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1740 /* TGSI_OPCODE_SNE (CPU Only) */
1744 const struct lp_build_tgsi_action
* action
,
1745 struct lp_build_tgsi_context
* bld_base
,
1746 struct lp_build_emit_data
* emit_data
)
1748 set_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1751 /* TGSI_OPCODE_SSG (CPU Only) */
1755 const struct lp_build_tgsi_action
* action
,
1756 struct lp_build_tgsi_context
* bld_base
,
1757 struct lp_build_emit_data
* emit_data
)
1759 emit_data
->output
[emit_data
->chan
] = lp_build_sgn(&bld_base
->base
,
1760 emit_data
->args
[0]);
1763 /* TGSI_OPCODE_SUB (CPU Only) */
1767 const struct lp_build_tgsi_action
* action
,
1768 struct lp_build_tgsi_context
* bld_base
,
1769 struct lp_build_emit_data
* emit_data
)
1771 emit_data
->output
[emit_data
->chan
] = lp_build_sub(&bld_base
->base
,
1773 emit_data
->args
[1]);
1776 /* TGSI_OPCODE_TRUNC (CPU Only) */
1780 const struct lp_build_tgsi_action
* action
,
1781 struct lp_build_tgsi_context
* bld_base
,
1782 struct lp_build_emit_data
* emit_data
)
1784 emit_data
->output
[emit_data
->chan
] = lp_build_trunc(&bld_base
->base
,
1785 emit_data
->args
[0]);
1788 /* TGSI_OPCODE_UADD (CPU Only) */
1791 const struct lp_build_tgsi_action
* action
,
1792 struct lp_build_tgsi_context
* bld_base
,
1793 struct lp_build_emit_data
* emit_data
)
1795 emit_data
->output
[emit_data
->chan
] = lp_build_add(&bld_base
->uint_bld
,
1796 emit_data
->args
[0], emit_data
->args
[1]);
1799 /* TGSI_OPCODE_UDIV (CPU Only) */
1802 const struct lp_build_tgsi_action
* action
,
1803 struct lp_build_tgsi_context
* bld_base
,
1804 struct lp_build_emit_data
* emit_data
)
1807 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1808 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1809 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1810 bld_base
->uint_bld
.zero
);
1811 /* We want to make sure that we never divide/mod by zero to not
1812 * generate sigfpe. We don't want to crash just because the
1813 * shader is doing something weird. */
1814 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1816 emit_data
->args
[1], "");
1817 LLVMValueRef result
= lp_build_div(&bld_base
->uint_bld
,
1818 emit_data
->args
[0], divisor
);
1819 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1820 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1825 /* TGSI_OPCODE_UMAX (CPU Only) */
1828 const struct lp_build_tgsi_action
* action
,
1829 struct lp_build_tgsi_context
* bld_base
,
1830 struct lp_build_emit_data
* emit_data
)
1832 emit_data
->output
[emit_data
->chan
] = lp_build_max(&bld_base
->uint_bld
,
1833 emit_data
->args
[0], emit_data
->args
[1]);
1836 /* TGSI_OPCODE_UMIN (CPU Only) */
1839 const struct lp_build_tgsi_action
* action
,
1840 struct lp_build_tgsi_context
* bld_base
,
1841 struct lp_build_emit_data
* emit_data
)
1843 emit_data
->output
[emit_data
->chan
] = lp_build_min(&bld_base
->uint_bld
,
1844 emit_data
->args
[0], emit_data
->args
[1]);
1847 /* TGSI_OPCODE_UMOD (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 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1855 LLVMValueRef div_mask
= lp_build_cmp(&bld_base
->uint_bld
,
1856 PIPE_FUNC_EQUAL
, emit_data
->args
[1],
1857 bld_base
->uint_bld
.zero
);
1858 /* We want to make sure that we never divide/mod by zero to not
1859 * generate sigfpe. We don't want to crash just because the
1860 * shader is doing something weird. */
1861 LLVMValueRef divisor
= LLVMBuildOr(builder
,
1863 emit_data
->args
[1], "");
1864 LLVMValueRef result
= lp_build_mod(&bld_base
->uint_bld
,
1865 emit_data
->args
[0], divisor
);
1866 /* umod by zero is guaranteed to return 0xffffffff */
1867 emit_data
->output
[emit_data
->chan
] = LLVMBuildOr(builder
,
1872 /* TGSI_OPCODE_USET Helper (CPU Only) */
1875 const struct lp_build_tgsi_action
* action
,
1876 struct lp_build_tgsi_context
* bld_base
,
1877 struct lp_build_emit_data
* emit_data
,
1880 LLVMValueRef cond
= lp_build_cmp(&bld_base
->uint_bld
, pipe_func
,
1881 emit_data
->args
[0], emit_data
->args
[1]);
1882 emit_data
->output
[emit_data
->chan
] = cond
;
1886 /* TGSI_OPCODE_USEQ (CPU Only) */
1889 const struct lp_build_tgsi_action
* action
,
1890 struct lp_build_tgsi_context
* bld_base
,
1891 struct lp_build_emit_data
* emit_data
)
1893 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
1896 /* TGSI_OPCODE_ISGE (CPU Only) */
1899 const struct lp_build_tgsi_action
* action
,
1900 struct lp_build_tgsi_context
* bld_base
,
1901 struct lp_build_emit_data
* emit_data
)
1903 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
1906 /* TGSI_OPCODE_USHR (CPU Only) */
1909 const struct lp_build_tgsi_action
* action
,
1910 struct lp_build_tgsi_context
* bld_base
,
1911 struct lp_build_emit_data
* emit_data
)
1913 struct lp_build_context
*uint_bld
= &bld_base
->uint_bld
;
1914 LLVMValueRef mask
= lp_build_const_vec(uint_bld
->gallivm
, uint_bld
->type
,
1915 uint_bld
->type
.width
- 1);
1916 LLVMValueRef masked_count
= lp_build_and(uint_bld
, emit_data
->args
[1], mask
);
1917 emit_data
->output
[emit_data
->chan
] = lp_build_shr(uint_bld
, emit_data
->args
[0],
1921 /* TGSI_OPCODE_ISLT (CPU Only) */
1924 const struct lp_build_tgsi_action
* action
,
1925 struct lp_build_tgsi_context
* bld_base
,
1926 struct lp_build_emit_data
* emit_data
)
1928 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
1931 /* TGSI_OPCODE_USNE (CPU Only) */
1935 const struct lp_build_tgsi_action
* action
,
1936 struct lp_build_tgsi_context
* bld_base
,
1937 struct lp_build_emit_data
* emit_data
)
1939 uset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
1942 /* TGSI_OPCODE_XOR */
1945 const struct lp_build_tgsi_action
* action
,
1946 struct lp_build_tgsi_context
* bld_base
,
1947 struct lp_build_emit_data
* emit_data
)
1949 emit_data
->output
[emit_data
->chan
] = lp_build_xor(&bld_base
->uint_bld
,
1951 emit_data
->args
[1]);
1954 /* TGSI_OPCODE_DABS (CPU Only) */
1957 const struct lp_build_tgsi_action
* action
,
1958 struct lp_build_tgsi_context
* bld_base
,
1959 struct lp_build_emit_data
* emit_data
)
1961 emit_data
->output
[emit_data
->chan
] = lp_build_abs(&bld_base
->dbl_bld
,
1962 emit_data
->args
[0]);
1965 /* TGSI_OPCODE_DNEG (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_sub(&bld_base
->dbl_bld
,
1973 bld_base
->dbl_bld
.zero
,
1974 emit_data
->args
[0]);
1977 /* TGSI_OPCODE_DSET Helper (CPU Only) */
1980 const struct lp_build_tgsi_action
* action
,
1981 struct lp_build_tgsi_context
* bld_base
,
1982 struct lp_build_emit_data
* emit_data
,
1985 LLVMBuilderRef builder
= bld_base
->base
.gallivm
->builder
;
1986 LLVMValueRef cond
= lp_build_cmp(&bld_base
->dbl_bld
, pipe_func
,
1987 emit_data
->args
[0], emit_data
->args
[1]);
1988 /* arguments were 64 bit but store as 32 bit */
1989 cond
= LLVMBuildTrunc(builder
, cond
, bld_base
->int_bld
.int_vec_type
, "");
1990 emit_data
->output
[emit_data
->chan
] = cond
;
1993 /* TGSI_OPCODE_DSEQ (CPU Only) */
1996 const struct lp_build_tgsi_action
* action
,
1997 struct lp_build_tgsi_context
* bld_base
,
1998 struct lp_build_emit_data
* emit_data
)
2000 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_EQUAL
);
2003 /* TGSI_OPCODE_DSGE (CPU Only) */
2006 const struct lp_build_tgsi_action
* action
,
2007 struct lp_build_tgsi_context
* bld_base
,
2008 struct lp_build_emit_data
* emit_data
)
2010 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_GEQUAL
);
2013 /* TGSI_OPCODE_DSLT (CPU Only) */
2016 const struct lp_build_tgsi_action
* action
,
2017 struct lp_build_tgsi_context
* bld_base
,
2018 struct lp_build_emit_data
* emit_data
)
2020 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_LESS
);
2023 /* TGSI_OPCODE_DSNE (CPU Only) */
2026 const struct lp_build_tgsi_action
* action
,
2027 struct lp_build_tgsi_context
* bld_base
,
2028 struct lp_build_emit_data
* emit_data
)
2030 dset_emit_cpu(action
, bld_base
, emit_data
, PIPE_FUNC_NOTEQUAL
);
2033 /* Double Reciprocal squareroot (CPU Only) */
2035 drecip_sqrt_emit_cpu(
2036 const struct lp_build_tgsi_action
* action
,
2037 struct lp_build_tgsi_context
* bld_base
,
2038 struct lp_build_emit_data
* emit_data
)
2040 emit_data
->output
[emit_data
->chan
] = lp_build_rsqrt(&bld_base
->dbl_bld
,
2041 emit_data
->args
[0]);
2044 /* Double Squareroot (CPU Only) */
2047 const struct lp_build_tgsi_action
* action
,
2048 struct lp_build_tgsi_context
* bld_base
,
2049 struct lp_build_emit_data
* emit_data
)
2051 emit_data
->output
[emit_data
->chan
] = lp_build_sqrt(&bld_base
->dbl_bld
,
2052 emit_data
->args
[0]);
2056 lp_set_default_actions_cpu(
2057 struct lp_build_tgsi_context
* bld_base
)
2059 lp_set_default_actions(bld_base
);
2060 bld_base
->op_actions
[TGSI_OPCODE_ABS
].emit
= abs_emit_cpu
;
2061 bld_base
->op_actions
[TGSI_OPCODE_ADD
].emit
= add_emit_cpu
;
2062 bld_base
->op_actions
[TGSI_OPCODE_AND
].emit
= and_emit_cpu
;
2063 bld_base
->op_actions
[TGSI_OPCODE_ARL
].emit
= arl_emit_cpu
;
2064 bld_base
->op_actions
[TGSI_OPCODE_ARR
].emit
= arr_emit_cpu
;
2065 bld_base
->op_actions
[TGSI_OPCODE_CEIL
].emit
= ceil_emit_cpu
;
2066 bld_base
->op_actions
[TGSI_OPCODE_COS
].emit
= cos_emit_cpu
;
2067 bld_base
->op_actions
[TGSI_OPCODE_CMP
].emit
= cmp_emit_cpu
;
2068 bld_base
->op_actions
[TGSI_OPCODE_DIV
].emit
= div_emit_cpu
;
2069 bld_base
->op_actions
[TGSI_OPCODE_EX2
].emit
= ex2_emit_cpu
;
2070 bld_base
->op_actions
[TGSI_OPCODE_F2I
].emit
= f2i_emit_cpu
;
2071 bld_base
->op_actions
[TGSI_OPCODE_FLR
].emit
= flr_emit_cpu
;
2072 bld_base
->op_actions
[TGSI_OPCODE_FSEQ
].emit
= fseq_emit_cpu
;
2073 bld_base
->op_actions
[TGSI_OPCODE_FSGE
].emit
= fsge_emit_cpu
;
2074 bld_base
->op_actions
[TGSI_OPCODE_FSLT
].emit
= fslt_emit_cpu
;
2075 bld_base
->op_actions
[TGSI_OPCODE_FSNE
].emit
= fsne_emit_cpu
;
2077 bld_base
->op_actions
[TGSI_OPCODE_I2F
].emit
= i2f_emit_cpu
;
2078 bld_base
->op_actions
[TGSI_OPCODE_IABS
].emit
= iabs_emit_cpu
;
2079 bld_base
->op_actions
[TGSI_OPCODE_IDIV
].emit
= idiv_emit_cpu
;
2080 bld_base
->op_actions
[TGSI_OPCODE_INEG
].emit
= ineg_emit_cpu
;
2081 bld_base
->op_actions
[TGSI_OPCODE_IMAX
].emit
= imax_emit_cpu
;
2082 bld_base
->op_actions
[TGSI_OPCODE_IMIN
].emit
= imin_emit_cpu
;
2083 bld_base
->op_actions
[TGSI_OPCODE_ISGE
].emit
= isge_emit_cpu
;
2084 bld_base
->op_actions
[TGSI_OPCODE_ISHR
].emit
= ishr_emit_cpu
;
2085 bld_base
->op_actions
[TGSI_OPCODE_ISLT
].emit
= islt_emit_cpu
;
2086 bld_base
->op_actions
[TGSI_OPCODE_ISSG
].emit
= issg_emit_cpu
;
2088 bld_base
->op_actions
[TGSI_OPCODE_LG2
].emit
= lg2_emit_cpu
;
2089 bld_base
->op_actions
[TGSI_OPCODE_LOG
].emit
= log_emit_cpu
;
2090 bld_base
->op_actions
[TGSI_OPCODE_MAX
].emit
= max_emit_cpu
;
2091 bld_base
->op_actions
[TGSI_OPCODE_MIN
].emit
= min_emit_cpu
;
2092 bld_base
->op_actions
[TGSI_OPCODE_MOD
].emit
= mod_emit_cpu
;
2093 bld_base
->op_actions
[TGSI_OPCODE_NOT
].emit
= not_emit_cpu
;
2094 bld_base
->op_actions
[TGSI_OPCODE_OR
].emit
= or_emit_cpu
;
2095 bld_base
->op_actions
[TGSI_OPCODE_POW
].emit
= pow_emit_cpu
;
2096 bld_base
->op_actions
[TGSI_OPCODE_RCP
].emit
= rcp_emit_cpu
;
2097 bld_base
->op_actions
[TGSI_OPCODE_ROUND
].emit
= round_emit_cpu
;
2098 bld_base
->op_actions
[TGSI_OPCODE_SEQ
].emit
= seq_emit_cpu
;
2099 bld_base
->op_actions
[TGSI_OPCODE_SGE
].emit
= sge_emit_cpu
;
2100 bld_base
->op_actions
[TGSI_OPCODE_SGT
].emit
= sgt_emit_cpu
;
2101 bld_base
->op_actions
[TGSI_OPCODE_SIN
].emit
= sin_emit_cpu
;
2102 bld_base
->op_actions
[TGSI_OPCODE_SHL
].emit
= shl_emit_cpu
;
2103 bld_base
->op_actions
[TGSI_OPCODE_SLE
].emit
= sle_emit_cpu
;
2104 bld_base
->op_actions
[TGSI_OPCODE_SLT
].emit
= slt_emit_cpu
;
2105 bld_base
->op_actions
[TGSI_OPCODE_SNE
].emit
= sne_emit_cpu
;
2106 bld_base
->op_actions
[TGSI_OPCODE_SSG
].emit
= ssg_emit_cpu
;
2107 bld_base
->op_actions
[TGSI_OPCODE_SUB
].emit
= sub_emit_cpu
;
2108 bld_base
->op_actions
[TGSI_OPCODE_TRUNC
].emit
= trunc_emit_cpu
;
2110 bld_base
->rsq_action
.emit
= recip_sqrt_emit_cpu
;
2111 bld_base
->sqrt_action
.emit
= sqrt_emit_cpu
;
2113 bld_base
->op_actions
[TGSI_OPCODE_UADD
].emit
= uadd_emit_cpu
;
2114 bld_base
->op_actions
[TGSI_OPCODE_UCMP
].emit
= ucmp_emit_cpu
;
2115 bld_base
->op_actions
[TGSI_OPCODE_UDIV
].emit
= udiv_emit_cpu
;
2116 bld_base
->op_actions
[TGSI_OPCODE_UMAX
].emit
= umax_emit_cpu
;
2117 bld_base
->op_actions
[TGSI_OPCODE_UMIN
].emit
= umin_emit_cpu
;
2118 bld_base
->op_actions
[TGSI_OPCODE_UMOD
].emit
= umod_emit_cpu
;
2119 bld_base
->op_actions
[TGSI_OPCODE_USEQ
].emit
= useq_emit_cpu
;
2120 bld_base
->op_actions
[TGSI_OPCODE_USGE
].emit
= usge_emit_cpu
;
2121 bld_base
->op_actions
[TGSI_OPCODE_USHR
].emit
= ushr_emit_cpu
;
2122 bld_base
->op_actions
[TGSI_OPCODE_USLT
].emit
= uslt_emit_cpu
;
2123 bld_base
->op_actions
[TGSI_OPCODE_USNE
].emit
= usne_emit_cpu
;
2125 bld_base
->op_actions
[TGSI_OPCODE_XOR
].emit
= xor_emit_cpu
;
2127 bld_base
->op_actions
[TGSI_OPCODE_DABS
].emit
= dabs_emit_cpu
;
2128 bld_base
->op_actions
[TGSI_OPCODE_DNEG
].emit
= dneg_emit_cpu
;
2129 bld_base
->op_actions
[TGSI_OPCODE_DSEQ
].emit
= dseq_emit_cpu
;
2130 bld_base
->op_actions
[TGSI_OPCODE_DSGE
].emit
= dsge_emit_cpu
;
2131 bld_base
->op_actions
[TGSI_OPCODE_DSLT
].emit
= dslt_emit_cpu
;
2132 bld_base
->op_actions
[TGSI_OPCODE_DSNE
].emit
= dsne_emit_cpu
;
2134 bld_base
->op_actions
[TGSI_OPCODE_DRSQ
].emit
= drecip_sqrt_emit_cpu
;
2135 bld_base
->op_actions
[TGSI_OPCODE_DSQRT
].emit
= dsqrt_emit_cpu
;