Home | History | Annotate | Line # | Download | only in bifrost
      1 /*
      2  * Copyright (C) 2020 Collabora, Ltd.
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
     21  * SOFTWARE.
     22  */
     23 
     24 /* Autogenerated file, do not edit */
     25 
     26 
     27 #ifndef _BI_BUILDER_H_
     28 #define _BI_BUILDER_H_
     29 
     30 #include "compiler.h"
     31 
     32 
     33 
     34 static inline
     35 bi_instr * bi_acmpstore_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
     36 {
     37     bi_instr *I = rzalloc(b->shader, bi_instr);
     38     I->op = BI_OPCODE_ACMPSTORE_I32;
     39     I->src[0] = src0;
     40     I->src[1] = src1;
     41     I->src[2] = src2;
     42     I->seg = seg;
     43     bi_builder_insert(&b->cursor, I);
     44     return I;
     45 }
     46 
     47 
     48 static inline
     49 bi_instr * bi_acmpstore_i64(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
     50 {
     51     bi_instr *I = rzalloc(b->shader, bi_instr);
     52     I->op = BI_OPCODE_ACMPSTORE_I64;
     53     I->src[0] = src0;
     54     I->src[1] = src1;
     55     I->src[2] = src2;
     56     I->seg = seg;
     57     bi_builder_insert(&b->cursor, I);
     58     return I;
     59 }
     60 
     61 
     62 static inline
     63 bi_instr * bi_acmpstore(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
     64 {
     65     if (bitsize == 32)
     66         return (bi_acmpstore_i32(b, src0, src1, src2, seg));
     67     else if (bitsize == 64)
     68         return (bi_acmpstore_i64(b, src0, src1, src2, seg));
     69     else
     70         unreachable("Invalid parameters for ACMPSTORE");
     71 }
     72 
     73 static inline
     74 bi_instr * bi_acmpxchg_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
     75 {
     76     bi_instr *I = rzalloc(b->shader, bi_instr);
     77     I->op = BI_OPCODE_ACMPXCHG_I32;
     78     I->dest[0] = dest0;
     79     I->src[0] = src0;
     80     I->src[1] = src1;
     81     I->src[2] = src2;
     82     I->seg = seg;
     83     bi_builder_insert(&b->cursor, I);
     84     return I;
     85 }
     86 
     87 static inline
     88 bi_index bi_acmpxchg_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
     89 {
     90     return (bi_acmpxchg_i32_to(b, bi_temp(b->shader), src0, src1, src2, seg))->dest[0];
     91 }
     92 
     93 
     94 static inline
     95 bi_instr * bi_acmpxchg_i64_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
     96 {
     97     bi_instr *I = rzalloc(b->shader, bi_instr);
     98     I->op = BI_OPCODE_ACMPXCHG_I64;
     99     I->dest[0] = dest0;
    100     I->src[0] = src0;
    101     I->src[1] = src1;
    102     I->src[2] = src2;
    103     I->seg = seg;
    104     bi_builder_insert(&b->cursor, I);
    105     return I;
    106 }
    107 
    108 static inline
    109 bi_index bi_acmpxchg_i64(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
    110 {
    111     return (bi_acmpxchg_i64_to(b, bi_temp(b->shader), src0, src1, src2, seg))->dest[0];
    112 }
    113 
    114 
    115 static inline
    116 bi_instr * bi_acmpxchg_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
    117 {
    118     if (bitsize == 32)
    119         return (bi_acmpxchg_i32_to(b, dest0, src0, src1, src2, seg));
    120     else if (bitsize == 64)
    121         return (bi_acmpxchg_i64_to(b, dest0, src0, src1, src2, seg));
    122     else
    123         unreachable("Invalid parameters for ACMPXCHG");
    124 }
    125 
    126 static inline
    127 bi_index bi_acmpxchg(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
    128 {
    129     if (bitsize == 32)
    130         return (bi_acmpxchg_i32_to(b, bi_temp(b->shader), src0, src1, src2, seg))->dest[0];
    131     else if (bitsize == 64)
    132         return (bi_acmpxchg_i64_to(b, bi_temp(b->shader), src0, src1, src2, seg))->dest[0];
    133     else
    134         unreachable("Invalid parameters for ACMPXCHG");
    135 }
    136 
    137 static inline
    138 bi_instr * bi_arshift_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
    139 {
    140     bi_instr *I = rzalloc(b->shader, bi_instr);
    141     I->op = BI_OPCODE_ARSHIFT_I32;
    142     I->dest[0] = dest0;
    143     I->src[0] = src0;
    144     I->src[1] = src1;
    145     I->src[2] = src2;
    146     bi_builder_insert(&b->cursor, I);
    147     return I;
    148 }
    149 
    150 static inline
    151 bi_index bi_arshift_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
    152 {
    153     return (bi_arshift_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
    154 }
    155 
    156 
    157 static inline
    158 bi_instr * bi_arshift_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
    159 {
    160     bi_instr *I = rzalloc(b->shader, bi_instr);
    161     I->op = BI_OPCODE_ARSHIFT_V2I16;
    162     I->dest[0] = dest0;
    163     I->src[0] = src0;
    164     I->src[1] = src1;
    165     I->src[2] = src2;
    166     bi_builder_insert(&b->cursor, I);
    167     return I;
    168 }
    169 
    170 static inline
    171 bi_index bi_arshift_v2i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
    172 {
    173     return (bi_arshift_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
    174 }
    175 
    176 
    177 static inline
    178 bi_instr * bi_arshift_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
    179 {
    180     bi_instr *I = rzalloc(b->shader, bi_instr);
    181     I->op = BI_OPCODE_ARSHIFT_V4I8;
    182     I->dest[0] = dest0;
    183     I->src[0] = src0;
    184     I->src[1] = src1;
    185     I->src[2] = src2;
    186     bi_builder_insert(&b->cursor, I);
    187     return I;
    188 }
    189 
    190 static inline
    191 bi_index bi_arshift_v4i8(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
    192 {
    193     return (bi_arshift_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
    194 }
    195 
    196 
    197 static inline
    198 bi_instr * bi_arshift_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
    199 {
    200     if (bitsize == 32)
    201         return (bi_arshift_i32_to(b, dest0, src0, src1, src2));
    202     else if (bitsize == 16)
    203         return (bi_arshift_v2i16_to(b, dest0, src0, src1, src2));
    204     else if (bitsize == 8)
    205         return (bi_arshift_v4i8_to(b, dest0, src0, src1, src2));
    206     else
    207         unreachable("Invalid parameters for ARSHIFT");
    208 }
    209 
    210 static inline
    211 bi_index bi_arshift(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2)
    212 {
    213     if (bitsize == 32)
    214         return (bi_arshift_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
    215     else if (bitsize == 16)
    216         return (bi_arshift_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
    217     else if (bitsize == 8)
    218         return (bi_arshift_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
    219     else
    220         unreachable("Invalid parameters for ARSHIFT");
    221 }
    222 
    223 static inline
    224 bi_instr * bi_arshift_double_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bool bytes2, bool result_word)
    225 {
    226     bi_instr *I = rzalloc(b->shader, bi_instr);
    227     I->op = BI_OPCODE_ARSHIFT_DOUBLE_I32;
    228     I->dest[0] = dest0;
    229     I->src[0] = src0;
    230     I->src[1] = src1;
    231     I->src[2] = src2;
    232     I->bytes2 = bytes2;
    233     I->result_word = result_word;
    234     bi_builder_insert(&b->cursor, I);
    235     return I;
    236 }
    237 
    238 static inline
    239 bi_index bi_arshift_double_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bool bytes2, bool result_word)
    240 {
    241     return (bi_arshift_double_i32_to(b, bi_temp(b->shader), src0, src1, src2, bytes2, result_word))->dest[0];
    242 }
    243 
    244 
    245 static inline
    246 bi_instr * bi_atest_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
    247 {
    248     bi_instr *I = rzalloc(b->shader, bi_instr);
    249     I->op = BI_OPCODE_ATEST;
    250     I->dest[0] = dest0;
    251     I->src[0] = src0;
    252     I->src[1] = src1;
    253     bi_builder_insert(&b->cursor, I);
    254     return I;
    255 }
    256 
    257 static inline
    258 bi_index bi_atest(bi_builder *b, bi_index src0, bi_index src1)
    259 {
    260     return (bi_atest_to(b, bi_temp(b->shader), src0, src1))->dest[0];
    261 }
    262 
    263 
    264 static inline
    265 bi_instr * bi_atom_c_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_atom_opc atom_opc)
    266 {
    267     bi_instr *I = rzalloc(b->shader, bi_instr);
    268     I->op = BI_OPCODE_ATOM_C_I32;
    269     I->src[0] = src0;
    270     I->src[1] = src1;
    271     I->src[2] = src2;
    272     I->atom_opc = atom_opc;
    273     bi_builder_insert(&b->cursor, I);
    274     return I;
    275 }
    276 
    277 
    278 static inline
    279 bi_instr * bi_atom_c_i64(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_atom_opc atom_opc)
    280 {
    281     bi_instr *I = rzalloc(b->shader, bi_instr);
    282     I->op = BI_OPCODE_ATOM_C_I64;
    283     I->src[0] = src0;
    284     I->src[1] = src1;
    285     I->src[2] = src2;
    286     I->atom_opc = atom_opc;
    287     bi_builder_insert(&b->cursor, I);
    288     return I;
    289 }
    290 
    291 
    292 static inline
    293 bi_instr * bi_atom_c(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, enum bi_atom_opc atom_opc)
    294 {
    295     if (bitsize == 32)
    296         return (bi_atom_c_i32(b, src0, src1, src2, atom_opc));
    297     else if (bitsize == 64)
    298         return (bi_atom_c_i64(b, src0, src1, src2, atom_opc));
    299     else
    300         unreachable("Invalid parameters for ATOM_C");
    301 }
    302 
    303 static inline
    304 bi_instr * bi_atom_c1_i32(bi_builder *b, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    305 {
    306     bi_instr *I = rzalloc(b->shader, bi_instr);
    307     I->op = BI_OPCODE_ATOM_C1_I32;
    308     I->src[0] = src0;
    309     I->src[1] = src1;
    310     I->atom_opc = atom_opc;
    311     bi_builder_insert(&b->cursor, I);
    312     return I;
    313 }
    314 
    315 
    316 static inline
    317 bi_instr * bi_atom_c1_i64(bi_builder *b, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    318 {
    319     bi_instr *I = rzalloc(b->shader, bi_instr);
    320     I->op = BI_OPCODE_ATOM_C1_I64;
    321     I->src[0] = src0;
    322     I->src[1] = src1;
    323     I->atom_opc = atom_opc;
    324     bi_builder_insert(&b->cursor, I);
    325     return I;
    326 }
    327 
    328 
    329 static inline
    330 bi_instr * bi_atom_c1(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    331 {
    332     if (bitsize == 32)
    333         return (bi_atom_c1_i32(b, src0, src1, atom_opc));
    334     else if (bitsize == 64)
    335         return (bi_atom_c1_i64(b, src0, src1, atom_opc));
    336     else
    337         unreachable("Invalid parameters for ATOM_C1");
    338 }
    339 
    340 static inline
    341 bi_instr * bi_atom_c1_return_i32(bi_builder *b, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    342 {
    343     bi_instr *I = rzalloc(b->shader, bi_instr);
    344     I->op = BI_OPCODE_ATOM_C1_RETURN_I32;
    345     I->src[0] = src0;
    346     I->src[1] = src1;
    347     I->atom_opc = atom_opc;
    348     bi_builder_insert(&b->cursor, I);
    349     return I;
    350 }
    351 
    352 
    353 static inline
    354 bi_instr * bi_atom_c1_return_i64(bi_builder *b, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    355 {
    356     bi_instr *I = rzalloc(b->shader, bi_instr);
    357     I->op = BI_OPCODE_ATOM_C1_RETURN_I64;
    358     I->src[0] = src0;
    359     I->src[1] = src1;
    360     I->atom_opc = atom_opc;
    361     bi_builder_insert(&b->cursor, I);
    362     return I;
    363 }
    364 
    365 
    366 static inline
    367 bi_instr * bi_atom_c1_return(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    368 {
    369     if (bitsize == 32)
    370         return (bi_atom_c1_return_i32(b, src0, src1, atom_opc));
    371     else if (bitsize == 64)
    372         return (bi_atom_c1_return_i64(b, src0, src1, atom_opc));
    373     else
    374         unreachable("Invalid parameters for ATOM_C1_RETURN");
    375 }
    376 
    377 static inline
    378 bi_instr * bi_atom_cx_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, uint32_t sr_count)
    379 {
    380     bi_instr *I = rzalloc(b->shader, bi_instr);
    381     I->op = BI_OPCODE_ATOM_CX;
    382     I->dest[0] = dest0;
    383     I->src[0] = src0;
    384     I->src[1] = src1;
    385     I->src[2] = src2;
    386     I->src[3] = src3;
    387     I->sr_count = sr_count;
    388     bi_builder_insert(&b->cursor, I);
    389     return I;
    390 }
    391 
    392 static inline
    393 bi_index bi_atom_cx(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, uint32_t sr_count)
    394 {
    395     return (bi_atom_cx_to(b, bi_temp(b->shader), src0, src1, src2, src3, sr_count))->dest[0];
    396 }
    397 
    398 
    399 static inline
    400 bi_instr * bi_atom_c_return_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_atom_opc atom_opc)
    401 {
    402     bi_instr *I = rzalloc(b->shader, bi_instr);
    403     I->op = BI_OPCODE_ATOM_C_RETURN_I32;
    404     I->src[0] = src0;
    405     I->src[1] = src1;
    406     I->src[2] = src2;
    407     I->atom_opc = atom_opc;
    408     bi_builder_insert(&b->cursor, I);
    409     return I;
    410 }
    411 
    412 
    413 static inline
    414 bi_instr * bi_atom_c_return_i64(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_atom_opc atom_opc)
    415 {
    416     bi_instr *I = rzalloc(b->shader, bi_instr);
    417     I->op = BI_OPCODE_ATOM_C_RETURN_I64;
    418     I->src[0] = src0;
    419     I->src[1] = src1;
    420     I->src[2] = src2;
    421     I->atom_opc = atom_opc;
    422     bi_builder_insert(&b->cursor, I);
    423     return I;
    424 }
    425 
    426 
    427 static inline
    428 bi_instr * bi_atom_c_return(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, enum bi_atom_opc atom_opc)
    429 {
    430     if (bitsize == 32)
    431         return (bi_atom_c_return_i32(b, src0, src1, src2, atom_opc));
    432     else if (bitsize == 64)
    433         return (bi_atom_c_return_i64(b, src0, src1, src2, atom_opc));
    434     else
    435         unreachable("Invalid parameters for ATOM_C_RETURN");
    436 }
    437 
    438 static inline
    439 bi_instr * bi_atom_post_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    440 {
    441     bi_instr *I = rzalloc(b->shader, bi_instr);
    442     I->op = BI_OPCODE_ATOM_POST_I32;
    443     I->dest[0] = dest0;
    444     I->src[0] = src0;
    445     I->src[1] = src1;
    446     I->atom_opc = atom_opc;
    447     bi_builder_insert(&b->cursor, I);
    448     return I;
    449 }
    450 
    451 static inline
    452 bi_index bi_atom_post_i32(bi_builder *b, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    453 {
    454     return (bi_atom_post_i32_to(b, bi_temp(b->shader), src0, src1, atom_opc))->dest[0];
    455 }
    456 
    457 
    458 static inline
    459 bi_instr * bi_atom_post_i64_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    460 {
    461     bi_instr *I = rzalloc(b->shader, bi_instr);
    462     I->op = BI_OPCODE_ATOM_POST_I64;
    463     I->dest[0] = dest0;
    464     I->src[0] = src0;
    465     I->src[1] = src1;
    466     I->atom_opc = atom_opc;
    467     bi_builder_insert(&b->cursor, I);
    468     return I;
    469 }
    470 
    471 static inline
    472 bi_index bi_atom_post_i64(bi_builder *b, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    473 {
    474     return (bi_atom_post_i64_to(b, bi_temp(b->shader), src0, src1, atom_opc))->dest[0];
    475 }
    476 
    477 
    478 static inline
    479 bi_instr * bi_atom_post_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    480 {
    481     if (bitsize == 32)
    482         return (bi_atom_post_i32_to(b, dest0, src0, src1, atom_opc));
    483     else if (bitsize == 64)
    484         return (bi_atom_post_i64_to(b, dest0, src0, src1, atom_opc));
    485     else
    486         unreachable("Invalid parameters for ATOM_POST");
    487 }
    488 
    489 static inline
    490 bi_index bi_atom_post(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc)
    491 {
    492     if (bitsize == 32)
    493         return (bi_atom_post_i32_to(b, bi_temp(b->shader), src0, src1, atom_opc))->dest[0];
    494     else if (bitsize == 64)
    495         return (bi_atom_post_i64_to(b, bi_temp(b->shader), src0, src1, atom_opc))->dest[0];
    496     else
    497         unreachable("Invalid parameters for ATOM_POST");
    498 }
    499 
    500 static inline
    501 bi_instr * bi_atom_pre_i64_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_atom_opc atom_opc)
    502 {
    503     bi_instr *I = rzalloc(b->shader, bi_instr);
    504     I->op = BI_OPCODE_ATOM_PRE_I64;
    505     I->dest[0] = dest0;
    506     I->src[0] = src0;
    507     I->src[1] = src1;
    508     I->src[2] = src2;
    509     I->atom_opc = atom_opc;
    510     bi_builder_insert(&b->cursor, I);
    511     return I;
    512 }
    513 
    514 static inline
    515 bi_index bi_atom_pre_i64(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_atom_opc atom_opc)
    516 {
    517     return (bi_atom_pre_i64_to(b, bi_temp(b->shader), src0, src1, src2, atom_opc))->dest[0];
    518 }
    519 
    520 
    521 static inline
    522 bi_instr * bi_axchg_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
    523 {
    524     bi_instr *I = rzalloc(b->shader, bi_instr);
    525     I->op = BI_OPCODE_AXCHG_I32;
    526     I->dest[0] = dest0;
    527     I->src[0] = src0;
    528     I->src[1] = src1;
    529     I->src[2] = src2;
    530     I->seg = seg;
    531     bi_builder_insert(&b->cursor, I);
    532     return I;
    533 }
    534 
    535 static inline
    536 bi_index bi_axchg_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
    537 {
    538     return (bi_axchg_i32_to(b, bi_temp(b->shader), src0, src1, src2, seg))->dest[0];
    539 }
    540 
    541 
    542 static inline
    543 bi_instr * bi_axchg_i64_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
    544 {
    545     bi_instr *I = rzalloc(b->shader, bi_instr);
    546     I->op = BI_OPCODE_AXCHG_I64;
    547     I->dest[0] = dest0;
    548     I->src[0] = src0;
    549     I->src[1] = src1;
    550     I->src[2] = src2;
    551     I->seg = seg;
    552     bi_builder_insert(&b->cursor, I);
    553     return I;
    554 }
    555 
    556 static inline
    557 bi_index bi_axchg_i64(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
    558 {
    559     return (bi_axchg_i64_to(b, bi_temp(b->shader), src0, src1, src2, seg))->dest[0];
    560 }
    561 
    562 
    563 static inline
    564 bi_instr * bi_axchg_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
    565 {
    566     if (bitsize == 32)
    567         return (bi_axchg_i32_to(b, dest0, src0, src1, src2, seg));
    568     else if (bitsize == 64)
    569         return (bi_axchg_i64_to(b, dest0, src0, src1, src2, seg));
    570     else
    571         unreachable("Invalid parameters for AXCHG");
    572 }
    573 
    574 static inline
    575 bi_index bi_axchg(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
    576 {
    577     if (bitsize == 32)
    578         return (bi_axchg_i32_to(b, bi_temp(b->shader), src0, src1, src2, seg))->dest[0];
    579     else if (bitsize == 64)
    580         return (bi_axchg_i64_to(b, bi_temp(b->shader), src0, src1, src2, seg))->dest[0];
    581     else
    582         unreachable("Invalid parameters for AXCHG");
    583 }
    584 
    585 static inline
    586 bi_instr * bi_barrier(bi_builder *b)
    587 {
    588     bi_instr *I = rzalloc(b->shader, bi_instr);
    589     I->op = BI_OPCODE_BARRIER;
    590     bi_builder_insert(&b->cursor, I);
    591     return I;
    592 }
    593 
    594 
    595 static inline
    596 bi_instr * bi_bitrev_i32_to(bi_builder *b, bi_index dest0, bi_index src0)
    597 {
    598     bi_instr *I = rzalloc(b->shader, bi_instr);
    599     I->op = BI_OPCODE_BITREV_I32;
    600     I->dest[0] = dest0;
    601     I->src[0] = src0;
    602     bi_builder_insert(&b->cursor, I);
    603     return I;
    604 }
    605 
    606 static inline
    607 bi_index bi_bitrev_i32(bi_builder *b, bi_index src0)
    608 {
    609     return (bi_bitrev_i32_to(b, bi_temp(b->shader), src0))->dest[0];
    610 }
    611 
    612 
    613 static inline
    614 bi_instr * bi_blend_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, uint32_t sr_count)
    615 {
    616     bi_instr *I = rzalloc(b->shader, bi_instr);
    617     I->op = BI_OPCODE_BLEND;
    618     I->dest[0] = dest0;
    619     I->src[0] = src0;
    620     I->src[1] = src1;
    621     I->src[2] = src2;
    622     I->src[3] = src3;
    623     I->sr_count = sr_count;
    624     bi_builder_insert(&b->cursor, I);
    625     return I;
    626 }
    627 
    628 static inline
    629 bi_index bi_blend(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, uint32_t sr_count)
    630 {
    631     return (bi_blend_to(b, bi_temp(b->shader), src0, src1, src2, src3, sr_count))->dest[0];
    632 }
    633 
    634 
    635 static inline
    636 bi_instr * bi_branch_f16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_cmpf cmpf)
    637 {
    638     bi_instr *I = rzalloc(b->shader, bi_instr);
    639     I->op = BI_OPCODE_BRANCH_F16;
    640     I->src[0] = src0;
    641     I->src[1] = src1;
    642     I->src[2] = src2;
    643     I->cmpf = cmpf;
    644     bi_builder_insert(&b->cursor, I);
    645     return I;
    646 }
    647 
    648 
    649 static inline
    650 bi_instr * bi_branch_f32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_cmpf cmpf)
    651 {
    652     bi_instr *I = rzalloc(b->shader, bi_instr);
    653     I->op = BI_OPCODE_BRANCH_F32;
    654     I->src[0] = src0;
    655     I->src[1] = src1;
    656     I->src[2] = src2;
    657     I->cmpf = cmpf;
    658     bi_builder_insert(&b->cursor, I);
    659     return I;
    660 }
    661 
    662 
    663 static inline
    664 bi_instr * bi_branch_i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_cmpf cmpf)
    665 {
    666     bi_instr *I = rzalloc(b->shader, bi_instr);
    667     I->op = BI_OPCODE_BRANCH_I16;
    668     I->src[0] = src0;
    669     I->src[1] = src1;
    670     I->src[2] = src2;
    671     I->cmpf = cmpf;
    672     bi_builder_insert(&b->cursor, I);
    673     return I;
    674 }
    675 
    676 
    677 static inline
    678 bi_instr * bi_branch_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_cmpf cmpf)
    679 {
    680     bi_instr *I = rzalloc(b->shader, bi_instr);
    681     I->op = BI_OPCODE_BRANCH_I32;
    682     I->src[0] = src0;
    683     I->src[1] = src1;
    684     I->src[2] = src2;
    685     I->cmpf = cmpf;
    686     bi_builder_insert(&b->cursor, I);
    687     return I;
    688 }
    689 
    690 
    691 static inline
    692 bi_instr * bi_branch_s16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_cmpf cmpf)
    693 {
    694     bi_instr *I = rzalloc(b->shader, bi_instr);
    695     I->op = BI_OPCODE_BRANCH_S16;
    696     I->src[0] = src0;
    697     I->src[1] = src1;
    698     I->src[2] = src2;
    699     I->cmpf = cmpf;
    700     bi_builder_insert(&b->cursor, I);
    701     return I;
    702 }
    703 
    704 
    705 static inline
    706 bi_instr * bi_branch_s32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_cmpf cmpf)
    707 {
    708     bi_instr *I = rzalloc(b->shader, bi_instr);
    709     I->op = BI_OPCODE_BRANCH_S32;
    710     I->src[0] = src0;
    711     I->src[1] = src1;
    712     I->src[2] = src2;
    713     I->cmpf = cmpf;
    714     bi_builder_insert(&b->cursor, I);
    715     return I;
    716 }
    717 
    718 
    719 static inline
    720 bi_instr * bi_branch_u16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_cmpf cmpf)
    721 {
    722     bi_instr *I = rzalloc(b->shader, bi_instr);
    723     I->op = BI_OPCODE_BRANCH_U16;
    724     I->src[0] = src0;
    725     I->src[1] = src1;
    726     I->src[2] = src2;
    727     I->cmpf = cmpf;
    728     bi_builder_insert(&b->cursor, I);
    729     return I;
    730 }
    731 
    732 
    733 static inline
    734 bi_instr * bi_branch_u32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_cmpf cmpf)
    735 {
    736     bi_instr *I = rzalloc(b->shader, bi_instr);
    737     I->op = BI_OPCODE_BRANCH_U32;
    738     I->src[0] = src0;
    739     I->src[1] = src1;
    740     I->src[2] = src2;
    741     I->cmpf = cmpf;
    742     bi_builder_insert(&b->cursor, I);
    743     return I;
    744 }
    745 
    746 
    747 static inline
    748 bi_instr * bi_branch(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, enum bi_cmpf cmpf)
    749 {
    750     if ((type == nir_type_float) && bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    751         return (bi_branch_f16(b, src0, src1, src2, cmpf));
    752     else if ((type == nir_type_float) && bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    753         return (bi_branch_f32(b, src0, src1, src2, cmpf));
    754     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
    755         return (bi_branch_i16(b, src0, src1, src2, cmpf));
    756     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
    757         return (bi_branch_i32(b, src0, src1, src2, cmpf));
    758     else if ((type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    759         return (bi_branch_s16(b, src0, src1, src2, cmpf));
    760     else if ((type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    761         return (bi_branch_s32(b, src0, src1, src2, cmpf));
    762     else if ((type == nir_type_uint) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    763         return (bi_branch_u16(b, src0, src1, src2, cmpf));
    764     else if ((type == nir_type_uint) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    765         return (bi_branch_u32(b, src0, src1, src2, cmpf));
    766     else
    767         unreachable("Invalid parameters for BRANCH");
    768 }
    769 
    770 static inline
    771 bi_instr * bi_branchc_i16(bi_builder *b, bi_index src0, bi_index src1, bool combine)
    772 {
    773     bi_instr *I = rzalloc(b->shader, bi_instr);
    774     I->op = BI_OPCODE_BRANCHC_I16;
    775     I->src[0] = src0;
    776     I->src[1] = src1;
    777     I->combine = combine;
    778     bi_builder_insert(&b->cursor, I);
    779     return I;
    780 }
    781 
    782 
    783 static inline
    784 bi_instr * bi_branchc_i32(bi_builder *b, bi_index src0, bi_index src1, bool combine)
    785 {
    786     bi_instr *I = rzalloc(b->shader, bi_instr);
    787     I->op = BI_OPCODE_BRANCHC_I32;
    788     I->src[0] = src0;
    789     I->src[1] = src1;
    790     I->combine = combine;
    791     bi_builder_insert(&b->cursor, I);
    792     return I;
    793 }
    794 
    795 
    796 static inline
    797 bi_instr * bi_branchc(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bool combine)
    798 {
    799     if (bitsize == 16)
    800         return (bi_branchc_i16(b, src0, src1, combine));
    801     else if (bitsize == 32)
    802         return (bi_branchc_i32(b, src0, src1, combine));
    803     else
    804         unreachable("Invalid parameters for BRANCHC");
    805 }
    806 
    807 static inline
    808 bi_instr * bi_branchz_f16(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf)
    809 {
    810     bi_instr *I = rzalloc(b->shader, bi_instr);
    811     I->op = BI_OPCODE_BRANCHZ_F16;
    812     I->src[0] = src0;
    813     I->src[1] = src1;
    814     I->cmpf = cmpf;
    815     bi_builder_insert(&b->cursor, I);
    816     return I;
    817 }
    818 
    819 
    820 static inline
    821 bi_instr * bi_branchz_f32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf)
    822 {
    823     bi_instr *I = rzalloc(b->shader, bi_instr);
    824     I->op = BI_OPCODE_BRANCHZ_F32;
    825     I->src[0] = src0;
    826     I->src[1] = src1;
    827     I->cmpf = cmpf;
    828     bi_builder_insert(&b->cursor, I);
    829     return I;
    830 }
    831 
    832 
    833 static inline
    834 bi_instr * bi_branchz_i16(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf)
    835 {
    836     bi_instr *I = rzalloc(b->shader, bi_instr);
    837     I->op = BI_OPCODE_BRANCHZ_I16;
    838     I->src[0] = src0;
    839     I->src[1] = src1;
    840     I->cmpf = cmpf;
    841     bi_builder_insert(&b->cursor, I);
    842     return I;
    843 }
    844 
    845 
    846 static inline
    847 bi_instr * bi_branchz_i32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf)
    848 {
    849     bi_instr *I = rzalloc(b->shader, bi_instr);
    850     I->op = BI_OPCODE_BRANCHZ_I32;
    851     I->src[0] = src0;
    852     I->src[1] = src1;
    853     I->cmpf = cmpf;
    854     bi_builder_insert(&b->cursor, I);
    855     return I;
    856 }
    857 
    858 
    859 static inline
    860 bi_instr * bi_branchz_s16(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf)
    861 {
    862     bi_instr *I = rzalloc(b->shader, bi_instr);
    863     I->op = BI_OPCODE_BRANCHZ_S16;
    864     I->src[0] = src0;
    865     I->src[1] = src1;
    866     I->cmpf = cmpf;
    867     bi_builder_insert(&b->cursor, I);
    868     return I;
    869 }
    870 
    871 
    872 static inline
    873 bi_instr * bi_branchz_s32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf)
    874 {
    875     bi_instr *I = rzalloc(b->shader, bi_instr);
    876     I->op = BI_OPCODE_BRANCHZ_S32;
    877     I->src[0] = src0;
    878     I->src[1] = src1;
    879     I->cmpf = cmpf;
    880     bi_builder_insert(&b->cursor, I);
    881     return I;
    882 }
    883 
    884 
    885 static inline
    886 bi_instr * bi_branchz_u16(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf)
    887 {
    888     bi_instr *I = rzalloc(b->shader, bi_instr);
    889     I->op = BI_OPCODE_BRANCHZ_U16;
    890     I->src[0] = src0;
    891     I->src[1] = src1;
    892     I->cmpf = cmpf;
    893     bi_builder_insert(&b->cursor, I);
    894     return I;
    895 }
    896 
    897 
    898 static inline
    899 bi_instr * bi_branchz_u32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf)
    900 {
    901     bi_instr *I = rzalloc(b->shader, bi_instr);
    902     I->op = BI_OPCODE_BRANCHZ_U32;
    903     I->src[0] = src0;
    904     I->src[1] = src1;
    905     I->cmpf = cmpf;
    906     bi_builder_insert(&b->cursor, I);
    907     return I;
    908 }
    909 
    910 
    911 static inline
    912 bi_instr * bi_branchz(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index src0, bi_index src1, enum bi_cmpf cmpf)
    913 {
    914     if ((type == nir_type_float) && bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    915         return (bi_branchz_f16(b, src0, src1, cmpf));
    916     else if ((type == nir_type_float) && bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    917         return (bi_branchz_f32(b, src0, src1, cmpf));
    918     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
    919         return (bi_branchz_i16(b, src0, src1, cmpf));
    920     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
    921         return (bi_branchz_i32(b, src0, src1, cmpf));
    922     else if ((type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    923         return (bi_branchz_s16(b, src0, src1, cmpf));
    924     else if ((type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    925         return (bi_branchz_s32(b, src0, src1, cmpf));
    926     else if ((type == nir_type_uint) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    927         return (bi_branchz_u16(b, src0, src1, cmpf));
    928     else if ((type == nir_type_uint) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
    929         return (bi_branchz_u32(b, src0, src1, cmpf));
    930     else
    931         unreachable("Invalid parameters for BRANCHZ");
    932 }
    933 
    934 static inline
    935 bi_instr * bi_branch_diverg(bi_builder *b, bi_index src0)
    936 {
    937     bi_instr *I = rzalloc(b->shader, bi_instr);
    938     I->op = BI_OPCODE_BRANCH_DIVERG;
    939     I->src[0] = src0;
    940     bi_builder_insert(&b->cursor, I);
    941     return I;
    942 }
    943 
    944 
    945 static inline
    946 bi_instr * bi_branch_lowbits_f32(bi_builder *b, bi_index src0, bi_index src1)
    947 {
    948     bi_instr *I = rzalloc(b->shader, bi_instr);
    949     I->op = BI_OPCODE_BRANCH_LOWBITS_F32;
    950     I->src[0] = src0;
    951     I->src[1] = src1;
    952     bi_builder_insert(&b->cursor, I);
    953     return I;
    954 }
    955 
    956 
    957 static inline
    958 bi_instr * bi_branch_no_diverg(bi_builder *b, bi_index src0)
    959 {
    960     bi_instr *I = rzalloc(b->shader, bi_instr);
    961     I->op = BI_OPCODE_BRANCH_NO_DIVERG;
    962     I->src[0] = src0;
    963     bi_builder_insert(&b->cursor, I);
    964     return I;
    965 }
    966 
    967 
    968 static inline
    969 bi_instr * bi_clper_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_inactive_result inactive_result, enum bi_lane_op lane_op, enum bi_subgroup subgroup)
    970 {
    971     bi_instr *I = rzalloc(b->shader, bi_instr);
    972     I->op = BI_OPCODE_CLPER_I32;
    973     I->dest[0] = dest0;
    974     I->src[0] = src0;
    975     I->src[1] = src1;
    976     I->lane_op = lane_op;
    977     I->subgroup = subgroup;
    978     I->inactive_result = inactive_result;
    979     bi_builder_insert(&b->cursor, I);
    980     return I;
    981 }
    982 
    983 static inline
    984 bi_index bi_clper_i32(bi_builder *b, bi_index src0, bi_index src1, enum bi_inactive_result inactive_result, enum bi_lane_op lane_op, enum bi_subgroup subgroup)
    985 {
    986     return (bi_clper_i32_to(b, bi_temp(b->shader), src0, src1, inactive_result, lane_op, subgroup))->dest[0];
    987 }
    988 
    989 
    990 static inline
    991 bi_instr * bi_clper_v6_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
    992 {
    993     bi_instr *I = rzalloc(b->shader, bi_instr);
    994     I->op = BI_OPCODE_CLPER_V6_I32;
    995     I->dest[0] = dest0;
    996     I->src[0] = src0;
    997     I->src[1] = src1;
    998     bi_builder_insert(&b->cursor, I);
    999     return I;
   1000 }
   1001 
   1002 static inline
   1003 bi_index bi_clper_v6_i32(bi_builder *b, bi_index src0, bi_index src1)
   1004 {
   1005     return (bi_clper_v6_i32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   1006 }
   1007 
   1008 
   1009 static inline
   1010 bi_instr * bi_clz_u32_to(bi_builder *b, bi_index dest0, bi_index src0, bool mask)
   1011 {
   1012     bi_instr *I = rzalloc(b->shader, bi_instr);
   1013     I->op = BI_OPCODE_CLZ_U32;
   1014     I->dest[0] = dest0;
   1015     I->src[0] = src0;
   1016     I->mask = mask;
   1017     bi_builder_insert(&b->cursor, I);
   1018     return I;
   1019 }
   1020 
   1021 static inline
   1022 bi_index bi_clz_u32(bi_builder *b, bi_index src0, bool mask)
   1023 {
   1024     return (bi_clz_u32_to(b, bi_temp(b->shader), src0, mask))->dest[0];
   1025 }
   1026 
   1027 
   1028 static inline
   1029 bi_instr * bi_clz_v2u16_to(bi_builder *b, bi_index dest0, bi_index src0, bool mask)
   1030 {
   1031     bi_instr *I = rzalloc(b->shader, bi_instr);
   1032     I->op = BI_OPCODE_CLZ_V2U16;
   1033     I->dest[0] = dest0;
   1034     I->src[0] = src0;
   1035     I->mask = mask;
   1036     bi_builder_insert(&b->cursor, I);
   1037     return I;
   1038 }
   1039 
   1040 static inline
   1041 bi_index bi_clz_v2u16(bi_builder *b, bi_index src0, bool mask)
   1042 {
   1043     return (bi_clz_v2u16_to(b, bi_temp(b->shader), src0, mask))->dest[0];
   1044 }
   1045 
   1046 
   1047 static inline
   1048 bi_instr * bi_clz_v4u8_to(bi_builder *b, bi_index dest0, bi_index src0, bool mask)
   1049 {
   1050     bi_instr *I = rzalloc(b->shader, bi_instr);
   1051     I->op = BI_OPCODE_CLZ_V4U8;
   1052     I->dest[0] = dest0;
   1053     I->src[0] = src0;
   1054     I->mask = mask;
   1055     bi_builder_insert(&b->cursor, I);
   1056     return I;
   1057 }
   1058 
   1059 static inline
   1060 bi_index bi_clz_v4u8(bi_builder *b, bi_index src0, bool mask)
   1061 {
   1062     return (bi_clz_v4u8_to(b, bi_temp(b->shader), src0, mask))->dest[0];
   1063 }
   1064 
   1065 
   1066 static inline
   1067 bi_instr * bi_clz_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bool mask)
   1068 {
   1069     if (bitsize == 32)
   1070         return (bi_clz_u32_to(b, dest0, src0, mask));
   1071     else if (bitsize == 16)
   1072         return (bi_clz_v2u16_to(b, dest0, src0, mask));
   1073     else if (bitsize == 8)
   1074         return (bi_clz_v4u8_to(b, dest0, src0, mask));
   1075     else
   1076         unreachable("Invalid parameters for CLZ");
   1077 }
   1078 
   1079 static inline
   1080 bi_index bi_clz(bi_builder *b, unsigned bitsize, bi_index src0, bool mask)
   1081 {
   1082     if (bitsize == 32)
   1083         return (bi_clz_u32_to(b, bi_temp(b->shader), src0, mask))->dest[0];
   1084     else if (bitsize == 16)
   1085         return (bi_clz_v2u16_to(b, bi_temp(b->shader), src0, mask))->dest[0];
   1086     else if (bitsize == 8)
   1087         return (bi_clz_v4u8_to(b, bi_temp(b->shader), src0, mask))->dest[0];
   1088     else
   1089         unreachable("Invalid parameters for CLZ");
   1090 }
   1091 
   1092 static inline
   1093 bi_instr * bi_csel_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1094 {
   1095     bi_instr *I = rzalloc(b->shader, bi_instr);
   1096     I->op = BI_OPCODE_CSEL_F32;
   1097     I->dest[0] = dest0;
   1098     I->src[0] = src0;
   1099     I->src[1] = src1;
   1100     I->src[2] = src2;
   1101     I->src[3] = src3;
   1102     I->cmpf = cmpf;
   1103     bi_builder_insert(&b->cursor, I);
   1104     return I;
   1105 }
   1106 
   1107 static inline
   1108 bi_index bi_csel_f32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1109 {
   1110     return (bi_csel_f32_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1111 }
   1112 
   1113 
   1114 static inline
   1115 bi_instr * bi_csel_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1116 {
   1117     bi_instr *I = rzalloc(b->shader, bi_instr);
   1118     I->op = BI_OPCODE_CSEL_I32;
   1119     I->dest[0] = dest0;
   1120     I->src[0] = src0;
   1121     I->src[1] = src1;
   1122     I->src[2] = src2;
   1123     I->src[3] = src3;
   1124     I->cmpf = cmpf;
   1125     bi_builder_insert(&b->cursor, I);
   1126     return I;
   1127 }
   1128 
   1129 static inline
   1130 bi_index bi_csel_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1131 {
   1132     return (bi_csel_i32_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1133 }
   1134 
   1135 
   1136 static inline
   1137 bi_instr * bi_csel_s32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1138 {
   1139     bi_instr *I = rzalloc(b->shader, bi_instr);
   1140     I->op = BI_OPCODE_CSEL_S32;
   1141     I->dest[0] = dest0;
   1142     I->src[0] = src0;
   1143     I->src[1] = src1;
   1144     I->src[2] = src2;
   1145     I->src[3] = src3;
   1146     I->cmpf = cmpf;
   1147     bi_builder_insert(&b->cursor, I);
   1148     return I;
   1149 }
   1150 
   1151 static inline
   1152 bi_index bi_csel_s32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1153 {
   1154     return (bi_csel_s32_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1155 }
   1156 
   1157 
   1158 static inline
   1159 bi_instr * bi_csel_u32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1160 {
   1161     bi_instr *I = rzalloc(b->shader, bi_instr);
   1162     I->op = BI_OPCODE_CSEL_U32;
   1163     I->dest[0] = dest0;
   1164     I->src[0] = src0;
   1165     I->src[1] = src1;
   1166     I->src[2] = src2;
   1167     I->src[3] = src3;
   1168     I->cmpf = cmpf;
   1169     bi_builder_insert(&b->cursor, I);
   1170     return I;
   1171 }
   1172 
   1173 static inline
   1174 bi_index bi_csel_u32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1175 {
   1176     return (bi_csel_u32_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1177 }
   1178 
   1179 
   1180 static inline
   1181 bi_instr * bi_csel_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1182 {
   1183     bi_instr *I = rzalloc(b->shader, bi_instr);
   1184     I->op = BI_OPCODE_CSEL_V2F16;
   1185     I->dest[0] = dest0;
   1186     I->src[0] = src0;
   1187     I->src[1] = src1;
   1188     I->src[2] = src2;
   1189     I->src[3] = src3;
   1190     I->cmpf = cmpf;
   1191     bi_builder_insert(&b->cursor, I);
   1192     return I;
   1193 }
   1194 
   1195 static inline
   1196 bi_index bi_csel_v2f16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1197 {
   1198     return (bi_csel_v2f16_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1199 }
   1200 
   1201 
   1202 static inline
   1203 bi_instr * bi_csel_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1204 {
   1205     bi_instr *I = rzalloc(b->shader, bi_instr);
   1206     I->op = BI_OPCODE_CSEL_V2I16;
   1207     I->dest[0] = dest0;
   1208     I->src[0] = src0;
   1209     I->src[1] = src1;
   1210     I->src[2] = src2;
   1211     I->src[3] = src3;
   1212     I->cmpf = cmpf;
   1213     bi_builder_insert(&b->cursor, I);
   1214     return I;
   1215 }
   1216 
   1217 static inline
   1218 bi_index bi_csel_v2i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1219 {
   1220     return (bi_csel_v2i16_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1221 }
   1222 
   1223 
   1224 static inline
   1225 bi_instr * bi_csel_v2s16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1226 {
   1227     bi_instr *I = rzalloc(b->shader, bi_instr);
   1228     I->op = BI_OPCODE_CSEL_V2S16;
   1229     I->dest[0] = dest0;
   1230     I->src[0] = src0;
   1231     I->src[1] = src1;
   1232     I->src[2] = src2;
   1233     I->src[3] = src3;
   1234     I->cmpf = cmpf;
   1235     bi_builder_insert(&b->cursor, I);
   1236     return I;
   1237 }
   1238 
   1239 static inline
   1240 bi_index bi_csel_v2s16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1241 {
   1242     return (bi_csel_v2s16_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1243 }
   1244 
   1245 
   1246 static inline
   1247 bi_instr * bi_csel_v2u16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1248 {
   1249     bi_instr *I = rzalloc(b->shader, bi_instr);
   1250     I->op = BI_OPCODE_CSEL_V2U16;
   1251     I->dest[0] = dest0;
   1252     I->src[0] = src0;
   1253     I->src[1] = src1;
   1254     I->src[2] = src2;
   1255     I->src[3] = src3;
   1256     I->cmpf = cmpf;
   1257     bi_builder_insert(&b->cursor, I);
   1258     return I;
   1259 }
   1260 
   1261 static inline
   1262 bi_index bi_csel_v2u16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1263 {
   1264     return (bi_csel_v2u16_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1265 }
   1266 
   1267 
   1268 static inline
   1269 bi_instr * bi_csel_to(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1270 {
   1271     if ((type == nir_type_float) && bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1272         return (bi_csel_f32_to(b, dest0, src0, src1, src2, src3, cmpf));
   1273     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   1274         return (bi_csel_i32_to(b, dest0, src0, src1, src2, src3, cmpf));
   1275     else if ((type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1276         return (bi_csel_s32_to(b, dest0, src0, src1, src2, src3, cmpf));
   1277     else if ((type == nir_type_uint) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1278         return (bi_csel_u32_to(b, dest0, src0, src1, src2, src3, cmpf));
   1279     else if ((type == nir_type_float) && bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1280         return (bi_csel_v2f16_to(b, dest0, src0, src1, src2, src3, cmpf));
   1281     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   1282         return (bi_csel_v2i16_to(b, dest0, src0, src1, src2, src3, cmpf));
   1283     else if ((type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1284         return (bi_csel_v2s16_to(b, dest0, src0, src1, src2, src3, cmpf));
   1285     else if ((type == nir_type_uint) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1286         return (bi_csel_v2u16_to(b, dest0, src0, src1, src2, src3, cmpf));
   1287     else
   1288         unreachable("Invalid parameters for CSEL");
   1289 }
   1290 
   1291 static inline
   1292 bi_index bi_csel(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_cmpf cmpf)
   1293 {
   1294     if ((type == nir_type_float) && bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1295         return (bi_csel_f32_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1296     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   1297         return (bi_csel_i32_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1298     else if ((type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1299         return (bi_csel_s32_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1300     else if ((type == nir_type_uint) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1301         return (bi_csel_u32_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1302     else if ((type == nir_type_float) && bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1303         return (bi_csel_v2f16_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1304     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   1305         return (bi_csel_v2i16_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1306     else if ((type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1307         return (bi_csel_v2s16_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1308     else if ((type == nir_type_uint) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   1309         return (bi_csel_v2u16_to(b, bi_temp(b->shader), src0, src1, src2, src3, cmpf))->dest[0];
   1310     else
   1311         unreachable("Invalid parameters for CSEL");
   1312 }
   1313 
   1314 static inline
   1315 bi_instr * bi_cubeface_to(bi_builder *b, bi_index dest0, bi_index dest1, bi_index src0, bi_index src1, bi_index src2)
   1316 {
   1317     bi_instr *I = rzalloc(b->shader, bi_instr);
   1318     I->op = BI_OPCODE_CUBEFACE;
   1319     I->dest[0] = dest0;
   1320     I->dest[1] = dest1;
   1321     I->src[0] = src0;
   1322     I->src[1] = src1;
   1323     I->src[2] = src2;
   1324     bi_builder_insert(&b->cursor, I);
   1325     return I;
   1326 }
   1327 
   1328 
   1329 static inline
   1330 bi_instr * bi_cubeface1_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   1331 {
   1332     bi_instr *I = rzalloc(b->shader, bi_instr);
   1333     I->op = BI_OPCODE_CUBEFACE1;
   1334     I->dest[0] = dest0;
   1335     I->src[0] = src0;
   1336     I->src[1] = src1;
   1337     I->src[2] = src2;
   1338     bi_builder_insert(&b->cursor, I);
   1339     return I;
   1340 }
   1341 
   1342 static inline
   1343 bi_index bi_cubeface1(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   1344 {
   1345     return (bi_cubeface1_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   1346 }
   1347 
   1348 
   1349 static inline
   1350 bi_instr * bi_cubeface2_to(bi_builder *b, bi_index dest0, bi_index src0)
   1351 {
   1352     bi_instr *I = rzalloc(b->shader, bi_instr);
   1353     I->op = BI_OPCODE_CUBEFACE2;
   1354     I->dest[0] = dest0;
   1355     I->src[0] = src0;
   1356     bi_builder_insert(&b->cursor, I);
   1357     return I;
   1358 }
   1359 
   1360 static inline
   1361 bi_index bi_cubeface2(bi_builder *b, bi_index src0)
   1362 {
   1363     return (bi_cubeface2_to(b, bi_temp(b->shader), src0))->dest[0];
   1364 }
   1365 
   1366 
   1367 static inline
   1368 bi_instr * bi_cube_ssel_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   1369 {
   1370     bi_instr *I = rzalloc(b->shader, bi_instr);
   1371     I->op = BI_OPCODE_CUBE_SSEL;
   1372     I->dest[0] = dest0;
   1373     I->src[0] = src0;
   1374     I->src[1] = src1;
   1375     I->src[2] = src2;
   1376     bi_builder_insert(&b->cursor, I);
   1377     return I;
   1378 }
   1379 
   1380 static inline
   1381 bi_index bi_cube_ssel(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   1382 {
   1383     return (bi_cube_ssel_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   1384 }
   1385 
   1386 
   1387 static inline
   1388 bi_instr * bi_cube_tsel_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   1389 {
   1390     bi_instr *I = rzalloc(b->shader, bi_instr);
   1391     I->op = BI_OPCODE_CUBE_TSEL;
   1392     I->dest[0] = dest0;
   1393     I->src[0] = src0;
   1394     I->src[1] = src1;
   1395     I->src[2] = src2;
   1396     bi_builder_insert(&b->cursor, I);
   1397     return I;
   1398 }
   1399 
   1400 static inline
   1401 bi_index bi_cube_tsel(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   1402 {
   1403     return (bi_cube_tsel_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   1404 }
   1405 
   1406 
   1407 static inline
   1408 bi_instr * bi_discard_b32(bi_builder *b, bi_index src0)
   1409 {
   1410     bi_instr *I = rzalloc(b->shader, bi_instr);
   1411     I->op = BI_OPCODE_DISCARD_B32;
   1412     I->src[0] = src0;
   1413     bi_builder_insert(&b->cursor, I);
   1414     return I;
   1415 }
   1416 
   1417 
   1418 static inline
   1419 bi_instr * bi_discard_f32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf)
   1420 {
   1421     bi_instr *I = rzalloc(b->shader, bi_instr);
   1422     I->op = BI_OPCODE_DISCARD_F32;
   1423     I->src[0] = src0;
   1424     I->src[1] = src1;
   1425     I->cmpf = cmpf;
   1426     bi_builder_insert(&b->cursor, I);
   1427     return I;
   1428 }
   1429 
   1430 
   1431 static inline
   1432 bi_instr * bi_dtsel_imm_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_table table)
   1433 {
   1434     bi_instr *I = rzalloc(b->shader, bi_instr);
   1435     I->op = BI_OPCODE_DTSEL_IMM;
   1436     I->dest[0] = dest0;
   1437     I->src[0] = src0;
   1438     I->table = table;
   1439     bi_builder_insert(&b->cursor, I);
   1440     return I;
   1441 }
   1442 
   1443 static inline
   1444 bi_index bi_dtsel_imm(bi_builder *b, bi_index src0, enum bi_table table)
   1445 {
   1446     return (bi_dtsel_imm_to(b, bi_temp(b->shader), src0, table))->dest[0];
   1447 }
   1448 
   1449 
   1450 static inline
   1451 bi_instr * bi_f16_to_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   1452 {
   1453     bi_instr *I = rzalloc(b->shader, bi_instr);
   1454     I->op = BI_OPCODE_F16_TO_F32;
   1455     I->dest[0] = dest0;
   1456     I->src[0] = src0;
   1457     bi_builder_insert(&b->cursor, I);
   1458     return I;
   1459 }
   1460 
   1461 static inline
   1462 bi_index bi_f16_to_f32(bi_builder *b, bi_index src0)
   1463 {
   1464     return (bi_f16_to_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   1465 }
   1466 
   1467 
   1468 static inline
   1469 bi_instr * bi_f16_to_s32_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   1470 {
   1471     bi_instr *I = rzalloc(b->shader, bi_instr);
   1472     I->op = BI_OPCODE_F16_TO_S32;
   1473     I->dest[0] = dest0;
   1474     I->src[0] = src0;
   1475     I->round = round;
   1476     bi_builder_insert(&b->cursor, I);
   1477     return I;
   1478 }
   1479 
   1480 static inline
   1481 bi_index bi_f16_to_s32(bi_builder *b, bi_index src0, enum bi_round round)
   1482 {
   1483     return (bi_f16_to_s32_to(b, bi_temp(b->shader), src0, round))->dest[0];
   1484 }
   1485 
   1486 
   1487 static inline
   1488 bi_instr * bi_f16_to_u32_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   1489 {
   1490     bi_instr *I = rzalloc(b->shader, bi_instr);
   1491     I->op = BI_OPCODE_F16_TO_U32;
   1492     I->dest[0] = dest0;
   1493     I->src[0] = src0;
   1494     I->round = round;
   1495     bi_builder_insert(&b->cursor, I);
   1496     return I;
   1497 }
   1498 
   1499 static inline
   1500 bi_index bi_f16_to_u32(bi_builder *b, bi_index src0, enum bi_round round)
   1501 {
   1502     return (bi_f16_to_u32_to(b, bi_temp(b->shader), src0, round))->dest[0];
   1503 }
   1504 
   1505 
   1506 static inline
   1507 bi_instr * bi_f32_to_s32_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   1508 {
   1509     bi_instr *I = rzalloc(b->shader, bi_instr);
   1510     I->op = BI_OPCODE_F32_TO_S32;
   1511     I->dest[0] = dest0;
   1512     I->src[0] = src0;
   1513     I->round = round;
   1514     bi_builder_insert(&b->cursor, I);
   1515     return I;
   1516 }
   1517 
   1518 static inline
   1519 bi_index bi_f32_to_s32(bi_builder *b, bi_index src0, enum bi_round round)
   1520 {
   1521     return (bi_f32_to_s32_to(b, bi_temp(b->shader), src0, round))->dest[0];
   1522 }
   1523 
   1524 
   1525 static inline
   1526 bi_instr * bi_f32_to_u32_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   1527 {
   1528     bi_instr *I = rzalloc(b->shader, bi_instr);
   1529     I->op = BI_OPCODE_F32_TO_U32;
   1530     I->dest[0] = dest0;
   1531     I->src[0] = src0;
   1532     I->round = round;
   1533     bi_builder_insert(&b->cursor, I);
   1534     return I;
   1535 }
   1536 
   1537 static inline
   1538 bi_index bi_f32_to_u32(bi_builder *b, bi_index src0, enum bi_round round)
   1539 {
   1540     return (bi_f32_to_u32_to(b, bi_temp(b->shader), src0, round))->dest[0];
   1541 }
   1542 
   1543 
   1544 static inline
   1545 bi_instr * bi_fabsneg_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   1546 {
   1547     bi_instr *I = rzalloc(b->shader, bi_instr);
   1548     I->op = BI_OPCODE_FABSNEG_F32;
   1549     I->dest[0] = dest0;
   1550     I->src[0] = src0;
   1551     bi_builder_insert(&b->cursor, I);
   1552     return I;
   1553 }
   1554 
   1555 static inline
   1556 bi_index bi_fabsneg_f32(bi_builder *b, bi_index src0)
   1557 {
   1558     return (bi_fabsneg_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   1559 }
   1560 
   1561 
   1562 static inline
   1563 bi_instr * bi_fabsneg_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   1564 {
   1565     bi_instr *I = rzalloc(b->shader, bi_instr);
   1566     I->op = BI_OPCODE_FABSNEG_V2F16;
   1567     I->dest[0] = dest0;
   1568     I->src[0] = src0;
   1569     bi_builder_insert(&b->cursor, I);
   1570     return I;
   1571 }
   1572 
   1573 static inline
   1574 bi_index bi_fabsneg_v2f16(bi_builder *b, bi_index src0)
   1575 {
   1576     return (bi_fabsneg_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   1577 }
   1578 
   1579 
   1580 static inline
   1581 bi_instr * bi_fabsneg_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0)
   1582 {
   1583     if (bitsize == 32)
   1584         return (bi_fabsneg_f32_to(b, dest0, src0));
   1585     else if (bitsize == 16)
   1586         return (bi_fabsneg_v2f16_to(b, dest0, src0));
   1587     else
   1588         unreachable("Invalid parameters for FABSNEG");
   1589 }
   1590 
   1591 static inline
   1592 bi_index bi_fabsneg(bi_builder *b, unsigned bitsize, bi_index src0)
   1593 {
   1594     if (bitsize == 32)
   1595         return (bi_fabsneg_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   1596     else if (bitsize == 16)
   1597         return (bi_fabsneg_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   1598     else
   1599         unreachable("Invalid parameters for FABSNEG");
   1600 }
   1601 
   1602 static inline
   1603 bi_instr * bi_fadd_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   1604 {
   1605     bi_instr *I = rzalloc(b->shader, bi_instr);
   1606     I->op = BI_OPCODE_FADD_F32;
   1607     I->dest[0] = dest0;
   1608     I->src[0] = src0;
   1609     I->src[1] = src1;
   1610     I->round = round;
   1611     bi_builder_insert(&b->cursor, I);
   1612     return I;
   1613 }
   1614 
   1615 static inline
   1616 bi_index bi_fadd_f32(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   1617 {
   1618     return (bi_fadd_f32_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   1619 }
   1620 
   1621 
   1622 static inline
   1623 bi_instr * bi_fadd_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   1624 {
   1625     bi_instr *I = rzalloc(b->shader, bi_instr);
   1626     I->op = BI_OPCODE_FADD_V2F16;
   1627     I->dest[0] = dest0;
   1628     I->src[0] = src0;
   1629     I->src[1] = src1;
   1630     I->round = round;
   1631     bi_builder_insert(&b->cursor, I);
   1632     return I;
   1633 }
   1634 
   1635 static inline
   1636 bi_index bi_fadd_v2f16(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   1637 {
   1638     return (bi_fadd_v2f16_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   1639 }
   1640 
   1641 
   1642 static inline
   1643 bi_instr * bi_fadd_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   1644 {
   1645     if (bitsize == 32)
   1646         return (bi_fadd_f32_to(b, dest0, src0, src1, round));
   1647     else if (bitsize == 16)
   1648         return (bi_fadd_v2f16_to(b, dest0, src0, src1, round));
   1649     else
   1650         unreachable("Invalid parameters for FADD");
   1651 }
   1652 
   1653 static inline
   1654 bi_index bi_fadd(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, enum bi_round round)
   1655 {
   1656     if (bitsize == 32)
   1657         return (bi_fadd_f32_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   1658     else if (bitsize == 16)
   1659         return (bi_fadd_v2f16_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   1660     else
   1661         unreachable("Invalid parameters for FADD");
   1662 }
   1663 
   1664 static inline
   1665 bi_instr * bi_fadd_imm_f32_to(bi_builder *b, bi_index dest0, bi_index src0, uint32_t index)
   1666 {
   1667     bi_instr *I = rzalloc(b->shader, bi_instr);
   1668     I->op = BI_OPCODE_FADD_IMM_F32;
   1669     I->dest[0] = dest0;
   1670     I->src[0] = src0;
   1671     I->index = index;
   1672     bi_builder_insert(&b->cursor, I);
   1673     return I;
   1674 }
   1675 
   1676 static inline
   1677 bi_index bi_fadd_imm_f32(bi_builder *b, bi_index src0, uint32_t index)
   1678 {
   1679     return (bi_fadd_imm_f32_to(b, bi_temp(b->shader), src0, index))->dest[0];
   1680 }
   1681 
   1682 
   1683 static inline
   1684 bi_instr * bi_fadd_imm_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, uint32_t index)
   1685 {
   1686     bi_instr *I = rzalloc(b->shader, bi_instr);
   1687     I->op = BI_OPCODE_FADD_IMM_V2F16;
   1688     I->dest[0] = dest0;
   1689     I->src[0] = src0;
   1690     I->index = index;
   1691     bi_builder_insert(&b->cursor, I);
   1692     return I;
   1693 }
   1694 
   1695 static inline
   1696 bi_index bi_fadd_imm_v2f16(bi_builder *b, bi_index src0, uint32_t index)
   1697 {
   1698     return (bi_fadd_imm_v2f16_to(b, bi_temp(b->shader), src0, index))->dest[0];
   1699 }
   1700 
   1701 
   1702 static inline
   1703 bi_instr * bi_fadd_imm_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, uint32_t index)
   1704 {
   1705     if (bitsize == 32)
   1706         return (bi_fadd_imm_f32_to(b, dest0, src0, index));
   1707     else if (bitsize == 16)
   1708         return (bi_fadd_imm_v2f16_to(b, dest0, src0, index));
   1709     else
   1710         unreachable("Invalid parameters for FADD_IMM");
   1711 }
   1712 
   1713 static inline
   1714 bi_index bi_fadd_imm(bi_builder *b, unsigned bitsize, bi_index src0, uint32_t index)
   1715 {
   1716     if (bitsize == 32)
   1717         return (bi_fadd_imm_f32_to(b, bi_temp(b->shader), src0, index))->dest[0];
   1718     else if (bitsize == 16)
   1719         return (bi_fadd_imm_v2f16_to(b, bi_temp(b->shader), src0, index))->dest[0];
   1720     else
   1721         unreachable("Invalid parameters for FADD_IMM");
   1722 }
   1723 
   1724 static inline
   1725 bi_instr * bi_fadd_lscale_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   1726 {
   1727     bi_instr *I = rzalloc(b->shader, bi_instr);
   1728     I->op = BI_OPCODE_FADD_LSCALE_F32;
   1729     I->dest[0] = dest0;
   1730     I->src[0] = src0;
   1731     I->src[1] = src1;
   1732     bi_builder_insert(&b->cursor, I);
   1733     return I;
   1734 }
   1735 
   1736 static inline
   1737 bi_index bi_fadd_lscale_f32(bi_builder *b, bi_index src0, bi_index src1)
   1738 {
   1739     return (bi_fadd_lscale_f32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   1740 }
   1741 
   1742 
   1743 static inline
   1744 bi_instr * bi_fadd_rscale_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_round round, enum bi_special special)
   1745 {
   1746     bi_instr *I = rzalloc(b->shader, bi_instr);
   1747     I->op = BI_OPCODE_FADD_RSCALE_F32;
   1748     I->dest[0] = dest0;
   1749     I->src[0] = src0;
   1750     I->src[1] = src1;
   1751     I->src[2] = src2;
   1752     I->special = special;
   1753     I->round = round;
   1754     bi_builder_insert(&b->cursor, I);
   1755     return I;
   1756 }
   1757 
   1758 static inline
   1759 bi_index bi_fadd_rscale_f32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_round round, enum bi_special special)
   1760 {
   1761     return (bi_fadd_rscale_f32_to(b, bi_temp(b->shader), src0, src1, src2, round, special))->dest[0];
   1762 }
   1763 
   1764 
   1765 static inline
   1766 bi_instr * bi_fclamp_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   1767 {
   1768     bi_instr *I = rzalloc(b->shader, bi_instr);
   1769     I->op = BI_OPCODE_FCLAMP_F32;
   1770     I->dest[0] = dest0;
   1771     I->src[0] = src0;
   1772     bi_builder_insert(&b->cursor, I);
   1773     return I;
   1774 }
   1775 
   1776 static inline
   1777 bi_index bi_fclamp_f32(bi_builder *b, bi_index src0)
   1778 {
   1779     return (bi_fclamp_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   1780 }
   1781 
   1782 
   1783 static inline
   1784 bi_instr * bi_fclamp_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   1785 {
   1786     bi_instr *I = rzalloc(b->shader, bi_instr);
   1787     I->op = BI_OPCODE_FCLAMP_V2F16;
   1788     I->dest[0] = dest0;
   1789     I->src[0] = src0;
   1790     bi_builder_insert(&b->cursor, I);
   1791     return I;
   1792 }
   1793 
   1794 static inline
   1795 bi_index bi_fclamp_v2f16(bi_builder *b, bi_index src0)
   1796 {
   1797     return (bi_fclamp_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   1798 }
   1799 
   1800 
   1801 static inline
   1802 bi_instr * bi_fclamp_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0)
   1803 {
   1804     if (bitsize == 32)
   1805         return (bi_fclamp_f32_to(b, dest0, src0));
   1806     else if (bitsize == 16)
   1807         return (bi_fclamp_v2f16_to(b, dest0, src0));
   1808     else
   1809         unreachable("Invalid parameters for FCLAMP");
   1810 }
   1811 
   1812 static inline
   1813 bi_index bi_fclamp(bi_builder *b, unsigned bitsize, bi_index src0)
   1814 {
   1815     if (bitsize == 32)
   1816         return (bi_fclamp_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   1817     else if (bitsize == 16)
   1818         return (bi_fclamp_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   1819     else
   1820         unreachable("Invalid parameters for FCLAMP");
   1821 }
   1822 
   1823 static inline
   1824 bi_instr * bi_fcmp_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   1825 {
   1826     bi_instr *I = rzalloc(b->shader, bi_instr);
   1827     I->op = BI_OPCODE_FCMP_F32;
   1828     I->dest[0] = dest0;
   1829     I->src[0] = src0;
   1830     I->src[1] = src1;
   1831     I->cmpf = cmpf;
   1832     I->result_type = result_type;
   1833     bi_builder_insert(&b->cursor, I);
   1834     return I;
   1835 }
   1836 
   1837 static inline
   1838 bi_index bi_fcmp_f32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   1839 {
   1840     return (bi_fcmp_f32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   1841 }
   1842 
   1843 
   1844 static inline
   1845 bi_instr * bi_fcmp_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   1846 {
   1847     bi_instr *I = rzalloc(b->shader, bi_instr);
   1848     I->op = BI_OPCODE_FCMP_V2F16;
   1849     I->dest[0] = dest0;
   1850     I->src[0] = src0;
   1851     I->src[1] = src1;
   1852     I->cmpf = cmpf;
   1853     I->result_type = result_type;
   1854     bi_builder_insert(&b->cursor, I);
   1855     return I;
   1856 }
   1857 
   1858 static inline
   1859 bi_index bi_fcmp_v2f16(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   1860 {
   1861     return (bi_fcmp_v2f16_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   1862 }
   1863 
   1864 
   1865 static inline
   1866 bi_instr * bi_fcmp_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   1867 {
   1868     if (bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE || cmpf == BI_CMPF_GTLT || cmpf == BI_CMPF_TOTAL || cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE || cmpf == BI_CMPF_GTLT || cmpf == BI_CMPF_TOTAL))
   1869         return (bi_fcmp_f32_to(b, dest0, src0, src1, cmpf, result_type));
   1870     else if (bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE || cmpf == BI_CMPF_GTLT || cmpf == BI_CMPF_TOTAL || cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE || cmpf == BI_CMPF_GTLT || cmpf == BI_CMPF_TOTAL))
   1871         return (bi_fcmp_v2f16_to(b, dest0, src0, src1, cmpf, result_type));
   1872     else
   1873         unreachable("Invalid parameters for FCMP");
   1874 }
   1875 
   1876 static inline
   1877 bi_index bi_fcmp(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   1878 {
   1879     if (bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE || cmpf == BI_CMPF_GTLT || cmpf == BI_CMPF_TOTAL || cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE || cmpf == BI_CMPF_GTLT || cmpf == BI_CMPF_TOTAL))
   1880         return (bi_fcmp_f32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   1881     else if (bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE || cmpf == BI_CMPF_GTLT || cmpf == BI_CMPF_TOTAL || cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_NE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE || cmpf == BI_CMPF_GTLT || cmpf == BI_CMPF_TOTAL))
   1882         return (bi_fcmp_v2f16_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   1883     else
   1884         unreachable("Invalid parameters for FCMP");
   1885 }
   1886 
   1887 static inline
   1888 bi_instr * bi_fcos_table_u6_to(bi_builder *b, bi_index dest0, bi_index src0, bool offset)
   1889 {
   1890     bi_instr *I = rzalloc(b->shader, bi_instr);
   1891     I->op = BI_OPCODE_FCOS_TABLE_U6;
   1892     I->dest[0] = dest0;
   1893     I->src[0] = src0;
   1894     I->offset = offset;
   1895     bi_builder_insert(&b->cursor, I);
   1896     return I;
   1897 }
   1898 
   1899 static inline
   1900 bi_index bi_fcos_table_u6(bi_builder *b, bi_index src0, bool offset)
   1901 {
   1902     return (bi_fcos_table_u6_to(b, bi_temp(b->shader), src0, offset))->dest[0];
   1903 }
   1904 
   1905 
   1906 static inline
   1907 bi_instr * bi_fexp_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   1908 {
   1909     bi_instr *I = rzalloc(b->shader, bi_instr);
   1910     I->op = BI_OPCODE_FEXP_F32;
   1911     I->dest[0] = dest0;
   1912     I->src[0] = src0;
   1913     I->src[1] = src1;
   1914     bi_builder_insert(&b->cursor, I);
   1915     return I;
   1916 }
   1917 
   1918 static inline
   1919 bi_index bi_fexp_f32(bi_builder *b, bi_index src0, bi_index src1)
   1920 {
   1921     return (bi_fexp_f32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   1922 }
   1923 
   1924 
   1925 static inline
   1926 bi_instr * bi_fexp_table_u4_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_adj adj)
   1927 {
   1928     bi_instr *I = rzalloc(b->shader, bi_instr);
   1929     I->op = BI_OPCODE_FEXP_TABLE_U4;
   1930     I->dest[0] = dest0;
   1931     I->src[0] = src0;
   1932     I->adj = adj;
   1933     bi_builder_insert(&b->cursor, I);
   1934     return I;
   1935 }
   1936 
   1937 static inline
   1938 bi_index bi_fexp_table_u4(bi_builder *b, bi_index src0, enum bi_adj adj)
   1939 {
   1940     return (bi_fexp_table_u4_to(b, bi_temp(b->shader), src0, adj))->dest[0];
   1941 }
   1942 
   1943 
   1944 static inline
   1945 bi_instr * bi_flogd_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   1946 {
   1947     bi_instr *I = rzalloc(b->shader, bi_instr);
   1948     I->op = BI_OPCODE_FLOGD_F32;
   1949     I->dest[0] = dest0;
   1950     I->src[0] = src0;
   1951     bi_builder_insert(&b->cursor, I);
   1952     return I;
   1953 }
   1954 
   1955 static inline
   1956 bi_index bi_flogd_f32(bi_builder *b, bi_index src0)
   1957 {
   1958     return (bi_flogd_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   1959 }
   1960 
   1961 
   1962 static inline
   1963 bi_instr * bi_flog_table_f32_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_mode mode, enum bi_precision precision)
   1964 {
   1965     bi_instr *I = rzalloc(b->shader, bi_instr);
   1966     I->op = BI_OPCODE_FLOG_TABLE_F32;
   1967     I->dest[0] = dest0;
   1968     I->src[0] = src0;
   1969     I->mode = mode;
   1970     I->precision = precision;
   1971     bi_builder_insert(&b->cursor, I);
   1972     return I;
   1973 }
   1974 
   1975 static inline
   1976 bi_index bi_flog_table_f32(bi_builder *b, bi_index src0, enum bi_mode mode, enum bi_precision precision)
   1977 {
   1978     return (bi_flog_table_f32_to(b, bi_temp(b->shader), src0, mode, precision))->dest[0];
   1979 }
   1980 
   1981 
   1982 static inline
   1983 bi_instr * bi_flshift_double_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bool bytes2)
   1984 {
   1985     bi_instr *I = rzalloc(b->shader, bi_instr);
   1986     I->op = BI_OPCODE_FLSHIFT_DOUBLE_I32;
   1987     I->dest[0] = dest0;
   1988     I->src[0] = src0;
   1989     I->src[1] = src1;
   1990     I->src[2] = src2;
   1991     I->bytes2 = bytes2;
   1992     bi_builder_insert(&b->cursor, I);
   1993     return I;
   1994 }
   1995 
   1996 static inline
   1997 bi_index bi_flshift_double_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bool bytes2)
   1998 {
   1999     return (bi_flshift_double_i32_to(b, bi_temp(b->shader), src0, src1, src2, bytes2))->dest[0];
   2000 }
   2001 
   2002 
   2003 static inline
   2004 bi_instr * bi_fma_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_round round)
   2005 {
   2006     bi_instr *I = rzalloc(b->shader, bi_instr);
   2007     I->op = BI_OPCODE_FMA_F32;
   2008     I->dest[0] = dest0;
   2009     I->src[0] = src0;
   2010     I->src[1] = src1;
   2011     I->src[2] = src2;
   2012     I->round = round;
   2013     bi_builder_insert(&b->cursor, I);
   2014     return I;
   2015 }
   2016 
   2017 static inline
   2018 bi_index bi_fma_f32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_round round)
   2019 {
   2020     return (bi_fma_f32_to(b, bi_temp(b->shader), src0, src1, src2, round))->dest[0];
   2021 }
   2022 
   2023 
   2024 static inline
   2025 bi_instr * bi_fma_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_round round)
   2026 {
   2027     bi_instr *I = rzalloc(b->shader, bi_instr);
   2028     I->op = BI_OPCODE_FMA_V2F16;
   2029     I->dest[0] = dest0;
   2030     I->src[0] = src0;
   2031     I->src[1] = src1;
   2032     I->src[2] = src2;
   2033     I->round = round;
   2034     bi_builder_insert(&b->cursor, I);
   2035     return I;
   2036 }
   2037 
   2038 static inline
   2039 bi_index bi_fma_v2f16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_round round)
   2040 {
   2041     return (bi_fma_v2f16_to(b, bi_temp(b->shader), src0, src1, src2, round))->dest[0];
   2042 }
   2043 
   2044 
   2045 static inline
   2046 bi_instr * bi_fma_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_round round)
   2047 {
   2048     if (bitsize == 32)
   2049         return (bi_fma_f32_to(b, dest0, src0, src1, src2, round));
   2050     else if (bitsize == 16)
   2051         return (bi_fma_v2f16_to(b, dest0, src0, src1, src2, round));
   2052     else
   2053         unreachable("Invalid parameters for FMA");
   2054 }
   2055 
   2056 static inline
   2057 bi_index bi_fma(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, enum bi_round round)
   2058 {
   2059     if (bitsize == 32)
   2060         return (bi_fma_f32_to(b, bi_temp(b->shader), src0, src1, src2, round))->dest[0];
   2061     else if (bitsize == 16)
   2062         return (bi_fma_v2f16_to(b, bi_temp(b->shader), src0, src1, src2, round))->dest[0];
   2063     else
   2064         unreachable("Invalid parameters for FMA");
   2065 }
   2066 
   2067 static inline
   2068 bi_instr * bi_fmax_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   2069 {
   2070     bi_instr *I = rzalloc(b->shader, bi_instr);
   2071     I->op = BI_OPCODE_FMAX_F32;
   2072     I->dest[0] = dest0;
   2073     I->src[0] = src0;
   2074     I->src[1] = src1;
   2075     bi_builder_insert(&b->cursor, I);
   2076     return I;
   2077 }
   2078 
   2079 static inline
   2080 bi_index bi_fmax_f32(bi_builder *b, bi_index src0, bi_index src1)
   2081 {
   2082     return (bi_fmax_f32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2083 }
   2084 
   2085 
   2086 static inline
   2087 bi_instr * bi_fmax_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   2088 {
   2089     bi_instr *I = rzalloc(b->shader, bi_instr);
   2090     I->op = BI_OPCODE_FMAX_V2F16;
   2091     I->dest[0] = dest0;
   2092     I->src[0] = src0;
   2093     I->src[1] = src1;
   2094     bi_builder_insert(&b->cursor, I);
   2095     return I;
   2096 }
   2097 
   2098 static inline
   2099 bi_index bi_fmax_v2f16(bi_builder *b, bi_index src0, bi_index src1)
   2100 {
   2101     return (bi_fmax_v2f16_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2102 }
   2103 
   2104 
   2105 static inline
   2106 bi_instr * bi_fmax_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1)
   2107 {
   2108     if (bitsize == 32)
   2109         return (bi_fmax_f32_to(b, dest0, src0, src1));
   2110     else if (bitsize == 16)
   2111         return (bi_fmax_v2f16_to(b, dest0, src0, src1));
   2112     else
   2113         unreachable("Invalid parameters for FMAX");
   2114 }
   2115 
   2116 static inline
   2117 bi_index bi_fmax(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1)
   2118 {
   2119     if (bitsize == 32)
   2120         return (bi_fmax_f32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2121     else if (bitsize == 16)
   2122         return (bi_fmax_v2f16_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2123     else
   2124         unreachable("Invalid parameters for FMAX");
   2125 }
   2126 
   2127 static inline
   2128 bi_instr * bi_fma_rscale_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_round round, enum bi_special special)
   2129 {
   2130     bi_instr *I = rzalloc(b->shader, bi_instr);
   2131     I->op = BI_OPCODE_FMA_RSCALE_F32;
   2132     I->dest[0] = dest0;
   2133     I->src[0] = src0;
   2134     I->src[1] = src1;
   2135     I->src[2] = src2;
   2136     I->src[3] = src3;
   2137     I->round = round;
   2138     I->special = special;
   2139     bi_builder_insert(&b->cursor, I);
   2140     return I;
   2141 }
   2142 
   2143 static inline
   2144 bi_index bi_fma_rscale_f32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_round round, enum bi_special special)
   2145 {
   2146     return (bi_fma_rscale_f32_to(b, bi_temp(b->shader), src0, src1, src2, src3, round, special))->dest[0];
   2147 }
   2148 
   2149 
   2150 static inline
   2151 bi_instr * bi_fma_rscale_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_round round, enum bi_special special)
   2152 {
   2153     bi_instr *I = rzalloc(b->shader, bi_instr);
   2154     I->op = BI_OPCODE_FMA_RSCALE_V2F16;
   2155     I->dest[0] = dest0;
   2156     I->src[0] = src0;
   2157     I->src[1] = src1;
   2158     I->src[2] = src2;
   2159     I->src[3] = src3;
   2160     I->round = round;
   2161     I->special = special;
   2162     bi_builder_insert(&b->cursor, I);
   2163     return I;
   2164 }
   2165 
   2166 static inline
   2167 bi_index bi_fma_rscale_v2f16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_round round, enum bi_special special)
   2168 {
   2169     return (bi_fma_rscale_v2f16_to(b, bi_temp(b->shader), src0, src1, src2, src3, round, special))->dest[0];
   2170 }
   2171 
   2172 
   2173 static inline
   2174 bi_instr * bi_fma_rscale_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_round round, enum bi_special special)
   2175 {
   2176     if (bitsize == 32)
   2177         return (bi_fma_rscale_f32_to(b, dest0, src0, src1, src2, src3, round, special));
   2178     else if (bitsize == 16)
   2179         return (bi_fma_rscale_v2f16_to(b, dest0, src0, src1, src2, src3, round, special));
   2180     else
   2181         unreachable("Invalid parameters for FMA_RSCALE");
   2182 }
   2183 
   2184 static inline
   2185 bi_index bi_fma_rscale(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_round round, enum bi_special special)
   2186 {
   2187     if (bitsize == 32)
   2188         return (bi_fma_rscale_f32_to(b, bi_temp(b->shader), src0, src1, src2, src3, round, special))->dest[0];
   2189     else if (bitsize == 16)
   2190         return (bi_fma_rscale_v2f16_to(b, bi_temp(b->shader), src0, src1, src2, src3, round, special))->dest[0];
   2191     else
   2192         unreachable("Invalid parameters for FMA_RSCALE");
   2193 }
   2194 
   2195 static inline
   2196 bi_instr * bi_fmin_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   2197 {
   2198     bi_instr *I = rzalloc(b->shader, bi_instr);
   2199     I->op = BI_OPCODE_FMIN_F32;
   2200     I->dest[0] = dest0;
   2201     I->src[0] = src0;
   2202     I->src[1] = src1;
   2203     bi_builder_insert(&b->cursor, I);
   2204     return I;
   2205 }
   2206 
   2207 static inline
   2208 bi_index bi_fmin_f32(bi_builder *b, bi_index src0, bi_index src1)
   2209 {
   2210     return (bi_fmin_f32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2211 }
   2212 
   2213 
   2214 static inline
   2215 bi_instr * bi_fmin_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   2216 {
   2217     bi_instr *I = rzalloc(b->shader, bi_instr);
   2218     I->op = BI_OPCODE_FMIN_V2F16;
   2219     I->dest[0] = dest0;
   2220     I->src[0] = src0;
   2221     I->src[1] = src1;
   2222     bi_builder_insert(&b->cursor, I);
   2223     return I;
   2224 }
   2225 
   2226 static inline
   2227 bi_index bi_fmin_v2f16(bi_builder *b, bi_index src0, bi_index src1)
   2228 {
   2229     return (bi_fmin_v2f16_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2230 }
   2231 
   2232 
   2233 static inline
   2234 bi_instr * bi_fmin_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1)
   2235 {
   2236     if (bitsize == 32)
   2237         return (bi_fmin_f32_to(b, dest0, src0, src1));
   2238     else if (bitsize == 16)
   2239         return (bi_fmin_v2f16_to(b, dest0, src0, src1));
   2240     else
   2241         unreachable("Invalid parameters for FMIN");
   2242 }
   2243 
   2244 static inline
   2245 bi_index bi_fmin(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1)
   2246 {
   2247     if (bitsize == 32)
   2248         return (bi_fmin_f32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2249     else if (bitsize == 16)
   2250         return (bi_fmin_v2f16_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2251     else
   2252         unreachable("Invalid parameters for FMIN");
   2253 }
   2254 
   2255 static inline
   2256 bi_instr * bi_fmul_cslice_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   2257 {
   2258     bi_instr *I = rzalloc(b->shader, bi_instr);
   2259     I->op = BI_OPCODE_FMUL_CSLICE;
   2260     I->dest[0] = dest0;
   2261     I->src[0] = src0;
   2262     I->src[1] = src1;
   2263     bi_builder_insert(&b->cursor, I);
   2264     return I;
   2265 }
   2266 
   2267 static inline
   2268 bi_index bi_fmul_cslice(bi_builder *b, bi_index src0, bi_index src1)
   2269 {
   2270     return (bi_fmul_cslice_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2271 }
   2272 
   2273 
   2274 static inline
   2275 bi_instr * bi_fmul_slice_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   2276 {
   2277     bi_instr *I = rzalloc(b->shader, bi_instr);
   2278     I->op = BI_OPCODE_FMUL_SLICE_F32;
   2279     I->dest[0] = dest0;
   2280     I->src[0] = src0;
   2281     I->src[1] = src1;
   2282     bi_builder_insert(&b->cursor, I);
   2283     return I;
   2284 }
   2285 
   2286 static inline
   2287 bi_index bi_fmul_slice_f32(bi_builder *b, bi_index src0, bi_index src1)
   2288 {
   2289     return (bi_fmul_slice_f32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2290 }
   2291 
   2292 
   2293 static inline
   2294 bi_instr * bi_fpclass_f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   2295 {
   2296     bi_instr *I = rzalloc(b->shader, bi_instr);
   2297     I->op = BI_OPCODE_FPCLASS_F16;
   2298     I->dest[0] = dest0;
   2299     I->src[0] = src0;
   2300     bi_builder_insert(&b->cursor, I);
   2301     return I;
   2302 }
   2303 
   2304 static inline
   2305 bi_index bi_fpclass_f16(bi_builder *b, bi_index src0)
   2306 {
   2307     return (bi_fpclass_f16_to(b, bi_temp(b->shader), src0))->dest[0];
   2308 }
   2309 
   2310 
   2311 static inline
   2312 bi_instr * bi_fpclass_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   2313 {
   2314     bi_instr *I = rzalloc(b->shader, bi_instr);
   2315     I->op = BI_OPCODE_FPCLASS_F32;
   2316     I->dest[0] = dest0;
   2317     I->src[0] = src0;
   2318     bi_builder_insert(&b->cursor, I);
   2319     return I;
   2320 }
   2321 
   2322 static inline
   2323 bi_index bi_fpclass_f32(bi_builder *b, bi_index src0)
   2324 {
   2325     return (bi_fpclass_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   2326 }
   2327 
   2328 
   2329 static inline
   2330 bi_instr * bi_fpclass_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0)
   2331 {
   2332     if (bitsize == 16)
   2333         return (bi_fpclass_f16_to(b, dest0, src0));
   2334     else if (bitsize == 32)
   2335         return (bi_fpclass_f32_to(b, dest0, src0));
   2336     else
   2337         unreachable("Invalid parameters for FPCLASS");
   2338 }
   2339 
   2340 static inline
   2341 bi_index bi_fpclass(bi_builder *b, unsigned bitsize, bi_index src0)
   2342 {
   2343     if (bitsize == 16)
   2344         return (bi_fpclass_f16_to(b, bi_temp(b->shader), src0))->dest[0];
   2345     else if (bitsize == 32)
   2346         return (bi_fpclass_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   2347     else
   2348         unreachable("Invalid parameters for FPCLASS");
   2349 }
   2350 
   2351 static inline
   2352 bi_instr * bi_fpow_sc_apply_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   2353 {
   2354     bi_instr *I = rzalloc(b->shader, bi_instr);
   2355     I->op = BI_OPCODE_FPOW_SC_APPLY;
   2356     I->dest[0] = dest0;
   2357     I->src[0] = src0;
   2358     I->src[1] = src1;
   2359     bi_builder_insert(&b->cursor, I);
   2360     return I;
   2361 }
   2362 
   2363 static inline
   2364 bi_index bi_fpow_sc_apply(bi_builder *b, bi_index src0, bi_index src1)
   2365 {
   2366     return (bi_fpow_sc_apply_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2367 }
   2368 
   2369 
   2370 static inline
   2371 bi_instr * bi_fpow_sc_det_f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_func func)
   2372 {
   2373     bi_instr *I = rzalloc(b->shader, bi_instr);
   2374     I->op = BI_OPCODE_FPOW_SC_DET_F16;
   2375     I->dest[0] = dest0;
   2376     I->src[0] = src0;
   2377     I->src[1] = src1;
   2378     I->func = func;
   2379     bi_builder_insert(&b->cursor, I);
   2380     return I;
   2381 }
   2382 
   2383 static inline
   2384 bi_index bi_fpow_sc_det_f16(bi_builder *b, bi_index src0, bi_index src1, enum bi_func func)
   2385 {
   2386     return (bi_fpow_sc_det_f16_to(b, bi_temp(b->shader), src0, src1, func))->dest[0];
   2387 }
   2388 
   2389 
   2390 static inline
   2391 bi_instr * bi_fpow_sc_det_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_func func)
   2392 {
   2393     bi_instr *I = rzalloc(b->shader, bi_instr);
   2394     I->op = BI_OPCODE_FPOW_SC_DET_F32;
   2395     I->dest[0] = dest0;
   2396     I->src[0] = src0;
   2397     I->src[1] = src1;
   2398     I->func = func;
   2399     bi_builder_insert(&b->cursor, I);
   2400     return I;
   2401 }
   2402 
   2403 static inline
   2404 bi_index bi_fpow_sc_det_f32(bi_builder *b, bi_index src0, bi_index src1, enum bi_func func)
   2405 {
   2406     return (bi_fpow_sc_det_f32_to(b, bi_temp(b->shader), src0, src1, func))->dest[0];
   2407 }
   2408 
   2409 
   2410 static inline
   2411 bi_instr * bi_fpow_sc_det_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, enum bi_func func)
   2412 {
   2413     if (bitsize == 16)
   2414         return (bi_fpow_sc_det_f16_to(b, dest0, src0, src1, func));
   2415     else if (bitsize == 32)
   2416         return (bi_fpow_sc_det_f32_to(b, dest0, src0, src1, func));
   2417     else
   2418         unreachable("Invalid parameters for FPOW_SC_DET");
   2419 }
   2420 
   2421 static inline
   2422 bi_index bi_fpow_sc_det(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, enum bi_func func)
   2423 {
   2424     if (bitsize == 16)
   2425         return (bi_fpow_sc_det_f16_to(b, bi_temp(b->shader), src0, src1, func))->dest[0];
   2426     else if (bitsize == 32)
   2427         return (bi_fpow_sc_det_f32_to(b, bi_temp(b->shader), src0, src1, func))->dest[0];
   2428     else
   2429         unreachable("Invalid parameters for FPOW_SC_DET");
   2430 }
   2431 
   2432 static inline
   2433 bi_instr * bi_frcp_f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   2434 {
   2435     bi_instr *I = rzalloc(b->shader, bi_instr);
   2436     I->op = BI_OPCODE_FRCP_F16;
   2437     I->dest[0] = dest0;
   2438     I->src[0] = src0;
   2439     bi_builder_insert(&b->cursor, I);
   2440     return I;
   2441 }
   2442 
   2443 static inline
   2444 bi_index bi_frcp_f16(bi_builder *b, bi_index src0)
   2445 {
   2446     return (bi_frcp_f16_to(b, bi_temp(b->shader), src0))->dest[0];
   2447 }
   2448 
   2449 
   2450 static inline
   2451 bi_instr * bi_frcp_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   2452 {
   2453     bi_instr *I = rzalloc(b->shader, bi_instr);
   2454     I->op = BI_OPCODE_FRCP_F32;
   2455     I->dest[0] = dest0;
   2456     I->src[0] = src0;
   2457     bi_builder_insert(&b->cursor, I);
   2458     return I;
   2459 }
   2460 
   2461 static inline
   2462 bi_index bi_frcp_f32(bi_builder *b, bi_index src0)
   2463 {
   2464     return (bi_frcp_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   2465 }
   2466 
   2467 
   2468 static inline
   2469 bi_instr * bi_frcp_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0)
   2470 {
   2471     if (bitsize == 16)
   2472         return (bi_frcp_f16_to(b, dest0, src0));
   2473     else if (bitsize == 32)
   2474         return (bi_frcp_f32_to(b, dest0, src0));
   2475     else
   2476         unreachable("Invalid parameters for FRCP");
   2477 }
   2478 
   2479 static inline
   2480 bi_index bi_frcp(bi_builder *b, unsigned bitsize, bi_index src0)
   2481 {
   2482     if (bitsize == 16)
   2483         return (bi_frcp_f16_to(b, bi_temp(b->shader), src0))->dest[0];
   2484     else if (bitsize == 32)
   2485         return (bi_frcp_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   2486     else
   2487         unreachable("Invalid parameters for FRCP");
   2488 }
   2489 
   2490 static inline
   2491 bi_instr * bi_frcp_approx_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   2492 {
   2493     bi_instr *I = rzalloc(b->shader, bi_instr);
   2494     I->op = BI_OPCODE_FRCP_APPROX_F32;
   2495     I->dest[0] = dest0;
   2496     I->src[0] = src0;
   2497     bi_builder_insert(&b->cursor, I);
   2498     return I;
   2499 }
   2500 
   2501 static inline
   2502 bi_index bi_frcp_approx_f32(bi_builder *b, bi_index src0)
   2503 {
   2504     return (bi_frcp_approx_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   2505 }
   2506 
   2507 
   2508 static inline
   2509 bi_instr * bi_frexpe_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bool log, bool sqrt)
   2510 {
   2511     bi_instr *I = rzalloc(b->shader, bi_instr);
   2512     I->op = BI_OPCODE_FREXPE_F32;
   2513     I->dest[0] = dest0;
   2514     I->src[0] = src0;
   2515     I->sqrt = sqrt;
   2516     I->log = log;
   2517     bi_builder_insert(&b->cursor, I);
   2518     return I;
   2519 }
   2520 
   2521 static inline
   2522 bi_index bi_frexpe_f32(bi_builder *b, bi_index src0, bool log, bool sqrt)
   2523 {
   2524     return (bi_frexpe_f32_to(b, bi_temp(b->shader), src0, log, sqrt))->dest[0];
   2525 }
   2526 
   2527 
   2528 static inline
   2529 bi_instr * bi_frexpe_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bool log, bool sqrt)
   2530 {
   2531     bi_instr *I = rzalloc(b->shader, bi_instr);
   2532     I->op = BI_OPCODE_FREXPE_V2F16;
   2533     I->dest[0] = dest0;
   2534     I->src[0] = src0;
   2535     I->sqrt = sqrt;
   2536     I->log = log;
   2537     bi_builder_insert(&b->cursor, I);
   2538     return I;
   2539 }
   2540 
   2541 static inline
   2542 bi_index bi_frexpe_v2f16(bi_builder *b, bi_index src0, bool log, bool sqrt)
   2543 {
   2544     return (bi_frexpe_v2f16_to(b, bi_temp(b->shader), src0, log, sqrt))->dest[0];
   2545 }
   2546 
   2547 
   2548 static inline
   2549 bi_instr * bi_frexpe_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bool log, bool sqrt)
   2550 {
   2551     if (bitsize == 32)
   2552         return (bi_frexpe_f32_to(b, dest0, src0, log, sqrt));
   2553     else if (bitsize == 16)
   2554         return (bi_frexpe_v2f16_to(b, dest0, src0, log, sqrt));
   2555     else
   2556         unreachable("Invalid parameters for FREXPE");
   2557 }
   2558 
   2559 static inline
   2560 bi_index bi_frexpe(bi_builder *b, unsigned bitsize, bi_index src0, bool log, bool sqrt)
   2561 {
   2562     if (bitsize == 32)
   2563         return (bi_frexpe_f32_to(b, bi_temp(b->shader), src0, log, sqrt))->dest[0];
   2564     else if (bitsize == 16)
   2565         return (bi_frexpe_v2f16_to(b, bi_temp(b->shader), src0, log, sqrt))->dest[0];
   2566     else
   2567         unreachable("Invalid parameters for FREXPE");
   2568 }
   2569 
   2570 static inline
   2571 bi_instr * bi_frexpm_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bool log, bool sqrt)
   2572 {
   2573     bi_instr *I = rzalloc(b->shader, bi_instr);
   2574     I->op = BI_OPCODE_FREXPM_F32;
   2575     I->dest[0] = dest0;
   2576     I->src[0] = src0;
   2577     I->sqrt = sqrt;
   2578     I->log = log;
   2579     bi_builder_insert(&b->cursor, I);
   2580     return I;
   2581 }
   2582 
   2583 static inline
   2584 bi_index bi_frexpm_f32(bi_builder *b, bi_index src0, bool log, bool sqrt)
   2585 {
   2586     return (bi_frexpm_f32_to(b, bi_temp(b->shader), src0, log, sqrt))->dest[0];
   2587 }
   2588 
   2589 
   2590 static inline
   2591 bi_instr * bi_frexpm_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bool log, bool sqrt)
   2592 {
   2593     bi_instr *I = rzalloc(b->shader, bi_instr);
   2594     I->op = BI_OPCODE_FREXPM_V2F16;
   2595     I->dest[0] = dest0;
   2596     I->src[0] = src0;
   2597     I->sqrt = sqrt;
   2598     I->log = log;
   2599     bi_builder_insert(&b->cursor, I);
   2600     return I;
   2601 }
   2602 
   2603 static inline
   2604 bi_index bi_frexpm_v2f16(bi_builder *b, bi_index src0, bool log, bool sqrt)
   2605 {
   2606     return (bi_frexpm_v2f16_to(b, bi_temp(b->shader), src0, log, sqrt))->dest[0];
   2607 }
   2608 
   2609 
   2610 static inline
   2611 bi_instr * bi_frexpm_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bool log, bool sqrt)
   2612 {
   2613     if (bitsize == 32)
   2614         return (bi_frexpm_f32_to(b, dest0, src0, log, sqrt));
   2615     else if (bitsize == 16)
   2616         return (bi_frexpm_v2f16_to(b, dest0, src0, log, sqrt));
   2617     else
   2618         unreachable("Invalid parameters for FREXPM");
   2619 }
   2620 
   2621 static inline
   2622 bi_index bi_frexpm(bi_builder *b, unsigned bitsize, bi_index src0, bool log, bool sqrt)
   2623 {
   2624     if (bitsize == 32)
   2625         return (bi_frexpm_f32_to(b, bi_temp(b->shader), src0, log, sqrt))->dest[0];
   2626     else if (bitsize == 16)
   2627         return (bi_frexpm_v2f16_to(b, bi_temp(b->shader), src0, log, sqrt))->dest[0];
   2628     else
   2629         unreachable("Invalid parameters for FREXPM");
   2630 }
   2631 
   2632 static inline
   2633 bi_instr * bi_fround_f32_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   2634 {
   2635     bi_instr *I = rzalloc(b->shader, bi_instr);
   2636     I->op = BI_OPCODE_FROUND_F32;
   2637     I->dest[0] = dest0;
   2638     I->src[0] = src0;
   2639     I->round = round;
   2640     bi_builder_insert(&b->cursor, I);
   2641     return I;
   2642 }
   2643 
   2644 static inline
   2645 bi_index bi_fround_f32(bi_builder *b, bi_index src0, enum bi_round round)
   2646 {
   2647     return (bi_fround_f32_to(b, bi_temp(b->shader), src0, round))->dest[0];
   2648 }
   2649 
   2650 
   2651 static inline
   2652 bi_instr * bi_fround_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   2653 {
   2654     bi_instr *I = rzalloc(b->shader, bi_instr);
   2655     I->op = BI_OPCODE_FROUND_V2F16;
   2656     I->dest[0] = dest0;
   2657     I->src[0] = src0;
   2658     I->round = round;
   2659     bi_builder_insert(&b->cursor, I);
   2660     return I;
   2661 }
   2662 
   2663 static inline
   2664 bi_index bi_fround_v2f16(bi_builder *b, bi_index src0, enum bi_round round)
   2665 {
   2666     return (bi_fround_v2f16_to(b, bi_temp(b->shader), src0, round))->dest[0];
   2667 }
   2668 
   2669 
   2670 static inline
   2671 bi_instr * bi_fround_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, enum bi_round round)
   2672 {
   2673     if (bitsize == 32)
   2674         return (bi_fround_f32_to(b, dest0, src0, round));
   2675     else if (bitsize == 16)
   2676         return (bi_fround_v2f16_to(b, dest0, src0, round));
   2677     else
   2678         unreachable("Invalid parameters for FROUND");
   2679 }
   2680 
   2681 static inline
   2682 bi_index bi_fround(bi_builder *b, unsigned bitsize, bi_index src0, enum bi_round round)
   2683 {
   2684     if (bitsize == 32)
   2685         return (bi_fround_f32_to(b, bi_temp(b->shader), src0, round))->dest[0];
   2686     else if (bitsize == 16)
   2687         return (bi_fround_v2f16_to(b, bi_temp(b->shader), src0, round))->dest[0];
   2688     else
   2689         unreachable("Invalid parameters for FROUND");
   2690 }
   2691 
   2692 static inline
   2693 bi_instr * bi_frscale_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   2694 {
   2695     bi_instr *I = rzalloc(b->shader, bi_instr);
   2696     I->op = BI_OPCODE_FRSCALE_F32;
   2697     I->dest[0] = dest0;
   2698     I->src[0] = src0;
   2699     I->src[1] = src1;
   2700     bi_builder_insert(&b->cursor, I);
   2701     return I;
   2702 }
   2703 
   2704 static inline
   2705 bi_index bi_frscale_f32(bi_builder *b, bi_index src0, bi_index src1)
   2706 {
   2707     return (bi_frscale_f32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2708 }
   2709 
   2710 
   2711 static inline
   2712 bi_instr * bi_frscale_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   2713 {
   2714     bi_instr *I = rzalloc(b->shader, bi_instr);
   2715     I->op = BI_OPCODE_FRSCALE_V2F16;
   2716     I->dest[0] = dest0;
   2717     I->src[0] = src0;
   2718     I->src[1] = src1;
   2719     bi_builder_insert(&b->cursor, I);
   2720     return I;
   2721 }
   2722 
   2723 static inline
   2724 bi_index bi_frscale_v2f16(bi_builder *b, bi_index src0, bi_index src1)
   2725 {
   2726     return (bi_frscale_v2f16_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2727 }
   2728 
   2729 
   2730 static inline
   2731 bi_instr * bi_frscale_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1)
   2732 {
   2733     if (bitsize == 32)
   2734         return (bi_frscale_f32_to(b, dest0, src0, src1));
   2735     else if (bitsize == 16)
   2736         return (bi_frscale_v2f16_to(b, dest0, src0, src1));
   2737     else
   2738         unreachable("Invalid parameters for FRSCALE");
   2739 }
   2740 
   2741 static inline
   2742 bi_index bi_frscale(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1)
   2743 {
   2744     if (bitsize == 32)
   2745         return (bi_frscale_f32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2746     else if (bitsize == 16)
   2747         return (bi_frscale_v2f16_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   2748     else
   2749         unreachable("Invalid parameters for FRSCALE");
   2750 }
   2751 
   2752 static inline
   2753 bi_instr * bi_frshift_double_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bool bytes2)
   2754 {
   2755     bi_instr *I = rzalloc(b->shader, bi_instr);
   2756     I->op = BI_OPCODE_FRSHIFT_DOUBLE_I32;
   2757     I->dest[0] = dest0;
   2758     I->src[0] = src0;
   2759     I->src[1] = src1;
   2760     I->src[2] = src2;
   2761     I->bytes2 = bytes2;
   2762     bi_builder_insert(&b->cursor, I);
   2763     return I;
   2764 }
   2765 
   2766 static inline
   2767 bi_index bi_frshift_double_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bool bytes2)
   2768 {
   2769     return (bi_frshift_double_i32_to(b, bi_temp(b->shader), src0, src1, src2, bytes2))->dest[0];
   2770 }
   2771 
   2772 
   2773 static inline
   2774 bi_instr * bi_frsq_f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   2775 {
   2776     bi_instr *I = rzalloc(b->shader, bi_instr);
   2777     I->op = BI_OPCODE_FRSQ_F16;
   2778     I->dest[0] = dest0;
   2779     I->src[0] = src0;
   2780     bi_builder_insert(&b->cursor, I);
   2781     return I;
   2782 }
   2783 
   2784 static inline
   2785 bi_index bi_frsq_f16(bi_builder *b, bi_index src0)
   2786 {
   2787     return (bi_frsq_f16_to(b, bi_temp(b->shader), src0))->dest[0];
   2788 }
   2789 
   2790 
   2791 static inline
   2792 bi_instr * bi_frsq_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   2793 {
   2794     bi_instr *I = rzalloc(b->shader, bi_instr);
   2795     I->op = BI_OPCODE_FRSQ_F32;
   2796     I->dest[0] = dest0;
   2797     I->src[0] = src0;
   2798     bi_builder_insert(&b->cursor, I);
   2799     return I;
   2800 }
   2801 
   2802 static inline
   2803 bi_index bi_frsq_f32(bi_builder *b, bi_index src0)
   2804 {
   2805     return (bi_frsq_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   2806 }
   2807 
   2808 
   2809 static inline
   2810 bi_instr * bi_frsq_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0)
   2811 {
   2812     if (bitsize == 16)
   2813         return (bi_frsq_f16_to(b, dest0, src0));
   2814     else if (bitsize == 32)
   2815         return (bi_frsq_f32_to(b, dest0, src0));
   2816     else
   2817         unreachable("Invalid parameters for FRSQ");
   2818 }
   2819 
   2820 static inline
   2821 bi_index bi_frsq(bi_builder *b, unsigned bitsize, bi_index src0)
   2822 {
   2823     if (bitsize == 16)
   2824         return (bi_frsq_f16_to(b, bi_temp(b->shader), src0))->dest[0];
   2825     else if (bitsize == 32)
   2826         return (bi_frsq_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   2827     else
   2828         unreachable("Invalid parameters for FRSQ");
   2829 }
   2830 
   2831 static inline
   2832 bi_instr * bi_frsq_approx_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   2833 {
   2834     bi_instr *I = rzalloc(b->shader, bi_instr);
   2835     I->op = BI_OPCODE_FRSQ_APPROX_F32;
   2836     I->dest[0] = dest0;
   2837     I->src[0] = src0;
   2838     bi_builder_insert(&b->cursor, I);
   2839     return I;
   2840 }
   2841 
   2842 static inline
   2843 bi_index bi_frsq_approx_f32(bi_builder *b, bi_index src0)
   2844 {
   2845     return (bi_frsq_approx_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   2846 }
   2847 
   2848 
   2849 static inline
   2850 bi_instr * bi_fsincos_offset_u6_to(bi_builder *b, bi_index dest0, bi_index src0, bool scale)
   2851 {
   2852     bi_instr *I = rzalloc(b->shader, bi_instr);
   2853     I->op = BI_OPCODE_FSINCOS_OFFSET_U6;
   2854     I->dest[0] = dest0;
   2855     I->src[0] = src0;
   2856     I->scale = scale;
   2857     bi_builder_insert(&b->cursor, I);
   2858     return I;
   2859 }
   2860 
   2861 static inline
   2862 bi_index bi_fsincos_offset_u6(bi_builder *b, bi_index src0, bool scale)
   2863 {
   2864     return (bi_fsincos_offset_u6_to(b, bi_temp(b->shader), src0, scale))->dest[0];
   2865 }
   2866 
   2867 
   2868 static inline
   2869 bi_instr * bi_fsin_table_u6_to(bi_builder *b, bi_index dest0, bi_index src0, bool offset)
   2870 {
   2871     bi_instr *I = rzalloc(b->shader, bi_instr);
   2872     I->op = BI_OPCODE_FSIN_TABLE_U6;
   2873     I->dest[0] = dest0;
   2874     I->src[0] = src0;
   2875     I->offset = offset;
   2876     bi_builder_insert(&b->cursor, I);
   2877     return I;
   2878 }
   2879 
   2880 static inline
   2881 bi_index bi_fsin_table_u6(bi_builder *b, bi_index src0, bool offset)
   2882 {
   2883     return (bi_fsin_table_u6_to(b, bi_temp(b->shader), src0, offset))->dest[0];
   2884 }
   2885 
   2886 
   2887 static inline
   2888 bi_instr * bi_hadd_s32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   2889 {
   2890     bi_instr *I = rzalloc(b->shader, bi_instr);
   2891     I->op = BI_OPCODE_HADD_S32;
   2892     I->dest[0] = dest0;
   2893     I->src[0] = src0;
   2894     I->src[1] = src1;
   2895     I->round = round;
   2896     bi_builder_insert(&b->cursor, I);
   2897     return I;
   2898 }
   2899 
   2900 static inline
   2901 bi_index bi_hadd_s32(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   2902 {
   2903     return (bi_hadd_s32_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   2904 }
   2905 
   2906 
   2907 static inline
   2908 bi_instr * bi_hadd_u32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   2909 {
   2910     bi_instr *I = rzalloc(b->shader, bi_instr);
   2911     I->op = BI_OPCODE_HADD_U32;
   2912     I->dest[0] = dest0;
   2913     I->src[0] = src0;
   2914     I->src[1] = src1;
   2915     I->round = round;
   2916     bi_builder_insert(&b->cursor, I);
   2917     return I;
   2918 }
   2919 
   2920 static inline
   2921 bi_index bi_hadd_u32(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   2922 {
   2923     return (bi_hadd_u32_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   2924 }
   2925 
   2926 
   2927 static inline
   2928 bi_instr * bi_hadd_v2s16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   2929 {
   2930     bi_instr *I = rzalloc(b->shader, bi_instr);
   2931     I->op = BI_OPCODE_HADD_V2S16;
   2932     I->dest[0] = dest0;
   2933     I->src[0] = src0;
   2934     I->src[1] = src1;
   2935     I->round = round;
   2936     bi_builder_insert(&b->cursor, I);
   2937     return I;
   2938 }
   2939 
   2940 static inline
   2941 bi_index bi_hadd_v2s16(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   2942 {
   2943     return (bi_hadd_v2s16_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   2944 }
   2945 
   2946 
   2947 static inline
   2948 bi_instr * bi_hadd_v2u16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   2949 {
   2950     bi_instr *I = rzalloc(b->shader, bi_instr);
   2951     I->op = BI_OPCODE_HADD_V2U16;
   2952     I->dest[0] = dest0;
   2953     I->src[0] = src0;
   2954     I->src[1] = src1;
   2955     I->round = round;
   2956     bi_builder_insert(&b->cursor, I);
   2957     return I;
   2958 }
   2959 
   2960 static inline
   2961 bi_index bi_hadd_v2u16(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   2962 {
   2963     return (bi_hadd_v2u16_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   2964 }
   2965 
   2966 
   2967 static inline
   2968 bi_instr * bi_hadd_v4s8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   2969 {
   2970     bi_instr *I = rzalloc(b->shader, bi_instr);
   2971     I->op = BI_OPCODE_HADD_V4S8;
   2972     I->dest[0] = dest0;
   2973     I->src[0] = src0;
   2974     I->src[1] = src1;
   2975     I->round = round;
   2976     bi_builder_insert(&b->cursor, I);
   2977     return I;
   2978 }
   2979 
   2980 static inline
   2981 bi_index bi_hadd_v4s8(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   2982 {
   2983     return (bi_hadd_v4s8_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   2984 }
   2985 
   2986 
   2987 static inline
   2988 bi_instr * bi_hadd_v4u8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   2989 {
   2990     bi_instr *I = rzalloc(b->shader, bi_instr);
   2991     I->op = BI_OPCODE_HADD_V4U8;
   2992     I->dest[0] = dest0;
   2993     I->src[0] = src0;
   2994     I->src[1] = src1;
   2995     I->round = round;
   2996     bi_builder_insert(&b->cursor, I);
   2997     return I;
   2998 }
   2999 
   3000 static inline
   3001 bi_index bi_hadd_v4u8(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   3002 {
   3003     return (bi_hadd_v4u8_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   3004 }
   3005 
   3006 
   3007 static inline
   3008 bi_instr * bi_hadd_to(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   3009 {
   3010     if ((type == nir_type_int) && bitsize == 32)
   3011         return (bi_hadd_s32_to(b, dest0, src0, src1, round));
   3012     else if ((type == nir_type_uint) && bitsize == 32)
   3013         return (bi_hadd_u32_to(b, dest0, src0, src1, round));
   3014     else if ((type == nir_type_int) && bitsize == 16)
   3015         return (bi_hadd_v2s16_to(b, dest0, src0, src1, round));
   3016     else if ((type == nir_type_uint) && bitsize == 16)
   3017         return (bi_hadd_v2u16_to(b, dest0, src0, src1, round));
   3018     else if ((type == nir_type_int) && bitsize == 8)
   3019         return (bi_hadd_v4s8_to(b, dest0, src0, src1, round));
   3020     else if ((type == nir_type_uint) && bitsize == 8)
   3021         return (bi_hadd_v4u8_to(b, dest0, src0, src1, round));
   3022     else
   3023         unreachable("Invalid parameters for HADD");
   3024 }
   3025 
   3026 static inline
   3027 bi_index bi_hadd(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index src0, bi_index src1, enum bi_round round)
   3028 {
   3029     if ((type == nir_type_int) && bitsize == 32)
   3030         return (bi_hadd_s32_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   3031     else if ((type == nir_type_uint) && bitsize == 32)
   3032         return (bi_hadd_u32_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   3033     else if ((type == nir_type_int) && bitsize == 16)
   3034         return (bi_hadd_v2s16_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   3035     else if ((type == nir_type_uint) && bitsize == 16)
   3036         return (bi_hadd_v2u16_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   3037     else if ((type == nir_type_int) && bitsize == 8)
   3038         return (bi_hadd_v4s8_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   3039     else if ((type == nir_type_uint) && bitsize == 8)
   3040         return (bi_hadd_v4u8_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   3041     else
   3042         unreachable("Invalid parameters for HADD");
   3043 }
   3044 
   3045 static inline
   3046 bi_instr * bi_iabs_s32_to(bi_builder *b, bi_index dest0, bi_index src0)
   3047 {
   3048     bi_instr *I = rzalloc(b->shader, bi_instr);
   3049     I->op = BI_OPCODE_IABS_S32;
   3050     I->dest[0] = dest0;
   3051     I->src[0] = src0;
   3052     bi_builder_insert(&b->cursor, I);
   3053     return I;
   3054 }
   3055 
   3056 static inline
   3057 bi_index bi_iabs_s32(bi_builder *b, bi_index src0)
   3058 {
   3059     return (bi_iabs_s32_to(b, bi_temp(b->shader), src0))->dest[0];
   3060 }
   3061 
   3062 
   3063 static inline
   3064 bi_instr * bi_iabs_v2s16_to(bi_builder *b, bi_index dest0, bi_index src0)
   3065 {
   3066     bi_instr *I = rzalloc(b->shader, bi_instr);
   3067     I->op = BI_OPCODE_IABS_V2S16;
   3068     I->dest[0] = dest0;
   3069     I->src[0] = src0;
   3070     bi_builder_insert(&b->cursor, I);
   3071     return I;
   3072 }
   3073 
   3074 static inline
   3075 bi_index bi_iabs_v2s16(bi_builder *b, bi_index src0)
   3076 {
   3077     return (bi_iabs_v2s16_to(b, bi_temp(b->shader), src0))->dest[0];
   3078 }
   3079 
   3080 
   3081 static inline
   3082 bi_instr * bi_iabs_v4s8_to(bi_builder *b, bi_index dest0, bi_index src0)
   3083 {
   3084     bi_instr *I = rzalloc(b->shader, bi_instr);
   3085     I->op = BI_OPCODE_IABS_V4S8;
   3086     I->dest[0] = dest0;
   3087     I->src[0] = src0;
   3088     bi_builder_insert(&b->cursor, I);
   3089     return I;
   3090 }
   3091 
   3092 static inline
   3093 bi_index bi_iabs_v4s8(bi_builder *b, bi_index src0)
   3094 {
   3095     return (bi_iabs_v4s8_to(b, bi_temp(b->shader), src0))->dest[0];
   3096 }
   3097 
   3098 
   3099 static inline
   3100 bi_instr * bi_iabs_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0)
   3101 {
   3102     if (bitsize == 32)
   3103         return (bi_iabs_s32_to(b, dest0, src0));
   3104     else if (bitsize == 16)
   3105         return (bi_iabs_v2s16_to(b, dest0, src0));
   3106     else if (bitsize == 8)
   3107         return (bi_iabs_v4s8_to(b, dest0, src0));
   3108     else
   3109         unreachable("Invalid parameters for IABS");
   3110 }
   3111 
   3112 static inline
   3113 bi_index bi_iabs(bi_builder *b, unsigned bitsize, bi_index src0)
   3114 {
   3115     if (bitsize == 32)
   3116         return (bi_iabs_s32_to(b, bi_temp(b->shader), src0))->dest[0];
   3117     else if (bitsize == 16)
   3118         return (bi_iabs_v2s16_to(b, bi_temp(b->shader), src0))->dest[0];
   3119     else if (bitsize == 8)
   3120         return (bi_iabs_v4s8_to(b, bi_temp(b->shader), src0))->dest[0];
   3121     else
   3122         unreachable("Invalid parameters for IABS");
   3123 }
   3124 
   3125 static inline
   3126 bi_instr * bi_iadd_s32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   3127 {
   3128     bi_instr *I = rzalloc(b->shader, bi_instr);
   3129     I->op = BI_OPCODE_IADD_S32;
   3130     I->dest[0] = dest0;
   3131     I->src[0] = src0;
   3132     I->src[1] = src1;
   3133     I->saturate = saturate;
   3134     bi_builder_insert(&b->cursor, I);
   3135     return I;
   3136 }
   3137 
   3138 static inline
   3139 bi_index bi_iadd_s32(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   3140 {
   3141     return (bi_iadd_s32_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3142 }
   3143 
   3144 
   3145 static inline
   3146 bi_instr * bi_iadd_u32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   3147 {
   3148     bi_instr *I = rzalloc(b->shader, bi_instr);
   3149     I->op = BI_OPCODE_IADD_U32;
   3150     I->dest[0] = dest0;
   3151     I->src[0] = src0;
   3152     I->src[1] = src1;
   3153     I->saturate = saturate;
   3154     bi_builder_insert(&b->cursor, I);
   3155     return I;
   3156 }
   3157 
   3158 static inline
   3159 bi_index bi_iadd_u32(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   3160 {
   3161     return (bi_iadd_u32_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3162 }
   3163 
   3164 
   3165 static inline
   3166 bi_instr * bi_iadd_v2s16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   3167 {
   3168     bi_instr *I = rzalloc(b->shader, bi_instr);
   3169     I->op = BI_OPCODE_IADD_V2S16;
   3170     I->dest[0] = dest0;
   3171     I->src[0] = src0;
   3172     I->src[1] = src1;
   3173     I->saturate = saturate;
   3174     bi_builder_insert(&b->cursor, I);
   3175     return I;
   3176 }
   3177 
   3178 static inline
   3179 bi_index bi_iadd_v2s16(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   3180 {
   3181     return (bi_iadd_v2s16_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3182 }
   3183 
   3184 
   3185 static inline
   3186 bi_instr * bi_iadd_v2u16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   3187 {
   3188     bi_instr *I = rzalloc(b->shader, bi_instr);
   3189     I->op = BI_OPCODE_IADD_V2U16;
   3190     I->dest[0] = dest0;
   3191     I->src[0] = src0;
   3192     I->src[1] = src1;
   3193     I->saturate = saturate;
   3194     bi_builder_insert(&b->cursor, I);
   3195     return I;
   3196 }
   3197 
   3198 static inline
   3199 bi_index bi_iadd_v2u16(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   3200 {
   3201     return (bi_iadd_v2u16_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3202 }
   3203 
   3204 
   3205 static inline
   3206 bi_instr * bi_iadd_v4s8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   3207 {
   3208     bi_instr *I = rzalloc(b->shader, bi_instr);
   3209     I->op = BI_OPCODE_IADD_V4S8;
   3210     I->dest[0] = dest0;
   3211     I->src[0] = src0;
   3212     I->src[1] = src1;
   3213     I->saturate = saturate;
   3214     bi_builder_insert(&b->cursor, I);
   3215     return I;
   3216 }
   3217 
   3218 static inline
   3219 bi_index bi_iadd_v4s8(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   3220 {
   3221     return (bi_iadd_v4s8_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3222 }
   3223 
   3224 
   3225 static inline
   3226 bi_instr * bi_iadd_v4u8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   3227 {
   3228     bi_instr *I = rzalloc(b->shader, bi_instr);
   3229     I->op = BI_OPCODE_IADD_V4U8;
   3230     I->dest[0] = dest0;
   3231     I->src[0] = src0;
   3232     I->src[1] = src1;
   3233     I->saturate = saturate;
   3234     bi_builder_insert(&b->cursor, I);
   3235     return I;
   3236 }
   3237 
   3238 static inline
   3239 bi_index bi_iadd_v4u8(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   3240 {
   3241     return (bi_iadd_v4u8_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3242 }
   3243 
   3244 
   3245 static inline
   3246 bi_instr * bi_iadd_to(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   3247 {
   3248     if ((type == nir_type_int) && bitsize == 32)
   3249         return (bi_iadd_s32_to(b, dest0, src0, src1, saturate));
   3250     else if ((type == nir_type_uint) && bitsize == 32)
   3251         return (bi_iadd_u32_to(b, dest0, src0, src1, saturate));
   3252     else if ((type == nir_type_int) && bitsize == 16)
   3253         return (bi_iadd_v2s16_to(b, dest0, src0, src1, saturate));
   3254     else if ((type == nir_type_uint) && bitsize == 16)
   3255         return (bi_iadd_v2u16_to(b, dest0, src0, src1, saturate));
   3256     else if ((type == nir_type_int) && bitsize == 8)
   3257         return (bi_iadd_v4s8_to(b, dest0, src0, src1, saturate));
   3258     else if ((type == nir_type_uint) && bitsize == 8)
   3259         return (bi_iadd_v4u8_to(b, dest0, src0, src1, saturate));
   3260     else
   3261         unreachable("Invalid parameters for IADD");
   3262 }
   3263 
   3264 static inline
   3265 bi_index bi_iadd(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index src0, bi_index src1, bool saturate)
   3266 {
   3267     if ((type == nir_type_int) && bitsize == 32)
   3268         return (bi_iadd_s32_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3269     else if ((type == nir_type_uint) && bitsize == 32)
   3270         return (bi_iadd_u32_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3271     else if ((type == nir_type_int) && bitsize == 16)
   3272         return (bi_iadd_v2s16_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3273     else if ((type == nir_type_uint) && bitsize == 16)
   3274         return (bi_iadd_v2u16_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3275     else if ((type == nir_type_int) && bitsize == 8)
   3276         return (bi_iadd_v4s8_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3277     else if ((type == nir_type_uint) && bitsize == 8)
   3278         return (bi_iadd_v4u8_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3279     else
   3280         unreachable("Invalid parameters for IADD");
   3281 }
   3282 
   3283 static inline
   3284 bi_instr * bi_iaddc_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   3285 {
   3286     bi_instr *I = rzalloc(b->shader, bi_instr);
   3287     I->op = BI_OPCODE_IADDC_I32;
   3288     I->dest[0] = dest0;
   3289     I->src[0] = src0;
   3290     I->src[1] = src1;
   3291     I->src[2] = src2;
   3292     bi_builder_insert(&b->cursor, I);
   3293     return I;
   3294 }
   3295 
   3296 static inline
   3297 bi_index bi_iaddc_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   3298 {
   3299     return (bi_iaddc_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   3300 }
   3301 
   3302 
   3303 static inline
   3304 bi_instr * bi_iadd_imm_i32_to(bi_builder *b, bi_index dest0, bi_index src0, uint32_t index)
   3305 {
   3306     bi_instr *I = rzalloc(b->shader, bi_instr);
   3307     I->op = BI_OPCODE_IADD_IMM_I32;
   3308     I->dest[0] = dest0;
   3309     I->src[0] = src0;
   3310     I->index = index;
   3311     bi_builder_insert(&b->cursor, I);
   3312     return I;
   3313 }
   3314 
   3315 static inline
   3316 bi_index bi_iadd_imm_i32(bi_builder *b, bi_index src0, uint32_t index)
   3317 {
   3318     return (bi_iadd_imm_i32_to(b, bi_temp(b->shader), src0, index))->dest[0];
   3319 }
   3320 
   3321 
   3322 static inline
   3323 bi_instr * bi_iadd_imm_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, uint32_t index)
   3324 {
   3325     bi_instr *I = rzalloc(b->shader, bi_instr);
   3326     I->op = BI_OPCODE_IADD_IMM_V2I16;
   3327     I->dest[0] = dest0;
   3328     I->src[0] = src0;
   3329     I->index = index;
   3330     bi_builder_insert(&b->cursor, I);
   3331     return I;
   3332 }
   3333 
   3334 static inline
   3335 bi_index bi_iadd_imm_v2i16(bi_builder *b, bi_index src0, uint32_t index)
   3336 {
   3337     return (bi_iadd_imm_v2i16_to(b, bi_temp(b->shader), src0, index))->dest[0];
   3338 }
   3339 
   3340 
   3341 static inline
   3342 bi_instr * bi_iadd_imm_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, uint32_t index)
   3343 {
   3344     bi_instr *I = rzalloc(b->shader, bi_instr);
   3345     I->op = BI_OPCODE_IADD_IMM_V4I8;
   3346     I->dest[0] = dest0;
   3347     I->src[0] = src0;
   3348     I->index = index;
   3349     bi_builder_insert(&b->cursor, I);
   3350     return I;
   3351 }
   3352 
   3353 static inline
   3354 bi_index bi_iadd_imm_v4i8(bi_builder *b, bi_index src0, uint32_t index)
   3355 {
   3356     return (bi_iadd_imm_v4i8_to(b, bi_temp(b->shader), src0, index))->dest[0];
   3357 }
   3358 
   3359 
   3360 static inline
   3361 bi_instr * bi_iadd_imm_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, uint32_t index)
   3362 {
   3363     if (bitsize == 32)
   3364         return (bi_iadd_imm_i32_to(b, dest0, src0, index));
   3365     else if (bitsize == 16)
   3366         return (bi_iadd_imm_v2i16_to(b, dest0, src0, index));
   3367     else if (bitsize == 8)
   3368         return (bi_iadd_imm_v4i8_to(b, dest0, src0, index));
   3369     else
   3370         unreachable("Invalid parameters for IADD_IMM");
   3371 }
   3372 
   3373 static inline
   3374 bi_index bi_iadd_imm(bi_builder *b, unsigned bitsize, bi_index src0, uint32_t index)
   3375 {
   3376     if (bitsize == 32)
   3377         return (bi_iadd_imm_i32_to(b, bi_temp(b->shader), src0, index))->dest[0];
   3378     else if (bitsize == 16)
   3379         return (bi_iadd_imm_v2i16_to(b, bi_temp(b->shader), src0, index))->dest[0];
   3380     else if (bitsize == 8)
   3381         return (bi_iadd_imm_v4i8_to(b, bi_temp(b->shader), src0, index))->dest[0];
   3382     else
   3383         unreachable("Invalid parameters for IADD_IMM");
   3384 }
   3385 
   3386 static inline
   3387 bi_instr * bi_icmp_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3388 {
   3389     bi_instr *I = rzalloc(b->shader, bi_instr);
   3390     I->op = BI_OPCODE_ICMP_I32;
   3391     I->dest[0] = dest0;
   3392     I->src[0] = src0;
   3393     I->src[1] = src1;
   3394     I->result_type = result_type;
   3395     I->cmpf = cmpf;
   3396     bi_builder_insert(&b->cursor, I);
   3397     return I;
   3398 }
   3399 
   3400 static inline
   3401 bi_index bi_icmp_i32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3402 {
   3403     return (bi_icmp_i32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3404 }
   3405 
   3406 
   3407 static inline
   3408 bi_instr * bi_icmp_s32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3409 {
   3410     bi_instr *I = rzalloc(b->shader, bi_instr);
   3411     I->op = BI_OPCODE_ICMP_S32;
   3412     I->dest[0] = dest0;
   3413     I->src[0] = src0;
   3414     I->src[1] = src1;
   3415     I->result_type = result_type;
   3416     I->cmpf = cmpf;
   3417     bi_builder_insert(&b->cursor, I);
   3418     return I;
   3419 }
   3420 
   3421 static inline
   3422 bi_index bi_icmp_s32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3423 {
   3424     return (bi_icmp_s32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3425 }
   3426 
   3427 
   3428 static inline
   3429 bi_instr * bi_icmp_u32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3430 {
   3431     bi_instr *I = rzalloc(b->shader, bi_instr);
   3432     I->op = BI_OPCODE_ICMP_U32;
   3433     I->dest[0] = dest0;
   3434     I->src[0] = src0;
   3435     I->src[1] = src1;
   3436     I->result_type = result_type;
   3437     I->cmpf = cmpf;
   3438     bi_builder_insert(&b->cursor, I);
   3439     return I;
   3440 }
   3441 
   3442 static inline
   3443 bi_index bi_icmp_u32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3444 {
   3445     return (bi_icmp_u32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3446 }
   3447 
   3448 
   3449 static inline
   3450 bi_instr * bi_icmp_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3451 {
   3452     bi_instr *I = rzalloc(b->shader, bi_instr);
   3453     I->op = BI_OPCODE_ICMP_V2I16;
   3454     I->dest[0] = dest0;
   3455     I->src[0] = src0;
   3456     I->src[1] = src1;
   3457     I->result_type = result_type;
   3458     I->cmpf = cmpf;
   3459     bi_builder_insert(&b->cursor, I);
   3460     return I;
   3461 }
   3462 
   3463 static inline
   3464 bi_index bi_icmp_v2i16(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3465 {
   3466     return (bi_icmp_v2i16_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3467 }
   3468 
   3469 
   3470 static inline
   3471 bi_instr * bi_icmp_v2s16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3472 {
   3473     bi_instr *I = rzalloc(b->shader, bi_instr);
   3474     I->op = BI_OPCODE_ICMP_V2S16;
   3475     I->dest[0] = dest0;
   3476     I->src[0] = src0;
   3477     I->src[1] = src1;
   3478     I->result_type = result_type;
   3479     I->cmpf = cmpf;
   3480     bi_builder_insert(&b->cursor, I);
   3481     return I;
   3482 }
   3483 
   3484 static inline
   3485 bi_index bi_icmp_v2s16(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3486 {
   3487     return (bi_icmp_v2s16_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3488 }
   3489 
   3490 
   3491 static inline
   3492 bi_instr * bi_icmp_v2u16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3493 {
   3494     bi_instr *I = rzalloc(b->shader, bi_instr);
   3495     I->op = BI_OPCODE_ICMP_V2U16;
   3496     I->dest[0] = dest0;
   3497     I->src[0] = src0;
   3498     I->src[1] = src1;
   3499     I->result_type = result_type;
   3500     I->cmpf = cmpf;
   3501     bi_builder_insert(&b->cursor, I);
   3502     return I;
   3503 }
   3504 
   3505 static inline
   3506 bi_index bi_icmp_v2u16(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3507 {
   3508     return (bi_icmp_v2u16_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3509 }
   3510 
   3511 
   3512 static inline
   3513 bi_instr * bi_icmp_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3514 {
   3515     bi_instr *I = rzalloc(b->shader, bi_instr);
   3516     I->op = BI_OPCODE_ICMP_V4I8;
   3517     I->dest[0] = dest0;
   3518     I->src[0] = src0;
   3519     I->src[1] = src1;
   3520     I->result_type = result_type;
   3521     I->cmpf = cmpf;
   3522     bi_builder_insert(&b->cursor, I);
   3523     return I;
   3524 }
   3525 
   3526 static inline
   3527 bi_index bi_icmp_v4i8(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3528 {
   3529     return (bi_icmp_v4i8_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3530 }
   3531 
   3532 
   3533 static inline
   3534 bi_instr * bi_icmp_v4s8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3535 {
   3536     bi_instr *I = rzalloc(b->shader, bi_instr);
   3537     I->op = BI_OPCODE_ICMP_V4S8;
   3538     I->dest[0] = dest0;
   3539     I->src[0] = src0;
   3540     I->src[1] = src1;
   3541     I->result_type = result_type;
   3542     I->cmpf = cmpf;
   3543     bi_builder_insert(&b->cursor, I);
   3544     return I;
   3545 }
   3546 
   3547 static inline
   3548 bi_index bi_icmp_v4s8(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3549 {
   3550     return (bi_icmp_v4s8_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3551 }
   3552 
   3553 
   3554 static inline
   3555 bi_instr * bi_icmp_v4u8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3556 {
   3557     bi_instr *I = rzalloc(b->shader, bi_instr);
   3558     I->op = BI_OPCODE_ICMP_V4U8;
   3559     I->dest[0] = dest0;
   3560     I->src[0] = src0;
   3561     I->src[1] = src1;
   3562     I->result_type = result_type;
   3563     I->cmpf = cmpf;
   3564     bi_builder_insert(&b->cursor, I);
   3565     return I;
   3566 }
   3567 
   3568 static inline
   3569 bi_index bi_icmp_v4u8(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3570 {
   3571     return (bi_icmp_v4u8_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3572 }
   3573 
   3574 
   3575 static inline
   3576 bi_instr * bi_icmp_to(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3577 {
   3578     if ((type == nir_type_uint || type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   3579         return (bi_icmp_i32_to(b, dest0, src0, src1, cmpf, result_type));
   3580     else if ((type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3581         return (bi_icmp_s32_to(b, dest0, src0, src1, cmpf, result_type));
   3582     else if ((type == nir_type_uint) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3583         return (bi_icmp_u32_to(b, dest0, src0, src1, cmpf, result_type));
   3584     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   3585         return (bi_icmp_v2i16_to(b, dest0, src0, src1, cmpf, result_type));
   3586     else if ((type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3587         return (bi_icmp_v2s16_to(b, dest0, src0, src1, cmpf, result_type));
   3588     else if ((type == nir_type_uint) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3589         return (bi_icmp_v2u16_to(b, dest0, src0, src1, cmpf, result_type));
   3590     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 8 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   3591         return (bi_icmp_v4i8_to(b, dest0, src0, src1, cmpf, result_type));
   3592     else if ((type == nir_type_int) && bitsize == 8 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3593         return (bi_icmp_v4s8_to(b, dest0, src0, src1, cmpf, result_type));
   3594     else if ((type == nir_type_uint) && bitsize == 8 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3595         return (bi_icmp_v4u8_to(b, dest0, src0, src1, cmpf, result_type));
   3596     else
   3597         unreachable("Invalid parameters for ICMP");
   3598 }
   3599 
   3600 static inline
   3601 bi_index bi_icmp(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3602 {
   3603     if ((type == nir_type_uint || type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   3604         return (bi_icmp_i32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3605     else if ((type == nir_type_int) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3606         return (bi_icmp_s32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3607     else if ((type == nir_type_uint) && bitsize == 32 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3608         return (bi_icmp_u32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3609     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   3610         return (bi_icmp_v2i16_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3611     else if ((type == nir_type_int) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3612         return (bi_icmp_v2s16_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3613     else if ((type == nir_type_uint) && bitsize == 16 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3614         return (bi_icmp_v2u16_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3615     else if ((type == nir_type_uint || type == nir_type_int) && bitsize == 8 && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   3616         return (bi_icmp_v4i8_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3617     else if ((type == nir_type_int) && bitsize == 8 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3618         return (bi_icmp_v4s8_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3619     else if ((type == nir_type_uint) && bitsize == 8 && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE || cmpf == BI_CMPF_LT || cmpf == BI_CMPF_LE))
   3620         return (bi_icmp_v4u8_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3621     else
   3622         unreachable("Invalid parameters for ICMP");
   3623 }
   3624 
   3625 static inline
   3626 bi_instr * bi_icmpf_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   3627 {
   3628     bi_instr *I = rzalloc(b->shader, bi_instr);
   3629     I->op = BI_OPCODE_ICMPF_I32;
   3630     I->dest[0] = dest0;
   3631     I->src[0] = src0;
   3632     I->src[1] = src1;
   3633     I->src[2] = src2;
   3634     bi_builder_insert(&b->cursor, I);
   3635     return I;
   3636 }
   3637 
   3638 static inline
   3639 bi_index bi_icmpf_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   3640 {
   3641     return (bi_icmpf_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   3642 }
   3643 
   3644 
   3645 static inline
   3646 bi_instr * bi_icmpi_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3647 {
   3648     bi_instr *I = rzalloc(b->shader, bi_instr);
   3649     I->op = BI_OPCODE_ICMPI_I32;
   3650     I->dest[0] = dest0;
   3651     I->src[0] = src0;
   3652     I->src[1] = src1;
   3653     I->result_type = result_type;
   3654     I->cmpf = cmpf;
   3655     bi_builder_insert(&b->cursor, I);
   3656     return I;
   3657 }
   3658 
   3659 static inline
   3660 bi_index bi_icmpi_i32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3661 {
   3662     return (bi_icmpi_i32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3663 }
   3664 
   3665 
   3666 static inline
   3667 bi_instr * bi_icmpi_s32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3668 {
   3669     bi_instr *I = rzalloc(b->shader, bi_instr);
   3670     I->op = BI_OPCODE_ICMPI_S32;
   3671     I->dest[0] = dest0;
   3672     I->src[0] = src0;
   3673     I->src[1] = src1;
   3674     I->result_type = result_type;
   3675     I->cmpf = cmpf;
   3676     bi_builder_insert(&b->cursor, I);
   3677     return I;
   3678 }
   3679 
   3680 static inline
   3681 bi_index bi_icmpi_s32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3682 {
   3683     return (bi_icmpi_s32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3684 }
   3685 
   3686 
   3687 static inline
   3688 bi_instr * bi_icmpi_u32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3689 {
   3690     bi_instr *I = rzalloc(b->shader, bi_instr);
   3691     I->op = BI_OPCODE_ICMPI_U32;
   3692     I->dest[0] = dest0;
   3693     I->src[0] = src0;
   3694     I->src[1] = src1;
   3695     I->result_type = result_type;
   3696     I->cmpf = cmpf;
   3697     bi_builder_insert(&b->cursor, I);
   3698     return I;
   3699 }
   3700 
   3701 static inline
   3702 bi_index bi_icmpi_u32(bi_builder *b, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3703 {
   3704     return (bi_icmpi_u32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3705 }
   3706 
   3707 
   3708 static inline
   3709 bi_instr * bi_icmpi_to(bi_builder *b, nir_alu_type type, bi_index dest0, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3710 {
   3711     if ((type == nir_type_uint || type == nir_type_int) && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   3712         return (bi_icmpi_i32_to(b, dest0, src0, src1, cmpf, result_type));
   3713     else if ((type == nir_type_int) && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE))
   3714         return (bi_icmpi_s32_to(b, dest0, src0, src1, cmpf, result_type));
   3715     else if ((type == nir_type_uint) && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE))
   3716         return (bi_icmpi_u32_to(b, dest0, src0, src1, cmpf, result_type));
   3717     else
   3718         unreachable("Invalid parameters for ICMPI");
   3719 }
   3720 
   3721 static inline
   3722 bi_index bi_icmpi(bi_builder *b, nir_alu_type type, bi_index src0, bi_index src1, enum bi_cmpf cmpf, enum bi_result_type result_type)
   3723 {
   3724     if ((type == nir_type_uint || type == nir_type_int) && (cmpf == BI_CMPF_EQ || cmpf == BI_CMPF_NE))
   3725         return (bi_icmpi_i32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3726     else if ((type == nir_type_int) && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE))
   3727         return (bi_icmpi_s32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3728     else if ((type == nir_type_uint) && (cmpf == BI_CMPF_GT || cmpf == BI_CMPF_GE))
   3729         return (bi_icmpi_u32_to(b, bi_temp(b->shader), src0, src1, cmpf, result_type))->dest[0];
   3730     else
   3731         unreachable("Invalid parameters for ICMPI");
   3732 }
   3733 
   3734 static inline
   3735 bi_instr * bi_icmpm_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   3736 {
   3737     bi_instr *I = rzalloc(b->shader, bi_instr);
   3738     I->op = BI_OPCODE_ICMPM_I32;
   3739     I->dest[0] = dest0;
   3740     I->src[0] = src0;
   3741     I->src[1] = src1;
   3742     I->src[2] = src2;
   3743     bi_builder_insert(&b->cursor, I);
   3744     return I;
   3745 }
   3746 
   3747 static inline
   3748 bi_index bi_icmpm_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   3749 {
   3750     return (bi_icmpm_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   3751 }
   3752 
   3753 
   3754 static inline
   3755 bi_instr * bi_idp_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   3756 {
   3757     bi_instr *I = rzalloc(b->shader, bi_instr);
   3758     I->op = BI_OPCODE_IDP_V4I8;
   3759     I->dest[0] = dest0;
   3760     I->src[0] = src0;
   3761     I->src[1] = src1;
   3762     bi_builder_insert(&b->cursor, I);
   3763     return I;
   3764 }
   3765 
   3766 static inline
   3767 bi_index bi_idp_v4i8(bi_builder *b, bi_index src0, bi_index src1)
   3768 {
   3769     return (bi_idp_v4i8_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   3770 }
   3771 
   3772 
   3773 static inline
   3774 bi_instr * bi_ilogb_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   3775 {
   3776     bi_instr *I = rzalloc(b->shader, bi_instr);
   3777     I->op = BI_OPCODE_ILOGB_F32;
   3778     I->dest[0] = dest0;
   3779     I->src[0] = src0;
   3780     bi_builder_insert(&b->cursor, I);
   3781     return I;
   3782 }
   3783 
   3784 static inline
   3785 bi_index bi_ilogb_f32(bi_builder *b, bi_index src0)
   3786 {
   3787     return (bi_ilogb_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   3788 }
   3789 
   3790 
   3791 static inline
   3792 bi_instr * bi_ilogb_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   3793 {
   3794     bi_instr *I = rzalloc(b->shader, bi_instr);
   3795     I->op = BI_OPCODE_ILOGB_V2F16;
   3796     I->dest[0] = dest0;
   3797     I->src[0] = src0;
   3798     bi_builder_insert(&b->cursor, I);
   3799     return I;
   3800 }
   3801 
   3802 static inline
   3803 bi_index bi_ilogb_v2f16(bi_builder *b, bi_index src0)
   3804 {
   3805     return (bi_ilogb_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   3806 }
   3807 
   3808 
   3809 static inline
   3810 bi_instr * bi_ilogb_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0)
   3811 {
   3812     if (bitsize == 32)
   3813         return (bi_ilogb_f32_to(b, dest0, src0));
   3814     else if (bitsize == 16)
   3815         return (bi_ilogb_v2f16_to(b, dest0, src0));
   3816     else
   3817         unreachable("Invalid parameters for ILOGB");
   3818 }
   3819 
   3820 static inline
   3821 bi_index bi_ilogb(bi_builder *b, unsigned bitsize, bi_index src0)
   3822 {
   3823     if (bitsize == 32)
   3824         return (bi_ilogb_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   3825     else if (bitsize == 16)
   3826         return (bi_ilogb_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   3827     else
   3828         unreachable("Invalid parameters for ILOGB");
   3829 }
   3830 
   3831 static inline
   3832 bi_instr * bi_imov_fma_to(bi_builder *b, bi_index dest0, bool threads)
   3833 {
   3834     bi_instr *I = rzalloc(b->shader, bi_instr);
   3835     I->op = BI_OPCODE_IMOV_FMA;
   3836     I->dest[0] = dest0;
   3837     I->threads = threads;
   3838     bi_builder_insert(&b->cursor, I);
   3839     return I;
   3840 }
   3841 
   3842 static inline
   3843 bi_index bi_imov_fma(bi_builder *b, bool threads)
   3844 {
   3845     return (bi_imov_fma_to(b, bi_temp(b->shader), threads))->dest[0];
   3846 }
   3847 
   3848 
   3849 static inline
   3850 bi_instr * bi_imul_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   3851 {
   3852     bi_instr *I = rzalloc(b->shader, bi_instr);
   3853     I->op = BI_OPCODE_IMUL_I32;
   3854     I->dest[0] = dest0;
   3855     I->src[0] = src0;
   3856     I->src[1] = src1;
   3857     bi_builder_insert(&b->cursor, I);
   3858     return I;
   3859 }
   3860 
   3861 static inline
   3862 bi_index bi_imul_i32(bi_builder *b, bi_index src0, bi_index src1)
   3863 {
   3864     return (bi_imul_i32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   3865 }
   3866 
   3867 
   3868 static inline
   3869 bi_instr * bi_imul_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   3870 {
   3871     bi_instr *I = rzalloc(b->shader, bi_instr);
   3872     I->op = BI_OPCODE_IMUL_V2I16;
   3873     I->dest[0] = dest0;
   3874     I->src[0] = src0;
   3875     I->src[1] = src1;
   3876     bi_builder_insert(&b->cursor, I);
   3877     return I;
   3878 }
   3879 
   3880 static inline
   3881 bi_index bi_imul_v2i16(bi_builder *b, bi_index src0, bi_index src1)
   3882 {
   3883     return (bi_imul_v2i16_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   3884 }
   3885 
   3886 
   3887 static inline
   3888 bi_instr * bi_imul_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   3889 {
   3890     bi_instr *I = rzalloc(b->shader, bi_instr);
   3891     I->op = BI_OPCODE_IMUL_V4I8;
   3892     I->dest[0] = dest0;
   3893     I->src[0] = src0;
   3894     I->src[1] = src1;
   3895     bi_builder_insert(&b->cursor, I);
   3896     return I;
   3897 }
   3898 
   3899 static inline
   3900 bi_index bi_imul_v4i8(bi_builder *b, bi_index src0, bi_index src1)
   3901 {
   3902     return (bi_imul_v4i8_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   3903 }
   3904 
   3905 
   3906 static inline
   3907 bi_instr * bi_imul_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1)
   3908 {
   3909     if (bitsize == 32)
   3910         return (bi_imul_i32_to(b, dest0, src0, src1));
   3911     else if (bitsize == 16)
   3912         return (bi_imul_v2i16_to(b, dest0, src0, src1));
   3913     else if (bitsize == 8)
   3914         return (bi_imul_v4i8_to(b, dest0, src0, src1));
   3915     else
   3916         unreachable("Invalid parameters for IMUL");
   3917 }
   3918 
   3919 static inline
   3920 bi_index bi_imul(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1)
   3921 {
   3922     if (bitsize == 32)
   3923         return (bi_imul_i32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   3924     else if (bitsize == 16)
   3925         return (bi_imul_v2i16_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   3926     else if (bitsize == 8)
   3927         return (bi_imul_v4i8_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   3928     else
   3929         unreachable("Invalid parameters for IMUL");
   3930 }
   3931 
   3932 static inline
   3933 bi_instr * bi_imuld_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool threads)
   3934 {
   3935     bi_instr *I = rzalloc(b->shader, bi_instr);
   3936     I->op = BI_OPCODE_IMULD;
   3937     I->dest[0] = dest0;
   3938     I->src[0] = src0;
   3939     I->src[1] = src1;
   3940     I->threads = threads;
   3941     bi_builder_insert(&b->cursor, I);
   3942     return I;
   3943 }
   3944 
   3945 static inline
   3946 bi_index bi_imuld(bi_builder *b, bi_index src0, bi_index src1, bool threads)
   3947 {
   3948     return (bi_imuld_to(b, bi_temp(b->shader), src0, src1, threads))->dest[0];
   3949 }
   3950 
   3951 
   3952 static inline
   3953 bi_instr * bi_isub_s32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   3954 {
   3955     bi_instr *I = rzalloc(b->shader, bi_instr);
   3956     I->op = BI_OPCODE_ISUB_S32;
   3957     I->dest[0] = dest0;
   3958     I->src[0] = src0;
   3959     I->src[1] = src1;
   3960     I->saturate = saturate;
   3961     bi_builder_insert(&b->cursor, I);
   3962     return I;
   3963 }
   3964 
   3965 static inline
   3966 bi_index bi_isub_s32(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   3967 {
   3968     return (bi_isub_s32_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3969 }
   3970 
   3971 
   3972 static inline
   3973 bi_instr * bi_isub_u32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   3974 {
   3975     bi_instr *I = rzalloc(b->shader, bi_instr);
   3976     I->op = BI_OPCODE_ISUB_U32;
   3977     I->dest[0] = dest0;
   3978     I->src[0] = src0;
   3979     I->src[1] = src1;
   3980     I->saturate = saturate;
   3981     bi_builder_insert(&b->cursor, I);
   3982     return I;
   3983 }
   3984 
   3985 static inline
   3986 bi_index bi_isub_u32(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   3987 {
   3988     return (bi_isub_u32_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   3989 }
   3990 
   3991 
   3992 static inline
   3993 bi_instr * bi_isub_v2s16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   3994 {
   3995     bi_instr *I = rzalloc(b->shader, bi_instr);
   3996     I->op = BI_OPCODE_ISUB_V2S16;
   3997     I->dest[0] = dest0;
   3998     I->src[0] = src0;
   3999     I->src[1] = src1;
   4000     I->saturate = saturate;
   4001     bi_builder_insert(&b->cursor, I);
   4002     return I;
   4003 }
   4004 
   4005 static inline
   4006 bi_index bi_isub_v2s16(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   4007 {
   4008     return (bi_isub_v2s16_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   4009 }
   4010 
   4011 
   4012 static inline
   4013 bi_instr * bi_isub_v2u16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   4014 {
   4015     bi_instr *I = rzalloc(b->shader, bi_instr);
   4016     I->op = BI_OPCODE_ISUB_V2U16;
   4017     I->dest[0] = dest0;
   4018     I->src[0] = src0;
   4019     I->src[1] = src1;
   4020     I->saturate = saturate;
   4021     bi_builder_insert(&b->cursor, I);
   4022     return I;
   4023 }
   4024 
   4025 static inline
   4026 bi_index bi_isub_v2u16(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   4027 {
   4028     return (bi_isub_v2u16_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   4029 }
   4030 
   4031 
   4032 static inline
   4033 bi_instr * bi_isub_v4s8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   4034 {
   4035     bi_instr *I = rzalloc(b->shader, bi_instr);
   4036     I->op = BI_OPCODE_ISUB_V4S8;
   4037     I->dest[0] = dest0;
   4038     I->src[0] = src0;
   4039     I->src[1] = src1;
   4040     I->saturate = saturate;
   4041     bi_builder_insert(&b->cursor, I);
   4042     return I;
   4043 }
   4044 
   4045 static inline
   4046 bi_index bi_isub_v4s8(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   4047 {
   4048     return (bi_isub_v4s8_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   4049 }
   4050 
   4051 
   4052 static inline
   4053 bi_instr * bi_isub_v4u8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   4054 {
   4055     bi_instr *I = rzalloc(b->shader, bi_instr);
   4056     I->op = BI_OPCODE_ISUB_V4U8;
   4057     I->dest[0] = dest0;
   4058     I->src[0] = src0;
   4059     I->src[1] = src1;
   4060     I->saturate = saturate;
   4061     bi_builder_insert(&b->cursor, I);
   4062     return I;
   4063 }
   4064 
   4065 static inline
   4066 bi_index bi_isub_v4u8(bi_builder *b, bi_index src0, bi_index src1, bool saturate)
   4067 {
   4068     return (bi_isub_v4u8_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   4069 }
   4070 
   4071 
   4072 static inline
   4073 bi_instr * bi_isub_to(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bool saturate)
   4074 {
   4075     if ((type == nir_type_int) && bitsize == 32)
   4076         return (bi_isub_s32_to(b, dest0, src0, src1, saturate));
   4077     else if ((type == nir_type_uint) && bitsize == 32)
   4078         return (bi_isub_u32_to(b, dest0, src0, src1, saturate));
   4079     else if ((type == nir_type_int) && bitsize == 16)
   4080         return (bi_isub_v2s16_to(b, dest0, src0, src1, saturate));
   4081     else if ((type == nir_type_uint) && bitsize == 16)
   4082         return (bi_isub_v2u16_to(b, dest0, src0, src1, saturate));
   4083     else if ((type == nir_type_int) && bitsize == 8)
   4084         return (bi_isub_v4s8_to(b, dest0, src0, src1, saturate));
   4085     else if ((type == nir_type_uint) && bitsize == 8)
   4086         return (bi_isub_v4u8_to(b, dest0, src0, src1, saturate));
   4087     else
   4088         unreachable("Invalid parameters for ISUB");
   4089 }
   4090 
   4091 static inline
   4092 bi_index bi_isub(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index src0, bi_index src1, bool saturate)
   4093 {
   4094     if ((type == nir_type_int) && bitsize == 32)
   4095         return (bi_isub_s32_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   4096     else if ((type == nir_type_uint) && bitsize == 32)
   4097         return (bi_isub_u32_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   4098     else if ((type == nir_type_int) && bitsize == 16)
   4099         return (bi_isub_v2s16_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   4100     else if ((type == nir_type_uint) && bitsize == 16)
   4101         return (bi_isub_v2u16_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   4102     else if ((type == nir_type_int) && bitsize == 8)
   4103         return (bi_isub_v4s8_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   4104     else if ((type == nir_type_uint) && bitsize == 8)
   4105         return (bi_isub_v4u8_to(b, bi_temp(b->shader), src0, src1, saturate))->dest[0];
   4106     else
   4107         unreachable("Invalid parameters for ISUB");
   4108 }
   4109 
   4110 static inline
   4111 bi_instr * bi_isubb_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   4112 {
   4113     bi_instr *I = rzalloc(b->shader, bi_instr);
   4114     I->op = BI_OPCODE_ISUBB_I32;
   4115     I->dest[0] = dest0;
   4116     I->src[0] = src0;
   4117     I->src[1] = src1;
   4118     I->src[2] = src2;
   4119     bi_builder_insert(&b->cursor, I);
   4120     return I;
   4121 }
   4122 
   4123 static inline
   4124 bi_index bi_isubb_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   4125 {
   4126     return (bi_isubb_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   4127 }
   4128 
   4129 
   4130 static inline
   4131 bi_instr * bi_jump(bi_builder *b, bi_index src0)
   4132 {
   4133     bi_instr *I = rzalloc(b->shader, bi_instr);
   4134     I->op = BI_OPCODE_JUMP;
   4135     I->src[0] = src0;
   4136     bi_builder_insert(&b->cursor, I);
   4137     return I;
   4138 }
   4139 
   4140 
   4141 static inline
   4142 bi_instr * bi_jump_ex_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_stack_mode stack_mode, bool test_mode)
   4143 {
   4144     bi_instr *I = rzalloc(b->shader, bi_instr);
   4145     I->op = BI_OPCODE_JUMP_EX;
   4146     I->dest[0] = dest0;
   4147     I->src[0] = src0;
   4148     I->src[1] = src1;
   4149     I->src[2] = src2;
   4150     I->test_mode = test_mode;
   4151     I->stack_mode = stack_mode;
   4152     bi_builder_insert(&b->cursor, I);
   4153     return I;
   4154 }
   4155 
   4156 static inline
   4157 bi_index bi_jump_ex(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_stack_mode stack_mode, bool test_mode)
   4158 {
   4159     return (bi_jump_ex_to(b, bi_temp(b->shader), src0, src1, src2, stack_mode, test_mode))->dest[0];
   4160 }
   4161 
   4162 
   4163 static inline
   4164 bi_instr * bi_ldexp_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   4165 {
   4166     bi_instr *I = rzalloc(b->shader, bi_instr);
   4167     I->op = BI_OPCODE_LDEXP_F32;
   4168     I->dest[0] = dest0;
   4169     I->src[0] = src0;
   4170     I->src[1] = src1;
   4171     I->round = round;
   4172     bi_builder_insert(&b->cursor, I);
   4173     return I;
   4174 }
   4175 
   4176 static inline
   4177 bi_index bi_ldexp_f32(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   4178 {
   4179     return (bi_ldexp_f32_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   4180 }
   4181 
   4182 
   4183 static inline
   4184 bi_instr * bi_ldexp_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   4185 {
   4186     bi_instr *I = rzalloc(b->shader, bi_instr);
   4187     I->op = BI_OPCODE_LDEXP_V2F16;
   4188     I->dest[0] = dest0;
   4189     I->src[0] = src0;
   4190     I->src[1] = src1;
   4191     I->round = round;
   4192     bi_builder_insert(&b->cursor, I);
   4193     return I;
   4194 }
   4195 
   4196 static inline
   4197 bi_index bi_ldexp_v2f16(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   4198 {
   4199     return (bi_ldexp_v2f16_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   4200 }
   4201 
   4202 
   4203 static inline
   4204 bi_instr * bi_ldexp_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   4205 {
   4206     if (bitsize == 32)
   4207         return (bi_ldexp_f32_to(b, dest0, src0, src1, round));
   4208     else if (bitsize == 16)
   4209         return (bi_ldexp_v2f16_to(b, dest0, src0, src1, round));
   4210     else
   4211         unreachable("Invalid parameters for LDEXP");
   4212 }
   4213 
   4214 static inline
   4215 bi_index bi_ldexp(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, enum bi_round round)
   4216 {
   4217     if (bitsize == 32)
   4218         return (bi_ldexp_f32_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   4219     else if (bitsize == 16)
   4220         return (bi_ldexp_v2f16_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   4221     else
   4222         unreachable("Invalid parameters for LDEXP");
   4223 }
   4224 
   4225 static inline
   4226 bi_instr * bi_ld_attr_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_register_format register_format, enum bi_vecsize vecsize)
   4227 {
   4228     bi_instr *I = rzalloc(b->shader, bi_instr);
   4229     I->op = BI_OPCODE_LD_ATTR;
   4230     I->dest[0] = dest0;
   4231     I->src[0] = src0;
   4232     I->src[1] = src1;
   4233     I->src[2] = src2;
   4234     I->register_format = register_format;
   4235     I->vecsize = vecsize;
   4236     bi_builder_insert(&b->cursor, I);
   4237     return I;
   4238 }
   4239 
   4240 static inline
   4241 bi_index bi_ld_attr(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_register_format register_format, enum bi_vecsize vecsize)
   4242 {
   4243     return (bi_ld_attr_to(b, bi_temp(b->shader), src0, src1, src2, register_format, vecsize))->dest[0];
   4244 }
   4245 
   4246 
   4247 static inline
   4248 bi_instr * bi_ld_attr_imm_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_register_format register_format, enum bi_vecsize vecsize, uint32_t attribute_index)
   4249 {
   4250     bi_instr *I = rzalloc(b->shader, bi_instr);
   4251     I->op = BI_OPCODE_LD_ATTR_IMM;
   4252     I->dest[0] = dest0;
   4253     I->src[0] = src0;
   4254     I->src[1] = src1;
   4255     I->register_format = register_format;
   4256     I->vecsize = vecsize;
   4257     I->attribute_index = attribute_index;
   4258     bi_builder_insert(&b->cursor, I);
   4259     return I;
   4260 }
   4261 
   4262 static inline
   4263 bi_index bi_ld_attr_imm(bi_builder *b, bi_index src0, bi_index src1, enum bi_register_format register_format, enum bi_vecsize vecsize, uint32_t attribute_index)
   4264 {
   4265     return (bi_ld_attr_imm_to(b, bi_temp(b->shader), src0, src1, register_format, vecsize, attribute_index))->dest[0];
   4266 }
   4267 
   4268 
   4269 static inline
   4270 bi_instr * bi_ld_attr_tex_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_register_format register_format, enum bi_vecsize vecsize)
   4271 {
   4272     bi_instr *I = rzalloc(b->shader, bi_instr);
   4273     I->op = BI_OPCODE_LD_ATTR_TEX;
   4274     I->dest[0] = dest0;
   4275     I->src[0] = src0;
   4276     I->src[1] = src1;
   4277     I->src[2] = src2;
   4278     I->register_format = register_format;
   4279     I->vecsize = vecsize;
   4280     bi_builder_insert(&b->cursor, I);
   4281     return I;
   4282 }
   4283 
   4284 static inline
   4285 bi_index bi_ld_attr_tex(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_register_format register_format, enum bi_vecsize vecsize)
   4286 {
   4287     return (bi_ld_attr_tex_to(b, bi_temp(b->shader), src0, src1, src2, register_format, vecsize))->dest[0];
   4288 }
   4289 
   4290 
   4291 static inline
   4292 bi_instr * bi_ld_cvt_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_register_format register_format, enum bi_vecsize vecsize)
   4293 {
   4294     bi_instr *I = rzalloc(b->shader, bi_instr);
   4295     I->op = BI_OPCODE_LD_CVT;
   4296     I->dest[0] = dest0;
   4297     I->src[0] = src0;
   4298     I->src[1] = src1;
   4299     I->src[2] = src2;
   4300     I->register_format = register_format;
   4301     I->vecsize = vecsize;
   4302     bi_builder_insert(&b->cursor, I);
   4303     return I;
   4304 }
   4305 
   4306 static inline
   4307 bi_index bi_ld_cvt(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_register_format register_format, enum bi_vecsize vecsize)
   4308 {
   4309     return (bi_ld_cvt_to(b, bi_temp(b->shader), src0, src1, src2, register_format, vecsize))->dest[0];
   4310 }
   4311 
   4312 
   4313 static inline
   4314 bi_instr * bi_ld_gclk_u64_to(bi_builder *b, bi_index dest0, enum bi_source source)
   4315 {
   4316     bi_instr *I = rzalloc(b->shader, bi_instr);
   4317     I->op = BI_OPCODE_LD_GCLK_U64;
   4318     I->dest[0] = dest0;
   4319     I->source = source;
   4320     bi_builder_insert(&b->cursor, I);
   4321     return I;
   4322 }
   4323 
   4324 static inline
   4325 bi_index bi_ld_gclk_u64(bi_builder *b, enum bi_source source)
   4326 {
   4327     return (bi_ld_gclk_u64_to(b, bi_temp(b->shader), source))->dest[0];
   4328 }
   4329 
   4330 
   4331 static inline
   4332 bi_instr * bi_ld_tile_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_vecsize vecsize)
   4333 {
   4334     bi_instr *I = rzalloc(b->shader, bi_instr);
   4335     I->op = BI_OPCODE_LD_TILE;
   4336     I->dest[0] = dest0;
   4337     I->src[0] = src0;
   4338     I->src[1] = src1;
   4339     I->src[2] = src2;
   4340     I->vecsize = vecsize;
   4341     bi_builder_insert(&b->cursor, I);
   4342     return I;
   4343 }
   4344 
   4345 static inline
   4346 bi_index bi_ld_tile(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_vecsize vecsize)
   4347 {
   4348     return (bi_ld_tile_to(b, bi_temp(b->shader), src0, src1, src2, vecsize))->dest[0];
   4349 }
   4350 
   4351 
   4352 static inline
   4353 bi_instr * bi_ld_var_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_register_format register_format, enum bi_sample sample, enum bi_update update, enum bi_vecsize vecsize)
   4354 {
   4355     bi_instr *I = rzalloc(b->shader, bi_instr);
   4356     I->op = BI_OPCODE_LD_VAR;
   4357     I->dest[0] = dest0;
   4358     I->src[0] = src0;
   4359     I->src[1] = src1;
   4360     I->vecsize = vecsize;
   4361     I->update = update;
   4362     I->register_format = register_format;
   4363     I->sample = sample;
   4364     bi_builder_insert(&b->cursor, I);
   4365     return I;
   4366 }
   4367 
   4368 static inline
   4369 bi_index bi_ld_var(bi_builder *b, bi_index src0, bi_index src1, enum bi_register_format register_format, enum bi_sample sample, enum bi_update update, enum bi_vecsize vecsize)
   4370 {
   4371     return (bi_ld_var_to(b, bi_temp(b->shader), src0, src1, register_format, sample, update, vecsize))->dest[0];
   4372 }
   4373 
   4374 
   4375 static inline
   4376 bi_instr * bi_ld_var_flat_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_function function, enum bi_register_format register_format, enum bi_vecsize vecsize)
   4377 {
   4378     bi_instr *I = rzalloc(b->shader, bi_instr);
   4379     I->op = BI_OPCODE_LD_VAR_FLAT;
   4380     I->dest[0] = dest0;
   4381     I->src[0] = src0;
   4382     I->vecsize = vecsize;
   4383     I->register_format = register_format;
   4384     I->function = function;
   4385     bi_builder_insert(&b->cursor, I);
   4386     return I;
   4387 }
   4388 
   4389 static inline
   4390 bi_index bi_ld_var_flat(bi_builder *b, bi_index src0, enum bi_function function, enum bi_register_format register_format, enum bi_vecsize vecsize)
   4391 {
   4392     return (bi_ld_var_flat_to(b, bi_temp(b->shader), src0, function, register_format, vecsize))->dest[0];
   4393 }
   4394 
   4395 
   4396 static inline
   4397 bi_instr * bi_ld_var_flat_imm_to(bi_builder *b, bi_index dest0, enum bi_function function, enum bi_register_format register_format, enum bi_vecsize vecsize, uint32_t index)
   4398 {
   4399     bi_instr *I = rzalloc(b->shader, bi_instr);
   4400     I->op = BI_OPCODE_LD_VAR_FLAT_IMM;
   4401     I->dest[0] = dest0;
   4402     I->vecsize = vecsize;
   4403     I->register_format = register_format;
   4404     I->function = function;
   4405     I->index = index;
   4406     bi_builder_insert(&b->cursor, I);
   4407     return I;
   4408 }
   4409 
   4410 static inline
   4411 bi_index bi_ld_var_flat_imm(bi_builder *b, enum bi_function function, enum bi_register_format register_format, enum bi_vecsize vecsize, uint32_t index)
   4412 {
   4413     return (bi_ld_var_flat_imm_to(b, bi_temp(b->shader), function, register_format, vecsize, index))->dest[0];
   4414 }
   4415 
   4416 
   4417 static inline
   4418 bi_instr * bi_ld_var_imm_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_register_format register_format, enum bi_sample sample, enum bi_update update, enum bi_vecsize vecsize, uint32_t index)
   4419 {
   4420     bi_instr *I = rzalloc(b->shader, bi_instr);
   4421     I->op = BI_OPCODE_LD_VAR_IMM;
   4422     I->dest[0] = dest0;
   4423     I->src[0] = src0;
   4424     I->vecsize = vecsize;
   4425     I->update = update;
   4426     I->register_format = register_format;
   4427     I->sample = sample;
   4428     I->index = index;
   4429     bi_builder_insert(&b->cursor, I);
   4430     return I;
   4431 }
   4432 
   4433 static inline
   4434 bi_index bi_ld_var_imm(bi_builder *b, bi_index src0, enum bi_register_format register_format, enum bi_sample sample, enum bi_update update, enum bi_vecsize vecsize, uint32_t index)
   4435 {
   4436     return (bi_ld_var_imm_to(b, bi_temp(b->shader), src0, register_format, sample, update, vecsize, index))->dest[0];
   4437 }
   4438 
   4439 
   4440 static inline
   4441 bi_instr * bi_ld_var_special_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_register_format register_format, enum bi_sample sample, enum bi_update update, enum bi_varying_name varying_name, enum bi_vecsize vecsize)
   4442 {
   4443     bi_instr *I = rzalloc(b->shader, bi_instr);
   4444     I->op = BI_OPCODE_LD_VAR_SPECIAL;
   4445     I->dest[0] = dest0;
   4446     I->src[0] = src0;
   4447     I->varying_name = varying_name;
   4448     I->vecsize = vecsize;
   4449     I->update = update;
   4450     I->register_format = register_format;
   4451     I->sample = sample;
   4452     bi_builder_insert(&b->cursor, I);
   4453     return I;
   4454 }
   4455 
   4456 static inline
   4457 bi_index bi_ld_var_special(bi_builder *b, bi_index src0, enum bi_register_format register_format, enum bi_sample sample, enum bi_update update, enum bi_varying_name varying_name, enum bi_vecsize vecsize)
   4458 {
   4459     return (bi_ld_var_special_to(b, bi_temp(b->shader), src0, register_format, sample, update, varying_name, vecsize))->dest[0];
   4460 }
   4461 
   4462 
   4463 static inline
   4464 bi_instr * bi_lea_attr_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_register_format register_format)
   4465 {
   4466     bi_instr *I = rzalloc(b->shader, bi_instr);
   4467     I->op = BI_OPCODE_LEA_ATTR;
   4468     I->dest[0] = dest0;
   4469     I->src[0] = src0;
   4470     I->src[1] = src1;
   4471     I->src[2] = src2;
   4472     I->register_format = register_format;
   4473     bi_builder_insert(&b->cursor, I);
   4474     return I;
   4475 }
   4476 
   4477 static inline
   4478 bi_index bi_lea_attr(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_register_format register_format)
   4479 {
   4480     return (bi_lea_attr_to(b, bi_temp(b->shader), src0, src1, src2, register_format))->dest[0];
   4481 }
   4482 
   4483 
   4484 static inline
   4485 bi_instr * bi_lea_attr_imm_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_register_format register_format, uint32_t attribute_index)
   4486 {
   4487     bi_instr *I = rzalloc(b->shader, bi_instr);
   4488     I->op = BI_OPCODE_LEA_ATTR_IMM;
   4489     I->dest[0] = dest0;
   4490     I->src[0] = src0;
   4491     I->src[1] = src1;
   4492     I->register_format = register_format;
   4493     I->attribute_index = attribute_index;
   4494     bi_builder_insert(&b->cursor, I);
   4495     return I;
   4496 }
   4497 
   4498 static inline
   4499 bi_index bi_lea_attr_imm(bi_builder *b, bi_index src0, bi_index src1, enum bi_register_format register_format, uint32_t attribute_index)
   4500 {
   4501     return (bi_lea_attr_imm_to(b, bi_temp(b->shader), src0, src1, register_format, attribute_index))->dest[0];
   4502 }
   4503 
   4504 
   4505 static inline
   4506 bi_instr * bi_lea_attr_tex_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_register_format register_format)
   4507 {
   4508     bi_instr *I = rzalloc(b->shader, bi_instr);
   4509     I->op = BI_OPCODE_LEA_ATTR_TEX;
   4510     I->dest[0] = dest0;
   4511     I->src[0] = src0;
   4512     I->src[1] = src1;
   4513     I->src[2] = src2;
   4514     I->register_format = register_format;
   4515     bi_builder_insert(&b->cursor, I);
   4516     return I;
   4517 }
   4518 
   4519 static inline
   4520 bi_index bi_lea_attr_tex(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_register_format register_format)
   4521 {
   4522     return (bi_lea_attr_tex_to(b, bi_temp(b->shader), src0, src1, src2, register_format))->dest[0];
   4523 }
   4524 
   4525 
   4526 static inline
   4527 bi_instr * bi_lea_tex_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bool format)
   4528 {
   4529     bi_instr *I = rzalloc(b->shader, bi_instr);
   4530     I->op = BI_OPCODE_LEA_TEX;
   4531     I->dest[0] = dest0;
   4532     I->src[0] = src0;
   4533     I->src[1] = src1;
   4534     I->src[2] = src2;
   4535     I->format = format;
   4536     bi_builder_insert(&b->cursor, I);
   4537     return I;
   4538 }
   4539 
   4540 static inline
   4541 bi_index bi_lea_tex(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bool format)
   4542 {
   4543     return (bi_lea_tex_to(b, bi_temp(b->shader), src0, src1, src2, format))->dest[0];
   4544 }
   4545 
   4546 
   4547 static inline
   4548 bi_instr * bi_lea_tex_imm_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool format, uint32_t texture_index)
   4549 {
   4550     bi_instr *I = rzalloc(b->shader, bi_instr);
   4551     I->op = BI_OPCODE_LEA_TEX_IMM;
   4552     I->dest[0] = dest0;
   4553     I->src[0] = src0;
   4554     I->src[1] = src1;
   4555     I->format = format;
   4556     I->texture_index = texture_index;
   4557     bi_builder_insert(&b->cursor, I);
   4558     return I;
   4559 }
   4560 
   4561 static inline
   4562 bi_index bi_lea_tex_imm(bi_builder *b, bi_index src0, bi_index src1, bool format, uint32_t texture_index)
   4563 {
   4564     return (bi_lea_tex_imm_to(b, bi_temp(b->shader), src0, src1, format, texture_index))->dest[0];
   4565 }
   4566 
   4567 
   4568 static inline
   4569 bi_instr * bi_load_i128_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_seg seg)
   4570 {
   4571     bi_instr *I = rzalloc(b->shader, bi_instr);
   4572     I->op = BI_OPCODE_LOAD_I128;
   4573     I->dest[0] = dest0;
   4574     I->src[0] = src0;
   4575     I->src[1] = src1;
   4576     I->seg = seg;
   4577     bi_builder_insert(&b->cursor, I);
   4578     return I;
   4579 }
   4580 
   4581 static inline
   4582 bi_index bi_load_i128(bi_builder *b, bi_index src0, bi_index src1, enum bi_seg seg)
   4583 {
   4584     return (bi_load_i128_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4585 }
   4586 
   4587 
   4588 static inline
   4589 bi_instr * bi_load_i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_seg seg)
   4590 {
   4591     bi_instr *I = rzalloc(b->shader, bi_instr);
   4592     I->op = BI_OPCODE_LOAD_I16;
   4593     I->dest[0] = dest0;
   4594     I->src[0] = src0;
   4595     I->src[1] = src1;
   4596     I->seg = seg;
   4597     I->extend = BI_EXTEND_ZEXT;
   4598     bi_builder_insert(&b->cursor, I);
   4599     return I;
   4600 }
   4601 
   4602 static inline
   4603 bi_index bi_load_i16(bi_builder *b, bi_index src0, bi_index src1, enum bi_seg seg)
   4604 {
   4605     return (bi_load_i16_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4606 }
   4607 
   4608 
   4609 static inline
   4610 bi_instr * bi_load_i24_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_seg seg)
   4611 {
   4612     bi_instr *I = rzalloc(b->shader, bi_instr);
   4613     I->op = BI_OPCODE_LOAD_I24;
   4614     I->dest[0] = dest0;
   4615     I->src[0] = src0;
   4616     I->src[1] = src1;
   4617     I->seg = seg;
   4618     I->extend = BI_EXTEND_ZEXT;
   4619     bi_builder_insert(&b->cursor, I);
   4620     return I;
   4621 }
   4622 
   4623 static inline
   4624 bi_index bi_load_i24(bi_builder *b, bi_index src0, bi_index src1, enum bi_seg seg)
   4625 {
   4626     return (bi_load_i24_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4627 }
   4628 
   4629 
   4630 static inline
   4631 bi_instr * bi_load_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_seg seg)
   4632 {
   4633     bi_instr *I = rzalloc(b->shader, bi_instr);
   4634     I->op = BI_OPCODE_LOAD_I32;
   4635     I->dest[0] = dest0;
   4636     I->src[0] = src0;
   4637     I->src[1] = src1;
   4638     I->seg = seg;
   4639     bi_builder_insert(&b->cursor, I);
   4640     return I;
   4641 }
   4642 
   4643 static inline
   4644 bi_index bi_load_i32(bi_builder *b, bi_index src0, bi_index src1, enum bi_seg seg)
   4645 {
   4646     return (bi_load_i32_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4647 }
   4648 
   4649 
   4650 static inline
   4651 bi_instr * bi_load_i48_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_seg seg)
   4652 {
   4653     bi_instr *I = rzalloc(b->shader, bi_instr);
   4654     I->op = BI_OPCODE_LOAD_I48;
   4655     I->dest[0] = dest0;
   4656     I->src[0] = src0;
   4657     I->src[1] = src1;
   4658     I->seg = seg;
   4659     bi_builder_insert(&b->cursor, I);
   4660     return I;
   4661 }
   4662 
   4663 static inline
   4664 bi_index bi_load_i48(bi_builder *b, bi_index src0, bi_index src1, enum bi_seg seg)
   4665 {
   4666     return (bi_load_i48_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4667 }
   4668 
   4669 
   4670 static inline
   4671 bi_instr * bi_load_i64_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_seg seg)
   4672 {
   4673     bi_instr *I = rzalloc(b->shader, bi_instr);
   4674     I->op = BI_OPCODE_LOAD_I64;
   4675     I->dest[0] = dest0;
   4676     I->src[0] = src0;
   4677     I->src[1] = src1;
   4678     I->seg = seg;
   4679     bi_builder_insert(&b->cursor, I);
   4680     return I;
   4681 }
   4682 
   4683 static inline
   4684 bi_index bi_load_i64(bi_builder *b, bi_index src0, bi_index src1, enum bi_seg seg)
   4685 {
   4686     return (bi_load_i64_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4687 }
   4688 
   4689 
   4690 static inline
   4691 bi_instr * bi_load_i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_seg seg)
   4692 {
   4693     bi_instr *I = rzalloc(b->shader, bi_instr);
   4694     I->op = BI_OPCODE_LOAD_I8;
   4695     I->dest[0] = dest0;
   4696     I->src[0] = src0;
   4697     I->src[1] = src1;
   4698     I->seg = seg;
   4699     I->extend = BI_EXTEND_ZEXT;
   4700     bi_builder_insert(&b->cursor, I);
   4701     return I;
   4702 }
   4703 
   4704 static inline
   4705 bi_index bi_load_i8(bi_builder *b, bi_index src0, bi_index src1, enum bi_seg seg)
   4706 {
   4707     return (bi_load_i8_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4708 }
   4709 
   4710 
   4711 static inline
   4712 bi_instr * bi_load_i96_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_seg seg)
   4713 {
   4714     bi_instr *I = rzalloc(b->shader, bi_instr);
   4715     I->op = BI_OPCODE_LOAD_I96;
   4716     I->dest[0] = dest0;
   4717     I->src[0] = src0;
   4718     I->src[1] = src1;
   4719     I->seg = seg;
   4720     bi_builder_insert(&b->cursor, I);
   4721     return I;
   4722 }
   4723 
   4724 static inline
   4725 bi_index bi_load_i96(bi_builder *b, bi_index src0, bi_index src1, enum bi_seg seg)
   4726 {
   4727     return (bi_load_i96_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4728 }
   4729 
   4730 
   4731 static inline
   4732 bi_instr * bi_load_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, enum bi_seg seg)
   4733 {
   4734     if (bitsize == 128)
   4735         return (bi_load_i128_to(b, dest0, src0, src1, seg));
   4736     else if (bitsize == 16)
   4737         return (bi_load_i16_to(b, dest0, src0, src1, seg));
   4738     else if (bitsize == 24)
   4739         return (bi_load_i24_to(b, dest0, src0, src1, seg));
   4740     else if (bitsize == 32)
   4741         return (bi_load_i32_to(b, dest0, src0, src1, seg));
   4742     else if (bitsize == 48)
   4743         return (bi_load_i48_to(b, dest0, src0, src1, seg));
   4744     else if (bitsize == 64)
   4745         return (bi_load_i64_to(b, dest0, src0, src1, seg));
   4746     else if (bitsize == 8)
   4747         return (bi_load_i8_to(b, dest0, src0, src1, seg));
   4748     else if (bitsize == 96)
   4749         return (bi_load_i96_to(b, dest0, src0, src1, seg));
   4750     else
   4751         unreachable("Invalid parameters for LOAD");
   4752 }
   4753 
   4754 static inline
   4755 bi_index bi_load(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, enum bi_seg seg)
   4756 {
   4757     if (bitsize == 128)
   4758         return (bi_load_i128_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4759     else if (bitsize == 16)
   4760         return (bi_load_i16_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4761     else if (bitsize == 24)
   4762         return (bi_load_i24_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4763     else if (bitsize == 32)
   4764         return (bi_load_i32_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4765     else if (bitsize == 48)
   4766         return (bi_load_i48_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4767     else if (bitsize == 64)
   4768         return (bi_load_i64_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4769     else if (bitsize == 8)
   4770         return (bi_load_i8_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4771     else if (bitsize == 96)
   4772         return (bi_load_i96_to(b, bi_temp(b->shader), src0, src1, seg))->dest[0];
   4773     else
   4774         unreachable("Invalid parameters for LOAD");
   4775 }
   4776 
   4777 static inline
   4778 bi_instr * bi_logb_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   4779 {
   4780     bi_instr *I = rzalloc(b->shader, bi_instr);
   4781     I->op = BI_OPCODE_LOGB_F32;
   4782     I->dest[0] = dest0;
   4783     I->src[0] = src0;
   4784     bi_builder_insert(&b->cursor, I);
   4785     return I;
   4786 }
   4787 
   4788 static inline
   4789 bi_index bi_logb_f32(bi_builder *b, bi_index src0)
   4790 {
   4791     return (bi_logb_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   4792 }
   4793 
   4794 
   4795 static inline
   4796 bi_instr * bi_logb_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   4797 {
   4798     bi_instr *I = rzalloc(b->shader, bi_instr);
   4799     I->op = BI_OPCODE_LOGB_V2F16;
   4800     I->dest[0] = dest0;
   4801     I->src[0] = src0;
   4802     bi_builder_insert(&b->cursor, I);
   4803     return I;
   4804 }
   4805 
   4806 static inline
   4807 bi_index bi_logb_v2f16(bi_builder *b, bi_index src0)
   4808 {
   4809     return (bi_logb_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   4810 }
   4811 
   4812 
   4813 static inline
   4814 bi_instr * bi_logb_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0)
   4815 {
   4816     if (bitsize == 32)
   4817         return (bi_logb_f32_to(b, dest0, src0));
   4818     else if (bitsize == 16)
   4819         return (bi_logb_v2f16_to(b, dest0, src0));
   4820     else
   4821         unreachable("Invalid parameters for LOGB");
   4822 }
   4823 
   4824 static inline
   4825 bi_index bi_logb(bi_builder *b, unsigned bitsize, bi_index src0)
   4826 {
   4827     if (bitsize == 32)
   4828         return (bi_logb_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   4829     else if (bitsize == 16)
   4830         return (bi_logb_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   4831     else
   4832         unreachable("Invalid parameters for LOGB");
   4833 }
   4834 
   4835 static inline
   4836 bi_instr * bi_lrot_double_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bool bytes2, bool result_word)
   4837 {
   4838     bi_instr *I = rzalloc(b->shader, bi_instr);
   4839     I->op = BI_OPCODE_LROT_DOUBLE_I32;
   4840     I->dest[0] = dest0;
   4841     I->src[0] = src0;
   4842     I->src[1] = src1;
   4843     I->src[2] = src2;
   4844     I->bytes2 = bytes2;
   4845     I->result_word = result_word;
   4846     bi_builder_insert(&b->cursor, I);
   4847     return I;
   4848 }
   4849 
   4850 static inline
   4851 bi_index bi_lrot_double_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bool bytes2, bool result_word)
   4852 {
   4853     return (bi_lrot_double_i32_to(b, bi_temp(b->shader), src0, src1, src2, bytes2, result_word))->dest[0];
   4854 }
   4855 
   4856 
   4857 static inline
   4858 bi_instr * bi_lshift_and_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   4859 {
   4860     bi_instr *I = rzalloc(b->shader, bi_instr);
   4861     I->op = BI_OPCODE_LSHIFT_AND_I32;
   4862     I->dest[0] = dest0;
   4863     I->src[0] = src0;
   4864     I->src[1] = src1;
   4865     I->src[2] = src2;
   4866     bi_builder_insert(&b->cursor, I);
   4867     return I;
   4868 }
   4869 
   4870 static inline
   4871 bi_index bi_lshift_and_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   4872 {
   4873     return (bi_lshift_and_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   4874 }
   4875 
   4876 
   4877 static inline
   4878 bi_instr * bi_lshift_and_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   4879 {
   4880     bi_instr *I = rzalloc(b->shader, bi_instr);
   4881     I->op = BI_OPCODE_LSHIFT_AND_V2I16;
   4882     I->dest[0] = dest0;
   4883     I->src[0] = src0;
   4884     I->src[1] = src1;
   4885     I->src[2] = src2;
   4886     bi_builder_insert(&b->cursor, I);
   4887     return I;
   4888 }
   4889 
   4890 static inline
   4891 bi_index bi_lshift_and_v2i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   4892 {
   4893     return (bi_lshift_and_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   4894 }
   4895 
   4896 
   4897 static inline
   4898 bi_instr * bi_lshift_and_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   4899 {
   4900     bi_instr *I = rzalloc(b->shader, bi_instr);
   4901     I->op = BI_OPCODE_LSHIFT_AND_V4I8;
   4902     I->dest[0] = dest0;
   4903     I->src[0] = src0;
   4904     I->src[1] = src1;
   4905     I->src[2] = src2;
   4906     bi_builder_insert(&b->cursor, I);
   4907     return I;
   4908 }
   4909 
   4910 static inline
   4911 bi_index bi_lshift_and_v4i8(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   4912 {
   4913     return (bi_lshift_and_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   4914 }
   4915 
   4916 
   4917 static inline
   4918 bi_instr * bi_lshift_and_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   4919 {
   4920     if (bitsize == 32)
   4921         return (bi_lshift_and_i32_to(b, dest0, src0, src1, src2));
   4922     else if (bitsize == 16)
   4923         return (bi_lshift_and_v2i16_to(b, dest0, src0, src1, src2));
   4924     else if (bitsize == 8)
   4925         return (bi_lshift_and_v4i8_to(b, dest0, src0, src1, src2));
   4926     else
   4927         unreachable("Invalid parameters for LSHIFT_AND");
   4928 }
   4929 
   4930 static inline
   4931 bi_index bi_lshift_and(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2)
   4932 {
   4933     if (bitsize == 32)
   4934         return (bi_lshift_and_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   4935     else if (bitsize == 16)
   4936         return (bi_lshift_and_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   4937     else if (bitsize == 8)
   4938         return (bi_lshift_and_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   4939     else
   4940         unreachable("Invalid parameters for LSHIFT_AND");
   4941 }
   4942 
   4943 static inline
   4944 bi_instr * bi_lshift_double_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bool bytes2, bool result_word)
   4945 {
   4946     bi_instr *I = rzalloc(b->shader, bi_instr);
   4947     I->op = BI_OPCODE_LSHIFT_DOUBLE_I32;
   4948     I->dest[0] = dest0;
   4949     I->src[0] = src0;
   4950     I->src[1] = src1;
   4951     I->src[2] = src2;
   4952     I->bytes2 = bytes2;
   4953     I->result_word = result_word;
   4954     bi_builder_insert(&b->cursor, I);
   4955     return I;
   4956 }
   4957 
   4958 static inline
   4959 bi_index bi_lshift_double_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bool bytes2, bool result_word)
   4960 {
   4961     return (bi_lshift_double_i32_to(b, bi_temp(b->shader), src0, src1, src2, bytes2, result_word))->dest[0];
   4962 }
   4963 
   4964 
   4965 static inline
   4966 bi_instr * bi_lshift_or_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   4967 {
   4968     bi_instr *I = rzalloc(b->shader, bi_instr);
   4969     I->op = BI_OPCODE_LSHIFT_OR_I32;
   4970     I->dest[0] = dest0;
   4971     I->src[0] = src0;
   4972     I->src[1] = src1;
   4973     I->src[2] = src2;
   4974     bi_builder_insert(&b->cursor, I);
   4975     return I;
   4976 }
   4977 
   4978 static inline
   4979 bi_index bi_lshift_or_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   4980 {
   4981     return (bi_lshift_or_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   4982 }
   4983 
   4984 
   4985 static inline
   4986 bi_instr * bi_lshift_or_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   4987 {
   4988     bi_instr *I = rzalloc(b->shader, bi_instr);
   4989     I->op = BI_OPCODE_LSHIFT_OR_V2I16;
   4990     I->dest[0] = dest0;
   4991     I->src[0] = src0;
   4992     I->src[1] = src1;
   4993     I->src[2] = src2;
   4994     bi_builder_insert(&b->cursor, I);
   4995     return I;
   4996 }
   4997 
   4998 static inline
   4999 bi_index bi_lshift_or_v2i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5000 {
   5001     return (bi_lshift_or_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5002 }
   5003 
   5004 
   5005 static inline
   5006 bi_instr * bi_lshift_or_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5007 {
   5008     bi_instr *I = rzalloc(b->shader, bi_instr);
   5009     I->op = BI_OPCODE_LSHIFT_OR_V4I8;
   5010     I->dest[0] = dest0;
   5011     I->src[0] = src0;
   5012     I->src[1] = src1;
   5013     I->src[2] = src2;
   5014     bi_builder_insert(&b->cursor, I);
   5015     return I;
   5016 }
   5017 
   5018 static inline
   5019 bi_index bi_lshift_or_v4i8(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5020 {
   5021     return (bi_lshift_or_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5022 }
   5023 
   5024 
   5025 static inline
   5026 bi_instr * bi_lshift_or_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5027 {
   5028     if (bitsize == 32)
   5029         return (bi_lshift_or_i32_to(b, dest0, src0, src1, src2));
   5030     else if (bitsize == 16)
   5031         return (bi_lshift_or_v2i16_to(b, dest0, src0, src1, src2));
   5032     else if (bitsize == 8)
   5033         return (bi_lshift_or_v4i8_to(b, dest0, src0, src1, src2));
   5034     else
   5035         unreachable("Invalid parameters for LSHIFT_OR");
   5036 }
   5037 
   5038 static inline
   5039 bi_index bi_lshift_or(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2)
   5040 {
   5041     if (bitsize == 32)
   5042         return (bi_lshift_or_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5043     else if (bitsize == 16)
   5044         return (bi_lshift_or_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5045     else if (bitsize == 8)
   5046         return (bi_lshift_or_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5047     else
   5048         unreachable("Invalid parameters for LSHIFT_OR");
   5049 }
   5050 
   5051 static inline
   5052 bi_instr * bi_lshift_xor_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5053 {
   5054     bi_instr *I = rzalloc(b->shader, bi_instr);
   5055     I->op = BI_OPCODE_LSHIFT_XOR_I32;
   5056     I->dest[0] = dest0;
   5057     I->src[0] = src0;
   5058     I->src[1] = src1;
   5059     I->src[2] = src2;
   5060     bi_builder_insert(&b->cursor, I);
   5061     return I;
   5062 }
   5063 
   5064 static inline
   5065 bi_index bi_lshift_xor_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5066 {
   5067     return (bi_lshift_xor_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5068 }
   5069 
   5070 
   5071 static inline
   5072 bi_instr * bi_lshift_xor_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5073 {
   5074     bi_instr *I = rzalloc(b->shader, bi_instr);
   5075     I->op = BI_OPCODE_LSHIFT_XOR_V2I16;
   5076     I->dest[0] = dest0;
   5077     I->src[0] = src0;
   5078     I->src[1] = src1;
   5079     I->src[2] = src2;
   5080     bi_builder_insert(&b->cursor, I);
   5081     return I;
   5082 }
   5083 
   5084 static inline
   5085 bi_index bi_lshift_xor_v2i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5086 {
   5087     return (bi_lshift_xor_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5088 }
   5089 
   5090 
   5091 static inline
   5092 bi_instr * bi_lshift_xor_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5093 {
   5094     bi_instr *I = rzalloc(b->shader, bi_instr);
   5095     I->op = BI_OPCODE_LSHIFT_XOR_V4I8;
   5096     I->dest[0] = dest0;
   5097     I->src[0] = src0;
   5098     I->src[1] = src1;
   5099     I->src[2] = src2;
   5100     bi_builder_insert(&b->cursor, I);
   5101     return I;
   5102 }
   5103 
   5104 static inline
   5105 bi_index bi_lshift_xor_v4i8(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5106 {
   5107     return (bi_lshift_xor_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5108 }
   5109 
   5110 
   5111 static inline
   5112 bi_instr * bi_lshift_xor_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5113 {
   5114     if (bitsize == 32)
   5115         return (bi_lshift_xor_i32_to(b, dest0, src0, src1, src2));
   5116     else if (bitsize == 16)
   5117         return (bi_lshift_xor_v2i16_to(b, dest0, src0, src1, src2));
   5118     else if (bitsize == 8)
   5119         return (bi_lshift_xor_v4i8_to(b, dest0, src0, src1, src2));
   5120     else
   5121         unreachable("Invalid parameters for LSHIFT_XOR");
   5122 }
   5123 
   5124 static inline
   5125 bi_index bi_lshift_xor(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2)
   5126 {
   5127     if (bitsize == 32)
   5128         return (bi_lshift_xor_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5129     else if (bitsize == 16)
   5130         return (bi_lshift_xor_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5131     else if (bitsize == 8)
   5132         return (bi_lshift_xor_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5133     else
   5134         unreachable("Invalid parameters for LSHIFT_XOR");
   5135 }
   5136 
   5137 static inline
   5138 bi_instr * bi_mkvec_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   5139 {
   5140     bi_instr *I = rzalloc(b->shader, bi_instr);
   5141     I->op = BI_OPCODE_MKVEC_V2I16;
   5142     I->dest[0] = dest0;
   5143     I->src[0] = src0;
   5144     I->src[1] = src1;
   5145     bi_builder_insert(&b->cursor, I);
   5146     return I;
   5147 }
   5148 
   5149 static inline
   5150 bi_index bi_mkvec_v2i16(bi_builder *b, bi_index src0, bi_index src1)
   5151 {
   5152     return (bi_mkvec_v2i16_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   5153 }
   5154 
   5155 
   5156 static inline
   5157 bi_instr * bi_mkvec_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3)
   5158 {
   5159     bi_instr *I = rzalloc(b->shader, bi_instr);
   5160     I->op = BI_OPCODE_MKVEC_V4I8;
   5161     I->dest[0] = dest0;
   5162     I->src[0] = src0;
   5163     I->src[1] = src1;
   5164     I->src[2] = src2;
   5165     I->src[3] = src3;
   5166     bi_builder_insert(&b->cursor, I);
   5167     return I;
   5168 }
   5169 
   5170 static inline
   5171 bi_index bi_mkvec_v4i8(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3)
   5172 {
   5173     return (bi_mkvec_v4i8_to(b, bi_temp(b->shader), src0, src1, src2, src3))->dest[0];
   5174 }
   5175 
   5176 
   5177 static inline
   5178 bi_instr * bi_mov_i32_to(bi_builder *b, bi_index dest0, bi_index src0)
   5179 {
   5180     bi_instr *I = rzalloc(b->shader, bi_instr);
   5181     I->op = BI_OPCODE_MOV_I32;
   5182     I->dest[0] = dest0;
   5183     I->src[0] = src0;
   5184     bi_builder_insert(&b->cursor, I);
   5185     return I;
   5186 }
   5187 
   5188 static inline
   5189 bi_index bi_mov_i32(bi_builder *b, bi_index src0)
   5190 {
   5191     return (bi_mov_i32_to(b, bi_temp(b->shader), src0))->dest[0];
   5192 }
   5193 
   5194 
   5195 static inline
   5196 bi_instr * bi_mux_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_mux mux)
   5197 {
   5198     bi_instr *I = rzalloc(b->shader, bi_instr);
   5199     I->op = BI_OPCODE_MUX_I32;
   5200     I->dest[0] = dest0;
   5201     I->src[0] = src0;
   5202     I->src[1] = src1;
   5203     I->src[2] = src2;
   5204     I->mux = mux;
   5205     bi_builder_insert(&b->cursor, I);
   5206     return I;
   5207 }
   5208 
   5209 static inline
   5210 bi_index bi_mux_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_mux mux)
   5211 {
   5212     return (bi_mux_i32_to(b, bi_temp(b->shader), src0, src1, src2, mux))->dest[0];
   5213 }
   5214 
   5215 
   5216 static inline
   5217 bi_instr * bi_mux_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_mux mux)
   5218 {
   5219     bi_instr *I = rzalloc(b->shader, bi_instr);
   5220     I->op = BI_OPCODE_MUX_V2I16;
   5221     I->dest[0] = dest0;
   5222     I->src[0] = src0;
   5223     I->src[1] = src1;
   5224     I->src[2] = src2;
   5225     I->mux = mux;
   5226     bi_builder_insert(&b->cursor, I);
   5227     return I;
   5228 }
   5229 
   5230 static inline
   5231 bi_index bi_mux_v2i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_mux mux)
   5232 {
   5233     return (bi_mux_v2i16_to(b, bi_temp(b->shader), src0, src1, src2, mux))->dest[0];
   5234 }
   5235 
   5236 
   5237 static inline
   5238 bi_instr * bi_mux_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_mux mux)
   5239 {
   5240     bi_instr *I = rzalloc(b->shader, bi_instr);
   5241     I->op = BI_OPCODE_MUX_V4I8;
   5242     I->dest[0] = dest0;
   5243     I->src[0] = src0;
   5244     I->src[1] = src1;
   5245     I->src[2] = src2;
   5246     I->mux = mux;
   5247     bi_builder_insert(&b->cursor, I);
   5248     return I;
   5249 }
   5250 
   5251 static inline
   5252 bi_index bi_mux_v4i8(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_mux mux)
   5253 {
   5254     return (bi_mux_v4i8_to(b, bi_temp(b->shader), src0, src1, src2, mux))->dest[0];
   5255 }
   5256 
   5257 
   5258 static inline
   5259 bi_instr * bi_mux_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_mux mux)
   5260 {
   5261     if (bitsize == 32)
   5262         return (bi_mux_i32_to(b, dest0, src0, src1, src2, mux));
   5263     else if (bitsize == 16)
   5264         return (bi_mux_v2i16_to(b, dest0, src0, src1, src2, mux));
   5265     else if (bitsize == 8)
   5266         return (bi_mux_v4i8_to(b, dest0, src0, src1, src2, mux));
   5267     else
   5268         unreachable("Invalid parameters for MUX");
   5269 }
   5270 
   5271 static inline
   5272 bi_index bi_mux(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, enum bi_mux mux)
   5273 {
   5274     if (bitsize == 32)
   5275         return (bi_mux_i32_to(b, bi_temp(b->shader), src0, src1, src2, mux))->dest[0];
   5276     else if (bitsize == 16)
   5277         return (bi_mux_v2i16_to(b, bi_temp(b->shader), src0, src1, src2, mux))->dest[0];
   5278     else if (bitsize == 8)
   5279         return (bi_mux_v4i8_to(b, bi_temp(b->shader), src0, src1, src2, mux))->dest[0];
   5280     else
   5281         unreachable("Invalid parameters for MUX");
   5282 }
   5283 
   5284 static inline
   5285 bi_instr * bi_nop_to(bi_builder *b, bi_index dest0)
   5286 {
   5287     bi_instr *I = rzalloc(b->shader, bi_instr);
   5288     I->op = BI_OPCODE_NOP;
   5289     I->dest[0] = dest0;
   5290     bi_builder_insert(&b->cursor, I);
   5291     return I;
   5292 }
   5293 
   5294 static inline
   5295 bi_index bi_nop(bi_builder *b)
   5296 {
   5297     return (bi_nop_to(b, bi_temp(b->shader)))->dest[0];
   5298 }
   5299 
   5300 
   5301 static inline
   5302 bi_instr * bi_patom_c_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, enum bi_atom_opc atom_opc, uint32_t sr_count)
   5303 {
   5304     bi_instr *I = rzalloc(b->shader, bi_instr);
   5305     I->op = BI_OPCODE_PATOM_C_I32;
   5306     I->dest[0] = dest0;
   5307     I->src[0] = src0;
   5308     I->src[1] = src1;
   5309     I->src[2] = src2;
   5310     I->atom_opc = atom_opc;
   5311     I->sr_count = sr_count;
   5312     bi_builder_insert(&b->cursor, I);
   5313     return I;
   5314 }
   5315 
   5316 static inline
   5317 bi_index bi_patom_c_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_atom_opc atom_opc, uint32_t sr_count)
   5318 {
   5319     return (bi_patom_c_i32_to(b, bi_temp(b->shader), src0, src1, src2, atom_opc, sr_count))->dest[0];
   5320 }
   5321 
   5322 
   5323 static inline
   5324 bi_instr * bi_patom_c1_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc, uint32_t sr_count)
   5325 {
   5326     bi_instr *I = rzalloc(b->shader, bi_instr);
   5327     I->op = BI_OPCODE_PATOM_C1_I32;
   5328     I->dest[0] = dest0;
   5329     I->src[0] = src0;
   5330     I->src[1] = src1;
   5331     I->atom_opc = atom_opc;
   5332     I->sr_count = sr_count;
   5333     bi_builder_insert(&b->cursor, I);
   5334     return I;
   5335 }
   5336 
   5337 static inline
   5338 bi_index bi_patom_c1_i32(bi_builder *b, bi_index src0, bi_index src1, enum bi_atom_opc atom_opc, uint32_t sr_count)
   5339 {
   5340     return (bi_patom_c1_i32_to(b, bi_temp(b->shader), src0, src1, atom_opc, sr_count))->dest[0];
   5341 }
   5342 
   5343 
   5344 static inline
   5345 bi_instr * bi_popcount_i32_to(bi_builder *b, bi_index dest0, bi_index src0)
   5346 {
   5347     bi_instr *I = rzalloc(b->shader, bi_instr);
   5348     I->op = BI_OPCODE_POPCOUNT_I32;
   5349     I->dest[0] = dest0;
   5350     I->src[0] = src0;
   5351     bi_builder_insert(&b->cursor, I);
   5352     return I;
   5353 }
   5354 
   5355 static inline
   5356 bi_index bi_popcount_i32(bi_builder *b, bi_index src0)
   5357 {
   5358     return (bi_popcount_i32_to(b, bi_temp(b->shader), src0))->dest[0];
   5359 }
   5360 
   5361 
   5362 static inline
   5363 bi_instr * bi_quiet_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   5364 {
   5365     bi_instr *I = rzalloc(b->shader, bi_instr);
   5366     I->op = BI_OPCODE_QUIET_F32;
   5367     I->dest[0] = dest0;
   5368     I->src[0] = src0;
   5369     bi_builder_insert(&b->cursor, I);
   5370     return I;
   5371 }
   5372 
   5373 static inline
   5374 bi_index bi_quiet_f32(bi_builder *b, bi_index src0)
   5375 {
   5376     return (bi_quiet_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   5377 }
   5378 
   5379 
   5380 static inline
   5381 bi_instr * bi_quiet_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   5382 {
   5383     bi_instr *I = rzalloc(b->shader, bi_instr);
   5384     I->op = BI_OPCODE_QUIET_V2F16;
   5385     I->dest[0] = dest0;
   5386     I->src[0] = src0;
   5387     bi_builder_insert(&b->cursor, I);
   5388     return I;
   5389 }
   5390 
   5391 static inline
   5392 bi_index bi_quiet_v2f16(bi_builder *b, bi_index src0)
   5393 {
   5394     return (bi_quiet_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   5395 }
   5396 
   5397 
   5398 static inline
   5399 bi_instr * bi_quiet_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0)
   5400 {
   5401     if (bitsize == 32)
   5402         return (bi_quiet_f32_to(b, dest0, src0));
   5403     else if (bitsize == 16)
   5404         return (bi_quiet_v2f16_to(b, dest0, src0));
   5405     else
   5406         unreachable("Invalid parameters for QUIET");
   5407 }
   5408 
   5409 static inline
   5410 bi_index bi_quiet(bi_builder *b, unsigned bitsize, bi_index src0)
   5411 {
   5412     if (bitsize == 32)
   5413         return (bi_quiet_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   5414     else if (bitsize == 16)
   5415         return (bi_quiet_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   5416     else
   5417         unreachable("Invalid parameters for QUIET");
   5418 }
   5419 
   5420 static inline
   5421 bi_instr * bi_rrot_double_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bool bytes2, bool result_word)
   5422 {
   5423     bi_instr *I = rzalloc(b->shader, bi_instr);
   5424     I->op = BI_OPCODE_RROT_DOUBLE_I32;
   5425     I->dest[0] = dest0;
   5426     I->src[0] = src0;
   5427     I->src[1] = src1;
   5428     I->src[2] = src2;
   5429     I->bytes2 = bytes2;
   5430     I->result_word = result_word;
   5431     bi_builder_insert(&b->cursor, I);
   5432     return I;
   5433 }
   5434 
   5435 static inline
   5436 bi_index bi_rrot_double_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bool bytes2, bool result_word)
   5437 {
   5438     return (bi_rrot_double_i32_to(b, bi_temp(b->shader), src0, src1, src2, bytes2, result_word))->dest[0];
   5439 }
   5440 
   5441 
   5442 static inline
   5443 bi_instr * bi_rshift_and_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5444 {
   5445     bi_instr *I = rzalloc(b->shader, bi_instr);
   5446     I->op = BI_OPCODE_RSHIFT_AND_I32;
   5447     I->dest[0] = dest0;
   5448     I->src[0] = src0;
   5449     I->src[1] = src1;
   5450     I->src[2] = src2;
   5451     bi_builder_insert(&b->cursor, I);
   5452     return I;
   5453 }
   5454 
   5455 static inline
   5456 bi_index bi_rshift_and_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5457 {
   5458     return (bi_rshift_and_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5459 }
   5460 
   5461 
   5462 static inline
   5463 bi_instr * bi_rshift_and_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5464 {
   5465     bi_instr *I = rzalloc(b->shader, bi_instr);
   5466     I->op = BI_OPCODE_RSHIFT_AND_V2I16;
   5467     I->dest[0] = dest0;
   5468     I->src[0] = src0;
   5469     I->src[1] = src1;
   5470     I->src[2] = src2;
   5471     bi_builder_insert(&b->cursor, I);
   5472     return I;
   5473 }
   5474 
   5475 static inline
   5476 bi_index bi_rshift_and_v2i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5477 {
   5478     return (bi_rshift_and_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5479 }
   5480 
   5481 
   5482 static inline
   5483 bi_instr * bi_rshift_and_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5484 {
   5485     bi_instr *I = rzalloc(b->shader, bi_instr);
   5486     I->op = BI_OPCODE_RSHIFT_AND_V4I8;
   5487     I->dest[0] = dest0;
   5488     I->src[0] = src0;
   5489     I->src[1] = src1;
   5490     I->src[2] = src2;
   5491     bi_builder_insert(&b->cursor, I);
   5492     return I;
   5493 }
   5494 
   5495 static inline
   5496 bi_index bi_rshift_and_v4i8(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5497 {
   5498     return (bi_rshift_and_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5499 }
   5500 
   5501 
   5502 static inline
   5503 bi_instr * bi_rshift_and_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5504 {
   5505     if (bitsize == 32)
   5506         return (bi_rshift_and_i32_to(b, dest0, src0, src1, src2));
   5507     else if (bitsize == 16)
   5508         return (bi_rshift_and_v2i16_to(b, dest0, src0, src1, src2));
   5509     else if (bitsize == 8)
   5510         return (bi_rshift_and_v4i8_to(b, dest0, src0, src1, src2));
   5511     else
   5512         unreachable("Invalid parameters for RSHIFT_AND");
   5513 }
   5514 
   5515 static inline
   5516 bi_index bi_rshift_and(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2)
   5517 {
   5518     if (bitsize == 32)
   5519         return (bi_rshift_and_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5520     else if (bitsize == 16)
   5521         return (bi_rshift_and_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5522     else if (bitsize == 8)
   5523         return (bi_rshift_and_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5524     else
   5525         unreachable("Invalid parameters for RSHIFT_AND");
   5526 }
   5527 
   5528 static inline
   5529 bi_instr * bi_rshift_double_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bool bytes2, bool result_word)
   5530 {
   5531     bi_instr *I = rzalloc(b->shader, bi_instr);
   5532     I->op = BI_OPCODE_RSHIFT_DOUBLE_I32;
   5533     I->dest[0] = dest0;
   5534     I->src[0] = src0;
   5535     I->src[1] = src1;
   5536     I->src[2] = src2;
   5537     I->bytes2 = bytes2;
   5538     I->result_word = result_word;
   5539     bi_builder_insert(&b->cursor, I);
   5540     return I;
   5541 }
   5542 
   5543 static inline
   5544 bi_index bi_rshift_double_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bool bytes2, bool result_word)
   5545 {
   5546     return (bi_rshift_double_i32_to(b, bi_temp(b->shader), src0, src1, src2, bytes2, result_word))->dest[0];
   5547 }
   5548 
   5549 
   5550 static inline
   5551 bi_instr * bi_rshift_or_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5552 {
   5553     bi_instr *I = rzalloc(b->shader, bi_instr);
   5554     I->op = BI_OPCODE_RSHIFT_OR_I32;
   5555     I->dest[0] = dest0;
   5556     I->src[0] = src0;
   5557     I->src[1] = src1;
   5558     I->src[2] = src2;
   5559     bi_builder_insert(&b->cursor, I);
   5560     return I;
   5561 }
   5562 
   5563 static inline
   5564 bi_index bi_rshift_or_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5565 {
   5566     return (bi_rshift_or_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5567 }
   5568 
   5569 
   5570 static inline
   5571 bi_instr * bi_rshift_or_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5572 {
   5573     bi_instr *I = rzalloc(b->shader, bi_instr);
   5574     I->op = BI_OPCODE_RSHIFT_OR_V2I16;
   5575     I->dest[0] = dest0;
   5576     I->src[0] = src0;
   5577     I->src[1] = src1;
   5578     I->src[2] = src2;
   5579     bi_builder_insert(&b->cursor, I);
   5580     return I;
   5581 }
   5582 
   5583 static inline
   5584 bi_index bi_rshift_or_v2i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5585 {
   5586     return (bi_rshift_or_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5587 }
   5588 
   5589 
   5590 static inline
   5591 bi_instr * bi_rshift_or_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5592 {
   5593     bi_instr *I = rzalloc(b->shader, bi_instr);
   5594     I->op = BI_OPCODE_RSHIFT_OR_V4I8;
   5595     I->dest[0] = dest0;
   5596     I->src[0] = src0;
   5597     I->src[1] = src1;
   5598     I->src[2] = src2;
   5599     bi_builder_insert(&b->cursor, I);
   5600     return I;
   5601 }
   5602 
   5603 static inline
   5604 bi_index bi_rshift_or_v4i8(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5605 {
   5606     return (bi_rshift_or_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5607 }
   5608 
   5609 
   5610 static inline
   5611 bi_instr * bi_rshift_or_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5612 {
   5613     if (bitsize == 32)
   5614         return (bi_rshift_or_i32_to(b, dest0, src0, src1, src2));
   5615     else if (bitsize == 16)
   5616         return (bi_rshift_or_v2i16_to(b, dest0, src0, src1, src2));
   5617     else if (bitsize == 8)
   5618         return (bi_rshift_or_v4i8_to(b, dest0, src0, src1, src2));
   5619     else
   5620         unreachable("Invalid parameters for RSHIFT_OR");
   5621 }
   5622 
   5623 static inline
   5624 bi_index bi_rshift_or(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2)
   5625 {
   5626     if (bitsize == 32)
   5627         return (bi_rshift_or_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5628     else if (bitsize == 16)
   5629         return (bi_rshift_or_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5630     else if (bitsize == 8)
   5631         return (bi_rshift_or_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5632     else
   5633         unreachable("Invalid parameters for RSHIFT_OR");
   5634 }
   5635 
   5636 static inline
   5637 bi_instr * bi_rshift_xor_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5638 {
   5639     bi_instr *I = rzalloc(b->shader, bi_instr);
   5640     I->op = BI_OPCODE_RSHIFT_XOR_I32;
   5641     I->dest[0] = dest0;
   5642     I->src[0] = src0;
   5643     I->src[1] = src1;
   5644     I->src[2] = src2;
   5645     bi_builder_insert(&b->cursor, I);
   5646     return I;
   5647 }
   5648 
   5649 static inline
   5650 bi_index bi_rshift_xor_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5651 {
   5652     return (bi_rshift_xor_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5653 }
   5654 
   5655 
   5656 static inline
   5657 bi_instr * bi_rshift_xor_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5658 {
   5659     bi_instr *I = rzalloc(b->shader, bi_instr);
   5660     I->op = BI_OPCODE_RSHIFT_XOR_V2I16;
   5661     I->dest[0] = dest0;
   5662     I->src[0] = src0;
   5663     I->src[1] = src1;
   5664     I->src[2] = src2;
   5665     bi_builder_insert(&b->cursor, I);
   5666     return I;
   5667 }
   5668 
   5669 static inline
   5670 bi_index bi_rshift_xor_v2i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5671 {
   5672     return (bi_rshift_xor_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5673 }
   5674 
   5675 
   5676 static inline
   5677 bi_instr * bi_rshift_xor_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5678 {
   5679     bi_instr *I = rzalloc(b->shader, bi_instr);
   5680     I->op = BI_OPCODE_RSHIFT_XOR_V4I8;
   5681     I->dest[0] = dest0;
   5682     I->src[0] = src0;
   5683     I->src[1] = src1;
   5684     I->src[2] = src2;
   5685     bi_builder_insert(&b->cursor, I);
   5686     return I;
   5687 }
   5688 
   5689 static inline
   5690 bi_index bi_rshift_xor_v4i8(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5691 {
   5692     return (bi_rshift_xor_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5693 }
   5694 
   5695 
   5696 static inline
   5697 bi_instr * bi_rshift_xor_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5698 {
   5699     if (bitsize == 32)
   5700         return (bi_rshift_xor_i32_to(b, dest0, src0, src1, src2));
   5701     else if (bitsize == 16)
   5702         return (bi_rshift_xor_v2i16_to(b, dest0, src0, src1, src2));
   5703     else if (bitsize == 8)
   5704         return (bi_rshift_xor_v4i8_to(b, dest0, src0, src1, src2));
   5705     else
   5706         unreachable("Invalid parameters for RSHIFT_XOR");
   5707 }
   5708 
   5709 static inline
   5710 bi_index bi_rshift_xor(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2)
   5711 {
   5712     if (bitsize == 32)
   5713         return (bi_rshift_xor_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5714     else if (bitsize == 16)
   5715         return (bi_rshift_xor_v2i16_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5716     else if (bitsize == 8)
   5717         return (bi_rshift_xor_v4i8_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5718     else
   5719         unreachable("Invalid parameters for RSHIFT_XOR");
   5720 }
   5721 
   5722 static inline
   5723 bi_instr * bi_s16_to_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   5724 {
   5725     bi_instr *I = rzalloc(b->shader, bi_instr);
   5726     I->op = BI_OPCODE_S16_TO_F32;
   5727     I->dest[0] = dest0;
   5728     I->src[0] = src0;
   5729     bi_builder_insert(&b->cursor, I);
   5730     return I;
   5731 }
   5732 
   5733 static inline
   5734 bi_index bi_s16_to_f32(bi_builder *b, bi_index src0)
   5735 {
   5736     return (bi_s16_to_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   5737 }
   5738 
   5739 
   5740 static inline
   5741 bi_instr * bi_s16_to_s32_to(bi_builder *b, bi_index dest0, bi_index src0)
   5742 {
   5743     bi_instr *I = rzalloc(b->shader, bi_instr);
   5744     I->op = BI_OPCODE_S16_TO_S32;
   5745     I->dest[0] = dest0;
   5746     I->src[0] = src0;
   5747     bi_builder_insert(&b->cursor, I);
   5748     return I;
   5749 }
   5750 
   5751 static inline
   5752 bi_index bi_s16_to_s32(bi_builder *b, bi_index src0)
   5753 {
   5754     return (bi_s16_to_s32_to(b, bi_temp(b->shader), src0))->dest[0];
   5755 }
   5756 
   5757 
   5758 static inline
   5759 bi_instr * bi_s32_to_f32_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   5760 {
   5761     bi_instr *I = rzalloc(b->shader, bi_instr);
   5762     I->op = BI_OPCODE_S32_TO_F32;
   5763     I->dest[0] = dest0;
   5764     I->src[0] = src0;
   5765     I->round = round;
   5766     bi_builder_insert(&b->cursor, I);
   5767     return I;
   5768 }
   5769 
   5770 static inline
   5771 bi_index bi_s32_to_f32(bi_builder *b, bi_index src0, enum bi_round round)
   5772 {
   5773     return (bi_s32_to_f32_to(b, bi_temp(b->shader), src0, round))->dest[0];
   5774 }
   5775 
   5776 
   5777 static inline
   5778 bi_instr * bi_s8_to_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   5779 {
   5780     bi_instr *I = rzalloc(b->shader, bi_instr);
   5781     I->op = BI_OPCODE_S8_TO_F32;
   5782     I->dest[0] = dest0;
   5783     I->src[0] = src0;
   5784     bi_builder_insert(&b->cursor, I);
   5785     return I;
   5786 }
   5787 
   5788 static inline
   5789 bi_index bi_s8_to_f32(bi_builder *b, bi_index src0)
   5790 {
   5791     return (bi_s8_to_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   5792 }
   5793 
   5794 
   5795 static inline
   5796 bi_instr * bi_s8_to_s32_to(bi_builder *b, bi_index dest0, bi_index src0)
   5797 {
   5798     bi_instr *I = rzalloc(b->shader, bi_instr);
   5799     I->op = BI_OPCODE_S8_TO_S32;
   5800     I->dest[0] = dest0;
   5801     I->src[0] = src0;
   5802     bi_builder_insert(&b->cursor, I);
   5803     return I;
   5804 }
   5805 
   5806 static inline
   5807 bi_index bi_s8_to_s32(bi_builder *b, bi_index src0)
   5808 {
   5809     return (bi_s8_to_s32_to(b, bi_temp(b->shader), src0))->dest[0];
   5810 }
   5811 
   5812 
   5813 static inline
   5814 bi_instr * bi_seg_add_to(bi_builder *b, bi_index dest0, bi_index src0, bool preserve_null, enum bi_seg seg)
   5815 {
   5816     bi_instr *I = rzalloc(b->shader, bi_instr);
   5817     I->op = BI_OPCODE_SEG_ADD;
   5818     I->dest[0] = dest0;
   5819     I->src[0] = src0;
   5820     I->seg = seg;
   5821     I->preserve_null = preserve_null;
   5822     bi_builder_insert(&b->cursor, I);
   5823     return I;
   5824 }
   5825 
   5826 static inline
   5827 bi_index bi_seg_add(bi_builder *b, bi_index src0, bool preserve_null, enum bi_seg seg)
   5828 {
   5829     return (bi_seg_add_to(b, bi_temp(b->shader), src0, preserve_null, seg))->dest[0];
   5830 }
   5831 
   5832 
   5833 static inline
   5834 bi_instr * bi_seg_add_i64_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool preserve_null, enum bi_seg seg)
   5835 {
   5836     bi_instr *I = rzalloc(b->shader, bi_instr);
   5837     I->op = BI_OPCODE_SEG_ADD_I64;
   5838     I->dest[0] = dest0;
   5839     I->src[0] = src0;
   5840     I->src[1] = src1;
   5841     I->seg = seg;
   5842     I->preserve_null = preserve_null;
   5843     bi_builder_insert(&b->cursor, I);
   5844     return I;
   5845 }
   5846 
   5847 static inline
   5848 bi_index bi_seg_add_i64(bi_builder *b, bi_index src0, bi_index src1, bool preserve_null, enum bi_seg seg)
   5849 {
   5850     return (bi_seg_add_i64_to(b, bi_temp(b->shader), src0, src1, preserve_null, seg))->dest[0];
   5851 }
   5852 
   5853 
   5854 static inline
   5855 bi_instr * bi_shaddxh_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1)
   5856 {
   5857     bi_instr *I = rzalloc(b->shader, bi_instr);
   5858     I->op = BI_OPCODE_SHADDXH_I32;
   5859     I->dest[0] = dest0;
   5860     I->src[0] = src0;
   5861     I->src[1] = src1;
   5862     bi_builder_insert(&b->cursor, I);
   5863     return I;
   5864 }
   5865 
   5866 static inline
   5867 bi_index bi_shaddxh_i32(bi_builder *b, bi_index src0, bi_index src1)
   5868 {
   5869     return (bi_shaddxh_i32_to(b, bi_temp(b->shader), src0, src1))->dest[0];
   5870 }
   5871 
   5872 
   5873 static inline
   5874 bi_instr * bi_shaddxl_i64_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, uint32_t shift)
   5875 {
   5876     bi_instr *I = rzalloc(b->shader, bi_instr);
   5877     I->op = BI_OPCODE_SHADDXL_I64;
   5878     I->dest[0] = dest0;
   5879     I->src[0] = src0;
   5880     I->src[1] = src1;
   5881     I->shift = shift;
   5882     bi_builder_insert(&b->cursor, I);
   5883     return I;
   5884 }
   5885 
   5886 static inline
   5887 bi_index bi_shaddxl_i64(bi_builder *b, bi_index src0, bi_index src1, uint32_t shift)
   5888 {
   5889     return (bi_shaddxl_i64_to(b, bi_temp(b->shader), src0, src1, shift))->dest[0];
   5890 }
   5891 
   5892 
   5893 static inline
   5894 bi_instr * bi_shaddxl_s32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, uint32_t shift)
   5895 {
   5896     bi_instr *I = rzalloc(b->shader, bi_instr);
   5897     I->op = BI_OPCODE_SHADDXL_S32;
   5898     I->dest[0] = dest0;
   5899     I->src[0] = src0;
   5900     I->src[1] = src1;
   5901     I->shift = shift;
   5902     bi_builder_insert(&b->cursor, I);
   5903     return I;
   5904 }
   5905 
   5906 static inline
   5907 bi_index bi_shaddxl_s32(bi_builder *b, bi_index src0, bi_index src1, uint32_t shift)
   5908 {
   5909     return (bi_shaddxl_s32_to(b, bi_temp(b->shader), src0, src1, shift))->dest[0];
   5910 }
   5911 
   5912 
   5913 static inline
   5914 bi_instr * bi_shaddxl_u32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, uint32_t shift)
   5915 {
   5916     bi_instr *I = rzalloc(b->shader, bi_instr);
   5917     I->op = BI_OPCODE_SHADDXL_U32;
   5918     I->dest[0] = dest0;
   5919     I->src[0] = src0;
   5920     I->src[1] = src1;
   5921     I->shift = shift;
   5922     bi_builder_insert(&b->cursor, I);
   5923     return I;
   5924 }
   5925 
   5926 static inline
   5927 bi_index bi_shaddxl_u32(bi_builder *b, bi_index src0, bi_index src1, uint32_t shift)
   5928 {
   5929     return (bi_shaddxl_u32_to(b, bi_temp(b->shader), src0, src1, shift))->dest[0];
   5930 }
   5931 
   5932 
   5933 static inline
   5934 bi_instr * bi_shaddxl_to(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, uint32_t shift)
   5935 {
   5936     if ((type == nir_type_uint || type == nir_type_int) && bitsize == 64)
   5937         return (bi_shaddxl_i64_to(b, dest0, src0, src1, shift));
   5938     else if ((type == nir_type_int) && bitsize == 32)
   5939         return (bi_shaddxl_s32_to(b, dest0, src0, src1, shift));
   5940     else if ((type == nir_type_uint) && bitsize == 32)
   5941         return (bi_shaddxl_u32_to(b, dest0, src0, src1, shift));
   5942     else
   5943         unreachable("Invalid parameters for SHADDXL");
   5944 }
   5945 
   5946 static inline
   5947 bi_index bi_shaddxl(bi_builder *b, nir_alu_type type, unsigned bitsize, bi_index src0, bi_index src1, uint32_t shift)
   5948 {
   5949     if ((type == nir_type_uint || type == nir_type_int) && bitsize == 64)
   5950         return (bi_shaddxl_i64_to(b, bi_temp(b->shader), src0, src1, shift))->dest[0];
   5951     else if ((type == nir_type_int) && bitsize == 32)
   5952         return (bi_shaddxl_s32_to(b, bi_temp(b->shader), src0, src1, shift))->dest[0];
   5953     else if ((type == nir_type_uint) && bitsize == 32)
   5954         return (bi_shaddxl_u32_to(b, bi_temp(b->shader), src0, src1, shift))->dest[0];
   5955     else
   5956         unreachable("Invalid parameters for SHADDXL");
   5957 }
   5958 
   5959 static inline
   5960 bi_instr * bi_shift_double_i32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2)
   5961 {
   5962     bi_instr *I = rzalloc(b->shader, bi_instr);
   5963     I->op = BI_OPCODE_SHIFT_DOUBLE_I32;
   5964     I->dest[0] = dest0;
   5965     I->src[0] = src0;
   5966     I->src[1] = src1;
   5967     I->src[2] = src2;
   5968     bi_builder_insert(&b->cursor, I);
   5969     return I;
   5970 }
   5971 
   5972 static inline
   5973 bi_index bi_shift_double_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2)
   5974 {
   5975     return (bi_shift_double_i32_to(b, bi_temp(b->shader), src0, src1, src2))->dest[0];
   5976 }
   5977 
   5978 
   5979 static inline
   5980 bi_instr * bi_store_i128(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
   5981 {
   5982     bi_instr *I = rzalloc(b->shader, bi_instr);
   5983     I->op = BI_OPCODE_STORE_I128;
   5984     I->src[0] = src0;
   5985     I->src[1] = src1;
   5986     I->src[2] = src2;
   5987     I->seg = seg;
   5988     bi_builder_insert(&b->cursor, I);
   5989     return I;
   5990 }
   5991 
   5992 
   5993 static inline
   5994 bi_instr * bi_store_i16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
   5995 {
   5996     bi_instr *I = rzalloc(b->shader, bi_instr);
   5997     I->op = BI_OPCODE_STORE_I16;
   5998     I->src[0] = src0;
   5999     I->src[1] = src1;
   6000     I->src[2] = src2;
   6001     I->seg = seg;
   6002     I->extend = BI_EXTEND_ZEXT;
   6003     bi_builder_insert(&b->cursor, I);
   6004     return I;
   6005 }
   6006 
   6007 
   6008 static inline
   6009 bi_instr * bi_store_i24(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
   6010 {
   6011     bi_instr *I = rzalloc(b->shader, bi_instr);
   6012     I->op = BI_OPCODE_STORE_I24;
   6013     I->src[0] = src0;
   6014     I->src[1] = src1;
   6015     I->src[2] = src2;
   6016     I->seg = seg;
   6017     I->extend = BI_EXTEND_ZEXT;
   6018     bi_builder_insert(&b->cursor, I);
   6019     return I;
   6020 }
   6021 
   6022 
   6023 static inline
   6024 bi_instr * bi_store_i32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
   6025 {
   6026     bi_instr *I = rzalloc(b->shader, bi_instr);
   6027     I->op = BI_OPCODE_STORE_I32;
   6028     I->src[0] = src0;
   6029     I->src[1] = src1;
   6030     I->src[2] = src2;
   6031     I->seg = seg;
   6032     bi_builder_insert(&b->cursor, I);
   6033     return I;
   6034 }
   6035 
   6036 
   6037 static inline
   6038 bi_instr * bi_store_i48(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
   6039 {
   6040     bi_instr *I = rzalloc(b->shader, bi_instr);
   6041     I->op = BI_OPCODE_STORE_I48;
   6042     I->src[0] = src0;
   6043     I->src[1] = src1;
   6044     I->src[2] = src2;
   6045     I->seg = seg;
   6046     bi_builder_insert(&b->cursor, I);
   6047     return I;
   6048 }
   6049 
   6050 
   6051 static inline
   6052 bi_instr * bi_store_i64(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
   6053 {
   6054     bi_instr *I = rzalloc(b->shader, bi_instr);
   6055     I->op = BI_OPCODE_STORE_I64;
   6056     I->src[0] = src0;
   6057     I->src[1] = src1;
   6058     I->src[2] = src2;
   6059     I->seg = seg;
   6060     bi_builder_insert(&b->cursor, I);
   6061     return I;
   6062 }
   6063 
   6064 
   6065 static inline
   6066 bi_instr * bi_store_i8(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
   6067 {
   6068     bi_instr *I = rzalloc(b->shader, bi_instr);
   6069     I->op = BI_OPCODE_STORE_I8;
   6070     I->src[0] = src0;
   6071     I->src[1] = src1;
   6072     I->src[2] = src2;
   6073     I->seg = seg;
   6074     I->extend = BI_EXTEND_ZEXT;
   6075     bi_builder_insert(&b->cursor, I);
   6076     return I;
   6077 }
   6078 
   6079 
   6080 static inline
   6081 bi_instr * bi_store_i96(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
   6082 {
   6083     bi_instr *I = rzalloc(b->shader, bi_instr);
   6084     I->op = BI_OPCODE_STORE_I96;
   6085     I->src[0] = src0;
   6086     I->src[1] = src1;
   6087     I->src[2] = src2;
   6088     I->seg = seg;
   6089     bi_builder_insert(&b->cursor, I);
   6090     return I;
   6091 }
   6092 
   6093 
   6094 static inline
   6095 bi_instr * bi_store(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, enum bi_seg seg)
   6096 {
   6097     if (bitsize == 128)
   6098         return (bi_store_i128(b, src0, src1, src2, seg));
   6099     else if (bitsize == 16)
   6100         return (bi_store_i16(b, src0, src1, src2, seg));
   6101     else if (bitsize == 24)
   6102         return (bi_store_i24(b, src0, src1, src2, seg));
   6103     else if (bitsize == 32)
   6104         return (bi_store_i32(b, src0, src1, src2, seg));
   6105     else if (bitsize == 48)
   6106         return (bi_store_i48(b, src0, src1, src2, seg));
   6107     else if (bitsize == 64)
   6108         return (bi_store_i64(b, src0, src1, src2, seg));
   6109     else if (bitsize == 8)
   6110         return (bi_store_i8(b, src0, src1, src2, seg));
   6111     else if (bitsize == 96)
   6112         return (bi_store_i96(b, src0, src1, src2, seg));
   6113     else
   6114         unreachable("Invalid parameters for STORE");
   6115 }
   6116 
   6117 static inline
   6118 bi_instr * bi_st_cvt(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_register_format register_format, enum bi_vecsize vecsize)
   6119 {
   6120     bi_instr *I = rzalloc(b->shader, bi_instr);
   6121     I->op = BI_OPCODE_ST_CVT;
   6122     I->src[0] = src0;
   6123     I->src[1] = src1;
   6124     I->src[2] = src2;
   6125     I->src[3] = src3;
   6126     I->register_format = register_format;
   6127     I->vecsize = vecsize;
   6128     bi_builder_insert(&b->cursor, I);
   6129     return I;
   6130 }
   6131 
   6132 
   6133 static inline
   6134 bi_instr * bi_st_tile(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, enum bi_vecsize vecsize)
   6135 {
   6136     bi_instr *I = rzalloc(b->shader, bi_instr);
   6137     I->op = BI_OPCODE_ST_TILE;
   6138     I->src[0] = src0;
   6139     I->src[1] = src1;
   6140     I->src[2] = src2;
   6141     I->src[3] = src3;
   6142     I->vecsize = vecsize;
   6143     bi_builder_insert(&b->cursor, I);
   6144     return I;
   6145 }
   6146 
   6147 
   6148 static inline
   6149 bi_instr * bi_swz_v2i16_to(bi_builder *b, bi_index dest0, bi_index src0)
   6150 {
   6151     bi_instr *I = rzalloc(b->shader, bi_instr);
   6152     I->op = BI_OPCODE_SWZ_V2I16;
   6153     I->dest[0] = dest0;
   6154     I->src[0] = src0;
   6155     bi_builder_insert(&b->cursor, I);
   6156     return I;
   6157 }
   6158 
   6159 static inline
   6160 bi_index bi_swz_v2i16(bi_builder *b, bi_index src0)
   6161 {
   6162     return (bi_swz_v2i16_to(b, bi_temp(b->shader), src0))->dest[0];
   6163 }
   6164 
   6165 
   6166 static inline
   6167 bi_instr * bi_swz_v4i8_to(bi_builder *b, bi_index dest0, bi_index src0)
   6168 {
   6169     bi_instr *I = rzalloc(b->shader, bi_instr);
   6170     I->op = BI_OPCODE_SWZ_V4I8;
   6171     I->dest[0] = dest0;
   6172     I->src[0] = src0;
   6173     bi_builder_insert(&b->cursor, I);
   6174     return I;
   6175 }
   6176 
   6177 static inline
   6178 bi_index bi_swz_v4i8(bi_builder *b, bi_index src0)
   6179 {
   6180     return (bi_swz_v4i8_to(b, bi_temp(b->shader), src0))->dest[0];
   6181 }
   6182 
   6183 
   6184 static inline
   6185 bi_instr * bi_swz_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0)
   6186 {
   6187     if (bitsize == 16)
   6188         return (bi_swz_v2i16_to(b, dest0, src0));
   6189     else if (bitsize == 8)
   6190         return (bi_swz_v4i8_to(b, dest0, src0));
   6191     else
   6192         unreachable("Invalid parameters for SWZ");
   6193 }
   6194 
   6195 static inline
   6196 bi_index bi_swz(bi_builder *b, unsigned bitsize, bi_index src0)
   6197 {
   6198     if (bitsize == 16)
   6199         return (bi_swz_v2i16_to(b, bi_temp(b->shader), src0))->dest[0];
   6200     else if (bitsize == 8)
   6201         return (bi_swz_v4i8_to(b, bi_temp(b->shader), src0))->dest[0];
   6202     else
   6203         unreachable("Invalid parameters for SWZ");
   6204 }
   6205 
   6206 static inline
   6207 bi_instr * bi_texc_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3, bool lod_mode, uint32_t sr_count)
   6208 {
   6209     bi_instr *I = rzalloc(b->shader, bi_instr);
   6210     I->op = BI_OPCODE_TEXC;
   6211     I->dest[0] = dest0;
   6212     I->src[0] = src0;
   6213     I->src[1] = src1;
   6214     I->src[2] = src2;
   6215     I->src[3] = src3;
   6216     I->lod_mode = lod_mode;
   6217     I->sr_count = sr_count;
   6218     bi_builder_insert(&b->cursor, I);
   6219     return I;
   6220 }
   6221 
   6222 static inline
   6223 bi_index bi_texc(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3, bool lod_mode, uint32_t sr_count)
   6224 {
   6225     return (bi_texc_to(b, bi_temp(b->shader), src0, src1, src2, src3, lod_mode, sr_count))->dest[0];
   6226 }
   6227 
   6228 
   6229 static inline
   6230 bi_instr * bi_texs_2d_f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool lod_mode, uint32_t sampler_index, uint32_t texture_index)
   6231 {
   6232     bi_instr *I = rzalloc(b->shader, bi_instr);
   6233     I->op = BI_OPCODE_TEXS_2D_F16;
   6234     I->dest[0] = dest0;
   6235     I->src[0] = src0;
   6236     I->src[1] = src1;
   6237     I->lod_mode = lod_mode;
   6238     I->sampler_index = sampler_index;
   6239     I->texture_index = texture_index;
   6240     bi_builder_insert(&b->cursor, I);
   6241     return I;
   6242 }
   6243 
   6244 static inline
   6245 bi_index bi_texs_2d_f16(bi_builder *b, bi_index src0, bi_index src1, bool lod_mode, uint32_t sampler_index, uint32_t texture_index)
   6246 {
   6247     return (bi_texs_2d_f16_to(b, bi_temp(b->shader), src0, src1, lod_mode, sampler_index, texture_index))->dest[0];
   6248 }
   6249 
   6250 
   6251 static inline
   6252 bi_instr * bi_texs_2d_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bool lod_mode, uint32_t sampler_index, uint32_t texture_index)
   6253 {
   6254     bi_instr *I = rzalloc(b->shader, bi_instr);
   6255     I->op = BI_OPCODE_TEXS_2D_F32;
   6256     I->dest[0] = dest0;
   6257     I->src[0] = src0;
   6258     I->src[1] = src1;
   6259     I->lod_mode = lod_mode;
   6260     I->sampler_index = sampler_index;
   6261     I->texture_index = texture_index;
   6262     bi_builder_insert(&b->cursor, I);
   6263     return I;
   6264 }
   6265 
   6266 static inline
   6267 bi_index bi_texs_2d_f32(bi_builder *b, bi_index src0, bi_index src1, bool lod_mode, uint32_t sampler_index, uint32_t texture_index)
   6268 {
   6269     return (bi_texs_2d_f32_to(b, bi_temp(b->shader), src0, src1, lod_mode, sampler_index, texture_index))->dest[0];
   6270 }
   6271 
   6272 
   6273 static inline
   6274 bi_instr * bi_texs_2d_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bool lod_mode, uint32_t sampler_index, uint32_t texture_index)
   6275 {
   6276     if (bitsize == 16)
   6277         return (bi_texs_2d_f16_to(b, dest0, src0, src1, lod_mode, sampler_index, texture_index));
   6278     else if (bitsize == 32)
   6279         return (bi_texs_2d_f32_to(b, dest0, src0, src1, lod_mode, sampler_index, texture_index));
   6280     else
   6281         unreachable("Invalid parameters for TEXS_2D");
   6282 }
   6283 
   6284 static inline
   6285 bi_index bi_texs_2d(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bool lod_mode, uint32_t sampler_index, uint32_t texture_index)
   6286 {
   6287     if (bitsize == 16)
   6288         return (bi_texs_2d_f16_to(b, bi_temp(b->shader), src0, src1, lod_mode, sampler_index, texture_index))->dest[0];
   6289     else if (bitsize == 32)
   6290         return (bi_texs_2d_f32_to(b, bi_temp(b->shader), src0, src1, lod_mode, sampler_index, texture_index))->dest[0];
   6291     else
   6292         unreachable("Invalid parameters for TEXS_2D");
   6293 }
   6294 
   6295 static inline
   6296 bi_instr * bi_texs_cube_f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, uint32_t sampler_index, uint32_t texture_index)
   6297 {
   6298     bi_instr *I = rzalloc(b->shader, bi_instr);
   6299     I->op = BI_OPCODE_TEXS_CUBE_F16;
   6300     I->dest[0] = dest0;
   6301     I->src[0] = src0;
   6302     I->src[1] = src1;
   6303     I->src[2] = src2;
   6304     I->sampler_index = sampler_index;
   6305     I->texture_index = texture_index;
   6306     bi_builder_insert(&b->cursor, I);
   6307     return I;
   6308 }
   6309 
   6310 static inline
   6311 bi_index bi_texs_cube_f16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, uint32_t sampler_index, uint32_t texture_index)
   6312 {
   6313     return (bi_texs_cube_f16_to(b, bi_temp(b->shader), src0, src1, src2, sampler_index, texture_index))->dest[0];
   6314 }
   6315 
   6316 
   6317 static inline
   6318 bi_instr * bi_texs_cube_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, uint32_t sampler_index, uint32_t texture_index)
   6319 {
   6320     bi_instr *I = rzalloc(b->shader, bi_instr);
   6321     I->op = BI_OPCODE_TEXS_CUBE_F32;
   6322     I->dest[0] = dest0;
   6323     I->src[0] = src0;
   6324     I->src[1] = src1;
   6325     I->src[2] = src2;
   6326     I->sampler_index = sampler_index;
   6327     I->texture_index = texture_index;
   6328     bi_builder_insert(&b->cursor, I);
   6329     return I;
   6330 }
   6331 
   6332 static inline
   6333 bi_index bi_texs_cube_f32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, uint32_t sampler_index, uint32_t texture_index)
   6334 {
   6335     return (bi_texs_cube_f32_to(b, bi_temp(b->shader), src0, src1, src2, sampler_index, texture_index))->dest[0];
   6336 }
   6337 
   6338 
   6339 static inline
   6340 bi_instr * bi_texs_cube_to(bi_builder *b, unsigned bitsize, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, uint32_t sampler_index, uint32_t texture_index)
   6341 {
   6342     if (bitsize == 16)
   6343         return (bi_texs_cube_f16_to(b, dest0, src0, src1, src2, sampler_index, texture_index));
   6344     else if (bitsize == 32)
   6345         return (bi_texs_cube_f32_to(b, dest0, src0, src1, src2, sampler_index, texture_index));
   6346     else
   6347         unreachable("Invalid parameters for TEXS_CUBE");
   6348 }
   6349 
   6350 static inline
   6351 bi_index bi_texs_cube(bi_builder *b, unsigned bitsize, bi_index src0, bi_index src1, bi_index src2, uint32_t sampler_index, uint32_t texture_index)
   6352 {
   6353     if (bitsize == 16)
   6354         return (bi_texs_cube_f16_to(b, bi_temp(b->shader), src0, src1, src2, sampler_index, texture_index))->dest[0];
   6355     else if (bitsize == 32)
   6356         return (bi_texs_cube_f32_to(b, bi_temp(b->shader), src0, src1, src2, sampler_index, texture_index))->dest[0];
   6357     else
   6358         unreachable("Invalid parameters for TEXS_CUBE");
   6359 }
   6360 
   6361 static inline
   6362 bi_instr * bi_u16_to_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   6363 {
   6364     bi_instr *I = rzalloc(b->shader, bi_instr);
   6365     I->op = BI_OPCODE_U16_TO_F32;
   6366     I->dest[0] = dest0;
   6367     I->src[0] = src0;
   6368     bi_builder_insert(&b->cursor, I);
   6369     return I;
   6370 }
   6371 
   6372 static inline
   6373 bi_index bi_u16_to_f32(bi_builder *b, bi_index src0)
   6374 {
   6375     return (bi_u16_to_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   6376 }
   6377 
   6378 
   6379 static inline
   6380 bi_instr * bi_u16_to_u32_to(bi_builder *b, bi_index dest0, bi_index src0)
   6381 {
   6382     bi_instr *I = rzalloc(b->shader, bi_instr);
   6383     I->op = BI_OPCODE_U16_TO_U32;
   6384     I->dest[0] = dest0;
   6385     I->src[0] = src0;
   6386     bi_builder_insert(&b->cursor, I);
   6387     return I;
   6388 }
   6389 
   6390 static inline
   6391 bi_index bi_u16_to_u32(bi_builder *b, bi_index src0)
   6392 {
   6393     return (bi_u16_to_u32_to(b, bi_temp(b->shader), src0))->dest[0];
   6394 }
   6395 
   6396 
   6397 static inline
   6398 bi_instr * bi_u32_to_f32_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   6399 {
   6400     bi_instr *I = rzalloc(b->shader, bi_instr);
   6401     I->op = BI_OPCODE_U32_TO_F32;
   6402     I->dest[0] = dest0;
   6403     I->src[0] = src0;
   6404     I->round = round;
   6405     bi_builder_insert(&b->cursor, I);
   6406     return I;
   6407 }
   6408 
   6409 static inline
   6410 bi_index bi_u32_to_f32(bi_builder *b, bi_index src0, enum bi_round round)
   6411 {
   6412     return (bi_u32_to_f32_to(b, bi_temp(b->shader), src0, round))->dest[0];
   6413 }
   6414 
   6415 
   6416 static inline
   6417 bi_instr * bi_u8_to_f32_to(bi_builder *b, bi_index dest0, bi_index src0)
   6418 {
   6419     bi_instr *I = rzalloc(b->shader, bi_instr);
   6420     I->op = BI_OPCODE_U8_TO_F32;
   6421     I->dest[0] = dest0;
   6422     I->src[0] = src0;
   6423     bi_builder_insert(&b->cursor, I);
   6424     return I;
   6425 }
   6426 
   6427 static inline
   6428 bi_index bi_u8_to_f32(bi_builder *b, bi_index src0)
   6429 {
   6430     return (bi_u8_to_f32_to(b, bi_temp(b->shader), src0))->dest[0];
   6431 }
   6432 
   6433 
   6434 static inline
   6435 bi_instr * bi_u8_to_u32_to(bi_builder *b, bi_index dest0, bi_index src0)
   6436 {
   6437     bi_instr *I = rzalloc(b->shader, bi_instr);
   6438     I->op = BI_OPCODE_U8_TO_U32;
   6439     I->dest[0] = dest0;
   6440     I->src[0] = src0;
   6441     bi_builder_insert(&b->cursor, I);
   6442     return I;
   6443 }
   6444 
   6445 static inline
   6446 bi_index bi_u8_to_u32(bi_builder *b, bi_index src0)
   6447 {
   6448     return (bi_u8_to_u32_to(b, bi_temp(b->shader), src0))->dest[0];
   6449 }
   6450 
   6451 
   6452 static inline
   6453 bi_instr * bi_v2f16_to_v2s16_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   6454 {
   6455     bi_instr *I = rzalloc(b->shader, bi_instr);
   6456     I->op = BI_OPCODE_V2F16_TO_V2S16;
   6457     I->dest[0] = dest0;
   6458     I->src[0] = src0;
   6459     I->round = round;
   6460     bi_builder_insert(&b->cursor, I);
   6461     return I;
   6462 }
   6463 
   6464 static inline
   6465 bi_index bi_v2f16_to_v2s16(bi_builder *b, bi_index src0, enum bi_round round)
   6466 {
   6467     return (bi_v2f16_to_v2s16_to(b, bi_temp(b->shader), src0, round))->dest[0];
   6468 }
   6469 
   6470 
   6471 static inline
   6472 bi_instr * bi_v2f16_to_v2u16_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   6473 {
   6474     bi_instr *I = rzalloc(b->shader, bi_instr);
   6475     I->op = BI_OPCODE_V2F16_TO_V2U16;
   6476     I->dest[0] = dest0;
   6477     I->src[0] = src0;
   6478     I->round = round;
   6479     bi_builder_insert(&b->cursor, I);
   6480     return I;
   6481 }
   6482 
   6483 static inline
   6484 bi_index bi_v2f16_to_v2u16(bi_builder *b, bi_index src0, enum bi_round round)
   6485 {
   6486     return (bi_v2f16_to_v2u16_to(b, bi_temp(b->shader), src0, round))->dest[0];
   6487 }
   6488 
   6489 
   6490 static inline
   6491 bi_instr * bi_v2f32_to_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, enum bi_round round)
   6492 {
   6493     bi_instr *I = rzalloc(b->shader, bi_instr);
   6494     I->op = BI_OPCODE_V2F32_TO_V2F16;
   6495     I->dest[0] = dest0;
   6496     I->src[0] = src0;
   6497     I->src[1] = src1;
   6498     I->round = round;
   6499     bi_builder_insert(&b->cursor, I);
   6500     return I;
   6501 }
   6502 
   6503 static inline
   6504 bi_index bi_v2f32_to_v2f16(bi_builder *b, bi_index src0, bi_index src1, enum bi_round round)
   6505 {
   6506     return (bi_v2f32_to_v2f16_to(b, bi_temp(b->shader), src0, src1, round))->dest[0];
   6507 }
   6508 
   6509 
   6510 static inline
   6511 bi_instr * bi_v2s16_to_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   6512 {
   6513     bi_instr *I = rzalloc(b->shader, bi_instr);
   6514     I->op = BI_OPCODE_V2S16_TO_V2F16;
   6515     I->dest[0] = dest0;
   6516     I->src[0] = src0;
   6517     I->round = round;
   6518     bi_builder_insert(&b->cursor, I);
   6519     return I;
   6520 }
   6521 
   6522 static inline
   6523 bi_index bi_v2s16_to_v2f16(bi_builder *b, bi_index src0, enum bi_round round)
   6524 {
   6525     return (bi_v2s16_to_v2f16_to(b, bi_temp(b->shader), src0, round))->dest[0];
   6526 }
   6527 
   6528 
   6529 static inline
   6530 bi_instr * bi_v2s8_to_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   6531 {
   6532     bi_instr *I = rzalloc(b->shader, bi_instr);
   6533     I->op = BI_OPCODE_V2S8_TO_V2F16;
   6534     I->dest[0] = dest0;
   6535     I->src[0] = src0;
   6536     bi_builder_insert(&b->cursor, I);
   6537     return I;
   6538 }
   6539 
   6540 static inline
   6541 bi_index bi_v2s8_to_v2f16(bi_builder *b, bi_index src0)
   6542 {
   6543     return (bi_v2s8_to_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   6544 }
   6545 
   6546 
   6547 static inline
   6548 bi_instr * bi_v2s8_to_v2s16_to(bi_builder *b, bi_index dest0, bi_index src0)
   6549 {
   6550     bi_instr *I = rzalloc(b->shader, bi_instr);
   6551     I->op = BI_OPCODE_V2S8_TO_V2S16;
   6552     I->dest[0] = dest0;
   6553     I->src[0] = src0;
   6554     bi_builder_insert(&b->cursor, I);
   6555     return I;
   6556 }
   6557 
   6558 static inline
   6559 bi_index bi_v2s8_to_v2s16(bi_builder *b, bi_index src0)
   6560 {
   6561     return (bi_v2s8_to_v2s16_to(b, bi_temp(b->shader), src0))->dest[0];
   6562 }
   6563 
   6564 
   6565 static inline
   6566 bi_instr * bi_v2u16_to_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_round round)
   6567 {
   6568     bi_instr *I = rzalloc(b->shader, bi_instr);
   6569     I->op = BI_OPCODE_V2U16_TO_V2F16;
   6570     I->dest[0] = dest0;
   6571     I->src[0] = src0;
   6572     I->round = round;
   6573     bi_builder_insert(&b->cursor, I);
   6574     return I;
   6575 }
   6576 
   6577 static inline
   6578 bi_index bi_v2u16_to_v2f16(bi_builder *b, bi_index src0, enum bi_round round)
   6579 {
   6580     return (bi_v2u16_to_v2f16_to(b, bi_temp(b->shader), src0, round))->dest[0];
   6581 }
   6582 
   6583 
   6584 static inline
   6585 bi_instr * bi_v2u8_to_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   6586 {
   6587     bi_instr *I = rzalloc(b->shader, bi_instr);
   6588     I->op = BI_OPCODE_V2U8_TO_V2F16;
   6589     I->dest[0] = dest0;
   6590     I->src[0] = src0;
   6591     bi_builder_insert(&b->cursor, I);
   6592     return I;
   6593 }
   6594 
   6595 static inline
   6596 bi_index bi_v2u8_to_v2f16(bi_builder *b, bi_index src0)
   6597 {
   6598     return (bi_v2u8_to_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   6599 }
   6600 
   6601 
   6602 static inline
   6603 bi_instr * bi_v2u8_to_v2u16_to(bi_builder *b, bi_index dest0, bi_index src0)
   6604 {
   6605     bi_instr *I = rzalloc(b->shader, bi_instr);
   6606     I->op = BI_OPCODE_V2U8_TO_V2U16;
   6607     I->dest[0] = dest0;
   6608     I->src[0] = src0;
   6609     bi_builder_insert(&b->cursor, I);
   6610     return I;
   6611 }
   6612 
   6613 static inline
   6614 bi_index bi_v2u8_to_v2u16(bi_builder *b, bi_index src0)
   6615 {
   6616     return (bi_v2u8_to_v2u16_to(b, bi_temp(b->shader), src0))->dest[0];
   6617 }
   6618 
   6619 
   6620 static inline
   6621 bi_instr * bi_var_tex_f16_to(bi_builder *b, bi_index dest0, bool lod_mode, enum bi_sample sample, enum bi_update update, uint32_t texture_index, uint32_t varying_index)
   6622 {
   6623     bi_instr *I = rzalloc(b->shader, bi_instr);
   6624     I->op = BI_OPCODE_VAR_TEX_F16;
   6625     I->dest[0] = dest0;
   6626     I->update = update;
   6627     I->lod_mode = lod_mode;
   6628     I->sample = sample;
   6629     I->texture_index = texture_index;
   6630     I->varying_index = varying_index;
   6631     bi_builder_insert(&b->cursor, I);
   6632     return I;
   6633 }
   6634 
   6635 static inline
   6636 bi_index bi_var_tex_f16(bi_builder *b, bool lod_mode, enum bi_sample sample, enum bi_update update, uint32_t texture_index, uint32_t varying_index)
   6637 {
   6638     return (bi_var_tex_f16_to(b, bi_temp(b->shader), lod_mode, sample, update, texture_index, varying_index))->dest[0];
   6639 }
   6640 
   6641 
   6642 static inline
   6643 bi_instr * bi_var_tex_f32_to(bi_builder *b, bi_index dest0, bool lod_mode, enum bi_sample sample, enum bi_update update, uint32_t texture_index, uint32_t varying_index)
   6644 {
   6645     bi_instr *I = rzalloc(b->shader, bi_instr);
   6646     I->op = BI_OPCODE_VAR_TEX_F32;
   6647     I->dest[0] = dest0;
   6648     I->update = update;
   6649     I->lod_mode = lod_mode;
   6650     I->sample = sample;
   6651     I->texture_index = texture_index;
   6652     I->varying_index = varying_index;
   6653     bi_builder_insert(&b->cursor, I);
   6654     return I;
   6655 }
   6656 
   6657 static inline
   6658 bi_index bi_var_tex_f32(bi_builder *b, bool lod_mode, enum bi_sample sample, enum bi_update update, uint32_t texture_index, uint32_t varying_index)
   6659 {
   6660     return (bi_var_tex_f32_to(b, bi_temp(b->shader), lod_mode, sample, update, texture_index, varying_index))->dest[0];
   6661 }
   6662 
   6663 
   6664 static inline
   6665 bi_instr * bi_var_tex_to(bi_builder *b, unsigned bitsize, bi_index dest0, bool lod_mode, enum bi_sample sample, enum bi_update update, uint32_t texture_index, uint32_t varying_index)
   6666 {
   6667     if (bitsize == 16)
   6668         return (bi_var_tex_f16_to(b, dest0, lod_mode, sample, update, texture_index, varying_index));
   6669     else if (bitsize == 32)
   6670         return (bi_var_tex_f32_to(b, dest0, lod_mode, sample, update, texture_index, varying_index));
   6671     else
   6672         unreachable("Invalid parameters for VAR_TEX");
   6673 }
   6674 
   6675 static inline
   6676 bi_index bi_var_tex(bi_builder *b, unsigned bitsize, bool lod_mode, enum bi_sample sample, enum bi_update update, uint32_t texture_index, uint32_t varying_index)
   6677 {
   6678     if (bitsize == 16)
   6679         return (bi_var_tex_f16_to(b, bi_temp(b->shader), lod_mode, sample, update, texture_index, varying_index))->dest[0];
   6680     else if (bitsize == 32)
   6681         return (bi_var_tex_f32_to(b, bi_temp(b->shader), lod_mode, sample, update, texture_index, varying_index))->dest[0];
   6682     else
   6683         unreachable("Invalid parameters for VAR_TEX");
   6684 }
   6685 
   6686 static inline
   6687 bi_instr * bi_vn_asst1_f16_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bool h, bool l)
   6688 {
   6689     bi_instr *I = rzalloc(b->shader, bi_instr);
   6690     I->op = BI_OPCODE_VN_ASST1_F16;
   6691     I->dest[0] = dest0;
   6692     I->src[0] = src0;
   6693     I->src[1] = src1;
   6694     I->src[2] = src2;
   6695     I->h = h;
   6696     I->l = l;
   6697     bi_builder_insert(&b->cursor, I);
   6698     return I;
   6699 }
   6700 
   6701 static inline
   6702 bi_index bi_vn_asst1_f16(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bool h, bool l)
   6703 {
   6704     return (bi_vn_asst1_f16_to(b, bi_temp(b->shader), src0, src1, src2, h, l))->dest[0];
   6705 }
   6706 
   6707 
   6708 static inline
   6709 bi_instr * bi_vn_asst1_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bi_index src3)
   6710 {
   6711     bi_instr *I = rzalloc(b->shader, bi_instr);
   6712     I->op = BI_OPCODE_VN_ASST1_F32;
   6713     I->dest[0] = dest0;
   6714     I->src[0] = src0;
   6715     I->src[1] = src1;
   6716     I->src[2] = src2;
   6717     I->src[3] = src3;
   6718     bi_builder_insert(&b->cursor, I);
   6719     return I;
   6720 }
   6721 
   6722 static inline
   6723 bi_index bi_vn_asst1_f32(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bi_index src3)
   6724 {
   6725     return (bi_vn_asst1_f32_to(b, bi_temp(b->shader), src0, src1, src2, src3))->dest[0];
   6726 }
   6727 
   6728 
   6729 static inline
   6730 bi_instr * bi_vn_asst2_f32_to(bi_builder *b, bi_index dest0, bi_index src0, bool scale)
   6731 {
   6732     bi_instr *I = rzalloc(b->shader, bi_instr);
   6733     I->op = BI_OPCODE_VN_ASST2_F32;
   6734     I->dest[0] = dest0;
   6735     I->src[0] = src0;
   6736     I->scale = scale;
   6737     bi_builder_insert(&b->cursor, I);
   6738     return I;
   6739 }
   6740 
   6741 static inline
   6742 bi_index bi_vn_asst2_f32(bi_builder *b, bi_index src0, bool scale)
   6743 {
   6744     return (bi_vn_asst2_f32_to(b, bi_temp(b->shader), src0, scale))->dest[0];
   6745 }
   6746 
   6747 
   6748 static inline
   6749 bi_instr * bi_vn_asst2_v2f16_to(bi_builder *b, bi_index dest0, bi_index src0)
   6750 {
   6751     bi_instr *I = rzalloc(b->shader, bi_instr);
   6752     I->op = BI_OPCODE_VN_ASST2_V2F16;
   6753     I->dest[0] = dest0;
   6754     I->src[0] = src0;
   6755     bi_builder_insert(&b->cursor, I);
   6756     return I;
   6757 }
   6758 
   6759 static inline
   6760 bi_index bi_vn_asst2_v2f16(bi_builder *b, bi_index src0)
   6761 {
   6762     return (bi_vn_asst2_v2f16_to(b, bi_temp(b->shader), src0))->dest[0];
   6763 }
   6764 
   6765 
   6766 static inline
   6767 bi_instr * bi_wmask_to(bi_builder *b, bi_index dest0, bi_index src0, enum bi_subgroup subgroup, uint32_t fill)
   6768 {
   6769     bi_instr *I = rzalloc(b->shader, bi_instr);
   6770     I->op = BI_OPCODE_WMASK;
   6771     I->dest[0] = dest0;
   6772     I->src[0] = src0;
   6773     I->subgroup = subgroup;
   6774     I->fill = fill;
   6775     bi_builder_insert(&b->cursor, I);
   6776     return I;
   6777 }
   6778 
   6779 static inline
   6780 bi_index bi_wmask(bi_builder *b, bi_index src0, enum bi_subgroup subgroup, uint32_t fill)
   6781 {
   6782     return (bi_wmask_to(b, bi_temp(b->shader), src0, subgroup, fill))->dest[0];
   6783 }
   6784 
   6785 
   6786 static inline
   6787 bi_instr * bi_zs_emit_to(bi_builder *b, bi_index dest0, bi_index src0, bi_index src1, bi_index src2, bool stencil, bool z)
   6788 {
   6789     bi_instr *I = rzalloc(b->shader, bi_instr);
   6790     I->op = BI_OPCODE_ZS_EMIT;
   6791     I->dest[0] = dest0;
   6792     I->src[0] = src0;
   6793     I->src[1] = src1;
   6794     I->src[2] = src2;
   6795     I->stencil = stencil;
   6796     I->z = z;
   6797     bi_builder_insert(&b->cursor, I);
   6798     return I;
   6799 }
   6800 
   6801 static inline
   6802 bi_index bi_zs_emit(bi_builder *b, bi_index src0, bi_index src1, bi_index src2, bool stencil, bool z)
   6803 {
   6804     return (bi_zs_emit_to(b, bi_temp(b->shader), src0, src1, src2, stencil, z))->dest[0];
   6805 }
   6806 
   6807 
   6808 #endif
   6809