1/************************************************************************** 2 * 3 * Copyright 2011-2012 Advanced Micro Devices, Inc. 4 * Copyright 2009 VMware, Inc. 5 * Copyright 2007-2008 Tungsten Graphics, Inc., Cedar Park, Texas. 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 TUNGSTEN GRAPHICS 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 <jfonseca@vmware.com> 35 * @author Tom Stellard <thomas.stellard@amd.com> 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_gather.h" 49#include "lp_bld_logic.h" 50 51#include "tgsi/tgsi_exec.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 63static 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 73static 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 */ 88static void 89add_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 */ 100static void 101arr_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/* TGSI_OPCODE_CLAMP */ 112static void 113clamp_emit( 114 const struct lp_build_tgsi_action * action, 115 struct lp_build_tgsi_context * bld_base, 116 struct lp_build_emit_data * emit_data) 117{ 118 LLVMValueRef tmp; 119 tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MAX, 120 emit_data->args[0], 121 emit_data->args[1]); 122 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 123 TGSI_OPCODE_MIN, tmp, emit_data->args[2]); 124} 125 126/* DP* Helper */ 127 128static void 129dp_fetch_args( 130 struct lp_build_tgsi_context * bld_base, 131 struct lp_build_emit_data * emit_data, 132 unsigned dp_components) 133{ 134 unsigned chan, src; 135 for (src = 0; src < 2; src++) { 136 for (chan = 0; chan < dp_components; chan++) { 137 emit_data->args[(src * dp_components) + chan] = 138 lp_build_emit_fetch(bld_base, emit_data->inst, src, chan); 139 } 140 } 141 emit_data->dst_type = bld_base->base.elem_type; 142} 143 144/* TGSI_OPCODE_DP2 */ 145static void 146dp2_fetch_args( 147 struct lp_build_tgsi_context * bld_base, 148 struct lp_build_emit_data * emit_data) 149{ 150 dp_fetch_args(bld_base, emit_data, 2); 151} 152 153static void 154dp2_emit( 155 const struct lp_build_tgsi_action * action, 156 struct lp_build_tgsi_context * bld_base, 157 struct lp_build_emit_data * emit_data) 158{ 159 LLVMValueRef tmp0, tmp1; 160 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 161 emit_data->args[0] /* src0.x */, 162 emit_data->args[2] /* src1.x */); 163 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 164 emit_data->args[1] /* src0.y */, 165 emit_data->args[3] /* src1.y */); 166 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 167 TGSI_OPCODE_ADD, tmp0, tmp1); 168} 169 170static struct lp_build_tgsi_action dp2_action = { 171 dp2_fetch_args, /* fetch_args */ 172 dp2_emit /* emit */ 173}; 174 175/* TGSI_OPCODE_DP2A */ 176static void 177dp2a_fetch_args( 178 struct lp_build_tgsi_context * bld_base, 179 struct lp_build_emit_data * emit_data) 180{ 181 dp_fetch_args(bld_base, emit_data, 2); 182 emit_data->args[5] = lp_build_emit_fetch(bld_base, emit_data->inst, 183 2, TGSI_CHAN_X); 184} 185 186static void 187dp2a_emit( 188 const struct lp_build_tgsi_action * action, 189 struct lp_build_tgsi_context * bld_base, 190 struct lp_build_emit_data * emit_data) 191{ 192 LLVMValueRef tmp; 193 tmp = lp_build_emit_llvm(bld_base, TGSI_OPCODE_DP2, emit_data); 194 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, 195 emit_data->args[5], tmp); 196} 197 198static struct lp_build_tgsi_action dp2a_action = { 199 dp2a_fetch_args, /* fetch_args */ 200 dp2a_emit /* emit */ 201}; 202 203/* TGSI_OPCODE_DP3 */ 204static void 205dp3_fetch_args( 206 struct lp_build_tgsi_context * bld_base, 207 struct lp_build_emit_data * emit_data) 208{ 209 dp_fetch_args(bld_base, emit_data, 3); 210} 211 212static void 213dp3_emit( 214 const struct lp_build_tgsi_action * action, 215 struct lp_build_tgsi_context * bld_base, 216 struct lp_build_emit_data * emit_data) 217{ 218 LLVMValueRef tmp0, tmp1; 219 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 220 emit_data->args[0] /* src0.x */, 221 emit_data->args[3] /* src1.x */); 222 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 223 emit_data->args[1] /* src0.y */, 224 emit_data->args[4] /* src1.y */); 225 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp1, tmp0); 226 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 227 emit_data->args[2] /* src0.z */, 228 emit_data->args[5] /* src1.z */); 229 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 230 TGSI_OPCODE_ADD, tmp0, tmp1); 231} 232 233static struct lp_build_tgsi_action dp3_action = { 234 dp3_fetch_args, /* fetch_args */ 235 dp3_emit /* emit */ 236}; 237 238/* TGSI_OPCODDE_DP4 */ 239 240static void 241dp4_fetch_args( 242 struct lp_build_tgsi_context * bld_base, 243 struct lp_build_emit_data * emit_data) 244{ 245 dp_fetch_args(bld_base, emit_data, 4); 246} 247 248static void 249dp4_emit( 250 const struct lp_build_tgsi_action * action, 251 struct lp_build_tgsi_context * bld_base, 252 struct lp_build_emit_data * emit_data) 253{ 254 LLVMValueRef tmp0, tmp1; 255 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 256 emit_data->args[0] /* src0.x */, 257 emit_data->args[4] /* src1.x */); 258 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 259 emit_data->args[1] /* src0.y */, 260 emit_data->args[5] /* src1.y */); 261 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp0, tmp1); 262 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 263 emit_data->args[2] /* src0.z */, 264 emit_data->args[6] /* src1.z */); 265 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_ADD, tmp0, tmp1); 266 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 267 emit_data->args[3] /* src0.w */, 268 emit_data->args[7] /* src1.w */); 269 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 270 TGSI_OPCODE_ADD, tmp0, tmp1); 271} 272 273static struct lp_build_tgsi_action dp4_action = { 274 dp4_fetch_args, /* fetch_args */ 275 dp4_emit /* emit */ 276}; 277 278/* TGSI_OPCODE_DPH */ 279static void 280dph_fetch_args( 281 struct lp_build_tgsi_context * bld_base, 282 struct lp_build_emit_data * emit_data) 283{ 284 dp_fetch_args(bld_base, emit_data, 4); 285 /* src0.w */ 286 emit_data->args[3] = bld_base->base.one; 287} 288 289const struct lp_build_tgsi_action dph_action = { 290 dph_fetch_args, /* fetch_args */ 291 dp4_emit /* emit */ 292}; 293 294/* TGSI_OPCODE_DST */ 295static void 296dst_fetch_args( 297 struct lp_build_tgsi_context * bld_base, 298 struct lp_build_emit_data * emit_data) 299{ 300 /* src0.y */ 301 emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 302 0, TGSI_CHAN_Y); 303 /* src0.z */ 304 emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 305 0, TGSI_CHAN_Z); 306 /* src1.y */ 307 emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 308 1, TGSI_CHAN_Y); 309 /* src1.w */ 310 emit_data->args[3] = lp_build_emit_fetch(bld_base, emit_data->inst, 311 1, TGSI_CHAN_W); 312} 313 314static void 315dst_emit( 316 const struct lp_build_tgsi_action * action, 317 struct lp_build_tgsi_context * bld_base, 318 struct lp_build_emit_data * emit_data) 319{ 320 /* dst.x */ 321 emit_data->output[TGSI_CHAN_X] = bld_base->base.one; 322 323 /* dst.y */ 324 emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 325 TGSI_OPCODE_MUL, 326 emit_data->args[0] /* src0.y */, 327 emit_data->args[2] /* src1.y */); 328 /* dst.z */ 329 emit_data->output[TGSI_CHAN_Z] = emit_data->args[1]; /* src0.z */ 330 331 /* dst.w */ 332 emit_data->output[TGSI_CHAN_W] = emit_data->args[3]; /* src1.w */ 333} 334 335static struct lp_build_tgsi_action dst_action = { 336 dst_fetch_args, /* fetch_args */ 337 dst_emit /* emit */ 338}; 339 340/* TGSI_OPCODE_END */ 341static void 342end_emit( 343 const struct lp_build_tgsi_action * action, 344 struct lp_build_tgsi_context * bld_base, 345 struct lp_build_emit_data * emit_data) 346{ 347 bld_base->pc = -1; 348} 349 350/* TGSI_OPCODE_EXP */ 351 352static void 353exp_emit( 354 const struct lp_build_tgsi_action * action, 355 struct lp_build_tgsi_context * bld_base, 356 struct lp_build_emit_data * emit_data) 357{ 358 LLVMValueRef floor_x; 359 360 /* floor( src0.x ) */ 361 floor_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR, 362 emit_data->args[0]); 363 364 /* 2 ^ floor( src0.x ) */ 365 emit_data->output[TGSI_CHAN_X] = lp_build_emit_llvm_unary(bld_base, 366 TGSI_OPCODE_EX2, floor_x); 367 368 /* src0.x - floor( src0.x ) */ 369 emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 370 TGSI_OPCODE_SUB, emit_data->args[0] /* src0.x */, floor_x); 371 372 /* 2 ^ src0.x */ 373 emit_data->output[TGSI_CHAN_Z] = lp_build_emit_llvm_unary(bld_base, 374 TGSI_OPCODE_EX2, emit_data->args[0] /* src0.x */); 375 376 emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 377} 378 379const struct lp_build_tgsi_action exp_action = { 380 scalar_unary_fetch_args, /* fetch_args */ 381 exp_emit /* emit */ 382}; 383 384/* TGSI_OPCODE_FRC */ 385 386static void 387frc_emit( 388 const struct lp_build_tgsi_action * action, 389 struct lp_build_tgsi_context * bld_base, 390 struct lp_build_emit_data * emit_data) 391{ 392 LLVMValueRef tmp; 393 tmp = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR, 394 emit_data->args[0]); 395 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 396 TGSI_OPCODE_SUB, emit_data->args[0], tmp); 397} 398 399/* TGSI_OPCODE_KIL */ 400 401static void 402kil_fetch_args( 403 struct lp_build_tgsi_context * bld_base, 404 struct lp_build_emit_data * emit_data) 405{ 406 /* src0.x */ 407 emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 408 0, TGSI_CHAN_X); 409 /* src0.y */ 410 emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 411 0, TGSI_CHAN_Y); 412 /* src0.z */ 413 emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 414 0, TGSI_CHAN_Z); 415 /* src0.w */ 416 emit_data->args[3] = lp_build_emit_fetch(bld_base, emit_data->inst, 417 0, TGSI_CHAN_W); 418 emit_data->arg_count = 4; 419 emit_data->dst_type = LLVMVoidTypeInContext(bld_base->base.gallivm->context); 420} 421 422/* TGSI_OPCODE_KILP */ 423 424static void 425kilp_fetch_args( 426 struct lp_build_tgsi_context * bld_base, 427 struct lp_build_emit_data * emit_data) 428{ 429 emit_data->dst_type = LLVMVoidTypeInContext(bld_base->base.gallivm->context); 430} 431 432/* TGSI_OPCODE_LIT */ 433 434static void 435lit_fetch_args( 436 struct lp_build_tgsi_context * bld_base, 437 struct lp_build_emit_data * emit_data) 438{ 439 /* src0.x */ 440 emit_data->args[0] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_X); 441 /* src0.y */ 442 emit_data->args[1] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_Y); 443 /* src0.w */ 444 emit_data->args[2] = lp_build_emit_fetch(bld_base, emit_data->inst, 0, TGSI_CHAN_W); 445 emit_data->arg_count = 3; 446} 447 448static void 449lit_emit( 450 const struct lp_build_tgsi_action * action, 451 struct lp_build_tgsi_context * bld_base, 452 struct lp_build_emit_data * emit_data) 453{ 454 LLVMValueRef tmp0, tmp1, tmp2; 455 456 /* dst.x */ 457 emit_data->output[TGSI_CHAN_X] = bld_base->base.one; 458 459 /* dst. y */ 460 emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 461 TGSI_OPCODE_MAX, 462 emit_data->args[0] /* src0.x */, 463 bld_base->base.zero); 464 465 /* dst.z */ 466 /* XMM[1] = SrcReg[0].yyyy */ 467 tmp1 = emit_data->args[1]; 468 /* XMM[1] = max(XMM[1], 0) */ 469 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MAX, 470 tmp1, bld_base->base.zero); 471 /* XMM[2] = SrcReg[0].wwww */ 472 tmp2 = emit_data->args[2]; 473 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_POW, 474 tmp1, tmp2); 475 tmp0 = emit_data->args[0]; 476 emit_data->output[TGSI_CHAN_Z] = lp_build_emit_llvm_ternary(bld_base, 477 TGSI_OPCODE_CMP, 478 tmp0, bld_base->base.zero, tmp1); 479 /* dst.w */ 480 emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 481} 482 483static struct lp_build_tgsi_action lit_action = { 484 lit_fetch_args, /* fetch_args */ 485 lit_emit /* emit */ 486}; 487 488/* TGSI_OPCODE_LOG */ 489 490static void 491log_emit( 492 const struct lp_build_tgsi_action * action, 493 struct lp_build_tgsi_context * bld_base, 494 struct lp_build_emit_data * emit_data) 495{ 496 497 LLVMValueRef abs_x, log_abs_x, flr_log_abs_x, ex2_flr_log_abs_x; 498 499 /* abs( src0.x) */ 500 abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS, 501 emit_data->args[0] /* src0.x */); 502 503 /* log( abs( src0.x ) ) */ 504 log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_LG2, 505 abs_x); 506 507 /* floor( log( abs( src0.x ) ) ) */ 508 flr_log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_FLR, 509 log_abs_x); 510 /* dst.x */ 511 emit_data->output[TGSI_CHAN_X] = flr_log_abs_x; 512 513 /* dst.y */ 514 ex2_flr_log_abs_x = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_EX2, 515 flr_log_abs_x); 516 517 /* abs( src0.x ) / 2^( floor( lg2( abs( src0.x ) ) ) ) */ 518 emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 519 TGSI_OPCODE_DIV, abs_x, ex2_flr_log_abs_x); 520 521 /* dst.x */ 522 emit_data->output[TGSI_CHAN_Z] = log_abs_x; 523 524 /* dst.w */ 525 emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 526} 527 528static struct lp_build_tgsi_action log_action = { 529 scalar_unary_fetch_args, /* fetch_args */ 530 log_emit /* emit */ 531}; 532 533/* TGSI_OPCODE_LRP */ 534 535static void 536lrp_emit( 537 const struct lp_build_tgsi_action * action, 538 struct lp_build_tgsi_context * bld_base, 539 struct lp_build_emit_data * emit_data) 540{ 541 LLVMValueRef tmp; 542 tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_SUB, 543 emit_data->args[1], 544 emit_data->args[2]); 545 emit_data->output[emit_data->chan] = lp_build_emit_llvm_ternary(bld_base, 546 TGSI_OPCODE_MAD, emit_data->args[0], tmp, emit_data->args[2]); 547} 548 549/* TGSI_OPCODE_MAD */ 550 551static void 552mad_emit( 553 const struct lp_build_tgsi_action * action, 554 struct lp_build_tgsi_context * bld_base, 555 struct lp_build_emit_data * emit_data) 556{ 557 LLVMValueRef tmp; 558 tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, 559 emit_data->args[0], 560 emit_data->args[1]); 561 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 562 TGSI_OPCODE_ADD, tmp, emit_data->args[2]); 563} 564 565/* TGSI_OPCODE_MOV */ 566 567static void 568mov_emit( 569 const struct lp_build_tgsi_action * action, 570 struct lp_build_tgsi_context * bld_base, 571 struct lp_build_emit_data * emit_data) 572{ 573 emit_data->output[emit_data->chan] = emit_data->args[0]; 574} 575 576/* TGSI_OPCODE_MUL */ 577static void 578mul_emit( 579 const struct lp_build_tgsi_action * action, 580 struct lp_build_tgsi_context * bld_base, 581 struct lp_build_emit_data * emit_data) 582{ 583 emit_data->output[emit_data->chan] = lp_build_mul(&bld_base->base, 584 emit_data->args[0], emit_data->args[1]); 585} 586 587/* TGSI_OPCODE_POW */ 588 589static void 590pow_emit( 591 const struct lp_build_tgsi_action * action, 592 struct lp_build_tgsi_context * bld_base, 593 struct lp_build_emit_data * emit_data) 594{ 595 emit_data->output[emit_data->chan] = lp_build_pow(&bld_base->base, 596 emit_data->args[0], emit_data->args[1]); 597} 598 599static struct lp_build_tgsi_action pow_action = { 600 scalar_binary_fetch_args, /* fetch_args */ 601 pow_emit /* emit */ 602}; 603 604/* TGSI_OPCODE_RSQ */ 605 606static void 607rsq_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->args[0] = lp_build_emit_llvm_unary(bld_base, TGSI_OPCODE_ABS, 613 emit_data->args[0]); 614 if (bld_base->rsq_action.emit) { 615 bld_base->rsq_action.emit(&bld_base->rsq_action, bld_base, emit_data); 616 } else { 617 emit_data->output[emit_data->chan] = bld_base->base.undef; 618 } 619} 620 621const struct lp_build_tgsi_action rsq_action = { 622 scalar_unary_fetch_args, /* fetch_args */ 623 rsq_emit /* emit */ 624 625}; 626 627/* TGSI_OPCODE_SCS */ 628static void 629scs_emit( 630 const struct lp_build_tgsi_action * action, 631 struct lp_build_tgsi_context * bld_base, 632 struct lp_build_emit_data * emit_data) 633{ 634 /* dst.x */ 635 emit_data->output[TGSI_CHAN_X] = lp_build_emit_llvm_unary(bld_base, 636 TGSI_OPCODE_COS, emit_data->args[0]); 637 /* dst.y */ 638 emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_unary(bld_base, 639 TGSI_OPCODE_SIN, emit_data->args[0]); 640 /* dst.z */ 641 emit_data->output[TGSI_CHAN_Z] = bld_base->base.zero; 642 643 /* dst.w */ 644 emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 645} 646 647const struct lp_build_tgsi_action scs_action = { 648 scalar_unary_fetch_args, /* fetch_args */ 649 scs_emit /* emit */ 650}; 651 652/* TGSI_OPCODE_SFL */ 653 654static void 655sfl_emit( 656 const struct lp_build_tgsi_action * action, 657 struct lp_build_tgsi_context * bld_base, 658 struct lp_build_emit_data * emit_data) 659{ 660 emit_data->output[emit_data->chan] = bld_base->base.zero; 661} 662 663/* TGSI_OPCODE_STR */ 664 665static void 666str_emit( 667 const struct lp_build_tgsi_action * action, 668 struct lp_build_tgsi_context * bld_base, 669 struct lp_build_emit_data * emit_data) 670{ 671 emit_data->output[emit_data->chan] = bld_base->base.one; 672} 673 674/* TGSI_OPCODE_SUB */ 675static void 676sub_emit( 677 const struct lp_build_tgsi_action * action, 678 struct lp_build_tgsi_context * bld_base, 679 struct lp_build_emit_data * emit_data) 680{ 681 emit_data->output[emit_data->chan] = LLVMBuildFSub( 682 bld_base->base.gallivm->builder, 683 emit_data->args[0], 684 emit_data->args[1], ""); 685} 686 687/* TGSI_OPCODE_U2F */ 688static void 689u2f_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] = LLVMBuildUIToFP(bld_base->base.gallivm->builder, 695 emit_data->args[0], 696 bld_base->base.vec_type, ""); 697} 698 699static void 700umad_emit( 701 const struct lp_build_tgsi_action * action, 702 struct lp_build_tgsi_context * bld_base, 703 struct lp_build_emit_data * emit_data) 704{ 705 LLVMValueRef tmp; 706 tmp = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_UMUL, 707 emit_data->args[0], 708 emit_data->args[1]); 709 emit_data->output[emit_data->chan] = lp_build_emit_llvm_binary(bld_base, 710 TGSI_OPCODE_UADD, tmp, emit_data->args[2]); 711} 712 713/* TGSI_OPCODE_UMUL */ 714static void 715umul_emit( 716 const struct lp_build_tgsi_action * action, 717 struct lp_build_tgsi_context * bld_base, 718 struct lp_build_emit_data * emit_data) 719{ 720 emit_data->output[emit_data->chan] = lp_build_mul(&bld_base->uint_bld, 721 emit_data->args[0], emit_data->args[1]); 722} 723 724/* TGSI_OPCODE_XPD */ 725 726static void 727xpd_fetch_args( 728 struct lp_build_tgsi_context * bld_base, 729 struct lp_build_emit_data * emit_data) 730{ 731 dp_fetch_args(bld_base, emit_data, 3); 732} 733 734/** 735 * (a * b) - (c * d) 736 */ 737static LLVMValueRef 738xpd_helper( 739 struct lp_build_tgsi_context * bld_base, 740 LLVMValueRef a, 741 LLVMValueRef b, 742 LLVMValueRef c, 743 LLVMValueRef d) 744{ 745 LLVMValueRef tmp0, tmp1; 746 747 tmp0 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, a, b); 748 tmp1 = lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_MUL, c, d); 749 750 return lp_build_emit_llvm_binary(bld_base, TGSI_OPCODE_SUB, tmp0, tmp1); 751} 752 753static void 754xpd_emit( 755 const struct lp_build_tgsi_action * action, 756 struct lp_build_tgsi_context * bld_base, 757 struct lp_build_emit_data * emit_data) 758{ 759 emit_data->output[TGSI_CHAN_X] = xpd_helper(bld_base, 760 emit_data->args[1] /* src0.y */, emit_data->args[5] /* src1.z */, 761 emit_data->args[4] /* src1.y */, emit_data->args[2] /* src0.z */); 762 763 emit_data->output[TGSI_CHAN_Y] = xpd_helper(bld_base, 764 emit_data->args[2] /* src0.z */, emit_data->args[3] /* src1.x */, 765 emit_data->args[5] /* src1.z */, emit_data->args[0] /* src0.x */); 766 767 emit_data->output[TGSI_CHAN_Z] = xpd_helper(bld_base, 768 emit_data->args[0] /* src0.x */, emit_data->args[4] /* src1.y */, 769 emit_data->args[3] /* src1.x */, emit_data->args[1] /* src0.y */); 770 771 emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 772} 773 774const struct lp_build_tgsi_action xpd_action = { 775 xpd_fetch_args, /* fetch_args */ 776 xpd_emit /* emit */ 777}; 778 779void 780lp_set_default_actions(struct lp_build_tgsi_context * bld_base) 781{ 782 bld_base->op_actions[TGSI_OPCODE_DP2] = dp2_action; 783 bld_base->op_actions[TGSI_OPCODE_DP3] = dp3_action; 784 bld_base->op_actions[TGSI_OPCODE_DP4] = dp4_action; 785 bld_base->op_actions[TGSI_OPCODE_DP2A] = dp2a_action; 786 bld_base->op_actions[TGSI_OPCODE_DPH] = dph_action; 787 bld_base->op_actions[TGSI_OPCODE_DST] = dst_action; 788 bld_base->op_actions[TGSI_OPCODE_EXP] = exp_action; 789 bld_base->op_actions[TGSI_OPCODE_LIT] = lit_action; 790 bld_base->op_actions[TGSI_OPCODE_LOG] = log_action; 791 bld_base->op_actions[TGSI_OPCODE_RSQ] = rsq_action; 792 bld_base->op_actions[TGSI_OPCODE_POW] = pow_action; 793 bld_base->op_actions[TGSI_OPCODE_SCS] = scs_action; 794 bld_base->op_actions[TGSI_OPCODE_XPD] = xpd_action; 795 796 bld_base->op_actions[TGSI_OPCODE_COS].fetch_args = scalar_unary_fetch_args; 797 bld_base->op_actions[TGSI_OPCODE_EX2].fetch_args = scalar_unary_fetch_args; 798 bld_base->op_actions[TGSI_OPCODE_IF].fetch_args = scalar_unary_fetch_args; 799 bld_base->op_actions[TGSI_OPCODE_KIL].fetch_args = kil_fetch_args; 800 bld_base->op_actions[TGSI_OPCODE_KILP].fetch_args = kilp_fetch_args; 801 bld_base->op_actions[TGSI_OPCODE_RCP].fetch_args = scalar_unary_fetch_args; 802 bld_base->op_actions[TGSI_OPCODE_SIN].fetch_args = scalar_unary_fetch_args; 803 bld_base->op_actions[TGSI_OPCODE_LG2].fetch_args = scalar_unary_fetch_args; 804 805 bld_base->op_actions[TGSI_OPCODE_ADD].emit = add_emit; 806 bld_base->op_actions[TGSI_OPCODE_ARR].emit = arr_emit; 807 bld_base->op_actions[TGSI_OPCODE_CLAMP].emit = clamp_emit; 808 bld_base->op_actions[TGSI_OPCODE_END].emit = end_emit; 809 bld_base->op_actions[TGSI_OPCODE_FRC].emit = frc_emit; 810 bld_base->op_actions[TGSI_OPCODE_LRP].emit = lrp_emit; 811 bld_base->op_actions[TGSI_OPCODE_MAD].emit = mad_emit; 812 bld_base->op_actions[TGSI_OPCODE_MOV].emit = mov_emit; 813 bld_base->op_actions[TGSI_OPCODE_MUL].emit = mul_emit; 814 bld_base->op_actions[TGSI_OPCODE_SFL].emit = sfl_emit; 815 bld_base->op_actions[TGSI_OPCODE_STR].emit = str_emit; 816 bld_base->op_actions[TGSI_OPCODE_SUB].emit = sub_emit; 817 818 bld_base->op_actions[TGSI_OPCODE_UARL].emit = mov_emit; 819 bld_base->op_actions[TGSI_OPCODE_U2F].emit = u2f_emit; 820 bld_base->op_actions[TGSI_OPCODE_UMAD].emit = umad_emit; 821 bld_base->op_actions[TGSI_OPCODE_UMUL].emit = umul_emit; 822} 823 824/* CPU Only default actions */ 825 826/* These actions are CPU only, because they could potentially output SSE 827 * intrinsics. 828 */ 829 830/* TGSI_OPCODE_ABS (CPU Only)*/ 831 832static void 833abs_emit_cpu( 834 const struct lp_build_tgsi_action * action, 835 struct lp_build_tgsi_context * bld_base, 836 struct lp_build_emit_data * emit_data) 837{ 838 emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->base, 839 emit_data->args[0]); 840} 841 842/* TGSI_OPCODE_ADD (CPU Only) */ 843static void 844add_emit_cpu( 845 const struct lp_build_tgsi_action * action, 846 struct lp_build_tgsi_context * bld_base, 847 struct lp_build_emit_data * emit_data) 848{ 849 emit_data->output[emit_data->chan] = lp_build_add(&bld_base->base, 850 emit_data->args[0], emit_data->args[1]); 851} 852 853/* TGSI_OPCODE_AND (CPU Only) */ 854static void 855and_emit_cpu( 856 const struct lp_build_tgsi_action * action, 857 struct lp_build_tgsi_context * bld_base, 858 struct lp_build_emit_data * emit_data) 859{ 860 emit_data->output[emit_data->chan] = lp_build_and(&bld_base->uint_bld, 861 emit_data->args[0], emit_data->args[1]); 862} 863 864/* TGSI_OPCODE_ARL (CPU Only) */ 865static void 866arl_emit_cpu( 867 const struct lp_build_tgsi_action * action, 868 struct lp_build_tgsi_context * bld_base, 869 struct lp_build_emit_data * emit_data) 870{ 871 LLVMValueRef tmp; 872 tmp = lp_build_floor(&bld_base->base, 873 emit_data->args[0]); 874 emit_data->output[emit_data->chan] = LLVMBuildFPToSI(bld_base->base.gallivm->builder, tmp, 875 bld_base->uint_bld.vec_type, ""); 876} 877 878/* TGSI_OPCODE_ARR (CPU Only) */ 879static void 880arr_emit_cpu( 881 const struct lp_build_tgsi_action * action, 882 struct lp_build_tgsi_context * bld_base, 883 struct lp_build_emit_data * emit_data) 884{ 885 emit_data->output[emit_data->chan] = lp_build_iround(&bld_base->base, emit_data->args[0]); 886} 887 888/* TGSI_OPCODE_CEIL (CPU Only) */ 889static void 890ceil_emit_cpu( 891 const struct lp_build_tgsi_action * action, 892 struct lp_build_tgsi_context * bld_base, 893 struct lp_build_emit_data * emit_data) 894{ 895 emit_data->output[emit_data->chan] = lp_build_ceil(&bld_base->base, 896 emit_data->args[0]); 897} 898 899/* TGSI_OPCODE_CMP (CPU Only) */ 900static void 901cmp_emit_cpu( 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 LLVMValueRef cond = lp_build_cmp(&bld_base->base, PIPE_FUNC_LESS, 907 emit_data->args[0], bld_base->base.zero); 908 emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base, 909 cond, emit_data->args[1], emit_data->args[2]); 910} 911 912/* TGSI_OPCODE_CND (CPU Only) */ 913static void 914cnd_emit_cpu( 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 half, tmp; 920 half = lp_build_const_vec(bld_base->base.gallivm, bld_base->base.type, 0.5); 921 tmp = lp_build_cmp(&bld_base->base, PIPE_FUNC_GREATER, 922 emit_data->args[2], half); 923 emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base, 924 tmp, 925 emit_data->args[0], 926 emit_data->args[1]); 927} 928 929/* TGSI_OPCODE_COS (CPU Only) */ 930static void 931cos_emit_cpu( 932 const struct lp_build_tgsi_action * action, 933 struct lp_build_tgsi_context * bld_base, 934 struct lp_build_emit_data * emit_data) 935{ 936 emit_data->output[emit_data->chan] = lp_build_cos(&bld_base->base, 937 emit_data->args[0]); 938} 939 940/* TGSI_OPCODE_DIV (CPU Only) */ 941static void 942div_emit_cpu( 943 const struct lp_build_tgsi_action * action, 944 struct lp_build_tgsi_context * bld_base, 945 struct lp_build_emit_data * emit_data) 946{ 947 emit_data->output[emit_data->chan] = lp_build_div(&bld_base->base, 948 emit_data->args[0], emit_data->args[1]); 949} 950 951/* TGSI_OPCODE_EX2 (CPU Only) */ 952static void 953ex2_emit_cpu( 954 const struct lp_build_tgsi_action * action, 955 struct lp_build_tgsi_context * bld_base, 956 struct lp_build_emit_data * emit_data) 957{ 958 emit_data->output[emit_data->chan] = lp_build_exp2(&bld_base->base, 959 emit_data->args[0]); 960} 961 962/* TGSI_OPCODE_EXP (CPU Only) */ 963static void 964exp_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 lp_build_exp2_approx(&bld_base->base, emit_data->args[0], 970 &emit_data->output[TGSI_CHAN_X], 971 &emit_data->output[TGSI_CHAN_Y], 972 &emit_data->output[TGSI_CHAN_Z]); 973 emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 974} 975 976/* TGSI_OPCODE_F2I (CPU Only) */ 977static void 978f2i_emit_cpu( 979 const struct lp_build_tgsi_action * action, 980 struct lp_build_tgsi_context * bld_base, 981 struct lp_build_emit_data * emit_data) 982{ 983 emit_data->output[emit_data->chan] = lp_build_itrunc(&bld_base->base, 984 emit_data->args[0]); 985} 986 987/* TGSI_OPCODE_F2U (CPU Only) */ 988static void 989f2u_emit_cpu( 990 const struct lp_build_tgsi_action * action, 991 struct lp_build_tgsi_context * bld_base, 992 struct lp_build_emit_data * emit_data) 993{ 994 /* FIXME: implement and use lp_build_utrunc() */ 995 emit_data->output[emit_data->chan] = lp_build_itrunc(&bld_base->base, 996 emit_data->args[0]); 997} 998 999/* TGSI_OPCODE_FLR (CPU Only) */ 1000 1001static void 1002flr_emit_cpu( 1003 const struct lp_build_tgsi_action * action, 1004 struct lp_build_tgsi_context * bld_base, 1005 struct lp_build_emit_data * emit_data) 1006{ 1007 emit_data->output[emit_data->chan] = lp_build_floor(&bld_base->base, 1008 emit_data->args[0]); 1009} 1010 1011/* TGSI_OPCODE_I2F (CPU Only) */ 1012static void 1013i2f_emit_cpu( 1014 const struct lp_build_tgsi_action * action, 1015 struct lp_build_tgsi_context * bld_base, 1016 struct lp_build_emit_data * emit_data) 1017{ 1018 emit_data->output[emit_data->chan] = lp_build_int_to_float(&bld_base->base, 1019 emit_data->args[0]); 1020} 1021 1022/* TGSI_OPCODE_IABS (CPU Only) */ 1023static void 1024iabs_emit_cpu( 1025 const struct lp_build_tgsi_action * action, 1026 struct lp_build_tgsi_context * bld_base, 1027 struct lp_build_emit_data * emit_data) 1028{ 1029 emit_data->output[emit_data->chan] = lp_build_abs(&bld_base->int_bld, 1030 emit_data->args[0]); 1031} 1032 1033/* TGSI_OPCODE_IDIV (CPU Only) */ 1034static void 1035idiv_emit_cpu( 1036 const struct lp_build_tgsi_action * action, 1037 struct lp_build_tgsi_context * bld_base, 1038 struct lp_build_emit_data * emit_data) 1039{ 1040 emit_data->output[emit_data->chan] = lp_build_div(&bld_base->int_bld, 1041 emit_data->args[0], emit_data->args[1]); 1042} 1043 1044/* TGSI_OPCODE_INEG (CPU Only) */ 1045static void 1046ineg_emit_cpu( 1047 const struct lp_build_tgsi_action * action, 1048 struct lp_build_tgsi_context * bld_base, 1049 struct lp_build_emit_data * emit_data) 1050{ 1051 emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->int_bld, 1052 bld_base->int_bld.zero, 1053 emit_data->args[0]); 1054} 1055 1056/* TGSI_OPCODE_ISET Helper (CPU Only) */ 1057static void 1058iset_emit_cpu( 1059 const struct lp_build_tgsi_action * action, 1060 struct lp_build_tgsi_context * bld_base, 1061 struct lp_build_emit_data * emit_data, 1062 unsigned pipe_func) 1063{ 1064 LLVMValueRef nz = lp_build_const_vec(bld_base->base.gallivm, 1065 bld_base->int_bld.type, ~0U); 1066 LLVMValueRef cond = lp_build_cmp(&bld_base->int_bld, pipe_func, 1067 emit_data->args[0], emit_data->args[1]); 1068 emit_data->output[emit_data->chan] = lp_build_select(&bld_base->int_bld, 1069 cond, 1070 nz, 1071 bld_base->int_bld.zero); 1072} 1073 1074/* TGSI_OPCODE_IMAX (CPU Only) */ 1075static void 1076imax_emit_cpu( 1077 const struct lp_build_tgsi_action * action, 1078 struct lp_build_tgsi_context * bld_base, 1079 struct lp_build_emit_data * emit_data) 1080{ 1081 emit_data->output[emit_data->chan] = lp_build_max(&bld_base->int_bld, 1082 emit_data->args[0], emit_data->args[1]); 1083} 1084 1085/* TGSI_OPCODE_IMIN (CPU Only) */ 1086static void 1087imin_emit_cpu( 1088 const struct lp_build_tgsi_action * action, 1089 struct lp_build_tgsi_context * bld_base, 1090 struct lp_build_emit_data * emit_data) 1091{ 1092 emit_data->output[emit_data->chan] = lp_build_min(&bld_base->int_bld, 1093 emit_data->args[0], emit_data->args[1]); 1094} 1095 1096/* TGSI_OPCODE_ISGE (CPU Only) */ 1097static void 1098isge_emit_cpu( 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 iset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL); 1104} 1105 1106/* TGSI_OPCODE_ISHR (CPU Only) */ 1107static void 1108ishr_emit_cpu( 1109 const struct lp_build_tgsi_action * action, 1110 struct lp_build_tgsi_context * bld_base, 1111 struct lp_build_emit_data * emit_data) 1112{ 1113 emit_data->output[emit_data->chan] = lp_build_shr(&bld_base->int_bld, 1114 emit_data->args[0], emit_data->args[1]); 1115} 1116 1117/* TGSI_OPCODE_ISLT (CPU Only) */ 1118static void 1119islt_emit_cpu( 1120 const struct lp_build_tgsi_action * action, 1121 struct lp_build_tgsi_context * bld_base, 1122 struct lp_build_emit_data * emit_data) 1123{ 1124 iset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS); 1125} 1126 1127 1128/* TGSI_OPCODE_ISSG (CPU Only) */ 1129static void 1130issg_emit_cpu( 1131 const struct lp_build_tgsi_action * action, 1132 struct lp_build_tgsi_context * bld_base, 1133 struct lp_build_emit_data * emit_data) 1134{ 1135 emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->int_bld, 1136 emit_data->args[0]); 1137} 1138 1139/* TGSI_OPCODE_LG2 (CPU Only) */ 1140static void 1141lg2_emit_cpu( 1142 const struct lp_build_tgsi_action * action, 1143 struct lp_build_tgsi_context * bld_base, 1144 struct lp_build_emit_data * emit_data) 1145{ 1146 emit_data->output[emit_data->chan] = lp_build_log2(&bld_base->base, 1147 emit_data->args[0]); 1148} 1149 1150/* TGSI_OPCODE_LOG (CPU Only) */ 1151static void 1152log_emit_cpu( 1153 const struct lp_build_tgsi_action * action, 1154 struct lp_build_tgsi_context * bld_base, 1155 struct lp_build_emit_data * emit_data) 1156{ 1157 LLVMValueRef p_floor_log2; 1158 LLVMValueRef p_exp; 1159 LLVMValueRef p_log2; 1160 LLVMValueRef src0 = emit_data->args[0]; 1161 1162 lp_build_log2_approx(&bld_base->base, src0, 1163 &p_exp, &p_floor_log2, &p_log2); 1164 1165 emit_data->output[TGSI_CHAN_X] = p_floor_log2; 1166 1167 emit_data->output[TGSI_CHAN_Y] = lp_build_emit_llvm_binary(bld_base, 1168 TGSI_OPCODE_DIV, 1169 src0, p_exp); 1170 emit_data->output[TGSI_CHAN_Z] = p_log2; 1171 1172 emit_data->output[TGSI_CHAN_W] = bld_base->base.one; 1173 1174} 1175 1176/* TGSI_OPCODE_MAX (CPU Only) */ 1177 1178static void 1179max_emit_cpu( 1180 const struct lp_build_tgsi_action * action, 1181 struct lp_build_tgsi_context * bld_base, 1182 struct lp_build_emit_data * emit_data) 1183{ 1184 emit_data->output[emit_data->chan] = lp_build_max(&bld_base->base, 1185 emit_data->args[0], emit_data->args[1]); 1186} 1187 1188/* TGSI_OPCODE_MIN (CPU Only) */ 1189static void 1190min_emit_cpu( 1191 const struct lp_build_tgsi_action * action, 1192 struct lp_build_tgsi_context * bld_base, 1193 struct lp_build_emit_data * emit_data) 1194{ 1195 emit_data->output[emit_data->chan] = lp_build_min(&bld_base->base, 1196 emit_data->args[0], emit_data->args[1]); 1197} 1198 1199/* TGSI_OPCODE_MOD (CPU Only) */ 1200static void 1201mod_emit_cpu( 1202 const struct lp_build_tgsi_action * action, 1203 struct lp_build_tgsi_context * bld_base, 1204 struct lp_build_emit_data * emit_data) 1205{ 1206 emit_data->output[emit_data->chan] = lp_build_mod(&bld_base->int_bld, 1207 emit_data->args[0], emit_data->args[1]); 1208} 1209 1210/* TGSI_OPCODE_NOT */ 1211static void 1212not_emit_cpu( 1213 const struct lp_build_tgsi_action * action, 1214 struct lp_build_tgsi_context * bld_base, 1215 struct lp_build_emit_data * emit_data) 1216{ 1217 emit_data->output[emit_data->chan] = lp_build_not(&bld_base->base, 1218 emit_data->args[0]); 1219} 1220 1221/* TGSI_OPCODE_OR (CPU Only) */ 1222static void 1223or_emit_cpu( 1224 const struct lp_build_tgsi_action * action, 1225 struct lp_build_tgsi_context * bld_base, 1226 struct lp_build_emit_data * emit_data) 1227{ 1228 emit_data->output[emit_data->chan] = lp_build_or(&bld_base->uint_bld, 1229 emit_data->args[0], emit_data->args[1]); 1230} 1231 1232/* TGSI_OPCODE_POW (CPU Only) */ 1233static void 1234pow_emit_cpu( 1235 const struct lp_build_tgsi_action * action, 1236 struct lp_build_tgsi_context * bld_base, 1237 struct lp_build_emit_data * emit_data) 1238{ 1239 emit_data->output[emit_data->chan] = lp_build_pow(&bld_base->base, 1240 emit_data->args[0], emit_data->args[1]); 1241} 1242 1243 1244/* TGSI_OPCODE_RCP (CPU Only) */ 1245 1246static void 1247rcp_emit_cpu( 1248 const struct lp_build_tgsi_action * action, 1249 struct lp_build_tgsi_context * bld_base, 1250 struct lp_build_emit_data * emit_data) 1251{ 1252 emit_data->output[emit_data->chan] = lp_build_rcp(&bld_base->base, 1253 emit_data->args[0]); 1254} 1255 1256/* Reciprical squareroot (CPU Only) */ 1257 1258/* This is not the same as TGSI_OPCODE_RSQ, which requres the argument to be 1259 * greater than or equal to 0 */ 1260static void 1261recip_sqrt_emit_cpu( 1262 const struct lp_build_tgsi_action * action, 1263 struct lp_build_tgsi_context * bld_base, 1264 struct lp_build_emit_data * emit_data) 1265{ 1266 emit_data->output[emit_data->chan] = lp_build_rsqrt(&bld_base->base, 1267 emit_data->args[0]); 1268} 1269 1270/* TGSI_OPCODE_ROUND (CPU Only) */ 1271static void 1272round_emit_cpu( 1273 const struct lp_build_tgsi_action * action, 1274 struct lp_build_tgsi_context * bld_base, 1275 struct lp_build_emit_data * emit_data) 1276{ 1277 emit_data->output[emit_data->chan] = lp_build_round(&bld_base->base, 1278 emit_data->args[0]); 1279} 1280 1281/* TGSI_OPCODE_SET Helper (CPU Only) */ 1282 1283static void 1284set_emit_cpu( 1285 const struct lp_build_tgsi_action * action, 1286 struct lp_build_tgsi_context * bld_base, 1287 struct lp_build_emit_data * emit_data, 1288 unsigned pipe_func) 1289{ 1290 LLVMValueRef cond = lp_build_cmp(&bld_base->base, pipe_func, 1291 emit_data->args[0], emit_data->args[1]); 1292 emit_data->output[emit_data->chan] = lp_build_select(&bld_base->base, 1293 cond, 1294 bld_base->base.one, 1295 bld_base->base.zero); 1296} 1297 1298/* TGSI_OPCODE_SEQ (CPU Only) */ 1299 1300static void 1301seq_emit_cpu( 1302 const struct lp_build_tgsi_action * action, 1303 struct lp_build_tgsi_context * bld_base, 1304 struct lp_build_emit_data * emit_data) 1305{ 1306 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL); 1307} 1308 1309/* TGSI_OPCODE_SGE (CPU Only) */ 1310static void 1311sge_emit_cpu( 1312 const struct lp_build_tgsi_action * action, 1313 struct lp_build_tgsi_context * bld_base, 1314 struct lp_build_emit_data * emit_data) 1315{ 1316 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL); 1317} 1318 1319/* TGSI_OPCODE_SGT (CPU Only)*/ 1320 1321static void 1322sgt_emit_cpu( 1323 const struct lp_build_tgsi_action * action, 1324 struct lp_build_tgsi_context * bld_base, 1325 struct lp_build_emit_data * emit_data) 1326{ 1327 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GREATER); 1328} 1329 1330/* TGSI_OPCODE_SHL (CPU Only) */ 1331static void 1332shl_emit_cpu( 1333 const struct lp_build_tgsi_action * action, 1334 struct lp_build_tgsi_context * bld_base, 1335 struct lp_build_emit_data * emit_data) 1336{ 1337 emit_data->output[emit_data->chan] = lp_build_shl(&bld_base->uint_bld, 1338 emit_data->args[0], emit_data->args[1]); 1339} 1340 1341/* TGSI_OPCODE_SIN (CPU Only) */ 1342static void 1343sin_emit_cpu( 1344 const struct lp_build_tgsi_action * action, 1345 struct lp_build_tgsi_context * bld_base, 1346 struct lp_build_emit_data * emit_data) 1347{ 1348 emit_data->output[emit_data->chan] = lp_build_sin(&bld_base->base, 1349 emit_data->args[0]); 1350} 1351 1352/* TGSI_OPCODE_SLE (CPU Only) */ 1353static void 1354sle_emit_cpu( 1355 const struct lp_build_tgsi_action * action, 1356 struct lp_build_tgsi_context * bld_base, 1357 struct lp_build_emit_data * emit_data) 1358{ 1359 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LEQUAL); 1360} 1361 1362/* TGSI_OPCODE_SLT (CPU Only) */ 1363static void 1364slt_emit_cpu( 1365 const struct lp_build_tgsi_action * action, 1366 struct lp_build_tgsi_context * bld_base, 1367 struct lp_build_emit_data * emit_data) 1368{ 1369 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS); 1370} 1371 1372/* TGSI_OPCODE_SNE (CPU Only) */ 1373 1374static void 1375sne_emit_cpu( 1376 const struct lp_build_tgsi_action * action, 1377 struct lp_build_tgsi_context * bld_base, 1378 struct lp_build_emit_data * emit_data) 1379{ 1380 set_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL); 1381} 1382 1383/* TGSI_OPCODE_SSG (CPU Only) */ 1384 1385static void 1386ssg_emit_cpu( 1387 const struct lp_build_tgsi_action * action, 1388 struct lp_build_tgsi_context * bld_base, 1389 struct lp_build_emit_data * emit_data) 1390{ 1391 emit_data->output[emit_data->chan] = lp_build_sgn(&bld_base->base, 1392 emit_data->args[0]); 1393} 1394 1395/* TGSI_OPCODE_SUB (CPU Only) */ 1396 1397static void 1398sub_emit_cpu( 1399 const struct lp_build_tgsi_action * action, 1400 struct lp_build_tgsi_context * bld_base, 1401 struct lp_build_emit_data * emit_data) 1402{ 1403 emit_data->output[emit_data->chan] = lp_build_sub(&bld_base->base, 1404 emit_data->args[0], 1405 emit_data->args[1]); 1406} 1407 1408/* TGSI_OPCODE_TRUNC (CPU Only) */ 1409 1410static void 1411trunc_emit_cpu( 1412 const struct lp_build_tgsi_action * action, 1413 struct lp_build_tgsi_context * bld_base, 1414 struct lp_build_emit_data * emit_data) 1415{ 1416 emit_data->output[emit_data->chan] = lp_build_trunc(&bld_base->base, 1417 emit_data->args[0]); 1418} 1419 1420/* TGSI_OPCODE_UADD (CPU Only) */ 1421static void 1422uadd_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 emit_data->output[emit_data->chan] = lp_build_add(&bld_base->uint_bld, 1428 emit_data->args[0], emit_data->args[1]); 1429} 1430 1431/* TGSI_OPCODE_UDIV (CPU Only) */ 1432static void 1433udiv_emit_cpu( 1434 const struct lp_build_tgsi_action * action, 1435 struct lp_build_tgsi_context * bld_base, 1436 struct lp_build_emit_data * emit_data) 1437{ 1438 emit_data->output[emit_data->chan] = lp_build_div(&bld_base->uint_bld, 1439 emit_data->args[0], emit_data->args[1]); 1440} 1441 1442/* TGSI_OPCODE_UMAX (CPU Only) */ 1443static void 1444umax_emit_cpu( 1445 const struct lp_build_tgsi_action * action, 1446 struct lp_build_tgsi_context * bld_base, 1447 struct lp_build_emit_data * emit_data) 1448{ 1449 emit_data->output[emit_data->chan] = lp_build_max(&bld_base->uint_bld, 1450 emit_data->args[0], emit_data->args[1]); 1451} 1452 1453/* TGSI_OPCODE_UMIN (CPU Only) */ 1454static void 1455umin_emit_cpu( 1456 const struct lp_build_tgsi_action * action, 1457 struct lp_build_tgsi_context * bld_base, 1458 struct lp_build_emit_data * emit_data) 1459{ 1460 emit_data->output[emit_data->chan] = lp_build_min(&bld_base->uint_bld, 1461 emit_data->args[0], emit_data->args[1]); 1462} 1463 1464/* TGSI_OPCODE_UMOD (CPU Only) */ 1465static void 1466umod_emit_cpu( 1467 const struct lp_build_tgsi_action * action, 1468 struct lp_build_tgsi_context * bld_base, 1469 struct lp_build_emit_data * emit_data) 1470{ 1471 emit_data->output[emit_data->chan] = lp_build_mod(&bld_base->uint_bld, 1472 emit_data->args[0], emit_data->args[1]); 1473} 1474 1475/* TGSI_OPCODE_USET Helper (CPU Only) */ 1476static void 1477uset_emit_cpu( 1478 const struct lp_build_tgsi_action * action, 1479 struct lp_build_tgsi_context * bld_base, 1480 struct lp_build_emit_data * emit_data, 1481 unsigned pipe_func) 1482{ 1483 LLVMValueRef nz = lp_build_const_vec(bld_base->base.gallivm, 1484 bld_base->uint_bld.type, ~0U); 1485 LLVMValueRef cond = lp_build_cmp(&bld_base->uint_bld, pipe_func, 1486 emit_data->args[0], emit_data->args[1]); 1487 emit_data->output[emit_data->chan] = lp_build_select(&bld_base->uint_bld, 1488 cond, 1489 nz, 1490 bld_base->uint_bld.zero); 1491} 1492 1493 1494/* TGSI_OPCODE_USEQ (CPU Only) */ 1495static void 1496useq_emit_cpu( 1497 const struct lp_build_tgsi_action * action, 1498 struct lp_build_tgsi_context * bld_base, 1499 struct lp_build_emit_data * emit_data) 1500{ 1501 uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_EQUAL); 1502} 1503 1504/* TGSI_OPCODE_ISGE (CPU Only) */ 1505static void 1506usge_emit_cpu( 1507 const struct lp_build_tgsi_action * action, 1508 struct lp_build_tgsi_context * bld_base, 1509 struct lp_build_emit_data * emit_data) 1510{ 1511 uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_GEQUAL); 1512} 1513 1514/* TGSI_OPCODE_USHR (CPU Only) */ 1515static void 1516ushr_emit_cpu( 1517 const struct lp_build_tgsi_action * action, 1518 struct lp_build_tgsi_context * bld_base, 1519 struct lp_build_emit_data * emit_data) 1520{ 1521 emit_data->output[emit_data->chan] = lp_build_shr(&bld_base->uint_bld, 1522 emit_data->args[0], emit_data->args[1]); 1523} 1524 1525/* TGSI_OPCODE_ISLT (CPU Only) */ 1526static void 1527uslt_emit_cpu( 1528 const struct lp_build_tgsi_action * action, 1529 struct lp_build_tgsi_context * bld_base, 1530 struct lp_build_emit_data * emit_data) 1531{ 1532 uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_LESS); 1533} 1534 1535/* TGSI_OPCODE_USNE (CPU Only) */ 1536 1537static void 1538usne_emit_cpu( 1539 const struct lp_build_tgsi_action * action, 1540 struct lp_build_tgsi_context * bld_base, 1541 struct lp_build_emit_data * emit_data) 1542{ 1543 uset_emit_cpu(action, bld_base, emit_data, PIPE_FUNC_NOTEQUAL); 1544} 1545 1546/* TGSI_OPCODE_XOR */ 1547static void 1548xor_emit_cpu( 1549 const struct lp_build_tgsi_action * action, 1550 struct lp_build_tgsi_context * bld_base, 1551 struct lp_build_emit_data * emit_data) 1552{ 1553 emit_data->output[emit_data->chan] = lp_build_xor(&bld_base->uint_bld, 1554 emit_data->args[0], 1555 emit_data->args[1]); 1556} 1557 1558void 1559lp_set_default_actions_cpu( 1560 struct lp_build_tgsi_context * bld_base) 1561{ 1562 lp_set_default_actions(bld_base); 1563 bld_base->op_actions[TGSI_OPCODE_ABS].emit = abs_emit_cpu; 1564 bld_base->op_actions[TGSI_OPCODE_ADD].emit = add_emit_cpu; 1565 bld_base->op_actions[TGSI_OPCODE_AND].emit = and_emit_cpu; 1566 bld_base->op_actions[TGSI_OPCODE_ARL].emit = arl_emit_cpu; 1567 bld_base->op_actions[TGSI_OPCODE_ARR].emit = arr_emit_cpu; 1568 bld_base->op_actions[TGSI_OPCODE_CEIL].emit = ceil_emit_cpu; 1569 bld_base->op_actions[TGSI_OPCODE_CND].emit = cnd_emit_cpu; 1570 bld_base->op_actions[TGSI_OPCODE_COS].emit = cos_emit_cpu; 1571 bld_base->op_actions[TGSI_OPCODE_CMP].emit = cmp_emit_cpu; 1572 bld_base->op_actions[TGSI_OPCODE_DIV].emit = div_emit_cpu; 1573 bld_base->op_actions[TGSI_OPCODE_EX2].emit = ex2_emit_cpu; 1574 bld_base->op_actions[TGSI_OPCODE_EXP].emit = exp_emit_cpu; 1575 bld_base->op_actions[TGSI_OPCODE_F2I].emit = f2i_emit_cpu; 1576 bld_base->op_actions[TGSI_OPCODE_F2U].emit = f2u_emit_cpu; 1577 bld_base->op_actions[TGSI_OPCODE_FLR].emit = flr_emit_cpu; 1578 1579 bld_base->op_actions[TGSI_OPCODE_I2F].emit = i2f_emit_cpu; 1580 bld_base->op_actions[TGSI_OPCODE_IABS].emit = iabs_emit_cpu; 1581 bld_base->op_actions[TGSI_OPCODE_IDIV].emit = idiv_emit_cpu; 1582 bld_base->op_actions[TGSI_OPCODE_INEG].emit = ineg_emit_cpu; 1583 bld_base->op_actions[TGSI_OPCODE_IMAX].emit = imax_emit_cpu; 1584 bld_base->op_actions[TGSI_OPCODE_IMIN].emit = imin_emit_cpu; 1585 bld_base->op_actions[TGSI_OPCODE_ISGE].emit = isge_emit_cpu; 1586 bld_base->op_actions[TGSI_OPCODE_ISHR].emit = ishr_emit_cpu; 1587 bld_base->op_actions[TGSI_OPCODE_ISLT].emit = islt_emit_cpu; 1588 bld_base->op_actions[TGSI_OPCODE_ISSG].emit = issg_emit_cpu; 1589 1590 bld_base->op_actions[TGSI_OPCODE_LG2].emit = lg2_emit_cpu; 1591 bld_base->op_actions[TGSI_OPCODE_LOG].emit = log_emit_cpu; 1592 bld_base->op_actions[TGSI_OPCODE_MAX].emit = max_emit_cpu; 1593 bld_base->op_actions[TGSI_OPCODE_MIN].emit = min_emit_cpu; 1594 bld_base->op_actions[TGSI_OPCODE_MOD].emit = mod_emit_cpu; 1595 bld_base->op_actions[TGSI_OPCODE_NOT].emit = not_emit_cpu; 1596 bld_base->op_actions[TGSI_OPCODE_OR].emit = or_emit_cpu; 1597 bld_base->op_actions[TGSI_OPCODE_POW].emit = pow_emit_cpu; 1598 bld_base->op_actions[TGSI_OPCODE_RCP].emit = rcp_emit_cpu; 1599 bld_base->op_actions[TGSI_OPCODE_ROUND].emit = round_emit_cpu; 1600 bld_base->op_actions[TGSI_OPCODE_SEQ].emit = seq_emit_cpu; 1601 bld_base->op_actions[TGSI_OPCODE_SGE].emit = sge_emit_cpu; 1602 bld_base->op_actions[TGSI_OPCODE_SGT].emit = sgt_emit_cpu; 1603 bld_base->op_actions[TGSI_OPCODE_SIN].emit = sin_emit_cpu; 1604 bld_base->op_actions[TGSI_OPCODE_SHL].emit = shl_emit_cpu; 1605 bld_base->op_actions[TGSI_OPCODE_SLE].emit = sle_emit_cpu; 1606 bld_base->op_actions[TGSI_OPCODE_SLT].emit = slt_emit_cpu; 1607 bld_base->op_actions[TGSI_OPCODE_SNE].emit = sne_emit_cpu; 1608 bld_base->op_actions[TGSI_OPCODE_SSG].emit = ssg_emit_cpu; 1609 bld_base->op_actions[TGSI_OPCODE_SUB].emit = sub_emit_cpu; 1610 bld_base->op_actions[TGSI_OPCODE_TRUNC].emit = trunc_emit_cpu; 1611 1612 bld_base->rsq_action.emit = recip_sqrt_emit_cpu; 1613 1614 bld_base->op_actions[TGSI_OPCODE_UADD].emit = uadd_emit_cpu; 1615 bld_base->op_actions[TGSI_OPCODE_UDIV].emit = udiv_emit_cpu; 1616 bld_base->op_actions[TGSI_OPCODE_UMAX].emit = umax_emit_cpu; 1617 bld_base->op_actions[TGSI_OPCODE_UMIN].emit = umin_emit_cpu; 1618 bld_base->op_actions[TGSI_OPCODE_UMOD].emit = umod_emit_cpu; 1619 bld_base->op_actions[TGSI_OPCODE_USEQ].emit = useq_emit_cpu; 1620 bld_base->op_actions[TGSI_OPCODE_USGE].emit = usge_emit_cpu; 1621 bld_base->op_actions[TGSI_OPCODE_USHR].emit = ushr_emit_cpu; 1622 bld_base->op_actions[TGSI_OPCODE_USLT].emit = uslt_emit_cpu; 1623 bld_base->op_actions[TGSI_OPCODE_USNE].emit = usne_emit_cpu; 1624 1625 bld_base->op_actions[TGSI_OPCODE_XOR].emit = xor_emit_cpu; 1626 1627} 1628