Home | History | Annotate | Download | only in i965
      1 /*
      2  * Copyright  2012 Intel Corporation
      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
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
     21  * IN THE SOFTWARE.
     22  */
     23 
     24 /** @file brw_eu_compact.c
     25  *
     26  * Instruction compaction is a feature of G45 and newer hardware that allows
     27  * for a smaller instruction encoding.
     28  *
     29  * The instruction cache is on the order of 32KB, and many programs generate
     30  * far more instructions than that.  The instruction cache is built to barely
     31  * keep up with instruction dispatch ability in cache hit cases -- L1
     32  * instruction cache misses that still hit in the next level could limit
     33  * throughput by around 50%.
     34  *
     35  * The idea of instruction compaction is that most instructions use a tiny
     36  * subset of the GPU functionality, so we can encode what would be a 16 byte
     37  * instruction in 8 bytes using some lookup tables for various fields.
     38  *
     39  *
     40  * Instruction compaction capabilities vary subtly by generation.
     41  *
     42  * G45's support for instruction compaction is very limited. Jump counts on
     43  * this generation are in units of 16-byte uncompacted instructions. As such,
     44  * all jump targets must be 16-byte aligned. Also, all instructions must be
     45  * naturally aligned, i.e. uncompacted instructions must be 16-byte aligned.
     46  * A G45-only instruction, NENOP, must be used to provide padding to align
     47  * uncompacted instructions.
     48  *
     49  * Gen5 removes these restrictions and changes jump counts to be in units of
     50  * 8-byte compacted instructions, allowing jump targets to be only 8-byte
     51  * aligned. Uncompacted instructions can also be placed on 8-byte boundaries.
     52  *
     53  * Gen6 adds the ability to compact instructions with a limited range of
     54  * immediate values. Compactable immediates have 12 unrestricted bits, and a
     55  * 13th bit that's replicated through the high 20 bits, to create the 32-bit
     56  * value of DW3 in the uncompacted instruction word.
     57  *
     58  * On Gen7 we can compact some control flow instructions with a small positive
     59  * immediate in the low bits of DW3, like ENDIF with the JIP field. Other
     60  * control flow instructions with UIP cannot be compacted, because of the
     61  * replicated 13th bit. No control flow instructions can be compacted on Gen6
     62  * since the jump count field is not in DW3.
     63  *
     64  *    break    JIP/UIP
     65  *    cont     JIP/UIP
     66  *    halt     JIP/UIP
     67  *    if       JIP/UIP
     68  *    else     JIP (plus UIP on BDW+)
     69  *    endif    JIP
     70  *    while    JIP (must be negative)
     71  *
     72  * Gen 8 adds support for compacting 3-src instructions.
     73  */
     74 
     75 #include "brw_context.h"
     76 #include "brw_eu.h"
     77 #include "intel_asm_annotation.h"
     78 #include "util/u_atomic.h" /* for p_atomic_cmpxchg */
     79 
     80 static const uint32_t g45_control_index_table[32] = {
     81    0b00000000000000000,
     82    0b01000000000000000,
     83    0b00110000000000000,
     84    0b00000000000000010,
     85    0b00100000000000000,
     86    0b00010000000000000,
     87    0b01000000000100000,
     88    0b01000000100000000,
     89    0b01010000000100000,
     90    0b00000000100000010,
     91    0b11000000000000000,
     92    0b00001000100000010,
     93    0b01001000100000000,
     94    0b00000000100000000,
     95    0b11000000000100000,
     96    0b00001000100000000,
     97    0b10110000000000000,
     98    0b11010000000100000,
     99    0b00110000100000000,
    100    0b00100000100000000,
    101    0b01000000000001000,
    102    0b01000000000000100,
    103    0b00111100000000000,
    104    0b00101011000000000,
    105    0b00110000000010000,
    106    0b00010000100000000,
    107    0b01000000000100100,
    108    0b01000000000101000,
    109    0b00110000000000110,
    110    0b00000000000001010,
    111    0b01010000000101000,
    112    0b01010000000100100
    113 };
    114 
    115 static const uint32_t g45_datatype_table[32] = {
    116    0b001000000000100001,
    117    0b001011010110101101,
    118    0b001000001000110001,
    119    0b001111011110111101,
    120    0b001011010110101100,
    121    0b001000000110101101,
    122    0b001000000000100000,
    123    0b010100010110110001,
    124    0b001100011000101101,
    125    0b001000000000100010,
    126    0b001000001000110110,
    127    0b010000001000110001,
    128    0b001000001000110010,
    129    0b011000001000110010,
    130    0b001111011110111100,
    131    0b001000000100101000,
    132    0b010100011000110001,
    133    0b001010010100101001,
    134    0b001000001000101001,
    135    0b010000001000110110,
    136    0b101000001000110001,
    137    0b001011011000101101,
    138    0b001000000100001001,
    139    0b001011011000101100,
    140    0b110100011000110001,
    141    0b001000001110111101,
    142    0b110000001000110001,
    143    0b011000000100101010,
    144    0b101000001000101001,
    145    0b001011010110001100,
    146    0b001000000110100001,
    147    0b001010010100001000
    148 };
    149 
    150 static const uint16_t g45_subreg_table[32] = {
    151    0b000000000000000,
    152    0b000000010000000,
    153    0b000001000000000,
    154    0b000100000000000,
    155    0b000000000100000,
    156    0b100000000000000,
    157    0b000000000010000,
    158    0b001100000000000,
    159    0b001010000000000,
    160    0b000000100000000,
    161    0b001000000000000,
    162    0b000000000001000,
    163    0b000000001000000,
    164    0b000000000000001,
    165    0b000010000000000,
    166    0b000000010100000,
    167    0b000000000000111,
    168    0b000001000100000,
    169    0b011000000000000,
    170    0b000000110000000,
    171    0b000000000000010,
    172    0b000000000000100,
    173    0b000000001100000,
    174    0b000100000000010,
    175    0b001110011000110,
    176    0b001110100001000,
    177    0b000110011000110,
    178    0b000001000011000,
    179    0b000110010000100,
    180    0b001100000000110,
    181    0b000000010000110,
    182    0b000001000110000
    183 };
    184 
    185 static const uint16_t g45_src_index_table[32] = {
    186    0b000000000000,
    187    0b010001101000,
    188    0b010110001000,
    189    0b011010010000,
    190    0b001101001000,
    191    0b010110001010,
    192    0b010101110000,
    193    0b011001111000,
    194    0b001000101000,
    195    0b000000101000,
    196    0b010001010000,
    197    0b111101101100,
    198    0b010110001100,
    199    0b010001101100,
    200    0b011010010100,
    201    0b010001001100,
    202    0b001100101000,
    203    0b000000000010,
    204    0b111101001100,
    205    0b011001101000,
    206    0b010101001000,
    207    0b000000000100,
    208    0b000000101100,
    209    0b010001101010,
    210    0b000000111000,
    211    0b010101011000,
    212    0b000100100000,
    213    0b010110000000,
    214    0b010000000100,
    215    0b010000111000,
    216    0b000101100000,
    217    0b111101110100
    218 };
    219 
    220 static const uint32_t gen6_control_index_table[32] = {
    221    0b00000000000000000,
    222    0b01000000000000000,
    223    0b00110000000000000,
    224    0b00000000100000000,
    225    0b00010000000000000,
    226    0b00001000100000000,
    227    0b00000000100000010,
    228    0b00000000000000010,
    229    0b01000000100000000,
    230    0b01010000000000000,
    231    0b10110000000000000,
    232    0b00100000000000000,
    233    0b11010000000000000,
    234    0b11000000000000000,
    235    0b01001000100000000,
    236    0b01000000000001000,
    237    0b01000000000000100,
    238    0b00000000000001000,
    239    0b00000000000000100,
    240    0b00111000100000000,
    241    0b00001000100000010,
    242    0b00110000100000000,
    243    0b00110000000000001,
    244    0b00100000000000001,
    245    0b00110000000000010,
    246    0b00110000000000101,
    247    0b00110000000001001,
    248    0b00110000000010000,
    249    0b00110000000000011,
    250    0b00110000000000100,
    251    0b00110000100001000,
    252    0b00100000000001001
    253 };
    254 
    255 static const uint32_t gen6_datatype_table[32] = {
    256    0b001001110000000000,
    257    0b001000110000100000,
    258    0b001001110000000001,
    259    0b001000000001100000,
    260    0b001010110100101001,
    261    0b001000000110101101,
    262    0b001100011000101100,
    263    0b001011110110101101,
    264    0b001000000111101100,
    265    0b001000000001100001,
    266    0b001000110010100101,
    267    0b001000000001000001,
    268    0b001000001000110001,
    269    0b001000001000101001,
    270    0b001000000000100000,
    271    0b001000001000110010,
    272    0b001010010100101001,
    273    0b001011010010100101,
    274    0b001000000110100101,
    275    0b001100011000101001,
    276    0b001011011000101100,
    277    0b001011010110100101,
    278    0b001011110110100101,
    279    0b001111011110111101,
    280    0b001111011110111100,
    281    0b001111011110111101,
    282    0b001111011110011101,
    283    0b001111011110111110,
    284    0b001000000000100001,
    285    0b001000000000100010,
    286    0b001001111111011101,
    287    0b001000001110111110,
    288 };
    289 
    290 static const uint16_t gen6_subreg_table[32] = {
    291    0b000000000000000,
    292    0b000000000000100,
    293    0b000000110000000,
    294    0b111000000000000,
    295    0b011110000001000,
    296    0b000010000000000,
    297    0b000000000010000,
    298    0b000110000001100,
    299    0b001000000000000,
    300    0b000001000000000,
    301    0b000001010010100,
    302    0b000000001010110,
    303    0b010000000000000,
    304    0b110000000000000,
    305    0b000100000000000,
    306    0b000000010000000,
    307    0b000000000001000,
    308    0b100000000000000,
    309    0b000001010000000,
    310    0b001010000000000,
    311    0b001100000000000,
    312    0b000000001010100,
    313    0b101101010010100,
    314    0b010100000000000,
    315    0b000000010001111,
    316    0b011000000000000,
    317    0b111110000000000,
    318    0b101000000000000,
    319    0b000000000001111,
    320    0b000100010001111,
    321    0b001000010001111,
    322    0b000110000000000,
    323 };
    324 
    325 static const uint16_t gen6_src_index_table[32] = {
    326    0b000000000000,
    327    0b010110001000,
    328    0b010001101000,
    329    0b001000101000,
    330    0b011010010000,
    331    0b000100100000,
    332    0b010001101100,
    333    0b010101110000,
    334    0b011001111000,
    335    0b001100101000,
    336    0b010110001100,
    337    0b001000100000,
    338    0b010110001010,
    339    0b000000000010,
    340    0b010101010000,
    341    0b010101101000,
    342    0b111101001100,
    343    0b111100101100,
    344    0b011001110000,
    345    0b010110001001,
    346    0b010101011000,
    347    0b001101001000,
    348    0b010000101100,
    349    0b010000000000,
    350    0b001101110000,
    351    0b001100010000,
    352    0b001100000000,
    353    0b010001101010,
    354    0b001101111000,
    355    0b000001110000,
    356    0b001100100000,
    357    0b001101010000,
    358 };
    359 
    360 static const uint32_t gen7_control_index_table[32] = {
    361    0b0000000000000000010,
    362    0b0000100000000000000,
    363    0b0000100000000000001,
    364    0b0000100000000000010,
    365    0b0000100000000000011,
    366    0b0000100000000000100,
    367    0b0000100000000000101,
    368    0b0000100000000000111,
    369    0b0000100000000001000,
    370    0b0000100000000001001,
    371    0b0000100000000001101,
    372    0b0000110000000000000,
    373    0b0000110000000000001,
    374    0b0000110000000000010,
    375    0b0000110000000000011,
    376    0b0000110000000000100,
    377    0b0000110000000000101,
    378    0b0000110000000000111,
    379    0b0000110000000001001,
    380    0b0000110000000001101,
    381    0b0000110000000010000,
    382    0b0000110000100000000,
    383    0b0001000000000000000,
    384    0b0001000000000000010,
    385    0b0001000000000000100,
    386    0b0001000000100000000,
    387    0b0010110000000000000,
    388    0b0010110000000010000,
    389    0b0011000000000000000,
    390    0b0011000000100000000,
    391    0b0101000000000000000,
    392    0b0101000000100000000
    393 };
    394 
    395 static const uint32_t gen7_datatype_table[32] = {
    396    0b001000000000000001,
    397    0b001000000000100000,
    398    0b001000000000100001,
    399    0b001000000001100001,
    400    0b001000000010111101,
    401    0b001000001011111101,
    402    0b001000001110100001,
    403    0b001000001110100101,
    404    0b001000001110111101,
    405    0b001000010000100001,
    406    0b001000110000100000,
    407    0b001000110000100001,
    408    0b001001010010100101,
    409    0b001001110010100100,
    410    0b001001110010100101,
    411    0b001111001110111101,
    412    0b001111011110011101,
    413    0b001111011110111100,
    414    0b001111011110111101,
    415    0b001111111110111100,
    416    0b000000001000001100,
    417    0b001000000000111101,
    418    0b001000000010100101,
    419    0b001000010000100000,
    420    0b001001010010100100,
    421    0b001001110010000100,
    422    0b001010010100001001,
    423    0b001101111110111101,
    424    0b001111111110111101,
    425    0b001011110110101100,
    426    0b001010010100101000,
    427    0b001010110100101000
    428 };
    429 
    430 static const uint16_t gen7_subreg_table[32] = {
    431    0b000000000000000,
    432    0b000000000000001,
    433    0b000000000001000,
    434    0b000000000001111,
    435    0b000000000010000,
    436    0b000000010000000,
    437    0b000000100000000,
    438    0b000000110000000,
    439    0b000001000000000,
    440    0b000001000010000,
    441    0b000010100000000,
    442    0b001000000000000,
    443    0b001000000000001,
    444    0b001000010000001,
    445    0b001000010000010,
    446    0b001000010000011,
    447    0b001000010000100,
    448    0b001000010000111,
    449    0b001000010001000,
    450    0b001000010001110,
    451    0b001000010001111,
    452    0b001000110000000,
    453    0b001000111101000,
    454    0b010000000000000,
    455    0b010000110000000,
    456    0b011000000000000,
    457    0b011110010000111,
    458    0b100000000000000,
    459    0b101000000000000,
    460    0b110000000000000,
    461    0b111000000000000,
    462    0b111000000011100
    463 };
    464 
    465 static const uint16_t gen7_src_index_table[32] = {
    466    0b000000000000,
    467    0b000000000010,
    468    0b000000010000,
    469    0b000000010010,
    470    0b000000011000,
    471    0b000000100000,
    472    0b000000101000,
    473    0b000001001000,
    474    0b000001010000,
    475    0b000001110000,
    476    0b000001111000,
    477    0b001100000000,
    478    0b001100000010,
    479    0b001100001000,
    480    0b001100010000,
    481    0b001100010010,
    482    0b001100100000,
    483    0b001100101000,
    484    0b001100111000,
    485    0b001101000000,
    486    0b001101000010,
    487    0b001101001000,
    488    0b001101010000,
    489    0b001101100000,
    490    0b001101101000,
    491    0b001101110000,
    492    0b001101110001,
    493    0b001101111000,
    494    0b010001101000,
    495    0b010001101001,
    496    0b010001101010,
    497    0b010110001000
    498 };
    499 
    500 static const uint32_t gen8_control_index_table[32] = {
    501    0b0000000000000000010,
    502    0b0000100000000000000,
    503    0b0000100000000000001,
    504    0b0000100000000000010,
    505    0b0000100000000000011,
    506    0b0000100000000000100,
    507    0b0000100000000000101,
    508    0b0000100000000000111,
    509    0b0000100000000001000,
    510    0b0000100000000001001,
    511    0b0000100000000001101,
    512    0b0000110000000000000,
    513    0b0000110000000000001,
    514    0b0000110000000000010,
    515    0b0000110000000000011,
    516    0b0000110000000000100,
    517    0b0000110000000000101,
    518    0b0000110000000000111,
    519    0b0000110000000001001,
    520    0b0000110000000001101,
    521    0b0000110000000010000,
    522    0b0000110000100000000,
    523    0b0001000000000000000,
    524    0b0001000000000000010,
    525    0b0001000000000000100,
    526    0b0001000000100000000,
    527    0b0010110000000000000,
    528    0b0010110000000010000,
    529    0b0011000000000000000,
    530    0b0011000000100000000,
    531    0b0101000000000000000,
    532    0b0101000000100000000
    533 };
    534 
    535 static const uint32_t gen8_datatype_table[32] = {
    536    0b001000000000000000001,
    537    0b001000000000001000000,
    538    0b001000000000001000001,
    539    0b001000000000011000001,
    540    0b001000000000101011101,
    541    0b001000000010111011101,
    542    0b001000000011101000001,
    543    0b001000000011101000101,
    544    0b001000000011101011101,
    545    0b001000001000001000001,
    546    0b001000011000001000000,
    547    0b001000011000001000001,
    548    0b001000101000101000101,
    549    0b001000111000101000100,
    550    0b001000111000101000101,
    551    0b001011100011101011101,
    552    0b001011101011100011101,
    553    0b001011101011101011100,
    554    0b001011101011101011101,
    555    0b001011111011101011100,
    556    0b000000000010000001100,
    557    0b001000000000001011101,
    558    0b001000000000101000101,
    559    0b001000001000001000000,
    560    0b001000101000101000100,
    561    0b001000111000100000100,
    562    0b001001001001000001001,
    563    0b001010111011101011101,
    564    0b001011111011101011101,
    565    0b001001111001101001100,
    566    0b001001001001001001000,
    567    0b001001011001001001000
    568 };
    569 
    570 static const uint16_t gen8_subreg_table[32] = {
    571    0b000000000000000,
    572    0b000000000000001,
    573    0b000000000001000,
    574    0b000000000001111,
    575    0b000000000010000,
    576    0b000000010000000,
    577    0b000000100000000,
    578    0b000000110000000,
    579    0b000001000000000,
    580    0b000001000010000,
    581    0b000001010000000,
    582    0b001000000000000,
    583    0b001000000000001,
    584    0b001000010000001,
    585    0b001000010000010,
    586    0b001000010000011,
    587    0b001000010000100,
    588    0b001000010000111,
    589    0b001000010001000,
    590    0b001000010001110,
    591    0b001000010001111,
    592    0b001000110000000,
    593    0b001000111101000,
    594    0b010000000000000,
    595    0b010000110000000,
    596    0b011000000000000,
    597    0b011110010000111,
    598    0b100000000000000,
    599    0b101000000000000,
    600    0b110000000000000,
    601    0b111000000000000,
    602    0b111000000011100
    603 };
    604 
    605 static const uint16_t gen8_src_index_table[32] = {
    606    0b000000000000,
    607    0b000000000010,
    608    0b000000010000,
    609    0b000000010010,
    610    0b000000011000,
    611    0b000000100000,
    612    0b000000101000,
    613    0b000001001000,
    614    0b000001010000,
    615    0b000001110000,
    616    0b000001111000,
    617    0b001100000000,
    618    0b001100000010,
    619    0b001100001000,
    620    0b001100010000,
    621    0b001100010010,
    622    0b001100100000,
    623    0b001100101000,
    624    0b001100111000,
    625    0b001101000000,
    626    0b001101000010,
    627    0b001101001000,
    628    0b001101010000,
    629    0b001101100000,
    630    0b001101101000,
    631    0b001101110000,
    632    0b001101110001,
    633    0b001101111000,
    634    0b010001101000,
    635    0b010001101001,
    636    0b010001101010,
    637    0b010110001000
    638 };
    639 
    640 /* This is actually the control index table for Cherryview (26 bits), but the
    641  * only difference from Broadwell (24 bits) is that it has two extra 0-bits at
    642  * the start.
    643  *
    644  * The low 24 bits have the same mappings on both hardware.
    645  */
    646 static const uint32_t gen8_3src_control_index_table[4] = {
    647    0b00100000000110000000000001,
    648    0b00000000000110000000000001,
    649    0b00000000001000000000000001,
    650    0b00000000001000000000100001
    651 };
    652 
    653 /* This is actually the control index table for Cherryview (49 bits), but the
    654  * only difference from Broadwell (46 bits) is that it has three extra 0-bits
    655  * at the start.
    656  *
    657  * The low 44 bits have the same mappings on both hardware, and since the high
    658  * three bits on Broadwell are zero, we can reuse Cherryview's table.
    659  */
    660 static const uint64_t gen8_3src_source_index_table[4] = {
    661    0b0000001110010011100100111001000001111000000000000,
    662    0b0000001110010011100100111001000001111000000000010,
    663    0b0000001110010011100100111001000001111000000001000,
    664    0b0000001110010011100100111001000001111000000100000
    665 };
    666 
    667 static const uint32_t *control_index_table;
    668 static const uint32_t *datatype_table;
    669 static const uint16_t *subreg_table;
    670 static const uint16_t *src_index_table;
    671 
    672 static bool
    673 set_control_index(const struct gen_device_info *devinfo,
    674                   brw_compact_inst *dst, brw_inst *src)
    675 {
    676    uint32_t uncompacted = devinfo->gen >= 8  /* 17b/G45; 19b/IVB+ */
    677       ? (brw_inst_bits(src, 33, 31) << 16) | /*  3b */
    678         (brw_inst_bits(src, 23, 12) <<  4) | /* 12b */
    679         (brw_inst_bits(src, 10,  9) <<  2) | /*  2b */
    680         (brw_inst_bits(src, 34, 34) <<  1) | /*  1b */
    681         (brw_inst_bits(src,  8,  8))         /*  1b */
    682       : (brw_inst_bits(src, 31, 31) << 16) | /*  1b */
    683         (brw_inst_bits(src, 23,  8));        /* 16b */
    684 
    685    /* On gen7, the flag register and subregister numbers are integrated into
    686     * the control index.
    687     */
    688    if (devinfo->gen == 7)
    689       uncompacted |= brw_inst_bits(src, 90, 89) << 17; /* 2b */
    690 
    691    for (int i = 0; i < 32; i++) {
    692       if (control_index_table[i] == uncompacted) {
    693          brw_compact_inst_set_control_index(devinfo, dst, i);
    694 	 return true;
    695       }
    696    }
    697 
    698    return false;
    699 }
    700 
    701 static bool
    702 set_datatype_index(const struct gen_device_info *devinfo, brw_compact_inst *dst,
    703                    brw_inst *src)
    704 {
    705    uint32_t uncompacted = devinfo->gen >= 8  /* 18b/G45+; 21b/BDW+ */
    706       ? (brw_inst_bits(src, 63, 61) << 18) | /*  3b */
    707         (brw_inst_bits(src, 94, 89) << 12) | /*  6b */
    708         (brw_inst_bits(src, 46, 35))         /* 12b */
    709       : (brw_inst_bits(src, 63, 61) << 15) | /*  3b */
    710         (brw_inst_bits(src, 46, 32));        /* 15b */
    711 
    712    for (int i = 0; i < 32; i++) {
    713       if (datatype_table[i] == uncompacted) {
    714          brw_compact_inst_set_datatype_index(devinfo, dst, i);
    715 	 return true;
    716       }
    717    }
    718 
    719    return false;
    720 }
    721 
    722 static bool
    723 set_subreg_index(const struct gen_device_info *devinfo, brw_compact_inst *dst,
    724                  brw_inst *src, bool is_immediate)
    725 {
    726    uint16_t uncompacted =                 /* 15b */
    727       (brw_inst_bits(src, 52, 48) << 0) | /*  5b */
    728       (brw_inst_bits(src, 68, 64) << 5);  /*  5b */
    729 
    730    if (!is_immediate)
    731       uncompacted |= brw_inst_bits(src, 100, 96) << 10; /* 5b */
    732 
    733    for (int i = 0; i < 32; i++) {
    734       if (subreg_table[i] == uncompacted) {
    735          brw_compact_inst_set_subreg_index(devinfo, dst, i);
    736 	 return true;
    737       }
    738    }
    739 
    740    return false;
    741 }
    742 
    743 static bool
    744 get_src_index(uint16_t uncompacted,
    745               uint16_t *compacted)
    746 {
    747    for (int i = 0; i < 32; i++) {
    748       if (src_index_table[i] == uncompacted) {
    749 	 *compacted = i;
    750 	 return true;
    751       }
    752    }
    753 
    754    return false;
    755 }
    756 
    757 static bool
    758 set_src0_index(const struct gen_device_info *devinfo,
    759                brw_compact_inst *dst, brw_inst *src)
    760 {
    761    uint16_t compacted;
    762    uint16_t uncompacted = brw_inst_bits(src, 88, 77); /* 12b */
    763 
    764    if (!get_src_index(uncompacted, &compacted))
    765       return false;
    766 
    767    brw_compact_inst_set_src0_index(devinfo, dst, compacted);
    768 
    769    return true;
    770 }
    771 
    772 static bool
    773 set_src1_index(const struct gen_device_info *devinfo, brw_compact_inst *dst,
    774                brw_inst *src, bool is_immediate)
    775 {
    776    uint16_t compacted;
    777 
    778    if (is_immediate) {
    779       compacted = (brw_inst_imm_ud(devinfo, src) >> 8) & 0x1f;
    780    } else {
    781       uint16_t uncompacted = brw_inst_bits(src, 120, 109); /* 12b */
    782 
    783       if (!get_src_index(uncompacted, &compacted))
    784          return false;
    785    }
    786 
    787    brw_compact_inst_set_src1_index(devinfo, dst, compacted);
    788 
    789    return true;
    790 }
    791 
    792 static bool
    793 set_3src_control_index(const struct gen_device_info *devinfo,
    794                        brw_compact_inst *dst, brw_inst *src)
    795 {
    796    assert(devinfo->gen >= 8);
    797 
    798    uint32_t uncompacted =                  /* 24b/BDW; 26b/CHV */
    799       (brw_inst_bits(src, 34, 32) << 21) | /*  3b */
    800       (brw_inst_bits(src, 28,  8));        /* 21b */
    801 
    802    if (devinfo->gen >= 9 || devinfo->is_cherryview)
    803       uncompacted |= brw_inst_bits(src, 36, 35) << 24; /* 2b */
    804 
    805    for (unsigned i = 0; i < ARRAY_SIZE(gen8_3src_control_index_table); i++) {
    806       if (gen8_3src_control_index_table[i] == uncompacted) {
    807          brw_compact_inst_set_3src_control_index(devinfo, dst, i);
    808 	 return true;
    809       }
    810    }
    811 
    812    return false;
    813 }
    814 
    815 static bool
    816 set_3src_source_index(const struct gen_device_info *devinfo,
    817                       brw_compact_inst *dst, brw_inst *src)
    818 {
    819    assert(devinfo->gen >= 8);
    820 
    821    uint64_t uncompacted =                    /* 46b/BDW; 49b/CHV */
    822       (brw_inst_bits(src,  83,  83) << 43) | /*  1b */
    823       (brw_inst_bits(src, 114, 107) << 35) | /*  8b */
    824       (brw_inst_bits(src,  93,  86) << 27) | /*  8b */
    825       (brw_inst_bits(src,  72,  65) << 19) | /*  8b */
    826       (brw_inst_bits(src,  55,  37));        /* 19b */
    827 
    828    if (devinfo->gen >= 9 || devinfo->is_cherryview) {
    829       uncompacted |=
    830          (brw_inst_bits(src, 126, 125) << 47) | /* 2b */
    831          (brw_inst_bits(src, 105, 104) << 45) | /* 2b */
    832          (brw_inst_bits(src,  84,  84) << 44);  /* 1b */
    833    } else {
    834       uncompacted |=
    835          (brw_inst_bits(src, 125, 125) << 45) | /* 1b */
    836          (brw_inst_bits(src, 104, 104) << 44);  /* 1b */
    837    }
    838 
    839    for (unsigned i = 0; i < ARRAY_SIZE(gen8_3src_source_index_table); i++) {
    840       if (gen8_3src_source_index_table[i] == uncompacted) {
    841          brw_compact_inst_set_3src_source_index(devinfo, dst, i);
    842 	 return true;
    843       }
    844    }
    845 
    846    return false;
    847 }
    848 
    849 static bool
    850 has_unmapped_bits(const struct gen_device_info *devinfo, brw_inst *src)
    851 {
    852    /* EOT can only be mapped on a send if the src1 is an immediate */
    853    if ((brw_inst_opcode(devinfo, src) == BRW_OPCODE_SENDC ||
    854         brw_inst_opcode(devinfo, src) == BRW_OPCODE_SEND) &&
    855        brw_inst_eot(devinfo, src))
    856       return true;
    857 
    858    /* Check for instruction bits that don't map to any of the fields of the
    859     * compacted instruction.  The instruction cannot be compacted if any of
    860     * them are set.  They overlap with:
    861     *  - NibCtrl (bit 47 on Gen7, bit 11 on Gen8)
    862     *  - Dst.AddrImm[9] (bit 47 on Gen8)
    863     *  - Src0.AddrImm[9] (bit 95 on Gen8)
    864     *  - Imm64[27:31] (bits 91-95 on Gen7, bit 95 on Gen8)
    865     *  - UIP[31] (bit 95 on Gen8)
    866     */
    867    if (devinfo->gen >= 8) {
    868       assert(!brw_inst_bits(src, 7,  7));
    869       return brw_inst_bits(src, 95, 95) ||
    870              brw_inst_bits(src, 47, 47) ||
    871              brw_inst_bits(src, 11, 11);
    872    } else {
    873       assert(!brw_inst_bits(src, 7,  7) &&
    874              !(devinfo->gen < 7 && brw_inst_bits(src, 90, 90)));
    875       return brw_inst_bits(src, 95, 91) ||
    876              brw_inst_bits(src, 47, 47);
    877    }
    878 }
    879 
    880 static bool
    881 has_3src_unmapped_bits(const struct gen_device_info *devinfo, brw_inst *src)
    882 {
    883    /* Check for three-source instruction bits that don't map to any of the
    884     * fields of the compacted instruction.  All of them seem to be reserved
    885     * bits currently.
    886     */
    887    if (devinfo->gen >= 9 || devinfo->is_cherryview) {
    888       assert(!brw_inst_bits(src, 127, 127) &&
    889              !brw_inst_bits(src, 7,  7));
    890    } else {
    891       assert(devinfo->gen >= 8);
    892       assert(!brw_inst_bits(src, 127, 126) &&
    893              !brw_inst_bits(src, 105, 105) &&
    894              !brw_inst_bits(src, 84, 84) &&
    895              !brw_inst_bits(src, 36, 35) &&
    896              !brw_inst_bits(src, 7,  7));
    897    }
    898 
    899    return false;
    900 }
    901 
    902 static bool
    903 brw_try_compact_3src_instruction(const struct gen_device_info *devinfo,
    904                                  brw_compact_inst *dst, brw_inst *src)
    905 {
    906    assert(devinfo->gen >= 8);
    907 
    908    if (has_3src_unmapped_bits(devinfo, src))
    909       return false;
    910 
    911 #define compact(field) \
    912    brw_compact_inst_set_3src_##field(devinfo, dst, brw_inst_3src_##field(devinfo, src))
    913 
    914    compact(opcode);
    915 
    916    if (!set_3src_control_index(devinfo, dst, src))
    917       return false;
    918 
    919    if (!set_3src_source_index(devinfo, dst, src))
    920       return false;
    921 
    922    compact(dst_reg_nr);
    923    compact(src0_rep_ctrl);
    924    brw_compact_inst_set_3src_cmpt_control(devinfo, dst, true);
    925    compact(debug_control);
    926    compact(saturate);
    927    compact(src1_rep_ctrl);
    928    compact(src2_rep_ctrl);
    929    compact(src0_reg_nr);
    930    compact(src1_reg_nr);
    931    compact(src2_reg_nr);
    932    compact(src0_subreg_nr);
    933    compact(src1_subreg_nr);
    934    compact(src2_subreg_nr);
    935 
    936 #undef compact
    937 
    938    return true;
    939 }
    940 
    941 /* Compacted instructions have 12-bits for immediate sources, and a 13th bit
    942  * that's replicated through the high 20 bits.
    943  *
    944  * Effectively this means we get 12-bit integers, 0.0f, and some limited uses
    945  * of packed vectors as compactable immediates.
    946  */
    947 static bool
    948 is_compactable_immediate(unsigned imm)
    949 {
    950    /* We get the low 12 bits as-is. */
    951    imm &= ~0xfff;
    952 
    953    /* We get one bit replicated through the top 20 bits. */
    954    return imm == 0 || imm == 0xfffff000;
    955 }
    956 
    957 /**
    958  * Tries to compact instruction src into dst.
    959  *
    960  * It doesn't modify dst unless src is compactable, which is relied on by
    961  * brw_compact_instructions().
    962  */
    963 bool
    964 brw_try_compact_instruction(const struct gen_device_info *devinfo,
    965                             brw_compact_inst *dst, brw_inst *src)
    966 {
    967    brw_compact_inst temp;
    968 
    969    assert(brw_inst_cmpt_control(devinfo, src) == 0);
    970 
    971    if (is_3src(devinfo, brw_inst_opcode(devinfo, src))) {
    972       if (devinfo->gen >= 8) {
    973          memset(&temp, 0, sizeof(temp));
    974          if (brw_try_compact_3src_instruction(devinfo, &temp, src)) {
    975             *dst = temp;
    976             return true;
    977          } else {
    978             return false;
    979          }
    980       } else {
    981          return false;
    982       }
    983    }
    984 
    985    bool is_immediate =
    986       brw_inst_src0_reg_file(devinfo, src) == BRW_IMMEDIATE_VALUE ||
    987       brw_inst_src1_reg_file(devinfo, src) == BRW_IMMEDIATE_VALUE;
    988    if (is_immediate &&
    989        (devinfo->gen < 6 ||
    990         !is_compactable_immediate(brw_inst_imm_ud(devinfo, src)))) {
    991       return false;
    992    }
    993 
    994    if (has_unmapped_bits(devinfo, src))
    995       return false;
    996 
    997    memset(&temp, 0, sizeof(temp));
    998 
    999 #define compact(field) \
   1000    brw_compact_inst_set_##field(devinfo, &temp, brw_inst_##field(devinfo, src))
   1001 
   1002    compact(opcode);
   1003    compact(debug_control);
   1004 
   1005    if (!set_control_index(devinfo, &temp, src))
   1006       return false;
   1007    if (!set_datatype_index(devinfo, &temp, src))
   1008       return false;
   1009    if (!set_subreg_index(devinfo, &temp, src, is_immediate))
   1010       return false;
   1011 
   1012    if (devinfo->gen >= 6) {
   1013       compact(acc_wr_control);
   1014    } else {
   1015       compact(mask_control_ex);
   1016    }
   1017 
   1018    compact(cond_modifier);
   1019 
   1020    if (devinfo->gen <= 6)
   1021       compact(flag_subreg_nr);
   1022 
   1023    brw_compact_inst_set_cmpt_control(devinfo, &temp, true);
   1024 
   1025    if (!set_src0_index(devinfo, &temp, src))
   1026       return false;
   1027    if (!set_src1_index(devinfo, &temp, src, is_immediate))
   1028       return false;
   1029 
   1030    brw_compact_inst_set_dst_reg_nr(devinfo, &temp,
   1031                                    brw_inst_dst_da_reg_nr(devinfo, src));
   1032    brw_compact_inst_set_src0_reg_nr(devinfo, &temp,
   1033                                     brw_inst_src0_da_reg_nr(devinfo, src));
   1034 
   1035    if (is_immediate) {
   1036       brw_compact_inst_set_src1_reg_nr(devinfo, &temp,
   1037                                        brw_inst_imm_ud(devinfo, src) & 0xff);
   1038    } else {
   1039       brw_compact_inst_set_src1_reg_nr(devinfo, &temp,
   1040                                        brw_inst_src1_da_reg_nr(devinfo, src));
   1041    }
   1042 
   1043 #undef compact
   1044 
   1045    *dst = temp;
   1046 
   1047    return true;
   1048 }
   1049 
   1050 static void
   1051 set_uncompacted_control(const struct gen_device_info *devinfo, brw_inst *dst,
   1052                         brw_compact_inst *src)
   1053 {
   1054    uint32_t uncompacted =
   1055       control_index_table[brw_compact_inst_control_index(devinfo, src)];
   1056 
   1057    if (devinfo->gen >= 8) {
   1058       brw_inst_set_bits(dst, 33, 31, (uncompacted >> 16));
   1059       brw_inst_set_bits(dst, 23, 12, (uncompacted >>  4) & 0xfff);
   1060       brw_inst_set_bits(dst, 10,  9, (uncompacted >>  2) & 0x3);
   1061       brw_inst_set_bits(dst, 34, 34, (uncompacted >>  1) & 0x1);
   1062       brw_inst_set_bits(dst,  8,  8, (uncompacted >>  0) & 0x1);
   1063    } else {
   1064       brw_inst_set_bits(dst, 31, 31, (uncompacted >> 16) & 0x1);
   1065       brw_inst_set_bits(dst, 23,  8, (uncompacted & 0xffff));
   1066 
   1067       if (devinfo->gen == 7)
   1068          brw_inst_set_bits(dst, 90, 89, uncompacted >> 17);
   1069    }
   1070 }
   1071 
   1072 static void
   1073 set_uncompacted_datatype(const struct gen_device_info *devinfo, brw_inst *dst,
   1074                          brw_compact_inst *src)
   1075 {
   1076    uint32_t uncompacted =
   1077       datatype_table[brw_compact_inst_datatype_index(devinfo, src)];
   1078 
   1079    if (devinfo->gen >= 8) {
   1080       brw_inst_set_bits(dst, 63, 61, (uncompacted >> 18));
   1081       brw_inst_set_bits(dst, 94, 89, (uncompacted >> 12) & 0x3f);
   1082       brw_inst_set_bits(dst, 46, 35, (uncompacted >>  0) & 0xfff);
   1083    } else {
   1084       brw_inst_set_bits(dst, 63, 61, (uncompacted >> 15));
   1085       brw_inst_set_bits(dst, 46, 32, (uncompacted & 0x7fff));
   1086    }
   1087 }
   1088 
   1089 static void
   1090 set_uncompacted_subreg(const struct gen_device_info *devinfo, brw_inst *dst,
   1091                        brw_compact_inst *src)
   1092 {
   1093    uint16_t uncompacted =
   1094       subreg_table[brw_compact_inst_subreg_index(devinfo, src)];
   1095 
   1096    brw_inst_set_bits(dst, 100, 96, (uncompacted >> 10));
   1097    brw_inst_set_bits(dst,  68, 64, (uncompacted >>  5) & 0x1f);
   1098    brw_inst_set_bits(dst,  52, 48, (uncompacted >>  0) & 0x1f);
   1099 }
   1100 
   1101 static void
   1102 set_uncompacted_src0(const struct gen_device_info *devinfo, brw_inst *dst,
   1103                      brw_compact_inst *src)
   1104 {
   1105    uint32_t compacted = brw_compact_inst_src0_index(devinfo, src);
   1106    uint16_t uncompacted = src_index_table[compacted];
   1107 
   1108    brw_inst_set_bits(dst, 88, 77, uncompacted);
   1109 }
   1110 
   1111 static void
   1112 set_uncompacted_src1(const struct gen_device_info *devinfo, brw_inst *dst,
   1113                      brw_compact_inst *src, bool is_immediate)
   1114 {
   1115    if (is_immediate) {
   1116       signed high5 = brw_compact_inst_src1_index(devinfo, src);
   1117       /* Replicate top bit of src1_index into high 20 bits of the immediate. */
   1118       brw_inst_set_imm_ud(devinfo, dst, (high5 << 27) >> 19);
   1119    } else {
   1120       uint16_t uncompacted =
   1121          src_index_table[brw_compact_inst_src1_index(devinfo, src)];
   1122 
   1123       brw_inst_set_bits(dst, 120, 109, uncompacted);
   1124    }
   1125 }
   1126 
   1127 static void
   1128 set_uncompacted_3src_control_index(const struct gen_device_info *devinfo,
   1129                                    brw_inst *dst, brw_compact_inst *src)
   1130 {
   1131    assert(devinfo->gen >= 8);
   1132 
   1133    uint32_t compacted = brw_compact_inst_3src_control_index(devinfo, src);
   1134    uint32_t uncompacted = gen8_3src_control_index_table[compacted];
   1135 
   1136    brw_inst_set_bits(dst, 34, 32, (uncompacted >> 21) & 0x7);
   1137    brw_inst_set_bits(dst, 28,  8, (uncompacted >>  0) & 0x1fffff);
   1138 
   1139    if (devinfo->gen >= 9 || devinfo->is_cherryview)
   1140       brw_inst_set_bits(dst, 36, 35, (uncompacted >> 24) & 0x3);
   1141 }
   1142 
   1143 static void
   1144 set_uncompacted_3src_source_index(const struct gen_device_info *devinfo,
   1145                                   brw_inst *dst, brw_compact_inst *src)
   1146 {
   1147    assert(devinfo->gen >= 8);
   1148 
   1149    uint32_t compacted = brw_compact_inst_3src_source_index(devinfo, src);
   1150    uint64_t uncompacted = gen8_3src_source_index_table[compacted];
   1151 
   1152    brw_inst_set_bits(dst,  83,  83, (uncompacted >> 43) & 0x1);
   1153    brw_inst_set_bits(dst, 114, 107, (uncompacted >> 35) & 0xff);
   1154    brw_inst_set_bits(dst,  93,  86, (uncompacted >> 27) & 0xff);
   1155    brw_inst_set_bits(dst,  72,  65, (uncompacted >> 19) & 0xff);
   1156    brw_inst_set_bits(dst,  55,  37, (uncompacted >>  0) & 0x7ffff);
   1157 
   1158    if (devinfo->gen >= 9 || devinfo->is_cherryview) {
   1159       brw_inst_set_bits(dst, 126, 125, (uncompacted >> 47) & 0x3);
   1160       brw_inst_set_bits(dst, 105, 104, (uncompacted >> 45) & 0x3);
   1161       brw_inst_set_bits(dst,  84,  84, (uncompacted >> 44) & 0x1);
   1162    } else {
   1163       brw_inst_set_bits(dst, 125, 125, (uncompacted >> 45) & 0x1);
   1164       brw_inst_set_bits(dst, 104, 104, (uncompacted >> 44) & 0x1);
   1165    }
   1166 }
   1167 
   1168 static void
   1169 brw_uncompact_3src_instruction(const struct gen_device_info *devinfo,
   1170                                brw_inst *dst, brw_compact_inst *src)
   1171 {
   1172    assert(devinfo->gen >= 8);
   1173 
   1174 #define uncompact(field) \
   1175    brw_inst_set_3src_##field(devinfo, dst, brw_compact_inst_3src_##field(devinfo, src))
   1176 
   1177    uncompact(opcode);
   1178 
   1179    set_uncompacted_3src_control_index(devinfo, dst, src);
   1180    set_uncompacted_3src_source_index(devinfo, dst, src);
   1181 
   1182    uncompact(dst_reg_nr);
   1183    uncompact(src0_rep_ctrl);
   1184    brw_inst_set_3src_cmpt_control(devinfo, dst, false);
   1185    uncompact(debug_control);
   1186    uncompact(saturate);
   1187    uncompact(src1_rep_ctrl);
   1188    uncompact(src2_rep_ctrl);
   1189    uncompact(src0_reg_nr);
   1190    uncompact(src1_reg_nr);
   1191    uncompact(src2_reg_nr);
   1192    uncompact(src0_subreg_nr);
   1193    uncompact(src1_subreg_nr);
   1194    uncompact(src2_subreg_nr);
   1195 
   1196 #undef uncompact
   1197 }
   1198 
   1199 void
   1200 brw_uncompact_instruction(const struct gen_device_info *devinfo, brw_inst *dst,
   1201                           brw_compact_inst *src)
   1202 {
   1203    memset(dst, 0, sizeof(*dst));
   1204 
   1205    if (devinfo->gen >= 8 &&
   1206        is_3src(devinfo, brw_compact_inst_3src_opcode(devinfo, src))) {
   1207       brw_uncompact_3src_instruction(devinfo, dst, src);
   1208       return;
   1209    }
   1210 
   1211 #define uncompact(field) \
   1212    brw_inst_set_##field(devinfo, dst, brw_compact_inst_##field(devinfo, src))
   1213 
   1214    uncompact(opcode);
   1215    uncompact(debug_control);
   1216 
   1217    set_uncompacted_control(devinfo, dst, src);
   1218    set_uncompacted_datatype(devinfo, dst, src);
   1219 
   1220    /* src0/1 register file fields are in the datatype table. */
   1221    bool is_immediate = brw_inst_src0_reg_file(devinfo, dst) == BRW_IMMEDIATE_VALUE ||
   1222                        brw_inst_src1_reg_file(devinfo, dst) == BRW_IMMEDIATE_VALUE;
   1223 
   1224    set_uncompacted_subreg(devinfo, dst, src);
   1225 
   1226    if (devinfo->gen >= 6) {
   1227       uncompact(acc_wr_control);
   1228    } else {
   1229       uncompact(mask_control_ex);
   1230    }
   1231 
   1232    uncompact(cond_modifier);
   1233 
   1234    if (devinfo->gen <= 6)
   1235       uncompact(flag_subreg_nr);
   1236 
   1237    set_uncompacted_src0(devinfo, dst, src);
   1238    set_uncompacted_src1(devinfo, dst, src, is_immediate);
   1239 
   1240    brw_inst_set_dst_da_reg_nr(devinfo, dst,
   1241                               brw_compact_inst_dst_reg_nr(devinfo, src));
   1242    brw_inst_set_src0_da_reg_nr(devinfo, dst,
   1243                                brw_compact_inst_src0_reg_nr(devinfo, src));
   1244 
   1245    if (is_immediate) {
   1246       brw_inst_set_imm_ud(devinfo, dst,
   1247                           brw_inst_imm_ud(devinfo, dst) |
   1248                           brw_compact_inst_src1_reg_nr(devinfo, src));
   1249    } else {
   1250       brw_inst_set_src1_da_reg_nr(devinfo, dst,
   1251                                   brw_compact_inst_src1_reg_nr(devinfo, src));
   1252    }
   1253 
   1254 #undef uncompact
   1255 }
   1256 
   1257 void brw_debug_compact_uncompact(const struct gen_device_info *devinfo,
   1258                                  brw_inst *orig,
   1259                                  brw_inst *uncompacted)
   1260 {
   1261    fprintf(stderr, "Instruction compact/uncompact changed (gen%d):\n",
   1262            devinfo->gen);
   1263 
   1264    fprintf(stderr, "  before: ");
   1265    brw_disassemble_inst(stderr, devinfo, orig, true);
   1266 
   1267    fprintf(stderr, "  after:  ");
   1268    brw_disassemble_inst(stderr, devinfo, uncompacted, false);
   1269 
   1270    uint32_t *before_bits = (uint32_t *)orig;
   1271    uint32_t *after_bits = (uint32_t *)uncompacted;
   1272    fprintf(stderr, "  changed bits:\n");
   1273    for (int i = 0; i < 128; i++) {
   1274       uint32_t before = before_bits[i / 32] & (1 << (i & 31));
   1275       uint32_t after = after_bits[i / 32] & (1 << (i & 31));
   1276 
   1277       if (before != after) {
   1278          fprintf(stderr, "  bit %d, %s to %s\n", i,
   1279                  before ? "set" : "unset",
   1280                  after ? "set" : "unset");
   1281       }
   1282    }
   1283 }
   1284 
   1285 static int
   1286 compacted_between(int old_ip, int old_target_ip, int *compacted_counts)
   1287 {
   1288    int this_compacted_count = compacted_counts[old_ip];
   1289    int target_compacted_count = compacted_counts[old_target_ip];
   1290    return target_compacted_count - this_compacted_count;
   1291 }
   1292 
   1293 static void
   1294 update_uip_jip(const struct gen_device_info *devinfo, brw_inst *insn,
   1295                int this_old_ip, int *compacted_counts)
   1296 {
   1297    /* JIP and UIP are in units of:
   1298     *    - bytes on Gen8+; and
   1299     *    - compacted instructions on Gen6+.
   1300     */
   1301    int shift = devinfo->gen >= 8 ? 3 : 0;
   1302 
   1303    int32_t jip_compacted = brw_inst_jip(devinfo, insn) >> shift;
   1304    jip_compacted -= compacted_between(this_old_ip,
   1305                                       this_old_ip + (jip_compacted / 2),
   1306                                       compacted_counts);
   1307    brw_inst_set_jip(devinfo, insn, jip_compacted << shift);
   1308 
   1309    if (brw_inst_opcode(devinfo, insn) == BRW_OPCODE_ENDIF ||
   1310        brw_inst_opcode(devinfo, insn) == BRW_OPCODE_WHILE ||
   1311        (brw_inst_opcode(devinfo, insn) == BRW_OPCODE_ELSE && devinfo->gen <= 7))
   1312       return;
   1313 
   1314    int32_t uip_compacted = brw_inst_uip(devinfo, insn) >> shift;
   1315    uip_compacted -= compacted_between(this_old_ip,
   1316                                       this_old_ip + (uip_compacted / 2),
   1317                                       compacted_counts);
   1318    brw_inst_set_uip(devinfo, insn, uip_compacted << shift);
   1319 }
   1320 
   1321 static void
   1322 update_gen4_jump_count(const struct gen_device_info *devinfo, brw_inst *insn,
   1323                        int this_old_ip, int *compacted_counts)
   1324 {
   1325    assert(devinfo->gen == 5 || devinfo->is_g4x);
   1326 
   1327    /* Jump Count is in units of:
   1328     *    - uncompacted instructions on G45; and
   1329     *    - compacted instructions on Gen5.
   1330     */
   1331    int shift = devinfo->is_g4x ? 1 : 0;
   1332 
   1333    int jump_count_compacted = brw_inst_gen4_jump_count(devinfo, insn) << shift;
   1334 
   1335    int target_old_ip = this_old_ip + (jump_count_compacted / 2);
   1336 
   1337    int this_compacted_count = compacted_counts[this_old_ip];
   1338    int target_compacted_count = compacted_counts[target_old_ip];
   1339 
   1340    jump_count_compacted -= (target_compacted_count - this_compacted_count);
   1341    brw_inst_set_gen4_jump_count(devinfo, insn, jump_count_compacted >> shift);
   1342 }
   1343 
   1344 void
   1345 brw_init_compaction_tables(const struct gen_device_info *devinfo)
   1346 {
   1347    static bool initialized;
   1348    if (initialized || p_atomic_cmpxchg(&initialized, false, true) != false)
   1349       return;
   1350 
   1351    assert(g45_control_index_table[ARRAY_SIZE(g45_control_index_table) - 1] != 0);
   1352    assert(g45_datatype_table[ARRAY_SIZE(g45_datatype_table) - 1] != 0);
   1353    assert(g45_subreg_table[ARRAY_SIZE(g45_subreg_table) - 1] != 0);
   1354    assert(g45_src_index_table[ARRAY_SIZE(g45_src_index_table) - 1] != 0);
   1355    assert(gen6_control_index_table[ARRAY_SIZE(gen6_control_index_table) - 1] != 0);
   1356    assert(gen6_datatype_table[ARRAY_SIZE(gen6_datatype_table) - 1] != 0);
   1357    assert(gen6_subreg_table[ARRAY_SIZE(gen6_subreg_table) - 1] != 0);
   1358    assert(gen6_src_index_table[ARRAY_SIZE(gen6_src_index_table) - 1] != 0);
   1359    assert(gen7_control_index_table[ARRAY_SIZE(gen7_control_index_table) - 1] != 0);
   1360    assert(gen7_datatype_table[ARRAY_SIZE(gen7_datatype_table) - 1] != 0);
   1361    assert(gen7_subreg_table[ARRAY_SIZE(gen7_subreg_table) - 1] != 0);
   1362    assert(gen7_src_index_table[ARRAY_SIZE(gen7_src_index_table) - 1] != 0);
   1363    assert(gen8_control_index_table[ARRAY_SIZE(gen8_control_index_table) - 1] != 0);
   1364    assert(gen8_datatype_table[ARRAY_SIZE(gen8_datatype_table) - 1] != 0);
   1365    assert(gen8_subreg_table[ARRAY_SIZE(gen8_subreg_table) - 1] != 0);
   1366    assert(gen8_src_index_table[ARRAY_SIZE(gen8_src_index_table) - 1] != 0);
   1367 
   1368    switch (devinfo->gen) {
   1369    case 9:
   1370    case 8:
   1371       control_index_table = gen8_control_index_table;
   1372       datatype_table = gen8_datatype_table;
   1373       subreg_table = gen8_subreg_table;
   1374       src_index_table = gen8_src_index_table;
   1375       break;
   1376    case 7:
   1377       control_index_table = gen7_control_index_table;
   1378       datatype_table = gen7_datatype_table;
   1379       subreg_table = gen7_subreg_table;
   1380       src_index_table = gen7_src_index_table;
   1381       break;
   1382    case 6:
   1383       control_index_table = gen6_control_index_table;
   1384       datatype_table = gen6_datatype_table;
   1385       subreg_table = gen6_subreg_table;
   1386       src_index_table = gen6_src_index_table;
   1387       break;
   1388    case 5:
   1389    case 4:
   1390       control_index_table = g45_control_index_table;
   1391       datatype_table = g45_datatype_table;
   1392       subreg_table = g45_subreg_table;
   1393       src_index_table = g45_src_index_table;
   1394       break;
   1395    default:
   1396       unreachable("unknown generation");
   1397    }
   1398 }
   1399 
   1400 void
   1401 brw_compact_instructions(struct brw_codegen *p, int start_offset,
   1402                          int num_annotations, struct annotation *annotation)
   1403 {
   1404    if (unlikely(INTEL_DEBUG & DEBUG_NO_COMPACTION))
   1405       return;
   1406 
   1407    const struct gen_device_info *devinfo = p->devinfo;
   1408    void *store = p->store + start_offset / 16;
   1409    /* For an instruction at byte offset 16*i before compaction, this is the
   1410     * number of compacted instructions minus the number of padding NOP/NENOPs
   1411     * that preceded it.
   1412     */
   1413    int compacted_counts[(p->next_insn_offset - start_offset) / sizeof(brw_inst)];
   1414    /* For an instruction at byte offset 8*i after compaction, this was its IP
   1415     * (in 16-byte units) before compaction.
   1416     */
   1417    int old_ip[(p->next_insn_offset - start_offset) / sizeof(brw_compact_inst)];
   1418 
   1419    if (devinfo->gen == 4 && !devinfo->is_g4x)
   1420       return;
   1421 
   1422    int offset = 0;
   1423    int compacted_count = 0;
   1424    for (int src_offset = 0; src_offset < p->next_insn_offset - start_offset;
   1425         src_offset += sizeof(brw_inst)) {
   1426       brw_inst *src = store + src_offset;
   1427       void *dst = store + offset;
   1428 
   1429       old_ip[offset / sizeof(brw_compact_inst)] = src_offset / sizeof(brw_inst);
   1430       compacted_counts[src_offset / sizeof(brw_inst)] = compacted_count;
   1431 
   1432       brw_inst saved = *src;
   1433 
   1434       if (brw_try_compact_instruction(devinfo, dst, src)) {
   1435          compacted_count++;
   1436 
   1437          if (INTEL_DEBUG) {
   1438             brw_inst uncompacted;
   1439             brw_uncompact_instruction(devinfo, &uncompacted, dst);
   1440             if (memcmp(&saved, &uncompacted, sizeof(uncompacted))) {
   1441                brw_debug_compact_uncompact(devinfo, &saved, &uncompacted);
   1442             }
   1443          }
   1444 
   1445          offset += sizeof(brw_compact_inst);
   1446       } else {
   1447          /* All uncompacted instructions need to be aligned on G45. */
   1448          if ((offset & sizeof(brw_compact_inst)) != 0 && devinfo->is_g4x){
   1449             brw_compact_inst *align = store + offset;
   1450             memset(align, 0, sizeof(*align));
   1451             brw_compact_inst_set_opcode(devinfo, align, BRW_OPCODE_NENOP);
   1452             brw_compact_inst_set_cmpt_control(devinfo, align, true);
   1453             offset += sizeof(brw_compact_inst);
   1454             compacted_count--;
   1455             compacted_counts[src_offset / sizeof(brw_inst)] = compacted_count;
   1456             old_ip[offset / sizeof(brw_compact_inst)] = src_offset / sizeof(brw_inst);
   1457 
   1458             dst = store + offset;
   1459          }
   1460 
   1461          /* If we didn't compact this intruction, we need to move it down into
   1462           * place.
   1463           */
   1464          if (offset != src_offset) {
   1465             memmove(dst, src, sizeof(brw_inst));
   1466          }
   1467          offset += sizeof(brw_inst);
   1468       }
   1469    }
   1470 
   1471    /* Fix up control flow offsets. */
   1472    p->next_insn_offset = start_offset + offset;
   1473    for (offset = 0; offset < p->next_insn_offset - start_offset;
   1474         offset = next_offset(devinfo, store, offset)) {
   1475       brw_inst *insn = store + offset;
   1476       int this_old_ip = old_ip[offset / sizeof(brw_compact_inst)];
   1477       int this_compacted_count = compacted_counts[this_old_ip];
   1478 
   1479       switch (brw_inst_opcode(devinfo, insn)) {
   1480       case BRW_OPCODE_BREAK:
   1481       case BRW_OPCODE_CONTINUE:
   1482       case BRW_OPCODE_HALT:
   1483          if (devinfo->gen >= 6) {
   1484             update_uip_jip(devinfo, insn, this_old_ip, compacted_counts);
   1485          } else {
   1486             update_gen4_jump_count(devinfo, insn, this_old_ip,
   1487                                    compacted_counts);
   1488          }
   1489          break;
   1490 
   1491       case BRW_OPCODE_IF:
   1492       case BRW_OPCODE_IFF:
   1493       case BRW_OPCODE_ELSE:
   1494       case BRW_OPCODE_ENDIF:
   1495       case BRW_OPCODE_WHILE:
   1496          if (devinfo->gen >= 7) {
   1497             if (brw_inst_cmpt_control(devinfo, insn)) {
   1498                brw_inst uncompacted;
   1499                brw_uncompact_instruction(devinfo, &uncompacted,
   1500                                          (brw_compact_inst *)insn);
   1501 
   1502                update_uip_jip(devinfo, &uncompacted, this_old_ip,
   1503                               compacted_counts);
   1504 
   1505                bool ret = brw_try_compact_instruction(devinfo,
   1506                                                       (brw_compact_inst *)insn,
   1507                                                       &uncompacted);
   1508                assert(ret); (void)ret;
   1509             } else {
   1510                update_uip_jip(devinfo, insn, this_old_ip, compacted_counts);
   1511             }
   1512          } else if (devinfo->gen == 6) {
   1513             assert(!brw_inst_cmpt_control(devinfo, insn));
   1514 
   1515             /* Jump Count is in units of compacted instructions on Gen6. */
   1516             int jump_count_compacted = brw_inst_gen6_jump_count(devinfo, insn);
   1517 
   1518             int target_old_ip = this_old_ip + (jump_count_compacted / 2);
   1519             int target_compacted_count = compacted_counts[target_old_ip];
   1520             jump_count_compacted -= (target_compacted_count - this_compacted_count);
   1521             brw_inst_set_gen6_jump_count(devinfo, insn, jump_count_compacted);
   1522          } else {
   1523             update_gen4_jump_count(devinfo, insn, this_old_ip,
   1524                                    compacted_counts);
   1525          }
   1526          break;
   1527 
   1528       case BRW_OPCODE_ADD:
   1529          /* Add instructions modifying the IP register use an immediate src1,
   1530           * and Gens that use this cannot compact instructions with immediate
   1531           * operands.
   1532           */
   1533          if (brw_inst_cmpt_control(devinfo, insn))
   1534             break;
   1535 
   1536          if (brw_inst_dst_reg_file(devinfo, insn) == BRW_ARCHITECTURE_REGISTER_FILE &&
   1537              brw_inst_dst_da_reg_nr(devinfo, insn) == BRW_ARF_IP) {
   1538             assert(brw_inst_src1_reg_file(devinfo, insn) == BRW_IMMEDIATE_VALUE);
   1539 
   1540             int shift = 3;
   1541             int jump_compacted = brw_inst_imm_d(devinfo, insn) >> shift;
   1542 
   1543             int target_old_ip = this_old_ip + (jump_compacted / 2);
   1544             int target_compacted_count = compacted_counts[target_old_ip];
   1545             jump_compacted -= (target_compacted_count - this_compacted_count);
   1546             brw_inst_set_imm_ud(devinfo, insn, jump_compacted << shift);
   1547          }
   1548          break;
   1549       }
   1550    }
   1551 
   1552    /* p->nr_insn is counting the number of uncompacted instructions still, so
   1553     * divide.  We do want to be sure there's a valid instruction in any
   1554     * alignment padding, so that the next compression pass (for the FS 8/16
   1555     * compile passes) parses correctly.
   1556     */
   1557    if (p->next_insn_offset & sizeof(brw_compact_inst)) {
   1558       brw_compact_inst *align = store + offset;
   1559       memset(align, 0, sizeof(*align));
   1560       brw_compact_inst_set_opcode(devinfo, align, BRW_OPCODE_NOP);
   1561       brw_compact_inst_set_cmpt_control(devinfo, align, true);
   1562       p->next_insn_offset += sizeof(brw_compact_inst);
   1563    }
   1564    p->nr_insn = p->next_insn_offset / sizeof(brw_inst);
   1565 
   1566    /* Update the instruction offsets for each annotation. */
   1567    if (annotation) {
   1568       for (int offset = 0, i = 0; i < num_annotations; i++) {
   1569          while (start_offset + old_ip[offset / sizeof(brw_compact_inst)] *
   1570                 sizeof(brw_inst) != annotation[i].offset) {
   1571             assert(start_offset + old_ip[offset / sizeof(brw_compact_inst)] *
   1572                    sizeof(brw_inst) < annotation[i].offset);
   1573             offset = next_offset(devinfo, store, offset);
   1574          }
   1575 
   1576          annotation[i].offset = start_offset + offset;
   1577 
   1578          offset = next_offset(devinfo, store, offset);
   1579       }
   1580 
   1581       annotation[num_annotations].offset = p->next_insn_offset;
   1582    }
   1583 }
   1584