diff --git a/src/intel/compiler/gen/gen_compact.cpp b/src/intel/compiler/gen/gen_compact.cpp new file mode 100644 index 00000000000..2989837b9f3 --- /dev/null +++ b/src/intel/compiler/gen/gen_compact.cpp @@ -0,0 +1,937 @@ +/* + * Copyright © 2025 Intel Corporation + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +#include "util/ralloc.h" + +#include "gen_private.h" + +static const uint32_t gfx8_control_index_table[32] = { + 0b0000000000000000010, + 0b0000100000000000000, + 0b0000100000000000001, + 0b0000100000000000010, + 0b0000100000000000011, + 0b0000100000000000100, + 0b0000100000000000101, + 0b0000100000000000111, + 0b0000100000000001000, + 0b0000100000000001001, + 0b0000100000000001101, + 0b0000110000000000000, + 0b0000110000000000001, + 0b0000110000000000010, + 0b0000110000000000011, + 0b0000110000000000100, + 0b0000110000000000101, + 0b0000110000000000111, + 0b0000110000000001001, + 0b0000110000000001101, + 0b0000110000000010000, + 0b0000110000100000000, + 0b0001000000000000000, + 0b0001000000000000010, + 0b0001000000000000100, + 0b0001000000100000000, + 0b0010110000000000000, + 0b0010110000000010000, + 0b0011000000000000000, + 0b0011000000100000000, + 0b0101000000000000000, + 0b0101000000100000000, +}; + +static const uint32_t gfx8_datatype_table[32] = { + 0b001000000000000000001, + 0b001000000000001000000, + 0b001000000000001000001, + 0b001000000000011000001, + 0b001000000000101011101, + 0b001000000010111011101, + 0b001000000011101000001, + 0b001000000011101000101, + 0b001000000011101011101, + 0b001000001000001000001, + 0b001000011000001000000, + 0b001000011000001000001, + 0b001000101000101000101, + 0b001000111000101000100, + 0b001000111000101000101, + 0b001011100011101011101, + 0b001011101011100011101, + 0b001011101011101011100, + 0b001011101011101011101, + 0b001011111011101011100, + 0b000000000010000001100, + 0b001000000000001011101, + 0b001000000000101000101, + 0b001000001000001000000, + 0b001000101000101000100, + 0b001000111000100000100, + 0b001001001001000001001, + 0b001010111011101011101, + 0b001011111011101011101, + 0b001001111001101001100, + 0b001001001001001001000, + 0b001001011001001001000, +}; + +static const uint16_t gfx8_subreg_table[32] = { + 0b000000000000000, + 0b000000000000001, + 0b000000000001000, + 0b000000000001111, + 0b000000000010000, + 0b000000010000000, + 0b000000100000000, + 0b000000110000000, + 0b000001000000000, + 0b000001000010000, + 0b000001010000000, + 0b001000000000000, + 0b001000000000001, + 0b001000010000001, + 0b001000010000010, + 0b001000010000011, + 0b001000010000100, + 0b001000010000111, + 0b001000010001000, + 0b001000010001110, + 0b001000010001111, + 0b001000110000000, + 0b001000111101000, + 0b010000000000000, + 0b010000110000000, + 0b011000000000000, + 0b011110010000111, + 0b100000000000000, + 0b101000000000000, + 0b110000000000000, + 0b111000000000000, + 0b111000000011100, +}; + +static const uint16_t gfx8_src_index_table[32] = { + 0b000000000000, + 0b000000000010, + 0b000000010000, + 0b000000010010, + 0b000000011000, + 0b000000100000, + 0b000000101000, + 0b000001001000, + 0b000001010000, + 0b000001110000, + 0b000001111000, + 0b001100000000, + 0b001100000010, + 0b001100001000, + 0b001100010000, + 0b001100010010, + 0b001100100000, + 0b001100101000, + 0b001100111000, + 0b001101000000, + 0b001101000010, + 0b001101001000, + 0b001101010000, + 0b001101100000, + 0b001101101000, + 0b001101110000, + 0b001101110001, + 0b001101111000, + 0b010001101000, + 0b010001101001, + 0b010001101010, + 0b010110001000, +}; + +static const uint32_t gfx11_datatype_table[32] = { + 0b001000000000000000001, + 0b001000000000001000000, + 0b001000000000001000001, + 0b001000000000011000001, + 0b001000000000101100101, + 0b001000000101111100101, + 0b001000000100101000001, + 0b001000000100101000101, + 0b001000000100101100101, + 0b001000001000001000001, + 0b001000011000001000000, + 0b001000011000001000001, + 0b001000101000101000101, + 0b001000111000101000100, + 0b001000111000101000101, + 0b001100100100101100101, + 0b001100101100100100101, + 0b001100101100101100100, + 0b001100101100101100101, + 0b001100111100101100100, + 0b000000000010000001100, + 0b001000000000001100101, + 0b001000000000101000101, + 0b001000001000001000000, + 0b001000101000101000100, + 0b001000111000100000100, + 0b001001001001000001001, + 0b001101111100101100101, + 0b001100111100101100101, + 0b001001111001101001100, + 0b001001001001001001000, + 0b001001011001001001000, +}; + +static const uint32_t gfx12_control_index_table[32] = { + 0b000000000000000000100, /* (16|M0) */ + 0b000000000000000000011, /* (8|M0) */ + 0b000000010000000000000, /* (W) (1|M0) */ + 0b000000010000000000100, /* (W) (16|M0) */ + 0b000000010000000000011, /* (W) (8|M0) */ + 0b010000000000000000100, /* (16|M0) (ge)f0.0 */ + 0b000000000000000100100, /* (16|M16) */ + 0b010100000000000000100, /* (16|M0) (lt)f0.0 */ + 0b000000000000000000000, /* (1|M0) */ + 0b000010000000000000100, /* (16|M0) (sat) */ + 0b000000000000000010011, /* (8|M8) */ + 0b001100000000000000100, /* (16|M0) (gt)f0.0 */ + 0b000100000000000000100, /* (16|M0) (eq)f0.0 */ + 0b000100010000000000100, /* (W) (16|M0) (eq)f0.0 */ + 0b001000000000000000100, /* (16|M0) (ne)f0.0 */ + 0b000000000000100000100, /* (f0.0) (16|M0) */ + 0b010100000000000000011, /* (8|M0) (lt)f0.0 */ + 0b000000000000110000100, /* (f1.0) (16|M0) */ + 0b000000010000000000001, /* (W) (2|M0) */ + 0b000000000000101000100, /* (f0.1) (16|M0) */ + 0b000000000000111000100, /* (f1.1) (16|M0) */ + 0b010000010000000000100, /* (W) (16|M0) (ge)f0.0 */ + 0b000000000000000100011, /* (8|M16) */ + 0b000000000000000110011, /* (8|M24) */ + 0b010100010000000000100, /* (W) (16|M0) (lt)f0.0 */ + 0b010000000000000000011, /* (8|M0) (ge)f0.0 */ + 0b000100010000000000000, /* (W) (1|M0) (eq)f0.0 */ + 0b000010000000000000011, /* (8|M0) (sat) */ + 0b010100000000010000100, /* (16|M0) (lt)f1.0 */ + 0b000100000000000000011, /* (8|M0) (eq)f0.0 */ + 0b000001000000000000011, /* (8|M0) {AccWrEn} */ + 0b000000010000000100100, /* (W) (16|M16) */ +}; + +static const uint32_t gfx12_datatype_table[32] = { + 0b11010110100101010100, /* grf<1>:f grf:f grf:f */ + 0b00000110100101010100, /* grf<1>:f grf:f arf:ub */ + 0b00000010101101010100, /* grf<1>:f imm:f arf:ub */ + 0b01010110110101010100, /* grf<1>:f grf:f imm:f */ + 0b11010100100101010100, /* arf<1>:f grf:f grf:f */ + 0b11010010100101010100, /* grf<1>:f arf:f grf:f */ + 0b01010100110101010100, /* arf<1>:f grf:f imm:f */ + 0b00000000100000000000, /* arf<1>:ub arf:ub arf:ub */ + 0b11010000100101010100, /* arf<1>:f arf:f grf:f */ + 0b00101110110011001100, /* grf<1>:d grf:d imm:w */ + 0b10110110100011001100, /* grf<1>:d grf:d grf:d */ + 0b01010010110101010100, /* grf<1>:f arf:f imm:f */ + 0b10010110100001000100, /* grf<1>:ud grf:ud grf:ud */ + 0b01010000110101010100, /* arf<1>:f arf:f imm:f */ + 0b00110110110011001100, /* grf<1>:d grf:d imm:d */ + 0b00010110110001000100, /* grf<1>:ud grf:ud imm:ud */ + 0b00000111000101010100, /* grf<2>:f grf:f arf:ub */ + 0b00101100110011001100, /* arf<1>:d grf:d imm:w */ + 0b00000000100000100010, /* arf<1>:uw arf:uw arf:ub */ + 0b00000010100001000100, /* grf<1>:ud arf:ud arf:ub */ + 0b00100110110000101010, /* grf<1>:w grf:uw imm:uv */ + 0b00001110110000100010, /* grf<1>:uw grf:uw imm:uw */ + 0b10010111000001000100, /* grf<2>:ud grf:ud grf:ud */ + 0b00000110100101001100, /* grf<1>:d grf:f arf:ub */ + 0b10001100100011001100, /* arf<1>:d grf:d grf:uw */ + 0b00000110100001010100, /* grf<1>:f grf:ud arf:ub */ + 0b00101110110001001100, /* grf<1>:d grf:ud imm:w */ + 0b00000010100000100010, /* grf<1>:uw arf:uw arf:ub */ + 0b00000110100000110100, /* grf<1>:f grf:uw arf:ub */ + 0b00000110100000010100, /* grf<1>:f grf:ub arf:ub */ + 0b00000110100011010100, /* grf<1>:f grf:d arf:ub */ + 0b00000010100101010100, /* grf<1>:f arf:f arf:ub */ +}; + +static const uint16_t gfx12_subreg_table[32] = { + 0b000000000000000, /* .0 .0 .0 */ + 0b100000000000000, /* .0 .0 .16 */ + 0b001000000000000, /* .0 .0 .4 */ + 0b011000000000000, /* .0 .0 .12 */ + 0b000000010000000, /* .0 .4 .0 */ + 0b010000000000000, /* .0 .0 .8 */ + 0b101000000000000, /* .0 .0 .20 */ + 0b000000000001000, /* .8 .0 .0 */ + 0b000000100000000, /* .0 .8 .0 */ + 0b110000000000000, /* .0 .0 .24 */ + 0b111000000000000, /* .0 .0 .28 */ + 0b000001000000000, /* .0 .16 .0 */ + 0b000000000000100, /* .4 .0 .0 */ + 0b000001100000000, /* .0 .24 .0 */ + 0b000001010000000, /* .0 .20 .0 */ + 0b000000110000000, /* .0 .12 .0 */ + 0b000001110000000, /* .0 .28 .0 */ + 0b000000000011100, /* .28 .0 .0 */ + 0b000000000010000, /* .16 .0 .0 */ + 0b000000000001100, /* .12 .0 .0 */ + 0b000000000011000, /* .24 .0 .0 */ + 0b000000000010100, /* .20 .0 .0 */ + 0b000000000000010, /* .2 .0 .0 */ + 0b000000101000000, /* .0 .10 .0 */ + 0b000000001000000, /* .0 .2 .0 */ + 0b000000010000100, /* .4 .4 .0 */ + 0b000000001011100, /* .28 .2 .0 */ + 0b000000001000010, /* .2 .2 .0 */ + 0b000000110001100, /* .12 .12 .0 */ + 0b000000000100000, /* .0 .1 .0 */ + 0b000000001100000, /* .0 .3 .0 */ + 0b110001100000000, /* .0 .24 .24 */ +}; + +static const uint16_t gfx12_src0_index_table[16] = { + 0b010001100100, /* r<8;8,1> */ + 0b000000000000, /* r<0;1,0> */ + 0b010001100110, /* -r<8;8,1> */ + 0b010001100101, /* (abs)r<8;8,1> */ + 0b000000000010, /* -r<0;1,0> */ + 0b001000000000, /* r<2;1,0> */ + 0b001001000000, /* r<2;4,0> */ + 0b001101000000, /* r<4;4,0> */ + 0b001000100100, /* r<2;2,1> */ + 0b001100000000, /* r<4;1,0> */ + 0b001000100110, /* -r<2;2,1> */ + 0b001101000100, /* r<4;4,1> */ + 0b010001100111, /* -(abs)r<8;8,1> */ + 0b000100000000, /* r<1;1,0> */ + 0b000000000001, /* (abs)r<0;1,0> */ + 0b111100010000, /* r[a]<1,0> */ +}; + +static const uint16_t gfx12_src1_index_table[16] = { + 0b000100011001, /* r<8;8,1> */ + 0b000000000000, /* r<0;1,0> */ + 0b100100011001, /* -r<8;8,1> */ + 0b100000000000, /* -r<0;1,0> */ + 0b010100011001, /* (abs)r<8;8,1> */ + 0b100011010000, /* -r<4;4,0> */ + 0b000010000000, /* r<2;1,0> */ + 0b000010001001, /* r<2;2,1> */ + 0b100010001001, /* -r<2;2,1> */ + 0b000011010000, /* r<4;4,0> */ + 0b000011010001, /* r<4;4,1> */ + 0b000011000000, /* r<4;1,0> */ + 0b110100011001, /* -(abs)r<8;8,1> */ + 0b010000000000, /* (abs)r<0;1,0> */ + 0b110000000000, /* -(abs)r<0;1,0> */ + 0b100011010001, /* -r<4;4,1> */ +}; + +static const uint16_t xehp_src0_index_table[16] = { + 0b000100000000, /* r<1;1,0> */ + 0b000000000000, /* r<0;1,0> */ + 0b000100000010, /* -r<1;1,0> */ + 0b000100000001, /* (abs)r<1;1,0> */ + 0b000000000010, /* -r<0;1,0> */ + 0b001000000000, /* r<2;1,0> */ + 0b001001000000, /* r<2;4,0> */ + 0b001101000000, /* r<4;4,0> */ + 0b001100000000, /* r<4;1,0> */ + 0b000100000011, /* -(abs)r<1;1,0> */ + 0b000000000001, /* (abs)r<0;1,0> */ + 0b111100010000, /* r[a]<1,0> */ + 0b010001100000, /* r<8;8,0> */ + 0b000101000000, /* r<1;4,0> */ + 0b010001001000, /* r<8;4,2> */ + 0b001000000010, /* -r<2;1,0> */ +}; + +static const uint16_t xehp_src1_index_table[16] = { + 0b000001000000, /* r<1;1,0> */ + 0b000000000000, /* r<0;1,0> */ + 0b100001000000, /* -r<1;1,0> */ + 0b100000000000, /* -r<0;1,0> */ + 0b010001000000, /* (abs)r<1;1,0> */ + 0b100011010000, /* -r<4;4,0> */ + 0b000010000000, /* r<2;1,0> */ + 0b000011010000, /* r<4;4,0> */ + 0b000011000000, /* r<4;1,0> */ + 0b110001000000, /* -(abs)r<1;1,0> */ + 0b010000000000, /* (abs)r<0;1,0> */ + 0b110000000000, /* -(abs)r<0;1,0> */ + 0b000100011000, /* r<8;8,0> */ + 0b100010000000, /* -r<2;1,0> */ + 0b100000001001, /* -r<0;2,1> */ + 0b100001000100, /* -r[a]<1;1,0> */ +}; + +static const uint32_t xe2_control_index_table[32] = { + 0b000000000000000100, /* (16|M0) */ + 0b000000100000000000, /* (W) (1|M0) */ + 0b000000000010000100, /* (16|M16) */ + 0b000000000000000000, /* (1|M0) */ + 0b000000100000000100, /* (W) (16|M0) */ + 0b010000000000000100, /* (16|M0) (.ge)f0.0 */ + 0b010100000000000100, /* (16|M0) (.lt)f0.0 */ + 0b000000100000000010, /* (W) (4|M0) */ + 0b000000000000000101, /* (32|M0) */ + 0b000000100000000011, /* (W) (8|M0) */ + 0b001100100000000000, /* (W) (1|M0) (.gt)f0.0 */ + 0b000010000000000100, /* (16|M0) (sat) */ + 0b000100000000000100, /* (16|M0) (.eq)f0.0 */ + 0b000000100000000001, /* (W) (2|M0) */ + 0b001100000000000100, /* (16|M0) (.gt)f0.0 */ + 0b000100100000000000, /* (W) (1|M0) (.eq)f0.0 */ + 0b010100100000000010, /* (W) (4|M0) (.lt)f0.0 */ + 0b010000100000000000, /* (W) (1|M0) (.ge)f0.0 */ + 0b010000100000000010, /* (W) (4|M0) (.ge)f0.0 */ + 0b010100100000000000, /* (W) (1|M0) (.lt)f0.0 */ + 0b001000000000000100, /* (16|M0) (.ne)f0.0 */ + 0b000000000100100100, /* (f2.0) (16|M0) */ + 0b010100100000000011, /* (W) (8|M0) (.lt)f0.0 */ + 0b000000000100011100, /* (f1.1) (16|M0) */ + 0b010000100000000011, /* (W) (8|M0) (.ge)f0.0 */ + 0b000000000100001100, /* (f0.1) (16|M0) */ + 0b000000000100010100, /* (f1.0) (16|M0) */ + 0b000000000100110100, /* (f3.0) (16|M0) */ + 0b000000000100111100, /* (f3.1) (16|M0) */ + 0b000000000100101100, /* (f2.1) (16|M0) */ + 0b000000000100000100, /* (f0.0) (16|M0) */ + 0b010100000000100100, /* (16|M0) (.lt)f2.0 */ +}; + +static const uint32_t xe2_datatype_table[32] = { + 0b11010110100101010100, /* grf<1>:f grf:f grf:f */ + 0b11010100100101010100, /* arf<1>:f grf:f grf:f */ + 0b00000110100101010100, /* grf<1>:f grf:f arf:ub */ + 0b00000110100001000100, /* grf<1>:ud grf:ud arf:ub */ + 0b01010110110101010100, /* grf<1>:f grf:f imm:f */ + 0b11010010100101010100, /* grf<1>:f arf:f grf:f */ + 0b10111110100011101110, /* grf<1>:q grf:q grf:q */ + 0b00000000100000000000, /* arf<1>:ub arf:ub arf:ub */ + 0b01010110100101010100, /* grf<1>:f grf:f arf:f */ + 0b00000010101001000100, /* grf<1>:ud imm:ud */ + 0b00101110110011001100, /* grf<1>:d grf:d imm:w */ + 0b11010000100101010100, /* arf<1>:f arf:f grf:f */ + 0b01010100100101010100, /* arf<1>:f grf:f arf:f */ + 0b01010100110101010100, /* arf<1>:f grf:f imm:f */ + 0b00000010101101010100, /* grf<1>:f imm:f */ + 0b00000110100011001100, /* grf<1>:d grf:d arf:ub */ + 0b00101110110011101110, /* grf<1>:q grf:q imm:w */ + 0b00000110100001100110, /* grf<1>:uq grf:uq arf:ub */ + 0b01010000100101010100, /* arf<1>:f arf:f arf:f */ + 0b10110110100011001100, /* grf<1>:d grf:d grf:d */ + 0b01010010100101010100, /* grf<1>:f arf:f arf:f */ + 0b00000111000001000100, /* grf<2>:ud grf:ud arf:ub */ + 0b00110110110011001110, /* grf<1>:q grf:d imm:d */ + 0b00101100110011001100, /* arf<1>:d grf:d imm:w */ + 0b11011110100101110110, /* grf<1>:df grf:df grf:df */ + 0b01010010110101010100, /* grf<1>:f arf:f imm:f */ + 0b10010110100001000100, /* grf<1>:ud grf:ud grf:ud */ + 0b00000010100001000100, /* grf<1>:ud arf:ud arf:ub */ + 0b00001110110001000100, /* grf<1>:ud grf:ud imm:uw */ + 0b00000010101010101100, /* grf<1>:d imm:w */ + 0b01010000110101010100, /* arf<1>:f arf:f imm:f */ + 0b00000100100001000100, /* arf<1>:ud grf:ud arf:ub */ +}; + +static const uint16_t xe2_subreg_table[16] = { + 0b000000000000, /* .0 .0 */ + 0b000010000000, /* .0 .4 */ + 0b000000000100, /* .4 .0 */ + 0b010000000000, /* .0 .32 */ + 0b001000000000, /* .0 .16 */ + 0b000000001000, /* .8 .0 */ + 0b000100000000, /* .0 .8 */ + 0b010100000000, /* .0 .40 */ + 0b011000000000, /* .0 .48 */ + 0b000110000000, /* .0 .12 */ + 0b000000010000, /* .16 .0 */ + 0b011010000000, /* .0 .52 */ + 0b001100000000, /* .0 .24 */ + 0b011100000000, /* .0 .56 */ + 0b010110000000, /* .0 .44 */ + 0b010010000000, /* .0 .36 */ +}; + +static const uint16_t xe2_src0_index_table[8] = { + 0b00100000000, /* r<1;1,0> */ + 0b00000000000, /* r<0;1,0> */ + 0b01000000000, /* r<2;1,0> */ + 0b00100000010, /* -r<1;1,0> */ + 0b01100000000, /* r<4;1,0> */ + 0b00100000001, /* (abs)r<1;1,0> */ + 0b00000000010, /* -r<0;1,0> */ + 0b01001000000, /* r<2;4,0> */ +}; + +static const uint16_t xe2_src1_index_table[16] = { + 0b0000100000000000, /* r<1;1,0>.0 */ + 0b0000000000000000, /* r<0;1,0>.0 */ + 0b1000100000000000, /* -r<1;1,0>.0 */ + 0b0000000000010000, /* r<0;1,0>.8 */ + 0b0000000000001000, /* r<0;1,0>.4 */ + 0b0000000000011000, /* r<0;1,0>.12 */ + 0b0000000001010000, /* r<0;1,0>.40 */ + 0b0000000001000000, /* r<0;1,0>.32 */ + 0b0000000000100000, /* r<0;1,0>.16 */ + 0b0000000001111000, /* r<0;1,0>.60 */ + 0b0000000000111000, /* r<0;1,0>.28 */ + 0b0000000000101000, /* r<0;1,0>.20 */ + 0b0000000001011000, /* r<0;1,0>.44 */ + 0b0000000001001000, /* r<0;1,0>.36 */ + 0b0000000001110000, /* r<0;1,0>.56 */ + 0b0000000000110000, /* r<0;1,0>.24 */ +}; + +/* This is actually the control index table for Cherryview (26 bits), but the + * only difference from Broadwell (24 bits) is that it has two extra 0-bits at + * the start. + * + * The low 24 bits have the same mappings on both hardware. + */ +static const uint32_t gfx8_3src_control_index_table[4] = { + 0b00100000000110000000000001, + 0b00000000000110000000000001, + 0b00000000001000000000000001, + 0b00000000001000000000100001, +}; + +/* This is actually the control index table for Cherryview (49 bits), but the + * only difference from Broadwell (46 bits) is that it has three extra 0-bits + * at the start. + * + * The low 44 bits have the same mappings on both hardware, and since the high + * three bits on Broadwell are zero, we can reuse Cherryview's table. + */ +static const uint64_t gfx8_3src_source_index_table[4] = { + 0b0000001110010011100100111001000001111000000000000, + 0b0000001110010011100100111001000001111000000000010, + 0b0000001110010011100100111001000001111000000001000, + 0b0000001110010011100100111001000001111000000100000, +}; + +static const uint64_t gfx12_3src_control_index_table[32] = { + 0b000001001010010101000000000000000100, /* (16|M0) grf<1>:f :f :f :f */ + 0b000001001010010101000000000000000011, /* (8|M0) grf<1>:f :f :f :f */ + 0b000001001000010101000000000000000011, /* (8|M0) arf<1>:f :f :f :f */ + 0b000001001010010101000010000000000011, /* (W) (8|M0) grf<1>:f :f :f :f */ + 0b000001001000010101000010000000000011, /* (W) (8|M0) arf<1>:f :f :f :f */ + 0b000001001000010101000000000000010011, /* (8|M8) arf<1>:f :f :f :f */ + 0b000001001010010101000000000000010011, /* (8|M8) grf<1>:f :f :f :f */ + 0b000001001000010101000010000000010011, /* (W) (8|M8) arf<1>:f :f :f :f */ + 0b000001001010010101000010000000010011, /* (W) (8|M8) grf<1>:f :f :f :f */ + 0b000001001010010101000010000000000100, /* (W) (16|M0) grf<1>:f :f :f :f */ + 0b000001001000010101000000000000000100, /* (16|M0) arf<1>:f :f :f :f */ + 0b000001001010010101010000000000000100, /* (16|M0) (sat)grf<1>:f :f :f :f */ + 0b000001001010010101000000000000100100, /* (16|M16) grf<1>:f :f :f :f */ + 0b000001001000010101000010000000000100, /* (W) (16|M0) arf<1>:f :f :f :f */ + 0b000001001010010101000010000000000000, /* (W) (1|M0) grf<1>:f :f :f :f */ + 0b000001001010010101010000000000000011, /* (8|M0) (sat)grf<1>:f :f :f :f */ + 0b000001001000010101000010000000110011, /* (W) (8|M24) arf<1>:f :f :f :f */ + 0b000001001000010101000010000000100011, /* (W) (8|M16) arf<1>:f :f :f :f */ + 0b000001001010010101000010000000110011, /* (W) (8|M24) grf<1>:f :f :f :f */ + 0b000001001010010101000010000000100011, /* (W) (8|M16) grf<1>:f :f :f :f */ + 0b000001001000010101000000000000100011, /* (8|M16) arf<1>:f :f :f :f */ + 0b000001001000010101000000000000110011, /* (8|M24) arf<1>:f :f :f :f */ + 0b000001001010010101000000000000100011, /* (8|M16) grf<1>:f :f :f :f */ + 0b000001001010010101000000000000110011, /* (8|M24) grf<1>:f :f :f :f */ + 0b000001001000010101010000000000000100, /* (16|M0) (sat)arf<1>:f :f :f :f */ + 0b000001001010010101010010000000000100, /* (W) (16|M0) (sat)grf<1>:f :f :f :f */ + 0b000001001010010101000010000000100100, /* (W) (16|M16) grf<1>:f :f :f :f */ + 0b000001001010010001000010000000000000, /* (W) (1|M0) grf<1>:ud :ud :ud :ud */ + 0b000001001000010101000000000000100100, /* (16|M16) arf<1>:f :f :f :f */ + 0b000001001010010101010000000000100100, /* (16|M16) (sat)grf<1>:f :f :f :f */ + 0b000001001010010101000010000000000010, /* (W) (4|M0) grf<1>:f :f :f :f */ + 0b000001001000010101010000000000000011, /* (8|M0) (sat)arf<1>:f :f :f :f */ +}; + +static const uint64_t xehp_3src_control_index_table[32] = { + 0b0000010010100010101000000000000000100, /* (16|M0) grf<1>:f :f :f :f */ + 0b0000010010100010101000000000000000011, /* (8|M0) grf<1>:f :f :f :f */ + 0b0000010010000010101000000000000000011, /* (8|M0) arf<1>:f :f :f :f */ + 0b0000010010100010101000010000000000011, /* (W) (8|M0) grf<1>:f :f :f :f */ + 0b0000010010000010101000010000000000011, /* (W) (8|M0) arf<1>:f :f :f :f */ + 0b0000010010000010101000000000000010011, /* (8|M8) arf<1>:f :f :f :f */ + 0b0000010010100010101000000000000010011, /* (8|M8) grf<1>:f :f :f :f */ + 0b0000010010000010101000010000000010011, /* (W) (8|M8) arf<1>:f :f :f :f */ + 0b0000010010100010101000010000000010011, /* (W) (8|M8) grf<1>:f :f :f :f */ + 0b0000010010100010101000010000000000100, /* (W) (16|M0) grf<1>:f :f :f :f */ + 0b0000010010000010101000000000000000100, /* (16|M0) arf<1>:f :f :f :f */ + 0b0000010010100010101010000000000000100, /* (16|M0) (sat)grf<1>:f :f :f :f */ + 0b0000010010100010101000000000000100100, /* (16|M16) grf<1>:f :f :f :f */ + 0b0000010010000010101000010000000000100, /* (W) (16|M0) arf<1>:f :f :f :f */ + 0b0000010010100010101000010000000000000, /* (W) (1|M0) grf<1>:f :f :f :f */ + 0b0000010010100010101010000000000000011, /* (8|M0) (sat)grf<1>:f :f :f :f */ + 0b0000010010000010101000010000000100011, /* (W) (8|M16) arf<1>:f :f :f :f */ + 0b0000010010000010101000010000000110011, /* (W) (8|M24) arf<1>:f :f :f :f */ + 0b0000010010100010101000010000000100011, /* (W) (8|M16) grf<1>:f :f :f :f */ + 0b0000010010100010101000010000000110011, /* (W) (8|M24) grf<1>:f :f :f :f */ + 0b0000010010000010101000000000000110011, /* (8|M24) arf<1>:f :f :f :f */ + 0b0000010010000010101000000000000100011, /* (8|M16) arf<1>:f :f :f :f */ + 0b0000000100111110011000000000000000011, /* dpas.8x* (8|M0) grf<1>:d :d :ub :b */ + 0b0000000000111110011000100000000000011, /* dpas.8x* (8|M0) grf<1>:d :d :ub :ub {Atomic} */ + 0b0000100100111110011000100000000000011, /* dpas.8x* (8|M0) grf<1>:d :d :b :b {Atomic} */ + 0b0000100000111110011000100000000000011, /* dpas.8x* (8|M0) grf<1>:d :d :b :ub {Atomic} */ + 0b0000100100111110011000000000000000011, /* dpas.8x* (8|M0) grf<1>:d :d :b :b */ + 0b0000000000111110011000000000000000011, /* dpas.8x* (8|M0) grf<1>:d :d :ub :ub */ + 0b0000000100111110011000100000000000011, /* dpas.8x* (8|M0) grf<1>:d :d :ub :b {Atomic} */ + 0b0000100000111110011000000000000000011, /* dpas.8x* (8|M0) grf<1>:d :d :b :ub */ + 0b0000101101111010101000100000000000011, /* dpas.8x* (8|M0) grf<1>:f :f :bf :bf {Atomic} */ + 0b0000101101111010101000000000000000011, /* dpas.8x* (8|M0) grf<1>:f :f :bf :bf */ +}; + +static const uint64_t xe2_3src_control_index_table[16] = { + 0b0000010010100010101000000000000100, /* (16|M0) grf<1>:f :f :f :f */ + 0b0000010010000010101000000000000100, /* (16|M0) arf<1>:f :f :f :f */ + 0b0000010010100010101000100000000100, /* (W)(16|M0) grf<1>:f :f :f :f */ + 0b0000010010000010101000100000000100, /* (W)(16|M0) arf<1>:f :f :f :f */ + 0b0000011011100011101100000000000100, /* (16|M0) grf<1>:df :df :df :df */ + 0b0000011011100011101100000010000100, /* (16|M16) grf<1>:df :df :df :df */ + 0b0000011011000011101100000000000100, /* (16|M0) arf<1>:df :df :df :df */ + 0b0000010010100010101000000000000101, /* (32|M0) grf<1>:f :f :f :f */ + 0b0000010010000010101000000000000101, /* (32|M0) arf<1>:f :f :f :f */ + 0b0000010010000010101010000000000100, /* (16|M0) (sat)arf<1>:f :f :f :f */ + 0b0000010010100010101010000000000100, /* (16|M0) (sat)grf<1>:f :f :f :f */ + 0b0000011011000011101100000010000100, /* (16|M16) arf<1>:df :df :df :df */ + 0b0000010010100010101000100000000000, /* (W)(1|M0) grf<1>:f :f :f :f */ + 0b0000010010100010001000000000000100, /* (16|M0) grf<1>:ud :ud :ud :ud */ + 0b0000110110100110011000000000000101, /* (32|M0) grf<1>:d :d :d :d */ + 0b0000011011000011101100000000000011, /* (8|M0) arf<1>:df :df :df :df */ +}; + +static const uint64_t xe2_3src_dpas_control_index_table[16] = { + 0b0000000000111110011001000000000100, /* dpas.8x* (16|M0) grf:d :d :ub :ub Atomic */ + 0b0000000100111110011001000000000100, /* dpas.8x* (16|M0) grf:d :d :ub :b Atomic */ + 0b0000100000111110011001000000000100, /* dpas.8x* (16|M0) grf:d :d :b :ub Atomic */ + 0b0000100100111110011001000000000100, /* dpas.8x* (16|M0) grf:d :d :b :b Atomic */ + 0b0000000000111110011000000000000100, /* dpas.8x* (16|M0) grf:d :d :ub :ub */ + 0b0000100100111110011000000000000100, /* dpas.8x* (16|M0) grf:d :d :b :b */ + 0b0000101101111010101001000000000100, /* dpas.8x* (16|M0) grf:f :f :bf :bf Atomic */ + 0b0000101101111101101001000000000100, /* dpas.8x* (16|M0) grf:f :bf :bf :bf Atomic */ + 0b0000101101111010110101000000000100, /* dpas.8x* (16|M0) grf:bf :f :bf :bf Atomic */ + 0b0000101101111101110101000000000100, /* dpas.8x* (16|M0) grf:bf :bf :bf :bf Atomic */ + 0b0000101101111010101000000000000100, /* dpas.8x* (16|M0) grf:f :f :bf :bf */ + 0b0000001001111010101001000000000100, /* dpas.8x* (16|M0) grf:f :f :hf :hf Atomic */ + 0b0000001001111001101001000000000100, /* dpas.8x* (16|M0) grf:f :hf :hf :hf Atomic */ + 0b0000001001111010100101000000000100, /* dpas.8x* (16|M0) grf:hf :f :hf :hf Atomic */ + 0b0000001001111001100101000000000100, /* dpas.8x* (16|M0) grf:hf :hf :hf :hf Atomic */ + 0b0000001001111010101000000000000100, /* dpas.8x* (16|M0) grf:f :f :hf :hf */ +}; + +static const uint32_t gfx12_3src_source_index_table[32] = { + 0b100101100001100000000, /* grf<0;0> grf<8;1> grf<0> */ + 0b100101100001001000010, /* arf<4;1> grf<8;1> grf<0> */ + 0b101101100001101000011, /* grf<8;1> grf<8;1> grf<1> */ + 0b100101100001101000011, /* grf<8;1> grf<8;1> grf<0> */ + 0b101100000000101000011, /* grf<8;1> grf<0;0> grf<1> */ + 0b101101100001101001011, /* -grf<8;1> grf<8;1> grf<1> */ + 0b101001100001101000011, /* grf<8;1> arf<8;1> grf<1> */ + 0b100001100001100000000, /* grf<0;0> arf<8;1> grf<0> */ + 0b101101100001100000000, /* grf<0;0> grf<8;1> grf<1> */ + 0b101101100101101000011, /* grf<8;1> grf<8;1> -grf<1> */ + 0b101101110001101000011, /* grf<8;1> -grf<8;1> grf<1> */ + 0b101100000000100000000, /* grf<0;0> grf<0;0> grf<1> */ + 0b100001100001101000011, /* grf<8;1> arf<8;1> grf<0> */ + 0b100101110001100000000, /* grf<0;0> -grf<8;1> grf<0> */ + 0b100101110001101000011, /* grf<8;1> -grf<8;1> grf<0> */ + 0b100101100001101001011, /* -grf<8;1> grf<8;1> grf<0> */ + 0b100100000000101000011, /* grf<8;1> grf<0;0> grf<0> */ + 0b100101100001100001000, /* -grf<0;0> grf<8;1> grf<0> */ + 0b100100000000100000000, /* grf<0;0> grf<0;0> grf<0> */ + 0b101101110001100000000, /* grf<0;0> -grf<8;1> grf<1> */ + 0b100101100101100000000, /* grf<0;0> grf<8;1> -grf<0> */ + 0b101001100001100000000, /* grf<0;0> arf<8;1> grf<1> */ + 0b100101100101101000011, /* grf<8;1> grf<8;1> -grf<0> */ + 0b101101100101101001011, /* -grf<8;1> grf<8;1> -grf<1> */ + 0b101001100001101001011, /* -grf<8;1> arf<8;1> grf<1> */ + 0b101101110001101001011, /* -grf<8;1> -grf<8;1> grf<1> */ + 0b101100010000101000011, /* grf<8;1> -grf<0;0> grf<1> */ + 0b101100000100101000011, /* grf<8;1> grf<0;0> -grf<1> */ + 0b101101100001100001000, /* -grf<0;0> grf<8;1> grf<1> */ + 0b101101100101100000000, /* grf<0;0> grf<8;1> -grf<1> */ + 0b100100000100101000011, /* grf<8;1> grf<0;0> -grf<0> */ + 0b101001100101101000011, /* grf<8;1> arf<8;1> -grf<1> */ +}; + +static const uint32_t xehp_3src_source_index_table[32] = { + 0b100100000001100000000, /* grf<0;0> grf<1;0> grf<0> */ + 0b100100000001000000001, /* arf<1;0> grf<1;0> grf<0> */ + 0b101100000001100000001, /* grf<1;0> grf<1;0> grf<1> */ + 0b100100000001100000001, /* grf<1;0> grf<1;0> grf<0> */ + 0b101100000000100000001, /* grf<1;0> grf<0;0> grf<1> */ + 0b101100000001100001001, /* -grf<1;0> grf<1;0> grf<1> */ + 0b101000000001100000001, /* grf<1;0> arf<1;0> grf<1> */ + 0b101100000001100000000, /* grf<0;0> grf<1;0> grf<1> */ + 0b100000000001100000000, /* grf<0;0> arf<1;0> grf<0> */ + 0b101100000101100000001, /* grf<1;0> grf<1;0> -grf<1> */ + 0b101100010001100000001, /* grf<1;0> -grf<1;0> grf<1> */ + 0b101100000000100000000, /* grf<0;0> grf<0;0> grf<1> */ + 0b100000000001100000001, /* grf<1;0> arf<1;0> grf<0> */ + 0b100100010001100000000, /* grf<0;0> -grf<1;0> grf<0> */ + 0b100100010001100000001, /* grf<1;0> -grf<1;0> grf<0> */ + 0b100100000001100001001, /* -grf<1;0> grf<1;0> grf<0> */ + 0b100100000000100000001, /* grf<1;0> grf<0;0> grf<0> */ + 0b100100000001100001000, /* -grf<0;0> grf<1;0> grf<0> */ + 0b100100000000100000000, /* grf<0;0> grf<0;0> grf<0> + * dpas.*x1 grf:d grf:[ub,b] grf:[ub,b] + * dpas.*x1 grf:f grf:bf grf:bf + */ + 0b101100010001100000000, /* grf<0;0> -grf<1;0> grf<1> */ + 0b100100000101100000000, /* grf<0;0> grf<1;0> -grf<0> */ + 0b101000000001100000000, /* grf<0;0> arf<1;0> grf<1> */ + 0b100100000101100000001, /* grf<1;0> grf<1;0> -grf<0> */ + 0b101100000101100001001, /* -grf<1;0> grf<1;0> -grf<1> */ + 0b100100010000100000000, /* dpas.*x1 grf:d grf:[u2,s2] grf:[ub,b] */ + 0b100100000100100000000, /* dpas.*x1 grf:d grf:[ub,b] grf:[u2,s2] */ + 0b100100010100100000000, /* dpas.*x1 grf:d grf:[u2,s2] grf:[u2,s2] */ + 0b100100001000100000000, /* dpas.*x1 grf:d grf:[u4,s4] grf:[ub,b] */ + 0b100100001100100000000, /* dpas.*x1 grf:d grf:[u4,s4] grf:[u2,s2] */ + 0b100100000010100000000, /* dpas.*x1 grf:d grf:[ub,b] grf:[u4,s4] */ + 0b100100001010100000000, /* dpas.*x1 grf:d grf:[u4,s4] grf:[u4,s4] */ + 0b100100010010100000000, /* dpas.*x1 grf:d grf:[u2,s2] grf:[u4,s4] */ +}; + +static const uint32_t xe2_3src_source_index_table[16] = { + 0b101100000001100000001, /* grf<1;0> grf<1;0> grf<1> */ + 0b101100000001000000001, /* arf<1;0> grf<1;0> grf<1> */ + 0b100100000001100000000, /* grf<0;0> grf<1;0> grf<0> */ + 0b100100000001000000001, /* arf<1;0> grf<1;0> grf<0> */ + 0b100100000001100000001, /* grf<1;0> grf<1;0> grf<0> */ + 0b100000000001100000000, /* grf<0;0> arf<1;0> grf<0> */ + 0b100000000001100000001, /* grf<1;0> arf<1;0> grf<0> */ + 0b101100000101100000001, /* grf<1;0> grf<1;0> -grf<1> */ + 0b101000000001100000001, /* grf<1;0> arf<1;0> grf<1> */ + 0b101000000001000000001, /* arf<1;0> arf<1;0> grf<1> */ + 0b100000000001000000001, /* arf<1;0> arf<1;0> grf<0> */ + 0b100100000000100000000, /* grf<0;0> grf<0;0> grf<0> */ + 0b100100000000100000001, /* grf<1;0> grf<0;0> grf<0> */ + 0b101100000101000000001, /* arf<1;0> grf<1;0> -grf<1> */ + 0b100100010001100000001, /* grf<1;0> -grf<1;0> grf<0> */ + 0b100100010001000000001, /* arf<1;0> -grf<1;0> grf<0> */ +}; + +static const uint32_t xe2_3src_dpas_source_index_table[16] = { + 0b100100000000100000000, /* dpas.*x1 grf:d grf:[ub,b] grf:[ub,b] + * dpas.*x1 grf:[f,bf] grf:bf grf:bf + * dpas.*x1 grf:[f,hf] grf:hf grf:hf + */ + 0b100100000010100000000, /* dpas.*x1 grf:d grf:[ub,b] grf:[u4,s4] */ + 0b100100000100100000000, /* dpas.*x1 grf:d grf:[ub,b] grf:[u2,s2] */ + 0b100100001000100000000, /* dpas.*x1 grf:d grf:[u4,s4] grf:[ub,b] */ + 0b100100001010100000000, /* dpas.*x1 grf:d grf:[u4,s4] grf:[u4,s4] */ + 0b100100001100100000000, /* dpas.*x1 grf:d grf:[u4,s4] grf:[u2,s2] */ + 0b100100010000100000000, /* dpas.*x1 grf:d grf:[u2,s2] grf:[ub,b] */ + 0b100100010010100000000, /* dpas.*x1 grf:d grf:[u2,s2] grf:[u4,s4] */ + 0b100100010100100000000, /* dpas.*x1 grf:d grf:[u2,s2] grf:[u2,s2] */ + 0b100100000000100000010, /* dpas.*x2 grf:d grf:[ub,b] grf:[ub,b] */ + 0b100100000010100000010, /* dpas.*x2 grf:d grf:[ub,b] grf:[u4,s4] */ + 0b100100001000100000010, /* dpas.*x2 grf:d grf:[u4,s4] grf:[ub,b] */ + 0b100100001010100000010, /* dpas.*x2 grf:d grf:[u4,s4] grf:[u4,s4] */ + 0b100100010100100000010, /* dpas.*x2 grf:d grf:[u2,s2] grf:[u2,s2] */ + 0b100100000000100001110, /* dpas.*x8 grf:d grf:[ub,b] grf:[ub,b] */ + 0b100100001010100001110, /* dpas.*x8 grf:d grf:[u4,s4] grf:[u4,s4] */ +}; + +static const uint32_t gfx12_3src_subreg_table[32] = { + 0b00000000000000000000, /* .0 .0 .0 .0 */ + 0b00100000000000000000, /* .0 .0 .0 .4 */ + 0b00000000000110000000, /* .0 .12 .0 .0 */ + 0b10100000000000000000, /* .0 .0 .0 .20 */ + 0b10000000001110000000, /* .0 .28 .0 .16 */ + 0b01100000000000000000, /* .0 .0 .0 .12 */ + 0b01000000000000000000, /* .0 .0 .0 .8 */ + 0b00000010000000000000, /* .0 .0 .8 .0 */ + 0b00000001000000000000, /* .0 .0 .4 .0 */ + 0b11000000000000000000, /* .0 .0 .0 .24 */ + 0b10000000000000000000, /* .0 .0 .0 .16 */ + 0b11100000000000000000, /* .0 .0 .0 .28 */ + 0b00000110000000000000, /* .0 .0 .24 .0 */ + 0b00000000000010000000, /* .0 .4 .0 .0 */ + 0b00000100000000000000, /* .0 .0 .16 .0 */ + 0b00000011000000000000, /* .0 .0 .12 .0 */ + 0b00000101000000000000, /* .0 .0 .20 .0 */ + 0b00000111000000000000, /* .0 .0 .28 .0 */ + 0b00000000000100000000, /* .0 .8 .0 .0 */ + 0b00000000001000000000, /* .0 .16 .0 .0 */ + 0b00000000001100000000, /* .0 .24 .0 .0 */ + 0b00000000001010000000, /* .0 .20 .0 .0 */ + 0b00000000001110000000, /* .0 .28 .0 .0 */ + 0b11000000001110000000, /* .0 .28 .0 .24 */ + 0b00100000000100000000, /* .0 .8 .0 .4 */ + 0b00100000000110000000, /* .0 .12 .0 .4 */ + 0b01000000000110000000, /* .0 .12 .0 .8 */ + 0b10000000001100000000, /* .0 .24 .0 .16 */ + 0b10000000001010000000, /* .0 .20 .0 .16 */ + 0b01100000000010000000, /* .0 .4 .0 .12 */ + 0b10100000001110000000, /* .0 .28 .0 .20 */ + 0b01000000000010000000, /* .0 .4 .0 .8 */ +}; + +static const uint32_t xe2_3src_subreg_table[32] = { + 0b00000000000000000000, /* .0 .0 .0 .0 */ + 0b00100000000000000000, /* .0 .0 .0 .8 */ + 0b10000000000000000000, /* .0 .0 .0 .32 */ + 0b00010000000000000000, /* .0 .0 .0 .4 */ + 0b11100000000000000000, /* .0 .0 .0 .56 */ + 0b01010000000000000000, /* .0 .0 .0 .20 */ + 0b10110000000000000000, /* .0 .0 .0 .44 */ + 0b01000000000011000000, /* .0 .12 .0 .16 */ + 0b01100000000000000000, /* .0 .0 .0 .24 */ + 0b10100000000000000000, /* .0 .0 .0 .40 */ + 0b11000000000000000000, /* .0 .0 .0 .48 */ + 0b01000000000000000000, /* .0 .0 .0 .16 */ + 0b01110000000110000000, /* .0 .24 .0 .28 */ + 0b10100000001001000000, /* .0 .36 .0 .40 */ + 0b11010000001100000000, /* .0 .48 .0 .52 */ + 0b01110000000000000000, /* .0 .0 .0 .28 */ + 0b11110000000000000000, /* .0 .0 .0 .60 */ + 0b10010000000000000000, /* .0 .0 .0 .36 */ + 0b00110000000000000000, /* .0 .0 .0 .12 */ + 0b00100000000010000000, /* .0 .8 .0 .8 */ + 0b00010000000001000000, /* .0 .4 .0 .4 */ + 0b00110000000011000000, /* .0 .12 .0 .12 */ + 0b11010000000000000000, /* .0 .0 .0 .52 */ + 0b00000000000001000000, /* .0 .4 .0 .0 */ + 0b00000101100000000000, /* .0 .0 .44 .0 */ + 0b00000100000000000000, /* .0 .0 .32 .0 */ + 0b00000000000010000000, /* .0 .8 .0 .0 */ + 0b00000000001100000000, /* .0 .48 .0 .0 */ + 0b00000000001101000000, /* .0 .52 .0 .0 */ + 0b00000110100000000000, /* .0 .0 .52 .0 */ + 0b00000000001000000000, /* .0 .32 .0 .0 */ + 0b00000000001111000000, /* .0 .60 .0 .0 */ +}; + +typedef struct compact_table_info { + uint64_t + read(unsigned index) const + { + assert(index < length); + switch (element_size) { + case sizeof(uint64_t): + return ((uint64_t*)ptr)[index]; + case sizeof(uint32_t): + return ((uint32_t*)ptr)[index]; + case sizeof(uint16_t): + return ((uint16_t*)ptr)[index]; + case sizeof(uint8_t): + return ((uint8_t*)ptr)[index]; + default: + UNREACHABLE("Unsupported size in compact_table_info::read()"); + return UINT64_MAX; + } + } + + const void *ptr; + uint32_t length; + uint8_t element_size; +} compact_table_info; + +struct compact_tables { + struct compact_table_info control; + struct compact_table_info datatype; + struct compact_table_info subreg; + struct compact_table_info src0; + struct compact_table_info src1; + struct compact_table_info control_3src; + struct compact_table_info control_dpas_3src; + struct compact_table_info source_3src; + struct compact_table_info source_dpas_3src; + struct compact_table_info subreg_3src; +}; + +#define declare_tables(NAME, INIT) \ + static constexpr struct compact_tables NAME = []() { \ + struct compact_tables tables = {}; \ + INIT \ + return tables; \ + }() + +#define set_table(FIELD, TABLE) { \ + tables.FIELD.ptr = TABLE; \ + tables.FIELD.length = ARRAY_SIZE(TABLE); \ + tables.FIELD.element_size = sizeof(TABLE[0]); \ + } + +declare_tables(gen9_tables, { + set_table(control, gfx8_control_index_table); + set_table(datatype, gfx8_datatype_table); + set_table(subreg, gfx8_subreg_table); + set_table(src0, gfx8_src_index_table); + set_table(src1, gfx8_src_index_table); + + set_table(control_3src, gfx8_3src_control_index_table); + set_table(source_3src, gfx8_3src_source_index_table); + return tables; +}); + +declare_tables(gen11_tables, { + tables = gen9_tables; + set_table(datatype, gfx11_datatype_table); +}); + +declare_tables(gen12_tables, { + set_table(control, gfx12_control_index_table); + set_table(datatype, gfx12_datatype_table); + set_table(subreg, gfx12_subreg_table); + set_table(src0, gfx12_src0_index_table); + set_table(src1, gfx12_src1_index_table); + set_table(control_3src, gfx12_3src_control_index_table); + set_table(source_3src, gfx12_3src_source_index_table); + set_table(subreg_3src, gfx12_3src_subreg_table); +}); + +declare_tables(genx125_tables, { + tables = gen12_tables; + set_table(src0, xehp_src0_index_table); + set_table(src1, xehp_src1_index_table); + set_table(control_3src, xehp_3src_control_index_table); + set_table(source_3src, xehp_3src_source_index_table); +}); + +declare_tables(xe2_tables, { + set_table(control, xe2_control_index_table); + set_table(datatype, xe2_datatype_table); + set_table(subreg, xe2_subreg_table); + set_table(src0, xe2_src0_index_table); + set_table(src1, xe2_src1_index_table); + set_table(control_3src, xe2_3src_control_index_table); + set_table(control_dpas_3src, xe2_3src_dpas_control_index_table); + set_table(source_3src, xe2_3src_source_index_table); + set_table(source_dpas_3src, xe2_3src_dpas_source_index_table); + set_table(subreg_3src, xe2_3src_subreg_table); +}); + +#undef declare_tables +#undef set_table + +static constexpr struct compact_tables empty_tables = {}; + +static const struct compact_tables& +get_compact_tables(const struct intel_device_info *devinfo) +{ + switch (devinfo->verx10) { + case 90: + return gen9_tables; + + case 110: + return gen11_tables; + + case 120: + return gen12_tables; + + case 125: + return genx125_tables; + + case 200: + case 300: + return xe2_tables; + + default: + UNREACHABLE("Unknown platform in get_compact_tables()"); + return empty_tables; + } +} diff --git a/src/intel/compiler/gen/meson.build b/src/intel/compiler/gen/meson.build index fd937939cf2..5d62680dd3c 100644 --- a/src/intel/compiler/gen/meson.build +++ b/src/intel/compiler/gen/meson.build @@ -12,6 +12,7 @@ libintel_compiler_gen_files = files( 'gen_private.h', 'gen_names.c', + 'gen_compact.cpp', 'gen_control_flow.cpp', 'gen_parse.cpp', 'gen_print.cpp',