1 /**************************************************************************
2 *
3 * Copyright 2011-2012 Advanced Micro Devices, Inc.
4 * Copyright 2009 VMware, Inc.
5 * Copyright 2007-2008 VMware, Inc.
6 * All Rights Reserved.
7 *
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:
15 *
16 * The above copyright notice and this permission notice (including the
17 * next paragraph) shall be included in all copies or substantial portions
18 * of the Software.
19 *
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.
27 *
28 **************************************************************************/
29
30 /**
31 * @file
32 * TGSI to LLVM IR translation.
33 *
34 * @author Jose Fonseca <[email protected]>
35 * @author Tom Stellard <[email protected]>
36 *
37 * Based on tgsi_sse2.c code written by Michal Krol, Keith Whitwell,
38 * Brian Paul, and others.
39 */
40
41
42 #include "lp_bld_tgsi_action.h"
43
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"
52
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.
57 */
58
59 /* Default actions */
60
61 /* Generic fetch_arg functions */
62
scalar_unary_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)63 static void scalar_unary_fetch_args(
64 struct lp_build_tgsi_context * bld_base,
65 struct lp_build_emit_data * emit_data)
66 {
67 /* src0.x */
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]);
71 }
72
scalar_binary_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)73 static void scalar_binary_fetch_args(
74 struct lp_build_tgsi_context * bld_base,
75 struct lp_build_emit_data * emit_data)
76 {
77 /* src0.x */
78 emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst,
79 0, TGSI_CHAN_X);
80 /* src1.x */
81 emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst,
82 1, TGSI_CHAN_X);
83 emit_data->arg_count = 2;
84 emit_data->dst_type = LLVMTypeOf(emit_data->args[0]);
85 }
86
87 /* TGSI_OPCODE_ADD */
88 static void
add_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)89 add_emit(
90 const struct lp_build_tgsi_action * action,
91 struct lp_build_tgsi_context * bld_base,
92 struct lp_build_emit_data * emit_data)
93 {
94 emit_data->output[emit_data->chan] = LLVMBuildFAdd(
95 bld_base->base.gallivm->builder,
96 emit_data->args[0], emit_data->args[1], "");
97 }
98
99 /* TGSI_OPCODE_ARR */
100 static void
arr_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)101 arr_emit(
102 const struct lp_build_tgsi_action * action,
103 struct lp_build_tgsi_context * bld_base,
104 struct lp_build_emit_data * emit_data)
105 {
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, "");
109 }
110
111 /* DP* Helper */
112
113 static void
dp_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned dp_components)114 dp_fetch_args(
115 struct lp_build_tgsi_context * bld_base,
116 struct lp_build_emit_data * emit_data,
117 unsigned dp_components)
118 {
119 unsigned chan, src;
120 for (src = 0; src < 2; src++) {
121 for (chan = 0; chan < dp_components; chan++) {
122 emit_data->args[(src * dp_components) + chan] =
123 lp_build_emit_fetch(bld_base, emit_data->inst, src, chan);
124 }
125 }
126 emit_data->dst_type = bld_base->base.elem_type;
127 }
128
129 /* TGSI_OPCODE_DP2 */
130 static void
dp2_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)131 dp2_fetch_args(
132 struct lp_build_tgsi_context * bld_base,
133 struct lp_build_emit_data * emit_data)
134 {
135 dp_fetch_args(bld_base, emit_data, 2);
136 }
137
138 static void
dp2_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)139 dp2_emit(
140 const struct lp_build_tgsi_action * action,
141 struct lp_build_tgsi_context * bld_base,
142 struct lp_build_emit_data * emit_data)
143 {
144 LLVMValueRef tmp0, tmp1;
145 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
146 emit_data->args[0] /* src0.x */,
147 emit_data->args[2] /* src1.x */);
148 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
149 emit_data->args[1] /* src0.y */,
150 emit_data->args[3] /* src1.y */);
151 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
152 TGSI_OPCODE_ADD, tmp0, tmp1);
153 }
154
155 static struct lp_build_tgsi_action dp2_action = {
156 dp2_fetch_args, /* fetch_args */
157 dp2_emit /* emit */
158 };
159
160 /* TGSI_OPCODE_DP3 */
161 static void
dp3_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)162 dp3_fetch_args(
163 struct lp_build_tgsi_context * bld_base,
164 struct lp_build_emit_data * emit_data)
165 {
166 dp_fetch_args(bld_base, emit_data, 3);
167 }
168
169 static void
dp3_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)170 dp3_emit(
171 const struct lp_build_tgsi_action * action,
172 struct lp_build_tgsi_context * bld_base,
173 struct lp_build_emit_data * emit_data)
174 {
175 LLVMValueRef tmp0, tmp1;
176 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
177 emit_data->args[0] /* src0.x */,
178 emit_data->args[3] /* src1.x */);
179 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
180 emit_data->args[1] /* src0.y */,
181 emit_data->args[4] /* src1.y */);
182 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp1, tmp0);
183 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
184 emit_data->args[2] /* src0.z */,
185 emit_data->args[5] /* src1.z */);
186 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
187 TGSI_OPCODE_ADD, tmp0, tmp1);
188 }
189
190 static struct lp_build_tgsi_action dp3_action = {
191 dp3_fetch_args, /* fetch_args */
192 dp3_emit /* emit */
193 };
194
195 /* TGSI_OPCODDE_DP4 */
196
197 static void
dp4_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)198 dp4_fetch_args(
199 struct lp_build_tgsi_context * bld_base,
200 struct lp_build_emit_data * emit_data)
201 {
202 dp_fetch_args(bld_base, emit_data, 4);
203 }
204
205 static void
dp4_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)206 dp4_emit(
207 const struct lp_build_tgsi_action * action,
208 struct lp_build_tgsi_context * bld_base,
209 struct lp_build_emit_data * emit_data)
210 {
211 LLVMValueRef tmp0, tmp1;
212 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
213 emit_data->args[0] /* src0.x */,
214 emit_data->args[4] /* src1.x */);
215 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
216 emit_data->args[1] /* src0.y */,
217 emit_data->args[5] /* src1.y */);
218 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp0, tmp1);
219 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
220 emit_data->args[2] /* src0.z */,
221 emit_data->args[6] /* src1.z */);
222 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp0, tmp1);
223 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
224 emit_data->args[3] /* src0.w */,
225 emit_data->args[7] /* src1.w */);
226 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
227 TGSI_OPCODE_ADD, tmp0, tmp1);
228 }
229
230 static struct lp_build_tgsi_action dp4_action = {
231 dp4_fetch_args, /* fetch_args */
232 dp4_emit /* emit */
233 };
234
235 /* TGSI_OPCODE_DST */
236 static void
dst_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)237 dst_fetch_args(
238 struct lp_build_tgsi_context * bld_base,
239 struct lp_build_emit_data * emit_data)
240 {
241 /* src0.y */
242 emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst,
243 0, TGSI_CHAN_Y);
244 /* src0.z */
245 emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst,
246 0, TGSI_CHAN_Z);
247 /* src1.y */
248 emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst,
249 1, TGSI_CHAN_Y);
250 /* src1.w */
251 emit_data->args[3] = lp_build_emit_fetch(bld_base, emit_data->inst,
252 1, TGSI_CHAN_W);
253 }
254
255 static void
dst_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)256 dst_emit(
257 const struct lp_build_tgsi_action * action,
258 struct lp_build_tgsi_context * bld_base,
259 struct lp_build_emit_data * emit_data)
260 {
261 /* dst.x */
262 emit_data->output[TGSI_CHAN_X] = bld_base->base.one;
263
264 /* dst.y */
265 emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base,
266 TGSI_OPCODE_MUL,
267 emit_data->args[0] /* src0.y */,
268 emit_data->args[2] /* src1.y */);
269 /* dst.z */
270 emit_data->output[TGSI_CHAN_Z] = emit_data->args[1]; /* src0.z */
271
272 /* dst.w */
273 emit_data->output[TGSI_CHAN_W] = emit_data->args[3]; /* src1.w */
274 }
275
276 static struct lp_build_tgsi_action dst_action = {
277 dst_fetch_args, /* fetch_args */
278 dst_emit /* emit */
279 };
280
281 /* TGSI_OPCODE_END */
282 static void
end_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)283 end_emit(
284 const struct lp_build_tgsi_action * action,
285 struct lp_build_tgsi_context * bld_base,
286 struct lp_build_emit_data * emit_data)
287 {
288 bld_base->pc = -1;
289 }
290
291 /* TGSI_OPCODE_EXP */
292
293 static void
exp_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)294 exp_emit(
295 const struct lp_build_tgsi_action * action,
296 struct lp_build_tgsi_context * bld_base,
297 struct lp_build_emit_data * emit_data)
298 {
299 LLVMValueRef floor_x;
300
301 /* floor( src0.x ) */
302 floor_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR,
303 emit_data->args[0]);
304
305 /* 2 ^ floor( src0.x ) */
306 emit_data->output[TGSI_CHAN_X] = lp_build_emit_llvm_unary(bld_base,
307 TGSI_OPCODE_EX2, floor_x);
308
309 /* src0.x - floor( src0.x ) */
310 emit_data->output[TGSI_CHAN_Y] =
311 lp_build_sub(&bld_base->base, emit_data->args[0] /* src0.x */, floor_x);
312
313 /* 2 ^ src0.x */
314 emit_data->output[TGSI_CHAN_Z] = lp_build_emit_llvm_unary(bld_base,
315 TGSI_OPCODE_EX2, emit_data->args[0] /* src0.x */);
316
317 emit_data->output[TGSI_CHAN_W] = bld_base->base.one;
318 }
319
320 const struct lp_build_tgsi_action exp_action = {
321 scalar_unary_fetch_args, /* fetch_args */
322 exp_emit /* emit */
323 };
324
325 /* TGSI_OPCODE_FRC */
326
327 static void
frc_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)328 frc_emit(
329 const struct lp_build_tgsi_action * action,
330 struct lp_build_tgsi_context * bld_base,
331 struct lp_build_emit_data * emit_data)
332 {
333 LLVMValueRef tmp;
334 tmp = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR,
335 emit_data->args[0]);
336 emit_data->output[emit_data->chan] =
337 lp_build_sub(&bld_base->base, emit_data->args[0], tmp);
338 }
339
340 /* TGSI_OPCODE_KILL_IF */
341
342 static void
kil_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)343 kil_fetch_args(
344 struct lp_build_tgsi_context * bld_base,
345 struct lp_build_emit_data * emit_data)
346 {
347 /* src0.x */
348 emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst,
349 0, TGSI_CHAN_X);
350 /* src0.y */
351 emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst,
352 0, TGSI_CHAN_Y);
353 /* src0.z */
354 emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst,
355 0, TGSI_CHAN_Z);
356 /* src0.w */
357 emit_data->args[3] = lp_build_emit_fetch(bld_base, emit_data->inst,
358 0, TGSI_CHAN_W);
359 emit_data->arg_count = 4;
360 emit_data->dst_type = LLVMVoidTypeInContext(bld_base->base.gallivm->context);
361 }
362
363 /* TGSI_OPCODE_KILL */
364
365 static void
kilp_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)366 kilp_fetch_args(
367 struct lp_build_tgsi_context * bld_base,
368 struct lp_build_emit_data * emit_data)
369 {
370 emit_data->dst_type = LLVMVoidTypeInContext(bld_base->base.gallivm->context);
371 }
372
373 /* TGSI_OPCODE_LIT */
374
375 static void
lit_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)376 lit_fetch_args(
377 struct lp_build_tgsi_context * bld_base,
378 struct lp_build_emit_data * emit_data)
379 {
380 /* src0.x */
381 emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_X);
382 /* src0.y */
383 emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_Y);
384 /* src0.w */
385 emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_W);
386 emit_data->arg_count = 3;
387 }
388
389 static void
lit_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)390 lit_emit(
391 const struct lp_build_tgsi_action * action,
392 struct lp_build_tgsi_context * bld_base,
393 struct lp_build_emit_data * emit_data)
394 {
395 LLVMValueRef tmp0, tmp1, tmp2;
396
397 /* dst.x */
398 emit_data->output[TGSI_CHAN_X] = bld_base->base.one;
399
400 /* dst. y */
401 emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base,
402 TGSI_OPCODE_MAX,
403 emit_data->args[0] /* src0.x */,
404 bld_base->base.zero);
405
406 /* dst.z */
407 /* XMM[1] = SrcReg[0].yyyy */
408 tmp1 = emit_data->args[1];
409 /* XMM[1] = max(XMM[1], 0) */
410 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MAX,
411 tmp1, bld_base->base.zero);
412 /* XMM[2] = SrcReg[0].wwww */
413 tmp2 = emit_data->args[2];
414 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_POW,
415 tmp1, tmp2);
416 tmp0 = emit_data->args[0];
417 emit_data->output[TGSI_CHAN_Z] = lp_build_emit_llvm_ternary(bld_base,
418 TGSI_OPCODE_CMP,
419 tmp0, bld_base->base.zero, tmp1);
420 /* dst.w */
421 emit_data->output[TGSI_CHAN_W] = bld_base->base.one;
422 }
423
424 static struct lp_build_tgsi_action lit_action = {
425 lit_fetch_args, /* fetch_args */
426 lit_emit /* emit */
427 };
428
429 /* TGSI_OPCODE_LOG */
430
431 static void
log_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)432 log_emit(
433 const struct lp_build_tgsi_action * action,
434 struct lp_build_tgsi_context * bld_base,
435 struct lp_build_emit_data * emit_data)
436 {
437
438 LLVMValueRef abs_x, log_abs_x, flr_log_abs_x, ex2_flr_log_abs_x;
439
440 /* abs( src0.x) */
441 abs_x = lp_build_abs(&bld_base->base, emit_data->args[0] /* src0.x */);
442
443 /* log( abs( src0.x ) ) */
444 log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_LG2,
445 abs_x);
446
447 /* floor( log( abs( src0.x ) ) ) */
448 flr_log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR,
449 log_abs_x);
450 /* dst.x */
451 emit_data->output[TGSI_CHAN_X] = flr_log_abs_x;
452
453 /* dst.y */
454 ex2_flr_log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_EX2,
455 flr_log_abs_x);
456
457 /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */
458 emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base,
459 TGSI_OPCODE_DIV, abs_x, ex2_flr_log_abs_x);
460
461 /* dst.x */
462 emit_data->output[TGSI_CHAN_Z] = log_abs_x;
463
464 /* dst.w */
465 emit_data->output[TGSI_CHAN_W] = bld_base->base.one;
466 }
467
468 static struct lp_build_tgsi_action log_action = {
469 scalar_unary_fetch_args, /* fetch_args */
470 log_emit /* emit */
471 };
472
473 /* TGSI_OPCODE_PK2H */
474
475 static void
pk2h_fetch_args(struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)476 pk2h_fetch_args(
477 struct lp_build_tgsi_context * bld_base,
478 struct lp_build_emit_data * emit_data)
479 {
480 /* src0.x */
481 emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst,
482 0, TGSI_CHAN_X);
483 /* src0.y */
484 emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst,
485 0, TGSI_CHAN_Y);
486 }
487
488 static void
pk2h_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)489 pk2h_emit(
490 const struct lp_build_tgsi_action *action,
491 struct lp_build_tgsi_context *bld_base,
492 struct lp_build_emit_data *emit_data)
493 {
494 struct gallivm_state *gallivm = bld_base->base.gallivm;
495 struct lp_type f16i_t;
496 LLVMValueRef lo, hi, res;
497
498 f16i_t = lp_type_uint_vec(16, bld_base->base.type.length * 32);
499 lo = lp_build_float_to_half(gallivm, emit_data->args[0]);
500 hi = lp_build_float_to_half(gallivm, emit_data->args[1]);
501 /* maybe some interleave doubling vector width would be useful... */
502 lo = lp_build_pad_vector(gallivm, lo, bld_base->base.type.length * 2);
503 hi = lp_build_pad_vector(gallivm, hi, bld_base->base.type.length * 2);
504 res = lp_build_interleave2(gallivm, f16i_t, lo, hi, 0);
505
506 emit_data->output[emit_data->chan] = res;
507 }
508
509 static struct lp_build_tgsi_action pk2h_action = {
510 pk2h_fetch_args, /* fetch_args */
511 pk2h_emit /* emit */
512 };
513
514 /* TGSI_OPCODE_UP2H */
515
516 static void
up2h_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)517 up2h_emit(
518 const struct lp_build_tgsi_action *action,
519 struct lp_build_tgsi_context *bld_base,
520 struct lp_build_emit_data *emit_data)
521 {
522 struct gallivm_state *gallivm = bld_base->base.gallivm;
523 LLVMBuilderRef builder = gallivm->builder;
524 LLVMContextRef context = gallivm->context;
525 LLVMValueRef lo, hi, res[2], arg;
526 unsigned nr = bld_base->base.type.length;
527 LLVMTypeRef i16t = LLVMVectorType(LLVMInt16TypeInContext(context), nr * 2);
528
529 arg = LLVMBuildBitCast(builder, emit_data->args[0], i16t, "");
530 lo = lp_build_uninterleave1(gallivm, nr * 2, arg, 0);
531 hi = lp_build_uninterleave1(gallivm, nr * 2, arg, 1);
532 res[0] = lp_build_half_to_float(gallivm, lo);
533 res[1] = lp_build_half_to_float(gallivm, hi);
534
535 emit_data->output[0] = emit_data->output[2] = res[0];
536 emit_data->output[1] = emit_data->output[3] = res[1];
537 }
538
539 static struct lp_build_tgsi_action up2h_action = {
540 scalar_unary_fetch_args, /* fetch_args */
541 up2h_emit /* emit */
542 };
543
544 /* TGSI_OPCODE_LRP */
545
546 static void
lrp_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)547 lrp_emit(
548 const struct lp_build_tgsi_action * action,
549 struct lp_build_tgsi_context * bld_base,
550 struct lp_build_emit_data * emit_data)
551 {
552 struct lp_build_context *bld = &bld_base->base;
553 LLVMValueRef inv, a, b;
554
555 /* This uses the correct version: (1 - t)*a + t*b
556 *
557 * An alternative version is "a + t*(b-a)". The problem is this version
558 * doesn't return "b" for t = 1, because "a + (b-a)" isn't equal to "b"
559 * because of the floating-point rounding.
560 */
561 inv = lp_build_sub(bld, bld_base->base.one, emit_data->args[0]);
562 a = lp_build_mul(bld, emit_data->args[1], emit_data->args[0]);
563 b = lp_build_mul(bld, emit_data->args[2], inv);
564 emit_data->output[emit_data->chan] = lp_build_add(bld, a, b);
565 }
566
567 /* TGSI_OPCODE_MAD */
568
569 static void
mad_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)570 mad_emit(
571 const struct lp_build_tgsi_action * action,
572 struct lp_build_tgsi_context * bld_base,
573 struct lp_build_emit_data * emit_data)
574 {
575 LLVMValueRef tmp;
576 tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL,
577 emit_data->args[0],
578 emit_data->args[1]);
579 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
580 TGSI_OPCODE_ADD, tmp, emit_data->args[2]);
581 }
582
583 /* TGSI_OPCODE_MOV */
584
585 static void
mov_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)586 mov_emit(
587 const struct lp_build_tgsi_action * action,
588 struct lp_build_tgsi_context * bld_base,
589 struct lp_build_emit_data * emit_data)
590 {
591 emit_data->output[emit_data->chan] = emit_data->args[0];
592 }
593
594 /* TGSI_OPCODE_MUL */
595 static void
mul_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)596 mul_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)
600 {
601 emit_data->output[emit_data->chan] = LLVMBuildFMul(
602 bld_base->base.gallivm->builder,
603 emit_data->args[0], emit_data->args[1], "");
604 }
605
606 /*.TGSI_OPCODE_DIV.*/
fdiv_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)607 static void fdiv_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)
611 {
612 emit_data->output[emit_data->chan] = LLVMBuildFDiv(
613 bld_base->base.gallivm->builder,
614 emit_data->args[0], emit_data->args[1], "");
615 }
616
617 /*.TGSI_OPCODE_RCP.*/
rcp_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)618 static void rcp_emit(
619 const struct lp_build_tgsi_action * action,
620 struct lp_build_tgsi_context * bld_base,
621 struct lp_build_emit_data * emit_data)
622 {
623 LLVMValueRef one;
624 one = lp_build_const_float(bld_base->base.gallivm, 1.0f);
625 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
626 TGSI_OPCODE_DIV, one, emit_data->args[0]);
627 }
628
629 /* TGSI_OPCODE_POW */
630
631 static void
pow_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)632 pow_emit(
633 const struct lp_build_tgsi_action * action,
634 struct lp_build_tgsi_context * bld_base,
635 struct lp_build_emit_data * emit_data)
636 {
637 emit_data->output[emit_data->chan] = lp_build_pow(&bld_base->base,
638 emit_data->args[0], emit_data->args[1]);
639 }
640
641 static struct lp_build_tgsi_action pow_action = {
642 scalar_binary_fetch_args, /* fetch_args */
643 pow_emit /* emit */
644 };
645
646 /* TGSI_OPCODE_RSQ */
647
648 static void
rsq_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)649 rsq_emit(
650 const struct lp_build_tgsi_action * action,
651 struct lp_build_tgsi_context * bld_base,
652 struct lp_build_emit_data * emit_data)
653 {
654 if (bld_base->rsq_action.emit) {
655 bld_base->rsq_action.emit(&bld_base->rsq_action, bld_base, emit_data);
656 } else {
657 emit_data->output[emit_data->chan] = bld_base->base.undef;
658 }
659 }
660
661 const struct lp_build_tgsi_action rsq_action = {
662 scalar_unary_fetch_args, /* fetch_args */
663 rsq_emit /* emit */
664
665 };
666
667 /* TGSI_OPCODE_SQRT */
668
669 static void
sqrt_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)670 sqrt_emit(
671 const struct lp_build_tgsi_action * action,
672 struct lp_build_tgsi_context * bld_base,
673 struct lp_build_emit_data * emit_data)
674 {
675 if (bld_base->sqrt_action.emit) {
676 bld_base->sqrt_action.emit(&bld_base->sqrt_action, bld_base, emit_data);
677 } else {
678 emit_data->output[emit_data->chan] = bld_base->base.undef;
679 }
680 }
681
682 const struct lp_build_tgsi_action sqrt_action = {
683 scalar_unary_fetch_args, /* fetch_args */
684 sqrt_emit /* emit */
685 };
686
687 /* TGSI_OPCODE_F2U */
688 static void
f2u_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)689 f2u_emit(
690 const struct lp_build_tgsi_action * action,
691 struct lp_build_tgsi_context * bld_base,
692 struct lp_build_emit_data * emit_data)
693 {
694 emit_data->output[emit_data->chan] =
695 LLVMBuildFPToUI(bld_base->base.gallivm->builder,
696 emit_data->args[0],
697 bld_base->base.int_vec_type, "");
698 }
699
700 /* TGSI_OPCODE_U2F */
701 static void
u2f_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)702 u2f_emit(
703 const struct lp_build_tgsi_action * action,
704 struct lp_build_tgsi_context * bld_base,
705 struct lp_build_emit_data * emit_data)
706 {
707 emit_data->output[emit_data->chan] =
708 LLVMBuildUIToFP(bld_base->base.gallivm->builder,
709 emit_data->args[0],
710 bld_base->base.vec_type, "");
711 }
712
713 static void
umad_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)714 umad_emit(
715 const struct lp_build_tgsi_action * action,
716 struct lp_build_tgsi_context * bld_base,
717 struct lp_build_emit_data * emit_data)
718 {
719 LLVMValueRef tmp;
720 tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_UMUL,
721 emit_data->args[0],
722 emit_data->args[1]);
723 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
724 TGSI_OPCODE_UADD, tmp, emit_data->args[2]);
725 }
726
727 /* TGSI_OPCODE_UMUL */
728 static void
umul_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)729 umul_emit(
730 const struct lp_build_tgsi_action * action,
731 struct lp_build_tgsi_context * bld_base,
732 struct lp_build_emit_data * emit_data)
733 {
734 emit_data->output[emit_data->chan] = lp_build_mul(&bld_base->uint_bld,
735 emit_data->args[0], emit_data->args[1]);
736 }
737
738 /* TGSI_OPCODE_IMUL_HI */
739 static void
imul_hi_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)740 imul_hi_emit(
741 const struct lp_build_tgsi_action * action,
742 struct lp_build_tgsi_context * bld_base,
743 struct lp_build_emit_data * emit_data)
744 {
745 struct lp_build_context *int_bld = &bld_base->int_bld;
746 LLVMValueRef hi_bits;
747
748 assert(int_bld->type.width == 32);
749
750 /* low result bits are tossed away */
751 lp_build_mul_32_lohi(int_bld, emit_data->args[0],
752 emit_data->args[1], &hi_bits);
753 emit_data->output[emit_data->chan] = hi_bits;
754 }
755
756 static void
imul_hi_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)757 imul_hi_emit_cpu(
758 const struct lp_build_tgsi_action * action,
759 struct lp_build_tgsi_context * bld_base,
760 struct lp_build_emit_data * emit_data)
761 {
762 struct lp_build_context *int_bld = &bld_base->int_bld;
763 LLVMValueRef hi_bits;
764
765 assert(int_bld->type.width == 32);
766
767 /* low result bits are tossed away */
768 lp_build_mul_32_lohi_cpu(int_bld, emit_data->args[0],
769 emit_data->args[1], &hi_bits);
770 emit_data->output[emit_data->chan] = hi_bits;
771 }
772
773 /* TGSI_OPCODE_UMUL_HI */
774 static void
umul_hi_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)775 umul_hi_emit(
776 const struct lp_build_tgsi_action * action,
777 struct lp_build_tgsi_context * bld_base,
778 struct lp_build_emit_data * emit_data)
779 {
780 struct lp_build_context *uint_bld = &bld_base->uint_bld;
781 LLVMValueRef hi_bits;
782
783 assert(uint_bld->type.width == 32);
784
785 /* low result bits are tossed away */
786 lp_build_mul_32_lohi(uint_bld, emit_data->args[0],
787 emit_data->args[1], &hi_bits);
788 emit_data->output[emit_data->chan] = hi_bits;
789 }
790
791 static void
umul_hi_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)792 umul_hi_emit_cpu(
793 const struct lp_build_tgsi_action * action,
794 struct lp_build_tgsi_context * bld_base,
795 struct lp_build_emit_data * emit_data)
796 {
797 struct lp_build_context *uint_bld = &bld_base->uint_bld;
798 LLVMValueRef hi_bits;
799
800 assert(uint_bld->type.width == 32);
801
802 /* low result bits are tossed away */
803 lp_build_mul_32_lohi_cpu(uint_bld, emit_data->args[0],
804 emit_data->args[1], &hi_bits);
805 emit_data->output[emit_data->chan] = hi_bits;
806 }
807
808 /* TGSI_OPCODE_MAX */
fmax_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)809 static void fmax_emit(
810 const struct lp_build_tgsi_action * action,
811 struct lp_build_tgsi_context * bld_base,
812 struct lp_build_emit_data * emit_data)
813 {
814 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
815 emit_data->output[emit_data->chan] = LLVMBuildSelect(builder,
816 LLVMBuildFCmp(builder, LLVMRealUGE,
817 emit_data->args[0], emit_data->args[1], ""),
818 emit_data->args[0], emit_data->args[1], "");
819 }
820
821 /* TGSI_OPCODE_MIN */
fmin_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)822 static void fmin_emit(
823 const struct lp_build_tgsi_action * action,
824 struct lp_build_tgsi_context * bld_base,
825 struct lp_build_emit_data * emit_data)
826 {
827 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
828 emit_data->output[emit_data->chan] = LLVMBuildSelect(builder,
829 LLVMBuildFCmp(builder, LLVMRealUGE,
830 emit_data->args[0], emit_data->args[1], ""),
831 emit_data->args[1], emit_data->args[0], "");
832 }
833
834 /* TGSI_OPCODE_D2F */
835 static void
d2f_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)836 d2f_emit(
837 const struct lp_build_tgsi_action * action,
838 struct lp_build_tgsi_context * bld_base,
839 struct lp_build_emit_data * emit_data)
840 {
841 emit_data->output[emit_data->chan] =
842 LLVMBuildFPTrunc(bld_base->base.gallivm->builder,
843 emit_data->args[0],
844 bld_base->base.vec_type, "");
845 }
846
847 /* TGSI_OPCODE_D2I */
848 static void
d2i_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)849 d2i_emit(
850 const struct lp_build_tgsi_action * action,
851 struct lp_build_tgsi_context * bld_base,
852 struct lp_build_emit_data * emit_data)
853 {
854 emit_data->output[emit_data->chan] =
855 LLVMBuildFPToSI(bld_base->base.gallivm->builder,
856 emit_data->args[0],
857 bld_base->base.int_vec_type, "");
858 }
859
860 /* TGSI_OPCODE_D2U */
861 static void
d2u_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)862 d2u_emit(
863 const struct lp_build_tgsi_action * action,
864 struct lp_build_tgsi_context * bld_base,
865 struct lp_build_emit_data * emit_data)
866 {
867 emit_data->output[emit_data->chan] =
868 LLVMBuildFPToUI(bld_base->base.gallivm->builder,
869 emit_data->args[0],
870 bld_base->base.int_vec_type, "");
871 }
872
873 /* TGSI_OPCODE_F2D */
874 static void
f2d_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)875 f2d_emit(
876 const struct lp_build_tgsi_action * action,
877 struct lp_build_tgsi_context * bld_base,
878 struct lp_build_emit_data * emit_data)
879 {
880 emit_data->output[emit_data->chan] =
881 LLVMBuildFPExt(bld_base->base.gallivm->builder,
882 emit_data->args[0],
883 bld_base->dbl_bld.vec_type, "");
884 }
885
886 /* TGSI_OPCODE_U2D */
887 static void
u2d_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)888 u2d_emit(
889 const struct lp_build_tgsi_action * action,
890 struct lp_build_tgsi_context * bld_base,
891 struct lp_build_emit_data * emit_data)
892 {
893 emit_data->output[emit_data->chan] =
894 LLVMBuildUIToFP(bld_base->base.gallivm->builder,
895 emit_data->args[0],
896 bld_base->dbl_bld.vec_type, "");
897 }
898
899 /* TGSI_OPCODE_I2D */
900 static void
i2d_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)901 i2d_emit(
902 const struct lp_build_tgsi_action * action,
903 struct lp_build_tgsi_context * bld_base,
904 struct lp_build_emit_data * emit_data)
905 {
906 emit_data->output[emit_data->chan] =
907 LLVMBuildSIToFP(bld_base->base.gallivm->builder,
908 emit_data->args[0],
909 bld_base->dbl_bld.vec_type, "");
910 }
911
912 /* TGSI_OPCODE_DMAD */
913 static void
dmad_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)914 dmad_emit(
915 const struct lp_build_tgsi_action * action,
916 struct lp_build_tgsi_context * bld_base,
917 struct lp_build_emit_data * emit_data)
918 {
919 LLVMValueRef tmp;
920 tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_DMUL,
921 emit_data->args[0],
922 emit_data->args[1]);
923 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base,
924 TGSI_OPCODE_DADD, tmp, emit_data->args[2]);
925 }
926
927 /*.TGSI_OPCODE_DRCP.*/
drcp_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)928 static void drcp_emit(
929 const struct lp_build_tgsi_action * action,
930 struct lp_build_tgsi_context * bld_base,
931 struct lp_build_emit_data * emit_data)
932 {
933 LLVMValueRef one;
934 one = lp_build_const_vec(bld_base->dbl_bld.gallivm, bld_base->dbl_bld.type, 1.0f);
935 emit_data->output[emit_data->chan] = LLVMBuildFDiv(
936 bld_base->base.gallivm->builder,
937 one, emit_data->args[0], "");
938 }
939
940 /* TGSI_OPCODE_DFRAC */
dfrac_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)941 static void dfrac_emit(
942 const struct lp_build_tgsi_action * action,
943 struct lp_build_tgsi_context * bld_base,
944 struct lp_build_emit_data * emit_data)
945 {
946 LLVMValueRef tmp;
947 tmp = lp_build_floor(&bld_base->dbl_bld,
948 emit_data->args[0]);
949 emit_data->output[emit_data->chan] = LLVMBuildFSub(bld_base->base.gallivm->builder,
950 emit_data->args[0], tmp, "");
951 }
952
953 static void
u64mul_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)954 u64mul_emit(
955 const struct lp_build_tgsi_action * action,
956 struct lp_build_tgsi_context * bld_base,
957 struct lp_build_emit_data * emit_data)
958 {
959 emit_data->output[emit_data->chan] = lp_build_mul(&bld_base->uint64_bld,
960 emit_data->args[0], emit_data->args[1]);
961 }
962
963 static void
u64mod_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)964 u64mod_emit_cpu(
965 const struct lp_build_tgsi_action * action,
966 struct lp_build_tgsi_context * bld_base,
967 struct lp_build_emit_data * emit_data)
968 {
969 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
970 LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint64_bld,
971 PIPE_FUNC_EQUAL, emit_data->args[1],
972 bld_base->uint64_bld.zero);
973 /* We want to make sure that we never divide/mod by zero to not
974 * generate sigfpe. We don't want to crash just because the
975 * shader is doing something weird. */
976 LLVMValueRef divisor = LLVMBuildOr(builder,
977 div_mask,
978 emit_data->args[1], "");
979 LLVMValueRef result = lp_build_mod(&bld_base->uint64_bld,
980 emit_data->args[0], divisor);
981 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
982 emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
983 div_mask,
984 result, "");
985 }
986
987 static void
i64mod_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)988 i64mod_emit_cpu(
989 const struct lp_build_tgsi_action * action,
990 struct lp_build_tgsi_context * bld_base,
991 struct lp_build_emit_data * emit_data)
992 {
993 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
994 LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint64_bld,
995 PIPE_FUNC_EQUAL, emit_data->args[1],
996 bld_base->uint64_bld.zero);
997 /* We want to make sure that we never divide/mod by zero to not
998 * generate sigfpe. We don't want to crash just because the
999 * shader is doing something weird. */
1000 LLVMValueRef divisor = LLVMBuildOr(builder,
1001 div_mask,
1002 emit_data->args[1], "");
1003 LLVMValueRef result = lp_build_mod(&bld_base->int64_bld,
1004 emit_data->args[0], divisor);
1005 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1006 emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
1007 div_mask,
1008 result, "");
1009 }
1010
1011 static void
u64div_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1012 u64div_emit_cpu(
1013 const struct lp_build_tgsi_action * action,
1014 struct lp_build_tgsi_context * bld_base,
1015 struct lp_build_emit_data * emit_data)
1016 {
1017
1018 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1019 LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint64_bld,
1020 PIPE_FUNC_EQUAL, emit_data->args[1],
1021 bld_base->uint64_bld.zero);
1022 /* We want to make sure that we never divide/mod by zero to not
1023 * generate sigfpe. We don't want to crash just because the
1024 * shader is doing something weird. */
1025 LLVMValueRef divisor = LLVMBuildOr(builder,
1026 div_mask,
1027 emit_data->args[1], "");
1028 LLVMValueRef result = LLVMBuildUDiv(builder,
1029 emit_data->args[0], divisor, "");
1030 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1031 emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
1032 div_mask,
1033 result, "");
1034 }
1035
1036 static void
i64div_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1037 i64div_emit_cpu(
1038 const struct lp_build_tgsi_action * action,
1039 struct lp_build_tgsi_context * bld_base,
1040 struct lp_build_emit_data * emit_data)
1041 {
1042
1043 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1044 LLVMValueRef div_mask = lp_build_cmp(&bld_base->int64_bld,
1045 PIPE_FUNC_EQUAL, emit_data->args[1],
1046 bld_base->int64_bld.zero);
1047 /* We want to make sure that we never divide/mod by zero to not
1048 * generate sigfpe. We don't want to crash just because the
1049 * shader is doing something weird. */
1050 LLVMValueRef divisor = LLVMBuildOr(builder,
1051 div_mask,
1052 emit_data->args[1], "");
1053 LLVMValueRef result = LLVMBuildSDiv(builder,
1054 emit_data->args[0], divisor, "");
1055 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1056 emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
1057 div_mask,
1058 result, "");
1059 }
1060
1061 static void
f2u64_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1062 f2u64_emit(
1063 const struct lp_build_tgsi_action * action,
1064 struct lp_build_tgsi_context * bld_base,
1065 struct lp_build_emit_data * emit_data)
1066 {
1067 emit_data->output[emit_data->chan] =
1068 LLVMBuildFPToUI(bld_base->base.gallivm->builder,
1069 emit_data->args[0],
1070 bld_base->uint64_bld.vec_type, "");
1071 }
1072
1073 static void
f2i64_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1074 f2i64_emit(
1075 const struct lp_build_tgsi_action * action,
1076 struct lp_build_tgsi_context * bld_base,
1077 struct lp_build_emit_data * emit_data)
1078 {
1079 emit_data->output[emit_data->chan] =
1080 LLVMBuildFPToSI(bld_base->base.gallivm->builder,
1081 emit_data->args[0],
1082 bld_base->int64_bld.vec_type, "");
1083 }
1084
1085 static void
u2i64_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1086 u2i64_emit(
1087 const struct lp_build_tgsi_action * action,
1088 struct lp_build_tgsi_context * bld_base,
1089 struct lp_build_emit_data * emit_data)
1090 {
1091 emit_data->output[emit_data->chan] =
1092 LLVMBuildZExt(bld_base->base.gallivm->builder,
1093 emit_data->args[0],
1094 bld_base->uint64_bld.vec_type, "");
1095 }
1096
1097 static void
i2i64_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1098 i2i64_emit(
1099 const struct lp_build_tgsi_action * action,
1100 struct lp_build_tgsi_context * bld_base,
1101 struct lp_build_emit_data * emit_data)
1102 {
1103 emit_data->output[emit_data->chan] =
1104 LLVMBuildSExt(bld_base->base.gallivm->builder,
1105 emit_data->args[0],
1106 bld_base->int64_bld.vec_type, "");
1107 }
1108
1109 static void
i642f_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1110 i642f_emit(
1111 const struct lp_build_tgsi_action * action,
1112 struct lp_build_tgsi_context * bld_base,
1113 struct lp_build_emit_data * emit_data)
1114 {
1115 emit_data->output[emit_data->chan] =
1116 LLVMBuildSIToFP(bld_base->base.gallivm->builder,
1117 emit_data->args[0],
1118 bld_base->base.vec_type, "");
1119 }
1120
1121 static void
u642f_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1122 u642f_emit(
1123 const struct lp_build_tgsi_action * action,
1124 struct lp_build_tgsi_context * bld_base,
1125 struct lp_build_emit_data * emit_data)
1126 {
1127 emit_data->output[emit_data->chan] =
1128 LLVMBuildUIToFP(bld_base->base.gallivm->builder,
1129 emit_data->args[0],
1130 bld_base->base.vec_type, "");
1131 }
1132
1133 static void
i642d_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1134 i642d_emit(
1135 const struct lp_build_tgsi_action * action,
1136 struct lp_build_tgsi_context * bld_base,
1137 struct lp_build_emit_data * emit_data)
1138 {
1139 emit_data->output[emit_data->chan] =
1140 LLVMBuildSIToFP(bld_base->base.gallivm->builder,
1141 emit_data->args[0],
1142 bld_base->dbl_bld.vec_type, "");
1143 }
1144
1145 static void
u642d_emit(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1146 u642d_emit(
1147 const struct lp_build_tgsi_action * action,
1148 struct lp_build_tgsi_context * bld_base,
1149 struct lp_build_emit_data * emit_data)
1150 {
1151 emit_data->output[emit_data->chan] =
1152 LLVMBuildUIToFP(bld_base->base.gallivm->builder,
1153 emit_data->args[0],
1154 bld_base->dbl_bld.vec_type, "");
1155 }
1156
1157 void
lp_set_default_actions(struct lp_build_tgsi_context * bld_base)1158 lp_set_default_actions(struct lp_build_tgsi_context * bld_base)
1159 {
1160 bld_base->op_actions[TGSI_OPCODE_DP2] = dp2_action;
1161 bld_base->op_actions[TGSI_OPCODE_DP3] = dp3_action;
1162 bld_base->op_actions[TGSI_OPCODE_DP4] = dp4_action;
1163 bld_base->op_actions[TGSI_OPCODE_DST] = dst_action;
1164 bld_base->op_actions[TGSI_OPCODE_EXP] = exp_action;
1165 bld_base->op_actions[TGSI_OPCODE_LIT] = lit_action;
1166 bld_base->op_actions[TGSI_OPCODE_LOG] = log_action;
1167 bld_base->op_actions[TGSI_OPCODE_PK2H] = pk2h_action;
1168 bld_base->op_actions[TGSI_OPCODE_RSQ] = rsq_action;
1169 bld_base->op_actions[TGSI_OPCODE_SQRT] = sqrt_action;
1170 bld_base->op_actions[TGSI_OPCODE_POW] = pow_action;
1171 bld_base->op_actions[TGSI_OPCODE_UP2H] = up2h_action;
1172
1173 bld_base->op_actions[TGSI_OPCODE_SWITCH].fetch_args = scalar_unary_fetch_args;
1174 bld_base->op_actions[TGSI_OPCODE_CASE].fetch_args = scalar_unary_fetch_args;
1175 bld_base->op_actions[TGSI_OPCODE_COS].fetch_args = scalar_unary_fetch_args;
1176 bld_base->op_actions[TGSI_OPCODE_EX2].fetch_args = scalar_unary_fetch_args;
1177 bld_base->op_actions[TGSI_OPCODE_IF].fetch_args = scalar_unary_fetch_args;
1178 bld_base->op_actions[TGSI_OPCODE_UIF].fetch_args = scalar_unary_fetch_args;
1179 bld_base->op_actions[TGSI_OPCODE_KILL_IF].fetch_args = kil_fetch_args;
1180 bld_base->op_actions[TGSI_OPCODE_KILL].fetch_args = kilp_fetch_args;
1181 bld_base->op_actions[TGSI_OPCODE_RCP].fetch_args = scalar_unary_fetch_args;
1182 bld_base->op_actions[TGSI_OPCODE_SIN].fetch_args = scalar_unary_fetch_args;
1183 bld_base->op_actions[TGSI_OPCODE_LG2].fetch_args = scalar_unary_fetch_args;
1184
1185 bld_base->op_actions[TGSI_OPCODE_ADD].emit = add_emit;
1186 bld_base->op_actions[TGSI_OPCODE_ARR].emit = arr_emit;
1187 bld_base->op_actions[TGSI_OPCODE_END].emit = end_emit;
1188 bld_base->op_actions[TGSI_OPCODE_FRC].emit = frc_emit;
1189 bld_base->op_actions[TGSI_OPCODE_LRP].emit = lrp_emit;
1190 bld_base->op_actions[TGSI_OPCODE_MAD].emit = mad_emit;
1191 bld_base->op_actions[TGSI_OPCODE_MOV].emit = mov_emit;
1192 bld_base->op_actions[TGSI_OPCODE_MUL].emit = mul_emit;
1193 bld_base->op_actions[TGSI_OPCODE_DIV].emit = fdiv_emit;
1194 bld_base->op_actions[TGSI_OPCODE_RCP].emit = rcp_emit;
1195
1196 bld_base->op_actions[TGSI_OPCODE_UARL].emit = mov_emit;
1197 bld_base->op_actions[TGSI_OPCODE_F2U].emit = f2u_emit;
1198 bld_base->op_actions[TGSI_OPCODE_U2F].emit = u2f_emit;
1199 bld_base->op_actions[TGSI_OPCODE_UMAD].emit = umad_emit;
1200 bld_base->op_actions[TGSI_OPCODE_UMUL].emit = umul_emit;
1201 bld_base->op_actions[TGSI_OPCODE_IMUL_HI].emit = imul_hi_emit;
1202 bld_base->op_actions[TGSI_OPCODE_UMUL_HI].emit = umul_hi_emit;
1203
1204 bld_base->op_actions[TGSI_OPCODE_MAX].emit = fmax_emit;
1205 bld_base->op_actions[TGSI_OPCODE_MIN].emit = fmin_emit;
1206
1207 bld_base->op_actions[TGSI_OPCODE_DADD].emit = add_emit;
1208 bld_base->op_actions[TGSI_OPCODE_DMAX].emit = fmax_emit;
1209 bld_base->op_actions[TGSI_OPCODE_DMIN].emit = fmin_emit;
1210 bld_base->op_actions[TGSI_OPCODE_DMUL].emit = mul_emit;
1211 bld_base->op_actions[TGSI_OPCODE_DDIV].emit = fdiv_emit;
1212
1213 bld_base->op_actions[TGSI_OPCODE_D2F].emit = d2f_emit;
1214 bld_base->op_actions[TGSI_OPCODE_D2I].emit = d2i_emit;
1215 bld_base->op_actions[TGSI_OPCODE_D2U].emit = d2u_emit;
1216
1217 bld_base->op_actions[TGSI_OPCODE_F2D].emit = f2d_emit;
1218 bld_base->op_actions[TGSI_OPCODE_I2D].emit = i2d_emit;
1219 bld_base->op_actions[TGSI_OPCODE_U2D].emit = u2d_emit;
1220
1221 bld_base->op_actions[TGSI_OPCODE_DMAD].emit = dmad_emit;
1222
1223 bld_base->op_actions[TGSI_OPCODE_DRCP].emit = drcp_emit;
1224 bld_base->op_actions[TGSI_OPCODE_DFRAC].emit = dfrac_emit;
1225
1226 bld_base->op_actions[TGSI_OPCODE_U64MUL].emit = u64mul_emit;
1227
1228 bld_base->op_actions[TGSI_OPCODE_F2I64].emit = f2i64_emit;
1229 bld_base->op_actions[TGSI_OPCODE_F2U64].emit = f2u64_emit;
1230
1231 bld_base->op_actions[TGSI_OPCODE_D2I64].emit = f2i64_emit;
1232 bld_base->op_actions[TGSI_OPCODE_D2U64].emit = f2u64_emit;
1233
1234 bld_base->op_actions[TGSI_OPCODE_I2I64].emit = i2i64_emit;
1235 bld_base->op_actions[TGSI_OPCODE_U2I64].emit = u2i64_emit;
1236
1237 bld_base->op_actions[TGSI_OPCODE_I642F].emit = i642f_emit;
1238 bld_base->op_actions[TGSI_OPCODE_U642F].emit = u642f_emit;
1239
1240 bld_base->op_actions[TGSI_OPCODE_I642F].emit = i642f_emit;
1241 bld_base->op_actions[TGSI_OPCODE_U642F].emit = u642f_emit;
1242
1243 bld_base->op_actions[TGSI_OPCODE_I642D].emit = i642d_emit;
1244 bld_base->op_actions[TGSI_OPCODE_U642D].emit = u642d_emit;
1245
1246 }
1247
1248 /* CPU Only default actions */
1249
1250 /* These actions are CPU only, because they could potentially output SSE
1251 * intrinsics.
1252 */
1253
1254 /* TGSI_OPCODE_ADD (CPU Only) */
1255 static void
add_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1256 add_emit_cpu(
1257 const struct lp_build_tgsi_action * action,
1258 struct lp_build_tgsi_context * bld_base,
1259 struct lp_build_emit_data * emit_data)
1260 {
1261 emit_data->output[emit_data->chan] = lp_build_add(&bld_base->base,
1262 emit_data->args[0], emit_data->args[1]);
1263 }
1264
1265 /* TGSI_OPCODE_AND (CPU Only) */
1266 static void
and_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1267 and_emit_cpu(
1268 const struct lp_build_tgsi_action * action,
1269 struct lp_build_tgsi_context * bld_base,
1270 struct lp_build_emit_data * emit_data)
1271 {
1272 emit_data->output[emit_data->chan] = lp_build_and(&bld_base->uint_bld,
1273 emit_data->args[0], emit_data->args[1]);
1274 }
1275
1276 /* TGSI_OPCODE_ARL (CPU Only) */
1277 static void
arl_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1278 arl_emit_cpu(
1279 const struct lp_build_tgsi_action * action,
1280 struct lp_build_tgsi_context * bld_base,
1281 struct lp_build_emit_data * emit_data)
1282 {
1283 LLVMValueRef tmp;
1284 tmp = lp_build_floor(&bld_base->base,
1285 emit_data->args[0]);
1286 emit_data->output[emit_data->chan] = LLVMBuildFPToSI(bld_base->base.gallivm->builder, tmp,
1287 bld_base->uint_bld.vec_type, "");
1288 }
1289
1290 /* TGSI_OPCODE_ARR (CPU Only) */
1291 static void
arr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1292 arr_emit_cpu(
1293 const struct lp_build_tgsi_action * action,
1294 struct lp_build_tgsi_context * bld_base,
1295 struct lp_build_emit_data * emit_data)
1296 {
1297 emit_data->output[emit_data->chan] = lp_build_iround(&bld_base->base, emit_data->args[0]);
1298 }
1299
1300 /* TGSI_OPCODE_CEIL (CPU Only) */
1301 static void
ceil_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1302 ceil_emit_cpu(
1303 const struct lp_build_tgsi_action * action,
1304 struct lp_build_tgsi_context * bld_base,
1305 struct lp_build_emit_data * emit_data)
1306 {
1307 emit_data->output[emit_data->chan] = lp_build_ceil(&bld_base->base,
1308 emit_data->args[0]);
1309 }
1310
1311 /* TGSI_OPCODE_CMP (CPU Only) */
1312 static void
cmp_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1313 cmp_emit_cpu(
1314 const struct lp_build_tgsi_action * action,
1315 struct lp_build_tgsi_context * bld_base,
1316 struct lp_build_emit_data * emit_data)
1317 {
1318 LLVMValueRef cond = lp_build_cmp(&bld_base->base, PIPE_FUNC_LESS,
1319 emit_data->args[0], bld_base->base.zero);
1320 emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base,
1321 cond, emit_data->args[1], emit_data->args[2]);
1322 }
1323
1324 /* TGSI_OPCODE_UCMP (CPU Only) */
1325 static void
ucmp_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1326 ucmp_emit_cpu(
1327 const struct lp_build_tgsi_action * action,
1328 struct lp_build_tgsi_context * bld_base,
1329 struct lp_build_emit_data * emit_data)
1330 {
1331 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1332 struct lp_build_context *uint_bld = &bld_base->uint_bld;
1333 LLVMValueRef unsigned_cond =
1334 LLVMBuildBitCast(builder, emit_data->args[0], uint_bld->vec_type, "");
1335 LLVMValueRef cond = lp_build_cmp(uint_bld, PIPE_FUNC_NOTEQUAL,
1336 unsigned_cond,
1337 uint_bld->zero);
1338 emit_data->output[emit_data->chan] =
1339 lp_build_select(&bld_base->base,
1340 cond, emit_data->args[1], emit_data->args[2]);
1341 }
1342
1343 /* TGSI_OPCODE_COS (CPU Only) */
1344 static void
cos_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1345 cos_emit_cpu(
1346 const struct lp_build_tgsi_action * action,
1347 struct lp_build_tgsi_context * bld_base,
1348 struct lp_build_emit_data * emit_data)
1349 {
1350 emit_data->output[emit_data->chan] = lp_build_cos(&bld_base->base,
1351 emit_data->args[0]);
1352 }
1353
1354 /* TGSI_OPCODE_DIV (CPU Only) */
1355 static void
div_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1356 div_emit_cpu(
1357 const struct lp_build_tgsi_action * action,
1358 struct lp_build_tgsi_context * bld_base,
1359 struct lp_build_emit_data * emit_data)
1360 {
1361 emit_data->output[emit_data->chan] = lp_build_div(&bld_base->base,
1362 emit_data->args[0], emit_data->args[1]);
1363 }
1364
1365 /* TGSI_OPCODE_EX2 (CPU Only) */
1366 static void
ex2_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1367 ex2_emit_cpu(
1368 const struct lp_build_tgsi_action * action,
1369 struct lp_build_tgsi_context * bld_base,
1370 struct lp_build_emit_data * emit_data)
1371 {
1372 emit_data->output[emit_data->chan] = lp_build_exp2(&bld_base->base,
1373 emit_data->args[0]);
1374 }
1375
1376 /* TGSI_OPCODE_F2I (CPU Only) */
1377 static void
f2i_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1378 f2i_emit_cpu(
1379 const struct lp_build_tgsi_action * action,
1380 struct lp_build_tgsi_context * bld_base,
1381 struct lp_build_emit_data * emit_data)
1382 {
1383 emit_data->output[emit_data->chan] = lp_build_itrunc(&bld_base->base,
1384 emit_data->args[0]);
1385 }
1386
1387 /* TGSI_OPCODE_FSET Helper (CPU Only) */
1388 static void
fset_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)1389 fset_emit_cpu(
1390 const struct lp_build_tgsi_action * action,
1391 struct lp_build_tgsi_context * bld_base,
1392 struct lp_build_emit_data * emit_data,
1393 unsigned pipe_func)
1394 {
1395 LLVMValueRef cond;
1396
1397 if (pipe_func != PIPE_FUNC_NOTEQUAL) {
1398 cond = lp_build_cmp_ordered(&bld_base->base, pipe_func,
1399 emit_data->args[0], emit_data->args[1]);
1400 }
1401 else {
1402 cond = lp_build_cmp(&bld_base->base, pipe_func,
1403 emit_data->args[0], emit_data->args[1]);
1404
1405 }
1406 emit_data->output[emit_data->chan] = cond;
1407 }
1408
1409
1410 /* TGSI_OPCODE_FSEQ (CPU Only) */
1411 static void
fseq_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1412 fseq_emit_cpu(
1413 const struct lp_build_tgsi_action * action,
1414 struct lp_build_tgsi_context * bld_base,
1415 struct lp_build_emit_data * emit_data)
1416 {
1417 fset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL);
1418 }
1419
1420 /* TGSI_OPCODE_ISGE (CPU Only) */
1421 static void
fsge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1422 fsge_emit_cpu(
1423 const struct lp_build_tgsi_action * action,
1424 struct lp_build_tgsi_context * bld_base,
1425 struct lp_build_emit_data * emit_data)
1426 {
1427 fset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
1428 }
1429
1430 /* TGSI_OPCODE_ISLT (CPU Only) */
1431 static void
fslt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1432 fslt_emit_cpu(
1433 const struct lp_build_tgsi_action * action,
1434 struct lp_build_tgsi_context * bld_base,
1435 struct lp_build_emit_data * emit_data)
1436 {
1437 fset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
1438 }
1439
1440 /* TGSI_OPCODE_USNE (CPU Only) */
1441
1442 static void
fsne_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1443 fsne_emit_cpu(
1444 const struct lp_build_tgsi_action * action,
1445 struct lp_build_tgsi_context * bld_base,
1446 struct lp_build_emit_data * emit_data)
1447 {
1448 fset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL);
1449 }
1450
1451 /* TGSI_OPCODE_FLR (CPU Only) */
1452
1453 static void
flr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1454 flr_emit_cpu(
1455 const struct lp_build_tgsi_action * action,
1456 struct lp_build_tgsi_context * bld_base,
1457 struct lp_build_emit_data * emit_data)
1458 {
1459 emit_data->output[emit_data->chan] = lp_build_floor(&bld_base->base,
1460 emit_data->args[0]);
1461 }
1462
1463 /* TGSI_OPCODE_I2F (CPU Only) */
1464 static void
i2f_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1465 i2f_emit_cpu(
1466 const struct lp_build_tgsi_action * action,
1467 struct lp_build_tgsi_context * bld_base,
1468 struct lp_build_emit_data * emit_data)
1469 {
1470 emit_data->output[emit_data->chan] = lp_build_int_to_float(&bld_base->base,
1471 emit_data->args[0]);
1472 }
1473
1474 /* TGSI_OPCODE_IABS (CPU Only) */
1475 static void
iabs_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1476 iabs_emit_cpu(
1477 const struct lp_build_tgsi_action * action,
1478 struct lp_build_tgsi_context * bld_base,
1479 struct lp_build_emit_data * emit_data)
1480 {
1481 emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->int_bld,
1482 emit_data->args[0]);
1483 }
1484
1485 /* TGSI_OPCODE_IDIV (CPU Only) */
1486 static void
idiv_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1487 idiv_emit_cpu(
1488 const struct lp_build_tgsi_action * action,
1489 struct lp_build_tgsi_context * bld_base,
1490 struct lp_build_emit_data * emit_data)
1491 {
1492 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1493 LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint_bld,
1494 PIPE_FUNC_EQUAL, emit_data->args[1],
1495 bld_base->uint_bld.zero);
1496 /* We want to make sure that we never divide/mod by zero to not
1497 * generate sigfpe. We don't want to crash just because the
1498 * shader is doing something weird. */
1499 LLVMValueRef divisor = LLVMBuildOr(builder,
1500 div_mask,
1501 emit_data->args[1], "");
1502 LLVMValueRef result = lp_build_div(&bld_base->int_bld,
1503 emit_data->args[0], divisor);
1504 LLVMValueRef not_div_mask = LLVMBuildNot(builder,
1505 div_mask,"");
1506 /* idiv by zero doesn't have a guaranteed return value chose 0 for now. */
1507 emit_data->output[emit_data->chan] = LLVMBuildAnd(builder,
1508 not_div_mask,
1509 result, "");
1510 }
1511
1512 /* TGSI_OPCODE_INEG (CPU Only) */
1513 static void
ineg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1514 ineg_emit_cpu(
1515 const struct lp_build_tgsi_action * action,
1516 struct lp_build_tgsi_context * bld_base,
1517 struct lp_build_emit_data * emit_data)
1518 {
1519 emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->int_bld,
1520 bld_base->int_bld.zero,
1521 emit_data->args[0]);
1522 }
1523
1524 /* TGSI_OPCODE_ISET Helper (CPU Only) */
1525 static void
iset_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)1526 iset_emit_cpu(
1527 const struct lp_build_tgsi_action * action,
1528 struct lp_build_tgsi_context * bld_base,
1529 struct lp_build_emit_data * emit_data,
1530 unsigned pipe_func)
1531 {
1532 LLVMValueRef cond = lp_build_cmp(&bld_base->int_bld, pipe_func,
1533 emit_data->args[0], emit_data->args[1]);
1534 emit_data->output[emit_data->chan] = cond;
1535 }
1536
1537 /* TGSI_OPCODE_IMAX (CPU Only) */
1538 static void
imax_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1539 imax_emit_cpu(
1540 const struct lp_build_tgsi_action * action,
1541 struct lp_build_tgsi_context * bld_base,
1542 struct lp_build_emit_data * emit_data)
1543 {
1544 emit_data->output[emit_data->chan] = lp_build_max(&bld_base->int_bld,
1545 emit_data->args[0], emit_data->args[1]);
1546 }
1547
1548 /* TGSI_OPCODE_IMIN (CPU Only) */
1549 static void
imin_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1550 imin_emit_cpu(
1551 const struct lp_build_tgsi_action * action,
1552 struct lp_build_tgsi_context * bld_base,
1553 struct lp_build_emit_data * emit_data)
1554 {
1555 emit_data->output[emit_data->chan] = lp_build_min(&bld_base->int_bld,
1556 emit_data->args[0], emit_data->args[1]);
1557 }
1558
1559 /* TGSI_OPCODE_ISGE (CPU Only) */
1560 static void
isge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1561 isge_emit_cpu(
1562 const struct lp_build_tgsi_action * action,
1563 struct lp_build_tgsi_context * bld_base,
1564 struct lp_build_emit_data * emit_data)
1565 {
1566 iset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
1567 }
1568
1569 /* TGSI_OPCODE_ISHR (CPU Only) */
1570 static void
ishr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1571 ishr_emit_cpu(
1572 const struct lp_build_tgsi_action * action,
1573 struct lp_build_tgsi_context * bld_base,
1574 struct lp_build_emit_data * emit_data)
1575 {
1576 struct lp_build_context *int_bld = &bld_base->int_bld;
1577 LLVMValueRef mask = lp_build_const_vec(int_bld->gallivm, int_bld->type,
1578 int_bld->type.width - 1);
1579 LLVMValueRef masked_count = lp_build_and(int_bld, emit_data->args[1], mask);
1580 emit_data->output[emit_data->chan] = lp_build_shr(int_bld, emit_data->args[0],
1581 masked_count);
1582 }
1583
1584 /* TGSI_OPCODE_ISLT (CPU Only) */
1585 static void
islt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1586 islt_emit_cpu(
1587 const struct lp_build_tgsi_action * action,
1588 struct lp_build_tgsi_context * bld_base,
1589 struct lp_build_emit_data * emit_data)
1590 {
1591 iset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
1592 }
1593
1594
1595 /* TGSI_OPCODE_ISSG (CPU Only) */
1596 static void
issg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1597 issg_emit_cpu(
1598 const struct lp_build_tgsi_action * action,
1599 struct lp_build_tgsi_context * bld_base,
1600 struct lp_build_emit_data * emit_data)
1601 {
1602 emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->int_bld,
1603 emit_data->args[0]);
1604 }
1605
1606 /* TGSI_OPCODE_LG2 (CPU Only) */
1607 static void
lg2_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1608 lg2_emit_cpu(
1609 const struct lp_build_tgsi_action * action,
1610 struct lp_build_tgsi_context * bld_base,
1611 struct lp_build_emit_data * emit_data)
1612 {
1613 emit_data->output[emit_data->chan] = lp_build_log2_safe(&bld_base->base,
1614 emit_data->args[0]);
1615 }
1616
1617 /* TGSI_OPCODE_LOG (CPU Only) */
1618 static void
log_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1619 log_emit_cpu(
1620 const struct lp_build_tgsi_action * action,
1621 struct lp_build_tgsi_context * bld_base,
1622 struct lp_build_emit_data * emit_data)
1623 {
1624 LLVMValueRef p_floor_log2;
1625 LLVMValueRef p_exp;
1626 LLVMValueRef p_log2;
1627 LLVMValueRef src0 = emit_data->args[0];
1628
1629 lp_build_log2_approx(&bld_base->base, src0,
1630 &p_exp, &p_floor_log2, &p_log2, false);
1631
1632 emit_data->output[TGSI_CHAN_X] = p_floor_log2;
1633
1634 emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base,
1635 TGSI_OPCODE_DIV,
1636 src0, p_exp);
1637 emit_data->output[TGSI_CHAN_Z] = p_log2;
1638
1639 emit_data->output[TGSI_CHAN_W] = bld_base->base.one;
1640
1641 }
1642
1643 /* TGSI_OPCODE_MAD (CPU Only) */
1644
1645 static void
mad_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1646 mad_emit_cpu(
1647 const struct lp_build_tgsi_action * action,
1648 struct lp_build_tgsi_context * bld_base,
1649 struct lp_build_emit_data * emit_data)
1650 {
1651 emit_data->output[emit_data->chan] =
1652 lp_build_mad(&bld_base->base,
1653 emit_data->args[0], emit_data->args[1], emit_data->args[2]);
1654 }
1655
1656 /* TGSI_OPCODE_MAX (CPU Only) */
1657
1658 static void
max_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1659 max_emit_cpu(
1660 const struct lp_build_tgsi_action * action,
1661 struct lp_build_tgsi_context * bld_base,
1662 struct lp_build_emit_data * emit_data)
1663 {
1664 emit_data->output[emit_data->chan] =
1665 lp_build_max_ext(&bld_base->base,
1666 emit_data->args[0], emit_data->args[1],
1667 GALLIVM_NAN_RETURN_OTHER);
1668 }
1669
1670 /* TGSI_OPCODE_MIN (CPU Only) */
1671 static void
min_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1672 min_emit_cpu(
1673 const struct lp_build_tgsi_action * action,
1674 struct lp_build_tgsi_context * bld_base,
1675 struct lp_build_emit_data * emit_data)
1676 {
1677 emit_data->output[emit_data->chan] =
1678 lp_build_min_ext(&bld_base->base,
1679 emit_data->args[0], emit_data->args[1],
1680 GALLIVM_NAN_RETURN_OTHER);
1681 }
1682
1683 /* TGSI_OPCODE_MOD (CPU Only) */
1684 static void
mod_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1685 mod_emit_cpu(
1686 const struct lp_build_tgsi_action * action,
1687 struct lp_build_tgsi_context * bld_base,
1688 struct lp_build_emit_data * emit_data)
1689 {
1690 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1691 LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint_bld,
1692 PIPE_FUNC_EQUAL, emit_data->args[1],
1693 bld_base->uint_bld.zero);
1694 /* We want to make sure that we never divide/mod by zero to not
1695 * generate sigfpe. We don't want to crash just because the
1696 * shader is doing something weird. */
1697 LLVMValueRef divisor = LLVMBuildOr(builder,
1698 div_mask,
1699 emit_data->args[1], "");
1700 LLVMValueRef result = lp_build_mod(&bld_base->int_bld,
1701 emit_data->args[0], divisor);
1702 /* umod by zero doesn't have a guaranteed return value chose -1 for now. */
1703 emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
1704 div_mask,
1705 result, "");
1706 }
1707
1708 /* TGSI_OPCODE_NOT */
1709 static void
not_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1710 not_emit_cpu(
1711 const struct lp_build_tgsi_action * action,
1712 struct lp_build_tgsi_context * bld_base,
1713 struct lp_build_emit_data * emit_data)
1714 {
1715 emit_data->output[emit_data->chan] = lp_build_not(&bld_base->uint_bld,
1716 emit_data->args[0]);
1717 }
1718
1719 /* TGSI_OPCODE_OR (CPU Only) */
1720 static void
or_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1721 or_emit_cpu(
1722 const struct lp_build_tgsi_action * action,
1723 struct lp_build_tgsi_context * bld_base,
1724 struct lp_build_emit_data * emit_data)
1725 {
1726 emit_data->output[emit_data->chan] = lp_build_or(&bld_base->uint_bld,
1727 emit_data->args[0], emit_data->args[1]);
1728 }
1729
1730 /* TGSI_OPCODE_POW (CPU Only) */
1731 static void
pow_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1732 pow_emit_cpu(
1733 const struct lp_build_tgsi_action * action,
1734 struct lp_build_tgsi_context * bld_base,
1735 struct lp_build_emit_data * emit_data)
1736 {
1737 emit_data->output[emit_data->chan] = lp_build_pow(&bld_base->base,
1738 emit_data->args[0], emit_data->args[1]);
1739 }
1740
1741
1742 /* TGSI_OPCODE_RCP (CPU Only) */
1743
1744 static void
rcp_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1745 rcp_emit_cpu(
1746 const struct lp_build_tgsi_action * action,
1747 struct lp_build_tgsi_context * bld_base,
1748 struct lp_build_emit_data * emit_data)
1749 {
1750 emit_data->output[emit_data->chan] = lp_build_rcp(&bld_base->base,
1751 emit_data->args[0]);
1752 }
1753
1754 /* Reciprical squareroot (CPU Only) */
1755 static void
recip_sqrt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1756 recip_sqrt_emit_cpu(
1757 const struct lp_build_tgsi_action * action,
1758 struct lp_build_tgsi_context * bld_base,
1759 struct lp_build_emit_data * emit_data)
1760 {
1761 emit_data->output[emit_data->chan] = lp_build_rsqrt(&bld_base->base,
1762 emit_data->args[0]);
1763 }
1764
1765 static void
sqrt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1766 sqrt_emit_cpu(
1767 const struct lp_build_tgsi_action * action,
1768 struct lp_build_tgsi_context * bld_base,
1769 struct lp_build_emit_data * emit_data)
1770 {
1771 emit_data->output[emit_data->chan] = lp_build_sqrt(&bld_base->base,
1772 emit_data->args[0]);
1773 }
1774
1775
1776 /* TGSI_OPCODE_ROUND (CPU Only) */
1777 static void
round_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1778 round_emit_cpu(
1779 const struct lp_build_tgsi_action * action,
1780 struct lp_build_tgsi_context * bld_base,
1781 struct lp_build_emit_data * emit_data)
1782 {
1783 emit_data->output[emit_data->chan] = lp_build_round(&bld_base->base,
1784 emit_data->args[0]);
1785 }
1786
1787 /* TGSI_OPCODE_SET Helper (CPU Only) */
1788
1789 static void
set_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)1790 set_emit_cpu(
1791 const struct lp_build_tgsi_action * action,
1792 struct lp_build_tgsi_context * bld_base,
1793 struct lp_build_emit_data * emit_data,
1794 unsigned pipe_func)
1795 {
1796 LLVMValueRef cond;
1797
1798 if (pipe_func != PIPE_FUNC_NOTEQUAL) {
1799 cond = lp_build_cmp_ordered(&bld_base->base, pipe_func,
1800 emit_data->args[0], emit_data->args[1]);
1801 }
1802 else {
1803 cond = lp_build_cmp(&bld_base->base, pipe_func,
1804 emit_data->args[0], emit_data->args[1]);
1805
1806 }
1807 emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base,
1808 cond,
1809 bld_base->base.one,
1810 bld_base->base.zero);
1811 }
1812
1813 /* TGSI_OPCODE_SEQ (CPU Only) */
1814
1815 static void
seq_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1816 seq_emit_cpu(
1817 const struct lp_build_tgsi_action * action,
1818 struct lp_build_tgsi_context * bld_base,
1819 struct lp_build_emit_data * emit_data)
1820 {
1821 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL);
1822 }
1823
1824 /* TGSI_OPCODE_SGE (CPU Only) */
1825 static void
sge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1826 sge_emit_cpu(
1827 const struct lp_build_tgsi_action * action,
1828 struct lp_build_tgsi_context * bld_base,
1829 struct lp_build_emit_data * emit_data)
1830 {
1831 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
1832 }
1833
1834 /* TGSI_OPCODE_SGT (CPU Only)*/
1835
1836 static void
sgt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1837 sgt_emit_cpu(
1838 const struct lp_build_tgsi_action * action,
1839 struct lp_build_tgsi_context * bld_base,
1840 struct lp_build_emit_data * emit_data)
1841 {
1842 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GREATER);
1843 }
1844
1845 /* TGSI_OPCODE_SHL (CPU Only) */
1846 static void
shl_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1847 shl_emit_cpu(
1848 const struct lp_build_tgsi_action * action,
1849 struct lp_build_tgsi_context * bld_base,
1850 struct lp_build_emit_data * emit_data)
1851 {
1852 struct lp_build_context *uint_bld = &bld_base->uint_bld;
1853 LLVMValueRef mask = lp_build_const_vec(uint_bld->gallivm, uint_bld->type,
1854 uint_bld->type.width - 1);
1855 LLVMValueRef masked_count = lp_build_and(uint_bld, emit_data->args[1], mask);
1856 emit_data->output[emit_data->chan] = lp_build_shl(uint_bld, emit_data->args[0],
1857 masked_count);
1858 }
1859
1860 /* TGSI_OPCODE_SIN (CPU Only) */
1861 static void
sin_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1862 sin_emit_cpu(
1863 const struct lp_build_tgsi_action * action,
1864 struct lp_build_tgsi_context * bld_base,
1865 struct lp_build_emit_data * emit_data)
1866 {
1867 emit_data->output[emit_data->chan] = lp_build_sin(&bld_base->base,
1868 emit_data->args[0]);
1869 }
1870
1871 /* TGSI_OPCODE_SLE (CPU Only) */
1872 static void
sle_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1873 sle_emit_cpu(
1874 const struct lp_build_tgsi_action * action,
1875 struct lp_build_tgsi_context * bld_base,
1876 struct lp_build_emit_data * emit_data)
1877 {
1878 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LEQUAL);
1879 }
1880
1881 /* TGSI_OPCODE_SLT (CPU Only) */
1882 static void
slt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1883 slt_emit_cpu(
1884 const struct lp_build_tgsi_action * action,
1885 struct lp_build_tgsi_context * bld_base,
1886 struct lp_build_emit_data * emit_data)
1887 {
1888 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
1889 }
1890
1891 /* TGSI_OPCODE_SNE (CPU Only) */
1892
1893 static void
sne_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1894 sne_emit_cpu(
1895 const struct lp_build_tgsi_action * action,
1896 struct lp_build_tgsi_context * bld_base,
1897 struct lp_build_emit_data * emit_data)
1898 {
1899 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL);
1900 }
1901
1902 /* TGSI_OPCODE_SSG (CPU Only) */
1903
1904 static void
ssg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1905 ssg_emit_cpu(
1906 const struct lp_build_tgsi_action * action,
1907 struct lp_build_tgsi_context * bld_base,
1908 struct lp_build_emit_data * emit_data)
1909 {
1910 emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->base,
1911 emit_data->args[0]);
1912 }
1913
1914 /* TGSI_OPCODE_TRUNC (CPU Only) */
1915
1916 static void
trunc_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1917 trunc_emit_cpu(
1918 const struct lp_build_tgsi_action * action,
1919 struct lp_build_tgsi_context * bld_base,
1920 struct lp_build_emit_data * emit_data)
1921 {
1922 emit_data->output[emit_data->chan] = lp_build_trunc(&bld_base->base,
1923 emit_data->args[0]);
1924 }
1925
1926 /* TGSI_OPCODE_UADD (CPU Only) */
1927 static void
uadd_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1928 uadd_emit_cpu(
1929 const struct lp_build_tgsi_action * action,
1930 struct lp_build_tgsi_context * bld_base,
1931 struct lp_build_emit_data * emit_data)
1932 {
1933 emit_data->output[emit_data->chan] = lp_build_add(&bld_base->uint_bld,
1934 emit_data->args[0], emit_data->args[1]);
1935 }
1936
1937 /* TGSI_OPCODE_UDIV (CPU Only) */
1938 static void
udiv_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1939 udiv_emit_cpu(
1940 const struct lp_build_tgsi_action * action,
1941 struct lp_build_tgsi_context * bld_base,
1942 struct lp_build_emit_data * emit_data)
1943 {
1944
1945 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1946 LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint_bld,
1947 PIPE_FUNC_EQUAL, emit_data->args[1],
1948 bld_base->uint_bld.zero);
1949 /* We want to make sure that we never divide/mod by zero to not
1950 * generate sigfpe. We don't want to crash just because the
1951 * shader is doing something weird. */
1952 LLVMValueRef divisor = LLVMBuildOr(builder,
1953 div_mask,
1954 emit_data->args[1], "");
1955 LLVMValueRef result = lp_build_div(&bld_base->uint_bld,
1956 emit_data->args[0], divisor);
1957 /* udiv by zero is guaranteed to return 0xffffffff at least with d3d10 */
1958 emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
1959 div_mask,
1960 result, "");
1961 }
1962
1963 /* TGSI_OPCODE_UMAX (CPU Only) */
1964 static void
umax_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1965 umax_emit_cpu(
1966 const struct lp_build_tgsi_action * action,
1967 struct lp_build_tgsi_context * bld_base,
1968 struct lp_build_emit_data * emit_data)
1969 {
1970 emit_data->output[emit_data->chan] = lp_build_max(&bld_base->uint_bld,
1971 emit_data->args[0], emit_data->args[1]);
1972 }
1973
1974 /* TGSI_OPCODE_UMIN (CPU Only) */
1975 static void
umin_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1976 umin_emit_cpu(
1977 const struct lp_build_tgsi_action * action,
1978 struct lp_build_tgsi_context * bld_base,
1979 struct lp_build_emit_data * emit_data)
1980 {
1981 emit_data->output[emit_data->chan] = lp_build_min(&bld_base->uint_bld,
1982 emit_data->args[0], emit_data->args[1]);
1983 }
1984
1985 /* TGSI_OPCODE_UMOD (CPU Only) */
1986 static void
umod_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)1987 umod_emit_cpu(
1988 const struct lp_build_tgsi_action * action,
1989 struct lp_build_tgsi_context * bld_base,
1990 struct lp_build_emit_data * emit_data)
1991 {
1992 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
1993 LLVMValueRef div_mask = lp_build_cmp(&bld_base->uint_bld,
1994 PIPE_FUNC_EQUAL, emit_data->args[1],
1995 bld_base->uint_bld.zero);
1996 /* We want to make sure that we never divide/mod by zero to not
1997 * generate sigfpe. We don't want to crash just because the
1998 * shader is doing something weird. */
1999 LLVMValueRef divisor = LLVMBuildOr(builder,
2000 div_mask,
2001 emit_data->args[1], "");
2002 LLVMValueRef result = lp_build_mod(&bld_base->uint_bld,
2003 emit_data->args[0], divisor);
2004 /* umod by zero is guaranteed to return 0xffffffff */
2005 emit_data->output[emit_data->chan] = LLVMBuildOr(builder,
2006 div_mask,
2007 result, "");
2008 }
2009
2010 /* TGSI_OPCODE_USET Helper (CPU Only) */
2011 static void
uset_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)2012 uset_emit_cpu(
2013 const struct lp_build_tgsi_action * action,
2014 struct lp_build_tgsi_context * bld_base,
2015 struct lp_build_emit_data * emit_data,
2016 unsigned pipe_func)
2017 {
2018 LLVMValueRef cond = lp_build_cmp(&bld_base->uint_bld, pipe_func,
2019 emit_data->args[0], emit_data->args[1]);
2020 emit_data->output[emit_data->chan] = cond;
2021 }
2022
2023
2024 /* TGSI_OPCODE_USEQ (CPU Only) */
2025 static void
useq_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2026 useq_emit_cpu(
2027 const struct lp_build_tgsi_action * action,
2028 struct lp_build_tgsi_context * bld_base,
2029 struct lp_build_emit_data * emit_data)
2030 {
2031 uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL);
2032 }
2033
2034 /* TGSI_OPCODE_ISGE (CPU Only) */
2035 static void
usge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2036 usge_emit_cpu(
2037 const struct lp_build_tgsi_action * action,
2038 struct lp_build_tgsi_context * bld_base,
2039 struct lp_build_emit_data * emit_data)
2040 {
2041 uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
2042 }
2043
2044 /* TGSI_OPCODE_USHR (CPU Only) */
2045 static void
ushr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2046 ushr_emit_cpu(
2047 const struct lp_build_tgsi_action * action,
2048 struct lp_build_tgsi_context * bld_base,
2049 struct lp_build_emit_data * emit_data)
2050 {
2051 struct lp_build_context *uint_bld = &bld_base->uint_bld;
2052 LLVMValueRef mask = lp_build_const_vec(uint_bld->gallivm, uint_bld->type,
2053 uint_bld->type.width - 1);
2054 LLVMValueRef masked_count = lp_build_and(uint_bld, emit_data->args[1], mask);
2055 emit_data->output[emit_data->chan] = lp_build_shr(uint_bld, emit_data->args[0],
2056 masked_count);
2057 }
2058
2059 /* TGSI_OPCODE_ISLT (CPU Only) */
2060 static void
uslt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2061 uslt_emit_cpu(
2062 const struct lp_build_tgsi_action * action,
2063 struct lp_build_tgsi_context * bld_base,
2064 struct lp_build_emit_data * emit_data)
2065 {
2066 uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
2067 }
2068
2069 /* TGSI_OPCODE_USNE (CPU Only) */
2070
2071 static void
usne_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2072 usne_emit_cpu(
2073 const struct lp_build_tgsi_action * action,
2074 struct lp_build_tgsi_context * bld_base,
2075 struct lp_build_emit_data * emit_data)
2076 {
2077 uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL);
2078 }
2079
2080 /* TGSI_OPCODE_XOR */
2081 static void
xor_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2082 xor_emit_cpu(
2083 const struct lp_build_tgsi_action * action,
2084 struct lp_build_tgsi_context * bld_base,
2085 struct lp_build_emit_data * emit_data)
2086 {
2087 emit_data->output[emit_data->chan] = lp_build_xor(&bld_base->uint_bld,
2088 emit_data->args[0],
2089 emit_data->args[1]);
2090 }
2091
2092 /* TGSI_OPCODE_DABS (CPU Only) */
2093 static void
dabs_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2094 dabs_emit_cpu(
2095 const struct lp_build_tgsi_action * action,
2096 struct lp_build_tgsi_context * bld_base,
2097 struct lp_build_emit_data * emit_data)
2098 {
2099 emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->dbl_bld,
2100 emit_data->args[0]);
2101 }
2102
2103 /* TGSI_OPCODE_DNEG (CPU Only) */
2104 static void
dneg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2105 dneg_emit_cpu(
2106 const struct lp_build_tgsi_action * action,
2107 struct lp_build_tgsi_context * bld_base,
2108 struct lp_build_emit_data * emit_data)
2109 {
2110 emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->dbl_bld,
2111 bld_base->dbl_bld.zero,
2112 emit_data->args[0]);
2113 }
2114
2115 /* TGSI_OPCODE_DSET Helper (CPU Only) */
2116 static void
dset_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)2117 dset_emit_cpu(
2118 const struct lp_build_tgsi_action * action,
2119 struct lp_build_tgsi_context * bld_base,
2120 struct lp_build_emit_data * emit_data,
2121 unsigned pipe_func)
2122 {
2123 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
2124 LLVMValueRef cond = lp_build_cmp(&bld_base->dbl_bld, pipe_func,
2125 emit_data->args[0], emit_data->args[1]);
2126 /* arguments were 64 bit but store as 32 bit */
2127 cond = LLVMBuildTrunc(builder, cond, bld_base->int_bld.int_vec_type, "");
2128 emit_data->output[emit_data->chan] = cond;
2129 }
2130
2131 /* TGSI_OPCODE_DSEQ (CPU Only) */
2132 static void
dseq_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2133 dseq_emit_cpu(
2134 const struct lp_build_tgsi_action * action,
2135 struct lp_build_tgsi_context * bld_base,
2136 struct lp_build_emit_data * emit_data)
2137 {
2138 dset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL);
2139 }
2140
2141 /* TGSI_OPCODE_DSGE (CPU Only) */
2142 static void
dsge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2143 dsge_emit_cpu(
2144 const struct lp_build_tgsi_action * action,
2145 struct lp_build_tgsi_context * bld_base,
2146 struct lp_build_emit_data * emit_data)
2147 {
2148 dset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
2149 }
2150
2151 /* TGSI_OPCODE_DSLT (CPU Only) */
2152 static void
dslt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2153 dslt_emit_cpu(
2154 const struct lp_build_tgsi_action * action,
2155 struct lp_build_tgsi_context * bld_base,
2156 struct lp_build_emit_data * emit_data)
2157 {
2158 dset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
2159 }
2160
2161 /* TGSI_OPCODE_DSNE (CPU Only) */
2162 static void
dsne_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2163 dsne_emit_cpu(
2164 const struct lp_build_tgsi_action * action,
2165 struct lp_build_tgsi_context * bld_base,
2166 struct lp_build_emit_data * emit_data)
2167 {
2168 dset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL);
2169 }
2170
2171 /* Double Reciprocal squareroot (CPU Only) */
2172 static void
drecip_sqrt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2173 drecip_sqrt_emit_cpu(
2174 const struct lp_build_tgsi_action * action,
2175 struct lp_build_tgsi_context * bld_base,
2176 struct lp_build_emit_data * emit_data)
2177 {
2178 emit_data->output[emit_data->chan] = lp_build_rsqrt(&bld_base->dbl_bld,
2179 emit_data->args[0]);
2180 }
2181
2182 /* Double Squareroot (CPU Only) */
2183 static void
dsqrt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2184 dsqrt_emit_cpu(
2185 const struct lp_build_tgsi_action * action,
2186 struct lp_build_tgsi_context * bld_base,
2187 struct lp_build_emit_data * emit_data)
2188 {
2189 emit_data->output[emit_data->chan] = lp_build_sqrt(&bld_base->dbl_bld,
2190 emit_data->args[0]);
2191 }
2192
2193 static void
i64abs_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2194 i64abs_emit_cpu(
2195 const struct lp_build_tgsi_action * action,
2196 struct lp_build_tgsi_context * bld_base,
2197 struct lp_build_emit_data * emit_data)
2198 {
2199 emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->int64_bld,
2200 emit_data->args[0]);
2201 }
2202
2203 static void
i64ssg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2204 i64ssg_emit_cpu(
2205 const struct lp_build_tgsi_action * action,
2206 struct lp_build_tgsi_context * bld_base,
2207 struct lp_build_emit_data * emit_data)
2208 {
2209 emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->int64_bld,
2210 emit_data->args[0]);
2211 }
2212
2213 static void
i64neg_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2214 i64neg_emit_cpu(
2215 const struct lp_build_tgsi_action * action,
2216 struct lp_build_tgsi_context * bld_base,
2217 struct lp_build_emit_data * emit_data)
2218 {
2219 emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->int64_bld,
2220 bld_base->int64_bld.zero,
2221 emit_data->args[0]);
2222 }
2223
2224 static void
u64set_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)2225 u64set_emit_cpu(
2226 const struct lp_build_tgsi_action * action,
2227 struct lp_build_tgsi_context * bld_base,
2228 struct lp_build_emit_data * emit_data,
2229 unsigned pipe_func)
2230 {
2231 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
2232 LLVMValueRef cond = lp_build_cmp(&bld_base->uint64_bld, pipe_func,
2233 emit_data->args[0], emit_data->args[1]);
2234 /* arguments were 64 bit but store as 32 bit */
2235 cond = LLVMBuildTrunc(builder, cond, bld_base->int_bld.int_vec_type, "");
2236 emit_data->output[emit_data->chan] = cond;
2237 }
2238
2239 static void
u64seq_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2240 u64seq_emit_cpu(
2241 const struct lp_build_tgsi_action * action,
2242 struct lp_build_tgsi_context * bld_base,
2243 struct lp_build_emit_data * emit_data)
2244 {
2245 u64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL);
2246 }
2247
2248 static void
u64sne_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2249 u64sne_emit_cpu(
2250 const struct lp_build_tgsi_action * action,
2251 struct lp_build_tgsi_context * bld_base,
2252 struct lp_build_emit_data * emit_data)
2253 {
2254 u64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL);
2255 }
2256
2257 static void
u64slt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2258 u64slt_emit_cpu(
2259 const struct lp_build_tgsi_action * action,
2260 struct lp_build_tgsi_context * bld_base,
2261 struct lp_build_emit_data * emit_data)
2262 {
2263 u64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
2264 }
2265
2266 static void
u64sge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2267 u64sge_emit_cpu(
2268 const struct lp_build_tgsi_action * action,
2269 struct lp_build_tgsi_context * bld_base,
2270 struct lp_build_emit_data * emit_data)
2271 {
2272 u64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
2273 }
2274
2275 static void
i64set_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data,unsigned pipe_func)2276 i64set_emit_cpu(
2277 const struct lp_build_tgsi_action * action,
2278 struct lp_build_tgsi_context * bld_base,
2279 struct lp_build_emit_data * emit_data,
2280 unsigned pipe_func)
2281 {
2282 LLVMBuilderRef builder = bld_base->base.gallivm->builder;
2283 LLVMValueRef cond = lp_build_cmp(&bld_base->int64_bld, pipe_func,
2284 emit_data->args[0], emit_data->args[1]);
2285 /* arguments were 64 bit but store as 32 bit */
2286 cond = LLVMBuildTrunc(builder, cond, bld_base->int_bld.int_vec_type, "");
2287 emit_data->output[emit_data->chan] = cond;
2288 }
2289
2290 static void
i64slt_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2291 i64slt_emit_cpu(
2292 const struct lp_build_tgsi_action * action,
2293 struct lp_build_tgsi_context * bld_base,
2294 struct lp_build_emit_data * emit_data)
2295 {
2296 i64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS);
2297 }
2298
2299 static void
i64sge_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2300 i64sge_emit_cpu(
2301 const struct lp_build_tgsi_action * action,
2302 struct lp_build_tgsi_context * bld_base,
2303 struct lp_build_emit_data * emit_data)
2304 {
2305 i64set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL);
2306 }
2307
2308 static void
u64max_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2309 u64max_emit_cpu(
2310 const struct lp_build_tgsi_action * action,
2311 struct lp_build_tgsi_context * bld_base,
2312 struct lp_build_emit_data * emit_data)
2313 {
2314 emit_data->output[emit_data->chan] = lp_build_max(&bld_base->uint64_bld,
2315 emit_data->args[0], emit_data->args[1]);
2316 }
2317
2318 static void
u64min_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2319 u64min_emit_cpu(
2320 const struct lp_build_tgsi_action * action,
2321 struct lp_build_tgsi_context * bld_base,
2322 struct lp_build_emit_data * emit_data)
2323 {
2324 emit_data->output[emit_data->chan] = lp_build_min(&bld_base->uint64_bld,
2325 emit_data->args[0], emit_data->args[1]);
2326 }
2327
2328 static void
i64max_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2329 i64max_emit_cpu(
2330 const struct lp_build_tgsi_action * action,
2331 struct lp_build_tgsi_context * bld_base,
2332 struct lp_build_emit_data * emit_data)
2333 {
2334 emit_data->output[emit_data->chan] = lp_build_max(&bld_base->int64_bld,
2335 emit_data->args[0], emit_data->args[1]);
2336 }
2337
2338 static void
i64min_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2339 i64min_emit_cpu(
2340 const struct lp_build_tgsi_action * action,
2341 struct lp_build_tgsi_context * bld_base,
2342 struct lp_build_emit_data * emit_data)
2343 {
2344 emit_data->output[emit_data->chan] = lp_build_min(&bld_base->int64_bld,
2345 emit_data->args[0], emit_data->args[1]);
2346 }
2347
2348 static void
u64add_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2349 u64add_emit_cpu(
2350 const struct lp_build_tgsi_action * action,
2351 struct lp_build_tgsi_context * bld_base,
2352 struct lp_build_emit_data * emit_data)
2353 {
2354 emit_data->output[emit_data->chan] = lp_build_add(&bld_base->uint64_bld,
2355 emit_data->args[0], emit_data->args[1]);
2356 }
2357
2358 static void
u64shl_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2359 u64shl_emit_cpu(
2360 const struct lp_build_tgsi_action * action,
2361 struct lp_build_tgsi_context * bld_base,
2362 struct lp_build_emit_data * emit_data)
2363 {
2364 struct lp_build_context *uint_bld = &bld_base->uint64_bld;
2365 LLVMValueRef mask = lp_build_const_vec(uint_bld->gallivm, uint_bld->type,
2366 uint_bld->type.width - 1);
2367 LLVMValueRef masked_count = lp_build_and(uint_bld, emit_data->args[1], mask);
2368 emit_data->output[emit_data->chan] = lp_build_shl(uint_bld, emit_data->args[0],
2369 masked_count);
2370 }
2371
2372 static void
i64shr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2373 i64shr_emit_cpu(
2374 const struct lp_build_tgsi_action * action,
2375 struct lp_build_tgsi_context * bld_base,
2376 struct lp_build_emit_data * emit_data)
2377 {
2378 struct lp_build_context *int_bld = &bld_base->int64_bld;
2379 LLVMValueRef mask = lp_build_const_vec(int_bld->gallivm, int_bld->type,
2380 int_bld->type.width - 1);
2381 LLVMValueRef masked_count = lp_build_and(int_bld, emit_data->args[1], mask);
2382 emit_data->output[emit_data->chan] = lp_build_shr(int_bld, emit_data->args[0],
2383 masked_count);
2384 }
2385
2386 static void
u64shr_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2387 u64shr_emit_cpu(
2388 const struct lp_build_tgsi_action * action,
2389 struct lp_build_tgsi_context * bld_base,
2390 struct lp_build_emit_data * emit_data)
2391 {
2392 struct lp_build_context *uint_bld = &bld_base->uint64_bld;
2393 LLVMValueRef mask = lp_build_const_vec(uint_bld->gallivm, uint_bld->type,
2394 uint_bld->type.width - 1);
2395 LLVMValueRef masked_count = lp_build_and(uint_bld, emit_data->args[1], mask);
2396 emit_data->output[emit_data->chan] = lp_build_shr(uint_bld, emit_data->args[0],
2397 masked_count);
2398 }
bfi_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2399 static void bfi_emit_cpu(const struct lp_build_tgsi_action *action,
2400 struct lp_build_tgsi_context *bld_base,
2401 struct lp_build_emit_data *emit_data) {
2402 /*
2403 * def bfi(base, insert, offset, bits):
2404 * if offset < 0 or bits < 0 or offset + bits > 32:
2405 * return undefined
2406 * # << defined such that mask == ~0 when bits == 32, offset == 0
2407 * mask = ((1 << bits) - 1) << offset
2408 * return ((insert << offset) & mask) | (base & ~mask)
2409 */
2410 struct lp_build_context *uint_bld = &bld_base->uint_bld;
2411 LLVMValueRef one_shl_bits_dec_one = lp_build_sub(
2412 uint_bld, lp_build_shl(uint_bld, uint_bld->one, emit_data->args[3]),
2413 uint_bld->one);
2414 LLVMValueRef mask =
2415 lp_build_shl(uint_bld, one_shl_bits_dec_one, emit_data->args[2]);
2416 LLVMValueRef insert_shl_offset =
2417 lp_build_shl(uint_bld, emit_data->args[1], emit_data->args[2]);
2418 LLVMValueRef insert_shl_offset_and_mask =
2419 lp_build_and(uint_bld, insert_shl_offset, mask);
2420 LLVMValueRef base_and_not_mask =
2421 lp_build_and(uint_bld, emit_data->args[0], lp_build_not(uint_bld, mask));
2422
2423 emit_data->output[emit_data->chan] =
2424 lp_build_or(uint_bld, insert_shl_offset_and_mask, base_and_not_mask);
2425 }
2426
lsb_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2427 static void lsb_emit_cpu(const struct lp_build_tgsi_action *action,
2428 struct lp_build_tgsi_context *bld_base,
2429 struct lp_build_emit_data *emit_data) {
2430 struct lp_build_context *uint_bld = &bld_base->int_bld;
2431
2432 LLVMValueRef result = lp_build_cttz(uint_bld, emit_data->args[0]);
2433 LLVMValueRef cond =
2434 lp_build_cmp(uint_bld, PIPE_FUNC_LESS, result,
2435 lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 32));
2436 emit_data->output[emit_data->chan] = lp_build_select(
2437 uint_bld, cond, result,
2438 lp_build_const_vec(uint_bld->gallivm, uint_bld->type, -1));
2439 }
2440
umsb_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2441 static void umsb_emit_cpu(const struct lp_build_tgsi_action *action,
2442 struct lp_build_tgsi_context *bld_base,
2443 struct lp_build_emit_data *emit_data) {
2444 struct lp_build_context *uint_bld = &bld_base->int_bld;
2445 emit_data->output[emit_data->chan] = lp_build_sub(
2446 uint_bld, lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 31),
2447 lp_build_ctlz(uint_bld, emit_data->args[0]));
2448 }
2449
imsb_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2450 static void imsb_emit_cpu(const struct lp_build_tgsi_action *action,
2451 struct lp_build_tgsi_context *bld_base,
2452 struct lp_build_emit_data *emit_data) {
2453 struct lp_build_context *uint_bld = &bld_base->int_bld;
2454
2455 LLVMValueRef cond =
2456 lp_build_cmp(uint_bld, PIPE_FUNC_LESS, emit_data->args[0],
2457 lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 0));
2458 emit_data->args[0] = lp_build_select(
2459 uint_bld, cond, lp_build_not(uint_bld, emit_data->args[0]),
2460 emit_data->args[0]);
2461 umsb_emit_cpu(action, bld_base, emit_data);
2462 }
2463
popc_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2464 static void popc_emit_cpu(const struct lp_build_tgsi_action *action,
2465 struct lp_build_tgsi_context *bld_base,
2466 struct lp_build_emit_data *emit_data) {
2467 struct lp_build_context *uint_bld = &bld_base->int_bld;
2468 emit_data->output[emit_data->chan] =
2469 lp_build_popcount(uint_bld, emit_data->args[0]);
2470 }
2471
ibfe_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2472 static void ibfe_emit_cpu(const struct lp_build_tgsi_action *action,
2473 struct lp_build_tgsi_context *bld_base,
2474 struct lp_build_emit_data *emit_data) {
2475 /* def ibfe(value, offset, bits):
2476 * if offset < 0 or bits < 0 or offset + bits > 32:
2477 * return undefined
2478 * if bits == 0: return 0
2479 * # Note: >> sign-extends
2480 * return (value << (32 - offset - bits)) >> (32 - bits)
2481 */
2482 struct lp_build_context *uint_bld = &bld_base->int_bld;
2483
2484 LLVMValueRef r_32_sub_bits = lp_build_sub(
2485 uint_bld, lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 32),
2486 emit_data->args[2]);
2487 LLVMValueRef temp1 =
2488 lp_build_sub(uint_bld, r_32_sub_bits, emit_data->args[1]);
2489 LLVMValueRef temp2 = lp_build_shl(uint_bld, emit_data->args[0], temp1);
2490 LLVMValueRef cond =
2491 lp_build_cmp(uint_bld, PIPE_FUNC_EQUAL, emit_data->args[2],
2492 lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 0));
2493 emit_data->output[emit_data->chan] = lp_build_select(
2494 uint_bld, cond, lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 0),
2495 lp_build_shr(uint_bld, temp2, r_32_sub_bits));
2496 }
2497
ubfe_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2498 static void ubfe_emit_cpu(const struct lp_build_tgsi_action *action,
2499 struct lp_build_tgsi_context *bld_base,
2500 struct lp_build_emit_data *emit_data) {
2501 /* def ubfe(value, offset, bits):
2502 * if offset < 0 or bits < 0 or offset + bits > 32:
2503 * return undefined
2504 * if bits == 0: return 0
2505 * # Note: >> does not sign-extend
2506 * return (value << (32 - offset - bits)) >> (32 - bits)
2507 */
2508 struct lp_build_context *uint_bld = &bld_base->uint_bld;
2509
2510 LLVMValueRef r_32_sub_bits = lp_build_sub(
2511 uint_bld, lp_build_const_vec(uint_bld->gallivm, uint_bld->type, 32),
2512 emit_data->args[2]);
2513 LLVMValueRef temp1 =
2514 lp_build_sub(uint_bld, r_32_sub_bits, emit_data->args[1]);
2515 LLVMValueRef temp2 = lp_build_shl(uint_bld, emit_data->args[0], temp1);
2516 emit_data->output[emit_data->chan] =
2517 lp_build_shr(uint_bld, temp2, r_32_sub_bits);
2518 }
2519
brev_emit_cpu(const struct lp_build_tgsi_action * action,struct lp_build_tgsi_context * bld_base,struct lp_build_emit_data * emit_data)2520 static void brev_emit_cpu(const struct lp_build_tgsi_action *action,
2521 struct lp_build_tgsi_context *bld_base,
2522 struct lp_build_emit_data *emit_data) {
2523 struct lp_build_context *uint_bld = &bld_base->uint_bld;
2524 emit_data->output[emit_data->chan] =
2525 lp_build_bitfield_reverse(uint_bld, emit_data->args[0]);
2526 }
2527
2528 void
lp_set_default_actions_cpu(struct lp_build_tgsi_context * bld_base)2529 lp_set_default_actions_cpu(
2530 struct lp_build_tgsi_context * bld_base)
2531 {
2532 lp_set_default_actions(bld_base);
2533 bld_base->op_actions[TGSI_OPCODE_ADD].emit = add_emit_cpu;
2534 bld_base->op_actions[TGSI_OPCODE_AND].emit = and_emit_cpu;
2535 bld_base->op_actions[TGSI_OPCODE_ARL].emit = arl_emit_cpu;
2536 bld_base->op_actions[TGSI_OPCODE_ARR].emit = arr_emit_cpu;
2537 bld_base->op_actions[TGSI_OPCODE_CEIL].emit = ceil_emit_cpu;
2538 bld_base->op_actions[TGSI_OPCODE_COS].emit = cos_emit_cpu;
2539 bld_base->op_actions[TGSI_OPCODE_CMP].emit = cmp_emit_cpu;
2540 bld_base->op_actions[TGSI_OPCODE_DIV].emit = div_emit_cpu;
2541 bld_base->op_actions[TGSI_OPCODE_EX2].emit = ex2_emit_cpu;
2542 bld_base->op_actions[TGSI_OPCODE_F2I].emit = f2i_emit_cpu;
2543 bld_base->op_actions[TGSI_OPCODE_FLR].emit = flr_emit_cpu;
2544 bld_base->op_actions[TGSI_OPCODE_FSEQ].emit = fseq_emit_cpu;
2545 bld_base->op_actions[TGSI_OPCODE_FSGE].emit = fsge_emit_cpu;
2546 bld_base->op_actions[TGSI_OPCODE_FSLT].emit = fslt_emit_cpu;
2547 bld_base->op_actions[TGSI_OPCODE_FSNE].emit = fsne_emit_cpu;
2548
2549 bld_base->op_actions[TGSI_OPCODE_I2F].emit = i2f_emit_cpu;
2550 bld_base->op_actions[TGSI_OPCODE_IABS].emit = iabs_emit_cpu;
2551 bld_base->op_actions[TGSI_OPCODE_IDIV].emit = idiv_emit_cpu;
2552 bld_base->op_actions[TGSI_OPCODE_INEG].emit = ineg_emit_cpu;
2553 bld_base->op_actions[TGSI_OPCODE_IMAX].emit = imax_emit_cpu;
2554 bld_base->op_actions[TGSI_OPCODE_IMIN].emit = imin_emit_cpu;
2555 bld_base->op_actions[TGSI_OPCODE_ISGE].emit = isge_emit_cpu;
2556 bld_base->op_actions[TGSI_OPCODE_ISHR].emit = ishr_emit_cpu;
2557 bld_base->op_actions[TGSI_OPCODE_ISLT].emit = islt_emit_cpu;
2558 bld_base->op_actions[TGSI_OPCODE_ISSG].emit = issg_emit_cpu;
2559 bld_base->op_actions[TGSI_OPCODE_IMUL_HI].emit = imul_hi_emit_cpu;
2560 bld_base->op_actions[TGSI_OPCODE_UMUL_HI].emit = umul_hi_emit_cpu;
2561
2562 bld_base->op_actions[TGSI_OPCODE_LG2].emit = lg2_emit_cpu;
2563 bld_base->op_actions[TGSI_OPCODE_LOG].emit = log_emit_cpu;
2564 bld_base->op_actions[TGSI_OPCODE_MAD].emit = mad_emit_cpu;
2565 bld_base->op_actions[TGSI_OPCODE_MAX].emit = max_emit_cpu;
2566 bld_base->op_actions[TGSI_OPCODE_MIN].emit = min_emit_cpu;
2567 bld_base->op_actions[TGSI_OPCODE_MOD].emit = mod_emit_cpu;
2568 bld_base->op_actions[TGSI_OPCODE_NOT].emit = not_emit_cpu;
2569 bld_base->op_actions[TGSI_OPCODE_OR].emit = or_emit_cpu;
2570 bld_base->op_actions[TGSI_OPCODE_POW].emit = pow_emit_cpu;
2571 bld_base->op_actions[TGSI_OPCODE_RCP].emit = rcp_emit_cpu;
2572 bld_base->op_actions[TGSI_OPCODE_ROUND].emit = round_emit_cpu;
2573 bld_base->op_actions[TGSI_OPCODE_SEQ].emit = seq_emit_cpu;
2574 bld_base->op_actions[TGSI_OPCODE_SGE].emit = sge_emit_cpu;
2575 bld_base->op_actions[TGSI_OPCODE_SGT].emit = sgt_emit_cpu;
2576 bld_base->op_actions[TGSI_OPCODE_SIN].emit = sin_emit_cpu;
2577 bld_base->op_actions[TGSI_OPCODE_SHL].emit = shl_emit_cpu;
2578 bld_base->op_actions[TGSI_OPCODE_SLE].emit = sle_emit_cpu;
2579 bld_base->op_actions[TGSI_OPCODE_SLT].emit = slt_emit_cpu;
2580 bld_base->op_actions[TGSI_OPCODE_SNE].emit = sne_emit_cpu;
2581 bld_base->op_actions[TGSI_OPCODE_SSG].emit = ssg_emit_cpu;
2582 bld_base->op_actions[TGSI_OPCODE_TRUNC].emit = trunc_emit_cpu;
2583
2584 bld_base->rsq_action.emit = recip_sqrt_emit_cpu;
2585 bld_base->sqrt_action.emit = sqrt_emit_cpu;
2586
2587 bld_base->op_actions[TGSI_OPCODE_UADD].emit = uadd_emit_cpu;
2588 bld_base->op_actions[TGSI_OPCODE_UCMP].emit = ucmp_emit_cpu;
2589 bld_base->op_actions[TGSI_OPCODE_UDIV].emit = udiv_emit_cpu;
2590 bld_base->op_actions[TGSI_OPCODE_UMAX].emit = umax_emit_cpu;
2591 bld_base->op_actions[TGSI_OPCODE_UMIN].emit = umin_emit_cpu;
2592 bld_base->op_actions[TGSI_OPCODE_UMOD].emit = umod_emit_cpu;
2593 bld_base->op_actions[TGSI_OPCODE_USEQ].emit = useq_emit_cpu;
2594 bld_base->op_actions[TGSI_OPCODE_USGE].emit = usge_emit_cpu;
2595 bld_base->op_actions[TGSI_OPCODE_USHR].emit = ushr_emit_cpu;
2596 bld_base->op_actions[TGSI_OPCODE_USLT].emit = uslt_emit_cpu;
2597 bld_base->op_actions[TGSI_OPCODE_USNE].emit = usne_emit_cpu;
2598
2599 bld_base->op_actions[TGSI_OPCODE_XOR].emit = xor_emit_cpu;
2600
2601 bld_base->op_actions[TGSI_OPCODE_DABS].emit = dabs_emit_cpu;
2602 bld_base->op_actions[TGSI_OPCODE_DNEG].emit = dneg_emit_cpu;
2603 bld_base->op_actions[TGSI_OPCODE_DSEQ].emit = dseq_emit_cpu;
2604 bld_base->op_actions[TGSI_OPCODE_DSGE].emit = dsge_emit_cpu;
2605 bld_base->op_actions[TGSI_OPCODE_DSLT].emit = dslt_emit_cpu;
2606 bld_base->op_actions[TGSI_OPCODE_DSNE].emit = dsne_emit_cpu;
2607
2608 bld_base->op_actions[TGSI_OPCODE_DRSQ].emit = drecip_sqrt_emit_cpu;
2609 bld_base->op_actions[TGSI_OPCODE_DSQRT].emit = dsqrt_emit_cpu;
2610
2611 bld_base->op_actions[TGSI_OPCODE_I64ABS].emit = i64abs_emit_cpu;
2612 bld_base->op_actions[TGSI_OPCODE_I64SSG].emit = i64ssg_emit_cpu;
2613 bld_base->op_actions[TGSI_OPCODE_I64NEG].emit = i64neg_emit_cpu;
2614
2615 bld_base->op_actions[TGSI_OPCODE_U64SEQ].emit = u64seq_emit_cpu;
2616 bld_base->op_actions[TGSI_OPCODE_U64SNE].emit = u64sne_emit_cpu;
2617 bld_base->op_actions[TGSI_OPCODE_U64SLT].emit = u64slt_emit_cpu;
2618 bld_base->op_actions[TGSI_OPCODE_U64SGE].emit = u64sge_emit_cpu;
2619 bld_base->op_actions[TGSI_OPCODE_I64SLT].emit = i64slt_emit_cpu;
2620 bld_base->op_actions[TGSI_OPCODE_I64SGE].emit = i64sge_emit_cpu;
2621
2622 bld_base->op_actions[TGSI_OPCODE_U64MIN].emit = u64min_emit_cpu;
2623 bld_base->op_actions[TGSI_OPCODE_U64MAX].emit = u64max_emit_cpu;
2624 bld_base->op_actions[TGSI_OPCODE_I64MIN].emit = i64min_emit_cpu;
2625 bld_base->op_actions[TGSI_OPCODE_I64MAX].emit = i64max_emit_cpu;
2626
2627 bld_base->op_actions[TGSI_OPCODE_U64ADD].emit = u64add_emit_cpu;
2628 bld_base->op_actions[TGSI_OPCODE_U64MOD].emit = u64mod_emit_cpu;
2629 bld_base->op_actions[TGSI_OPCODE_I64MOD].emit = i64mod_emit_cpu;
2630 bld_base->op_actions[TGSI_OPCODE_U64DIV].emit = u64div_emit_cpu;
2631 bld_base->op_actions[TGSI_OPCODE_I64DIV].emit = i64div_emit_cpu;
2632
2633 bld_base->op_actions[TGSI_OPCODE_U64SHL].emit = u64shl_emit_cpu;
2634 bld_base->op_actions[TGSI_OPCODE_I64SHR].emit = i64shr_emit_cpu;
2635 bld_base->op_actions[TGSI_OPCODE_U64SHR].emit = u64shr_emit_cpu;
2636
2637 bld_base->op_actions[TGSI_OPCODE_BFI].emit = bfi_emit_cpu;
2638 bld_base->op_actions[TGSI_OPCODE_POPC].emit = popc_emit_cpu;
2639 bld_base->op_actions[TGSI_OPCODE_LSB].emit = lsb_emit_cpu;
2640 bld_base->op_actions[TGSI_OPCODE_IMSB].emit = imsb_emit_cpu;
2641 bld_base->op_actions[TGSI_OPCODE_UMSB].emit = umsb_emit_cpu;
2642 bld_base->op_actions[TGSI_OPCODE_IBFE].emit = ibfe_emit_cpu;
2643 bld_base->op_actions[TGSI_OPCODE_UBFE].emit = ubfe_emit_cpu;
2644 bld_base->op_actions[TGSI_OPCODE_BREV].emit = brev_emit_cpu;
2645
2646 }
2647