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