1b8e80941Smrg/* 2b8e80941Smrg * Copyright © 2014 Intel Corporation 3b8e80941Smrg * 4b8e80941Smrg * Permission is hereby granted, free of charge, to any person obtaining a 5b8e80941Smrg * copy of this software and associated documentation files (the "Software"), 6b8e80941Smrg * to deal in the Software without restriction, including without limitation 7b8e80941Smrg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8b8e80941Smrg * and/or sell copies of the Software, and to permit persons to whom the 9b8e80941Smrg * Software is furnished to do so, subject to the following conditions: 10b8e80941Smrg * 11b8e80941Smrg * The above copyright notice and this permission notice (including the next 12b8e80941Smrg * paragraph) shall be included in all copies or substantial portions of the 13b8e80941Smrg * Software. 14b8e80941Smrg * 15b8e80941Smrg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16b8e80941Smrg * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17b8e80941Smrg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18b8e80941Smrg * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19b8e80941Smrg * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20b8e80941Smrg * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21b8e80941Smrg * IN THE SOFTWARE. 22b8e80941Smrg */ 23b8e80941Smrg 24b8e80941Smrg/** 25b8e80941Smrg * @file brw_inst.h 26b8e80941Smrg * 27b8e80941Smrg * A representation of i965 EU assembly instructions, with helper methods to 28b8e80941Smrg * get and set various fields. This is the actual hardware format. 29b8e80941Smrg */ 30b8e80941Smrg 31b8e80941Smrg#ifndef BRW_INST_H 32b8e80941Smrg#define BRW_INST_H 33b8e80941Smrg 34b8e80941Smrg#include <assert.h> 35b8e80941Smrg#include <stdint.h> 36b8e80941Smrg 37b8e80941Smrg#include "brw_eu_defines.h" 38b8e80941Smrg#include "brw_reg_type.h" 39b8e80941Smrg#include "dev/gen_device_info.h" 40b8e80941Smrg 41b8e80941Smrg#ifdef __cplusplus 42b8e80941Smrgextern "C" { 43b8e80941Smrg#endif 44b8e80941Smrg 45b8e80941Smrg/* brw_context.h has a forward declaration of brw_inst, so name the struct. */ 46b8e80941Smrgtypedef struct brw_inst { 47b8e80941Smrg uint64_t data[2]; 48b8e80941Smrg} brw_inst; 49b8e80941Smrg 50b8e80941Smrgstatic inline uint64_t brw_inst_bits(const brw_inst *inst, 51b8e80941Smrg unsigned high, unsigned low); 52b8e80941Smrgstatic inline void brw_inst_set_bits(brw_inst *inst, 53b8e80941Smrg unsigned high, unsigned low, 54b8e80941Smrg uint64_t value); 55b8e80941Smrg 56b8e80941Smrg#define FC(name, high, low, assertions) \ 57b8e80941Smrgstatic inline void \ 58b8e80941Smrgbrw_inst_set_##name(const struct gen_device_info *devinfo, \ 59b8e80941Smrg brw_inst *inst, uint64_t v) \ 60b8e80941Smrg{ \ 61b8e80941Smrg assert(assertions); \ 62b8e80941Smrg (void) devinfo; \ 63b8e80941Smrg brw_inst_set_bits(inst, high, low, v); \ 64b8e80941Smrg} \ 65b8e80941Smrgstatic inline uint64_t \ 66b8e80941Smrgbrw_inst_##name(const struct gen_device_info *devinfo, \ 67b8e80941Smrg const brw_inst *inst) \ 68b8e80941Smrg{ \ 69b8e80941Smrg assert(assertions); \ 70b8e80941Smrg (void) devinfo; \ 71b8e80941Smrg return brw_inst_bits(inst, high, low); \ 72b8e80941Smrg} 73b8e80941Smrg 74b8e80941Smrg/* A simple macro for fields which stay in the same place on all generations. */ 75b8e80941Smrg#define F(name, high, low) FC(name, high, low, true) 76b8e80941Smrg 77b8e80941Smrg#define BOUNDS(hi4, lo4, hi45, lo45, hi5, lo5, hi6, lo6, hi7, lo7, hi8, lo8) \ 78b8e80941Smrg unsigned high, low; \ 79b8e80941Smrg if (devinfo->gen >= 8) { \ 80b8e80941Smrg high = hi8; low = lo8; \ 81b8e80941Smrg } else if (devinfo->gen >= 7) { \ 82b8e80941Smrg high = hi7; low = lo7; \ 83b8e80941Smrg } else if (devinfo->gen >= 6) { \ 84b8e80941Smrg high = hi6; low = lo6; \ 85b8e80941Smrg } else if (devinfo->gen >= 5) { \ 86b8e80941Smrg high = hi5; low = lo5; \ 87b8e80941Smrg } else if (devinfo->is_g4x) { \ 88b8e80941Smrg high = hi45; low = lo45; \ 89b8e80941Smrg } else { \ 90b8e80941Smrg high = hi4; low = lo4; \ 91b8e80941Smrg } \ 92b8e80941Smrg assert(((int) high) != -1 && ((int) low) != -1); 93b8e80941Smrg 94b8e80941Smrg/* A general macro for cases where the field has moved to several different 95b8e80941Smrg * bit locations across generations. GCC appears to combine cases where the 96b8e80941Smrg * bits are identical, removing some of the inefficiency. 97b8e80941Smrg */ 98b8e80941Smrg#define FF(name, hi4, lo4, hi45, lo45, hi5, lo5, hi6, lo6, hi7, lo7, hi8, lo8)\ 99b8e80941Smrgstatic inline void \ 100b8e80941Smrgbrw_inst_set_##name(const struct gen_device_info *devinfo, \ 101b8e80941Smrg brw_inst *inst, uint64_t value) \ 102b8e80941Smrg{ \ 103b8e80941Smrg BOUNDS(hi4, lo4, hi45, lo45, hi5, lo5, hi6, lo6, hi7, lo7, hi8, lo8) \ 104b8e80941Smrg brw_inst_set_bits(inst, high, low, value); \ 105b8e80941Smrg} \ 106b8e80941Smrgstatic inline uint64_t \ 107b8e80941Smrgbrw_inst_##name(const struct gen_device_info *devinfo, const brw_inst *inst) \ 108b8e80941Smrg{ \ 109b8e80941Smrg BOUNDS(hi4, lo4, hi45, lo45, hi5, lo5, hi6, lo6, hi7, lo7, hi8, lo8) \ 110b8e80941Smrg return brw_inst_bits(inst, high, low); \ 111b8e80941Smrg} 112b8e80941Smrg 113b8e80941Smrg/* A macro for fields which moved as of Gen8+. */ 114b8e80941Smrg#define F8(name, gen4_high, gen4_low, gen8_high, gen8_low) \ 115b8e80941SmrgFF(name, \ 116b8e80941Smrg /* 4: */ gen4_high, gen4_low, \ 117b8e80941Smrg /* 4.5: */ gen4_high, gen4_low, \ 118b8e80941Smrg /* 5: */ gen4_high, gen4_low, \ 119b8e80941Smrg /* 6: */ gen4_high, gen4_low, \ 120b8e80941Smrg /* 7: */ gen4_high, gen4_low, \ 121b8e80941Smrg /* 8: */ gen8_high, gen8_low); 122b8e80941Smrg 123b8e80941SmrgF(src1_vstride, 120, 117) 124b8e80941SmrgF(src1_width, 116, 114) 125b8e80941SmrgF(src1_da16_swiz_w, 115, 114) 126b8e80941SmrgF(src1_da16_swiz_z, 113, 112) 127b8e80941SmrgF(src1_hstride, 113, 112) 128b8e80941SmrgF(src1_address_mode, 111, 111) 129b8e80941Smrg/** Src1.SrcMod @{ */ 130b8e80941SmrgF(src1_negate, 110, 110) 131b8e80941SmrgF(src1_abs, 109, 109) 132b8e80941Smrg/** @} */ 133b8e80941SmrgF8(src1_ia_subreg_nr, /* 4+ */ 108, 106, /* 8+ */ 108, 105) 134b8e80941SmrgF(src1_da_reg_nr, 108, 101) 135b8e80941SmrgF(src1_da16_subreg_nr, 100, 100) 136b8e80941SmrgF(src1_da1_subreg_nr, 100, 96) 137b8e80941SmrgF(src1_da16_swiz_y, 99, 98) 138b8e80941SmrgF(src1_da16_swiz_x, 97, 96) 139b8e80941SmrgF8(src1_reg_hw_type, /* 4+ */ 46, 44, /* 8+ */ 94, 91) 140b8e80941SmrgF8(src1_reg_file, /* 4+ */ 43, 42, /* 8+ */ 90, 89) 141b8e80941SmrgF(src0_vstride, 88, 85) 142b8e80941SmrgF(src0_width, 84, 82) 143b8e80941SmrgF(src0_da16_swiz_w, 83, 82) 144b8e80941SmrgF(src0_da16_swiz_z, 81, 80) 145b8e80941SmrgF(src0_hstride, 81, 80) 146b8e80941SmrgF(src0_address_mode, 79, 79) 147b8e80941Smrg/** Src0.SrcMod @{ */ 148b8e80941SmrgF(src0_negate, 78, 78) 149b8e80941SmrgF(src0_abs, 77, 77) 150b8e80941Smrg/** @} */ 151b8e80941SmrgF8(src0_ia_subreg_nr, /* 4+ */ 76, 74, /* 8+ */ 76, 73) 152b8e80941SmrgF(src0_da_reg_nr, 76, 69) 153b8e80941SmrgF(src0_da16_subreg_nr, 68, 68) 154b8e80941SmrgF(src0_da1_subreg_nr, 68, 64) 155b8e80941SmrgF(src0_da16_swiz_y, 67, 66) 156b8e80941SmrgF(src0_da16_swiz_x, 65, 64) 157b8e80941SmrgF(dst_address_mode, 63, 63) 158b8e80941SmrgF(dst_hstride, 62, 61) 159b8e80941SmrgF8(dst_ia_subreg_nr, /* 4+ */ 60, 58, /* 8+ */ 60, 57) 160b8e80941SmrgF(dst_da_reg_nr, 60, 53) 161b8e80941SmrgF(dst_da16_subreg_nr, 52, 52) 162b8e80941SmrgF(dst_da1_subreg_nr, 52, 48) 163b8e80941SmrgF(da16_writemask, 51, 48) /* Dst.ChanEn */ 164b8e80941SmrgF8(src0_reg_hw_type, /* 4+ */ 41, 39, /* 8+ */ 46, 43) 165b8e80941SmrgF8(src0_reg_file, /* 4+ */ 38, 37, /* 8+ */ 42, 41) 166b8e80941SmrgF8(dst_reg_hw_type, /* 4+ */ 36, 34, /* 8+ */ 40, 37) 167b8e80941SmrgF8(dst_reg_file, /* 4+ */ 33, 32, /* 8+ */ 36, 35) 168b8e80941SmrgF8(mask_control, /* 4+ */ 9, 9, /* 8+ */ 34, 34) 169b8e80941SmrgFF(flag_reg_nr, 170b8e80941Smrg /* 4-6: doesn't exist */ -1, -1, -1, -1, -1, -1, -1, -1, 171b8e80941Smrg /* 7: */ 90, 90, 172b8e80941Smrg /* 8: */ 33, 33) 173b8e80941SmrgF8(flag_subreg_nr, /* 4+ */ 89, 89, /* 8+ */ 32, 32) 174b8e80941SmrgF(saturate, 31, 31) 175b8e80941SmrgF(debug_control, 30, 30) 176b8e80941SmrgF(cmpt_control, 29, 29) 177b8e80941SmrgFC(branch_control, 28, 28, devinfo->gen >= 8) 178b8e80941SmrgFC(acc_wr_control, 28, 28, devinfo->gen >= 6) 179b8e80941SmrgFC(mask_control_ex, 28, 28, devinfo->is_g4x || devinfo->gen == 5) 180b8e80941SmrgF(cond_modifier, 27, 24) 181b8e80941SmrgFC(math_function, 27, 24, devinfo->gen >= 6) 182b8e80941SmrgF(exec_size, 23, 21) 183b8e80941SmrgF(pred_inv, 20, 20) 184b8e80941SmrgF(pred_control, 19, 16) 185b8e80941SmrgF(thread_control, 15, 14) 186b8e80941SmrgF(qtr_control, 13, 12) 187b8e80941SmrgFF(nib_control, 188b8e80941Smrg /* 4-6: doesn't exist */ -1, -1, -1, -1, -1, -1, -1, -1, 189b8e80941Smrg /* 7: */ 47, 47, 190b8e80941Smrg /* 8: */ 11, 11) 191b8e80941SmrgF8(no_dd_check, /* 4+ */ 11, 11, /* 8+ */ 10, 10) 192b8e80941SmrgF8(no_dd_clear, /* 4+ */ 10, 10, /* 8+ */ 9, 9) 193b8e80941SmrgF(access_mode, 8, 8) 194b8e80941Smrg/* Bit 7 is Reserved (for future Opcode expansion) */ 195b8e80941SmrgF(opcode, 6, 0) 196b8e80941Smrg 197b8e80941Smrg/** 198b8e80941Smrg * Three-source instructions: 199b8e80941Smrg * @{ 200b8e80941Smrg */ 201b8e80941SmrgF(3src_src2_reg_nr, 125, 118) /* same in align1 */ 202b8e80941SmrgF(3src_a16_src2_subreg_nr, 117, 115) /* Extra discontiguous bit on CHV? */ 203b8e80941SmrgF(3src_a16_src2_swizzle, 114, 107) 204b8e80941SmrgF(3src_a16_src2_rep_ctrl, 106, 106) 205b8e80941SmrgF(3src_src1_reg_nr, 104, 97) /* same in align1 */ 206b8e80941SmrgF(3src_a16_src1_subreg_nr, 96, 94) /* Extra discontiguous bit on CHV? */ 207b8e80941SmrgF(3src_a16_src1_swizzle, 93, 86) 208b8e80941SmrgF(3src_a16_src1_rep_ctrl, 85, 85) 209b8e80941SmrgF(3src_src0_reg_nr, 83, 76) /* same in align1 */ 210b8e80941SmrgF(3src_a16_src0_subreg_nr, 75, 73) /* Extra discontiguous bit on CHV? */ 211b8e80941SmrgF(3src_a16_src0_swizzle, 72, 65) 212b8e80941SmrgF(3src_a16_src0_rep_ctrl, 64, 64) 213b8e80941SmrgF(3src_dst_reg_nr, 63, 56) /* same in align1 */ 214b8e80941SmrgF(3src_a16_dst_subreg_nr, 55, 53) 215b8e80941SmrgF(3src_a16_dst_writemask, 52, 49) 216b8e80941SmrgF8(3src_a16_nib_ctrl, 47, 47, 11, 11) /* only exists on IVB+ */ 217b8e80941SmrgF8(3src_a16_dst_hw_type, 45, 44, 48, 46) /* only exists on IVB+ */ 218b8e80941SmrgF8(3src_a16_src_hw_type, 43, 42, 45, 43) 219b8e80941SmrgF8(3src_src2_negate, 41, 41, 42, 42) 220b8e80941SmrgF8(3src_src2_abs, 40, 40, 41, 41) 221b8e80941SmrgF8(3src_src1_negate, 39, 39, 40, 40) 222b8e80941SmrgF8(3src_src1_abs, 38, 38, 39, 39) 223b8e80941SmrgF8(3src_src0_negate, 37, 37, 38, 38) 224b8e80941SmrgF8(3src_src0_abs, 36, 36, 37, 37) 225b8e80941SmrgF8(3src_a16_src1_type, -1, -1, 36, 36) 226b8e80941SmrgF8(3src_a16_src2_type, -1, -1, 35, 35) 227b8e80941SmrgF8(3src_a16_flag_reg_nr, 34, 34, 33, 33) 228b8e80941SmrgF8(3src_a16_flag_subreg_nr, 33, 33, 32, 32) 229b8e80941SmrgFF(3src_a16_dst_reg_file, 230b8e80941Smrg /* 4-5: doesn't exist - no 3-source instructions */ -1, -1, -1, -1, -1, -1, 231b8e80941Smrg /* 6: */ 32, 32, 232b8e80941Smrg /* 7-8: doesn't exist - no MRFs */ -1, -1, -1, -1) 233b8e80941SmrgF(3src_saturate, 31, 31) 234b8e80941SmrgF(3src_debug_control, 30, 30) 235b8e80941SmrgF(3src_cmpt_control, 29, 29) 236b8e80941SmrgF(3src_acc_wr_control, 28, 28) 237b8e80941SmrgF(3src_cond_modifier, 27, 24) 238b8e80941SmrgF(3src_exec_size, 23, 21) 239b8e80941SmrgF(3src_pred_inv, 20, 20) 240b8e80941SmrgF(3src_pred_control, 19, 16) 241b8e80941SmrgF(3src_thread_control, 15, 14) 242b8e80941SmrgF(3src_qtr_control, 13, 12) 243b8e80941SmrgF8(3src_no_dd_check, 11, 11, 10, 10) 244b8e80941SmrgF8(3src_no_dd_clear, 10, 10, 9, 9) 245b8e80941SmrgF8(3src_mask_control, 9, 9, 34, 34) 246b8e80941SmrgF(3src_access_mode, 8, 8) 247b8e80941Smrg/* Bit 7 is Reserved (for future Opcode expansion) */ 248b8e80941SmrgF(3src_opcode, 6, 0) 249b8e80941Smrg/** @} */ 250b8e80941Smrg 251b8e80941Smrg#define REG_TYPE(reg) \ 252b8e80941Smrgstatic inline void \ 253b8e80941Smrgbrw_inst_set_3src_a16_##reg##_type(const struct gen_device_info *devinfo, \ 254b8e80941Smrg brw_inst *inst, enum brw_reg_type type) \ 255b8e80941Smrg{ \ 256b8e80941Smrg unsigned hw_type = brw_reg_type_to_a16_hw_3src_type(devinfo, type); \ 257b8e80941Smrg brw_inst_set_3src_a16_##reg##_hw_type(devinfo, inst, hw_type); \ 258b8e80941Smrg} \ 259b8e80941Smrg \ 260b8e80941Smrgstatic inline enum brw_reg_type \ 261b8e80941Smrgbrw_inst_3src_a16_##reg##_type(const struct gen_device_info *devinfo, \ 262b8e80941Smrg const brw_inst *inst) \ 263b8e80941Smrg{ \ 264b8e80941Smrg unsigned hw_type = brw_inst_3src_a16_##reg##_hw_type(devinfo, inst); \ 265b8e80941Smrg return brw_a16_hw_3src_type_to_reg_type(devinfo, hw_type); \ 266b8e80941Smrg} 267b8e80941Smrg 268b8e80941SmrgREG_TYPE(dst) 269b8e80941SmrgREG_TYPE(src) 270b8e80941Smrg#undef REG_TYPE 271b8e80941Smrg 272b8e80941Smrg/** 273b8e80941Smrg * Three-source align1 instructions: 274b8e80941Smrg * @{ 275b8e80941Smrg */ 276b8e80941Smrg/* Reserved 127:126 */ 277b8e80941Smrg/* src2_reg_nr same in align16 */ 278b8e80941SmrgFC(3src_a1_src2_subreg_nr, 117, 113, devinfo->gen >= 10) 279b8e80941SmrgFC(3src_a1_src2_hstride, 112, 111, devinfo->gen >= 10) 280b8e80941Smrg/* Reserved 110:109. src2 vstride is an implied parameter */ 281b8e80941SmrgFC(3src_a1_src2_hw_type, 108, 106, devinfo->gen >= 10) 282b8e80941Smrg/* Reserved 105 */ 283b8e80941Smrg/* src1_reg_nr same in align16 */ 284b8e80941SmrgFC(3src_a1_src1_subreg_nr, 96, 92, devinfo->gen >= 10) 285b8e80941SmrgFC(3src_a1_src1_hstride, 91, 90, devinfo->gen >= 10) 286b8e80941SmrgFC(3src_a1_src1_vstride, 89, 88, devinfo->gen >= 10) 287b8e80941SmrgFC(3src_a1_src1_hw_type, 87, 85, devinfo->gen >= 10) 288b8e80941Smrg/* Reserved 84 */ 289b8e80941Smrg/* src0_reg_nr same in align16 */ 290b8e80941SmrgFC(3src_a1_src0_subreg_nr, 75, 71, devinfo->gen >= 10) 291b8e80941SmrgFC(3src_a1_src0_hstride, 70, 69, devinfo->gen >= 10) 292b8e80941SmrgFC(3src_a1_src0_vstride, 68, 67, devinfo->gen >= 10) 293b8e80941SmrgFC(3src_a1_src0_hw_type, 66, 64, devinfo->gen >= 10) 294b8e80941Smrg/* dst_reg_nr same in align16 */ 295b8e80941SmrgFC(3src_a1_dst_subreg_nr, 55, 54, devinfo->gen >= 10) 296b8e80941SmrgFC(3src_a1_special_acc, 55, 52, devinfo->gen >= 10) /* aliases dst_subreg_nr */ 297b8e80941Smrg/* Reserved 51:50 */ 298b8e80941SmrgFC(3src_a1_dst_hstride, 49, 49, devinfo->gen >= 10) 299b8e80941SmrgFC(3src_a1_dst_hw_type, 48, 46, devinfo->gen >= 10) 300b8e80941SmrgFC(3src_a1_src2_reg_file, 45, 45, devinfo->gen >= 10) 301b8e80941SmrgFC(3src_a1_src1_reg_file, 44, 44, devinfo->gen >= 10) 302b8e80941SmrgFC(3src_a1_src0_reg_file, 43, 43, devinfo->gen >= 10) 303b8e80941Smrg/* Source Modifier fields same in align16 */ 304b8e80941SmrgFC(3src_a1_dst_reg_file, 36, 36, devinfo->gen >= 10) 305b8e80941SmrgFC(3src_a1_exec_type, 35, 35, devinfo->gen >= 10) 306b8e80941Smrg/* Fields below this same in align16 */ 307b8e80941Smrg/** @} */ 308b8e80941Smrg 309b8e80941Smrg#define REG_TYPE(reg) \ 310b8e80941Smrgstatic inline void \ 311b8e80941Smrgbrw_inst_set_3src_a1_##reg##_type(const struct gen_device_info *devinfo, \ 312b8e80941Smrg brw_inst *inst, enum brw_reg_type type) \ 313b8e80941Smrg{ \ 314b8e80941Smrg UNUSED enum gen10_align1_3src_exec_type exec_type = \ 315b8e80941Smrg (enum gen10_align1_3src_exec_type) brw_inst_3src_a1_exec_type(devinfo, \ 316b8e80941Smrg inst); \ 317b8e80941Smrg if (brw_reg_type_is_floating_point(type)) { \ 318b8e80941Smrg assert(exec_type == BRW_ALIGN1_3SRC_EXEC_TYPE_FLOAT); \ 319b8e80941Smrg } else { \ 320b8e80941Smrg assert(exec_type == BRW_ALIGN1_3SRC_EXEC_TYPE_INT); \ 321b8e80941Smrg } \ 322b8e80941Smrg unsigned hw_type = brw_reg_type_to_a1_hw_3src_type(devinfo, type); \ 323b8e80941Smrg brw_inst_set_3src_a1_##reg##_hw_type(devinfo, inst, hw_type); \ 324b8e80941Smrg} \ 325b8e80941Smrg \ 326b8e80941Smrgstatic inline enum brw_reg_type \ 327b8e80941Smrgbrw_inst_3src_a1_##reg##_type(const struct gen_device_info *devinfo, \ 328b8e80941Smrg const brw_inst *inst) \ 329b8e80941Smrg{ \ 330b8e80941Smrg enum gen10_align1_3src_exec_type exec_type = \ 331b8e80941Smrg (enum gen10_align1_3src_exec_type) brw_inst_3src_a1_exec_type(devinfo, \ 332b8e80941Smrg inst); \ 333b8e80941Smrg unsigned hw_type = brw_inst_3src_a1_##reg##_hw_type(devinfo, inst); \ 334b8e80941Smrg return brw_a1_hw_3src_type_to_reg_type(devinfo, hw_type, exec_type); \ 335b8e80941Smrg} 336b8e80941Smrg 337b8e80941SmrgREG_TYPE(dst) 338b8e80941SmrgREG_TYPE(src0) 339b8e80941SmrgREG_TYPE(src1) 340b8e80941SmrgREG_TYPE(src2) 341b8e80941Smrg#undef REG_TYPE 342b8e80941Smrg 343b8e80941Smrg/** 344b8e80941Smrg * Three-source align1 instruction immediates: 345b8e80941Smrg * @{ 346b8e80941Smrg */ 347b8e80941Smrgstatic inline uint16_t 348b8e80941Smrgbrw_inst_3src_a1_src0_imm(MAYBE_UNUSED const struct gen_device_info *devinfo, 349b8e80941Smrg const brw_inst *insn) 350b8e80941Smrg{ 351b8e80941Smrg assert(devinfo->gen >= 10); 352b8e80941Smrg return brw_inst_bits(insn, 82, 67); 353b8e80941Smrg} 354b8e80941Smrg 355b8e80941Smrgstatic inline uint16_t 356b8e80941Smrgbrw_inst_3src_a1_src2_imm(MAYBE_UNUSED const struct gen_device_info *devinfo, 357b8e80941Smrg const brw_inst *insn) 358b8e80941Smrg{ 359b8e80941Smrg assert(devinfo->gen >= 10); 360b8e80941Smrg return brw_inst_bits(insn, 124, 109); 361b8e80941Smrg} 362b8e80941Smrg 363b8e80941Smrgstatic inline void 364b8e80941Smrgbrw_inst_set_3src_a1_src0_imm(MAYBE_UNUSED const struct gen_device_info *devinfo, 365b8e80941Smrg brw_inst *insn, uint16_t value) 366b8e80941Smrg{ 367b8e80941Smrg assert(devinfo->gen >= 10); 368b8e80941Smrg brw_inst_set_bits(insn, 82, 67, value); 369b8e80941Smrg} 370b8e80941Smrg 371b8e80941Smrgstatic inline void 372b8e80941Smrgbrw_inst_set_3src_a1_src2_imm(MAYBE_UNUSED const struct gen_device_info *devinfo, 373b8e80941Smrg brw_inst *insn, uint16_t value) 374b8e80941Smrg{ 375b8e80941Smrg assert(devinfo->gen >= 10); 376b8e80941Smrg brw_inst_set_bits(insn, 124, 109, value); 377b8e80941Smrg} 378b8e80941Smrg/** @} */ 379b8e80941Smrg 380b8e80941Smrg/** 381b8e80941Smrg * Flow control instruction bits: 382b8e80941Smrg * @{ 383b8e80941Smrg */ 384b8e80941Smrgstatic inline void 385b8e80941Smrgbrw_inst_set_uip(const struct gen_device_info *devinfo, 386b8e80941Smrg brw_inst *inst, int32_t value) 387b8e80941Smrg{ 388b8e80941Smrg assert(devinfo->gen >= 6); 389b8e80941Smrg 390b8e80941Smrg if (devinfo->gen >= 8) { 391b8e80941Smrg brw_inst_set_bits(inst, 95, 64, (uint32_t)value); 392b8e80941Smrg } else { 393b8e80941Smrg assert(value <= (1 << 16) - 1); 394b8e80941Smrg assert(value > -(1 << 16)); 395b8e80941Smrg brw_inst_set_bits(inst, 127, 112, (uint16_t)value); 396b8e80941Smrg } 397b8e80941Smrg} 398b8e80941Smrg 399b8e80941Smrgstatic inline int32_t 400b8e80941Smrgbrw_inst_uip(const struct gen_device_info *devinfo, const brw_inst *inst) 401b8e80941Smrg{ 402b8e80941Smrg assert(devinfo->gen >= 6); 403b8e80941Smrg 404b8e80941Smrg if (devinfo->gen >= 8) { 405b8e80941Smrg return brw_inst_bits(inst, 95, 64); 406b8e80941Smrg } else { 407b8e80941Smrg return (int16_t)brw_inst_bits(inst, 127, 112); 408b8e80941Smrg } 409b8e80941Smrg} 410b8e80941Smrg 411b8e80941Smrgstatic inline void 412b8e80941Smrgbrw_inst_set_jip(const struct gen_device_info *devinfo, 413b8e80941Smrg brw_inst *inst, int32_t value) 414b8e80941Smrg{ 415b8e80941Smrg assert(devinfo->gen >= 6); 416b8e80941Smrg 417b8e80941Smrg if (devinfo->gen >= 8) { 418b8e80941Smrg brw_inst_set_bits(inst, 127, 96, (uint32_t)value); 419b8e80941Smrg } else { 420b8e80941Smrg assert(value <= (1 << 15) - 1); 421b8e80941Smrg assert(value >= -(1 << 15)); 422b8e80941Smrg brw_inst_set_bits(inst, 111, 96, (uint16_t)value); 423b8e80941Smrg } 424b8e80941Smrg} 425b8e80941Smrg 426b8e80941Smrgstatic inline int32_t 427b8e80941Smrgbrw_inst_jip(const struct gen_device_info *devinfo, const brw_inst *inst) 428b8e80941Smrg{ 429b8e80941Smrg assert(devinfo->gen >= 6); 430b8e80941Smrg 431b8e80941Smrg if (devinfo->gen >= 8) { 432b8e80941Smrg return brw_inst_bits(inst, 127, 96); 433b8e80941Smrg } else { 434b8e80941Smrg return (int16_t)brw_inst_bits(inst, 111, 96); 435b8e80941Smrg } 436b8e80941Smrg} 437b8e80941Smrg 438b8e80941Smrg/** Like FC, but using int16_t to handle negative jump targets. */ 439b8e80941Smrg#define FJ(name, high, low, assertions) \ 440b8e80941Smrgstatic inline void \ 441b8e80941Smrgbrw_inst_set_##name(const struct gen_device_info *devinfo, brw_inst *inst, int16_t v) \ 442b8e80941Smrg{ \ 443b8e80941Smrg assert(assertions); \ 444b8e80941Smrg (void) devinfo; \ 445b8e80941Smrg brw_inst_set_bits(inst, high, low, (uint16_t) v); \ 446b8e80941Smrg} \ 447b8e80941Smrgstatic inline int16_t \ 448b8e80941Smrgbrw_inst_##name(const struct gen_device_info *devinfo, const brw_inst *inst) \ 449b8e80941Smrg{ \ 450b8e80941Smrg assert(assertions); \ 451b8e80941Smrg (void) devinfo; \ 452b8e80941Smrg return brw_inst_bits(inst, high, low); \ 453b8e80941Smrg} 454b8e80941Smrg 455b8e80941SmrgFJ(gen6_jump_count, 63, 48, devinfo->gen == 6) 456b8e80941SmrgFJ(gen4_jump_count, 111, 96, devinfo->gen < 6) 457b8e80941SmrgFC(gen4_pop_count, 115, 112, devinfo->gen < 6) 458b8e80941Smrg/** @} */ 459b8e80941Smrg 460b8e80941Smrg/** 461b8e80941Smrg * SEND instructions: 462b8e80941Smrg * @{ 463b8e80941Smrg */ 464b8e80941SmrgFC(send_ex_desc_ia_subreg_nr, 82, 80, devinfo->gen >= 9) 465b8e80941SmrgFC(send_src0_address_mode, 79, 79, devinfo->gen >= 9) 466b8e80941SmrgFC(send_sel_reg32_desc, 77, 77, devinfo->gen >= 9) 467b8e80941SmrgFC(send_sel_reg32_ex_desc, 61, 61, devinfo->gen >= 9) 468b8e80941SmrgFC(send_src1_reg_nr, 51, 44, devinfo->gen >= 9) 469b8e80941SmrgFC(send_src1_reg_file, 36, 36, devinfo->gen >= 9) 470b8e80941SmrgFC(send_dst_reg_file, 35, 35, devinfo->gen >= 9) 471b8e80941Smrg/** @} */ 472b8e80941Smrg 473b8e80941Smrg/* Message descriptor bits */ 474b8e80941Smrg#define MD(x) ((x) + 96) 475b8e80941Smrg 476b8e80941Smrg/** 477b8e80941Smrg * Set the SEND(C) message descriptor immediate. 478b8e80941Smrg * 479b8e80941Smrg * This doesn't include the SFID nor the EOT field that were considered to be 480b8e80941Smrg * part of the message descriptor by ancient versions of the BSpec, because 481b8e80941Smrg * they are present in the instruction even if the message descriptor is 482b8e80941Smrg * provided indirectly in the address register, so we want to specify them 483b8e80941Smrg * separately. 484b8e80941Smrg */ 485b8e80941Smrgstatic inline void 486b8e80941Smrgbrw_inst_set_send_desc(const struct gen_device_info *devinfo, 487b8e80941Smrg brw_inst *inst, uint32_t value) 488b8e80941Smrg{ 489b8e80941Smrg if (devinfo->gen >= 9) { 490b8e80941Smrg brw_inst_set_bits(inst, 126, 96, value); 491b8e80941Smrg assert(value >> 31 == 0); 492b8e80941Smrg } else if (devinfo->gen >= 5) { 493b8e80941Smrg brw_inst_set_bits(inst, 124, 96, value); 494b8e80941Smrg assert(value >> 29 == 0); 495b8e80941Smrg } else { 496b8e80941Smrg brw_inst_set_bits(inst, 119, 96, value); 497b8e80941Smrg assert(value >> 24 == 0); 498b8e80941Smrg } 499b8e80941Smrg} 500b8e80941Smrg 501b8e80941Smrg/** 502b8e80941Smrg * Get the SEND(C) message descriptor immediate. 503b8e80941Smrg * 504b8e80941Smrg * \sa brw_inst_set_send_desc(). 505b8e80941Smrg */ 506b8e80941Smrgstatic inline uint32_t 507b8e80941Smrgbrw_inst_send_desc(const struct gen_device_info *devinfo, const brw_inst *inst) 508b8e80941Smrg{ 509b8e80941Smrg if (devinfo->gen >= 9) 510b8e80941Smrg return brw_inst_bits(inst, 126, 96); 511b8e80941Smrg else if (devinfo->gen >= 5) 512b8e80941Smrg return brw_inst_bits(inst, 124, 96); 513b8e80941Smrg else 514b8e80941Smrg return brw_inst_bits(inst, 119, 96); 515b8e80941Smrg} 516b8e80941Smrg 517b8e80941Smrg/** 518b8e80941Smrg * Set the SEND(C) message extended descriptor immediate. 519b8e80941Smrg * 520b8e80941Smrg * This doesn't include the SFID nor the EOT field that were considered to be 521b8e80941Smrg * part of the extended message descriptor by some versions of the BSpec, 522b8e80941Smrg * because they are present in the instruction even if the extended message 523b8e80941Smrg * descriptor is provided indirectly in a register, so we want to specify them 524b8e80941Smrg * separately. 525b8e80941Smrg */ 526b8e80941Smrgstatic inline void 527b8e80941Smrgbrw_inst_set_send_ex_desc(const struct gen_device_info *devinfo, 528b8e80941Smrg brw_inst *inst, uint32_t value) 529b8e80941Smrg{ 530b8e80941Smrg assert(devinfo->gen >= 9); 531b8e80941Smrg if (brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SEND || 532b8e80941Smrg brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SENDC) { 533b8e80941Smrg brw_inst_set_bits(inst, 94, 91, GET_BITS(value, 31, 28)); 534b8e80941Smrg brw_inst_set_bits(inst, 88, 85, GET_BITS(value, 27, 24)); 535b8e80941Smrg brw_inst_set_bits(inst, 83, 80, GET_BITS(value, 23, 20)); 536b8e80941Smrg brw_inst_set_bits(inst, 67, 64, GET_BITS(value, 19, 16)); 537b8e80941Smrg assert(GET_BITS(value, 15, 0) == 0); 538b8e80941Smrg } else { 539b8e80941Smrg assert(brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SENDS || 540b8e80941Smrg brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SENDSC); 541b8e80941Smrg brw_inst_set_bits(inst, 95, 80, GET_BITS(value, 31, 16)); 542b8e80941Smrg assert(GET_BITS(value, 15, 10) == 0); 543b8e80941Smrg brw_inst_set_bits(inst, 67, 64, GET_BITS(value, 9, 6)); 544b8e80941Smrg assert(GET_BITS(value, 5, 0) == 0); 545b8e80941Smrg } 546b8e80941Smrg} 547b8e80941Smrg 548b8e80941Smrg/** 549b8e80941Smrg * Get the SEND(C) message extended descriptor immediate. 550b8e80941Smrg * 551b8e80941Smrg * \sa brw_inst_set_send_ex_desc(). 552b8e80941Smrg */ 553b8e80941Smrgstatic inline uint32_t 554b8e80941Smrgbrw_inst_send_ex_desc(const struct gen_device_info *devinfo, 555b8e80941Smrg const brw_inst *inst) 556b8e80941Smrg{ 557b8e80941Smrg assert(devinfo->gen >= 9); 558b8e80941Smrg if (brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SEND || 559b8e80941Smrg brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SENDC) { 560b8e80941Smrg return (brw_inst_bits(inst, 94, 91) << 28 | 561b8e80941Smrg brw_inst_bits(inst, 88, 85) << 24 | 562b8e80941Smrg brw_inst_bits(inst, 83, 80) << 20 | 563b8e80941Smrg brw_inst_bits(inst, 67, 64) << 16); 564b8e80941Smrg } else { 565b8e80941Smrg assert(brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SENDS || 566b8e80941Smrg brw_inst_opcode(devinfo, inst) == BRW_OPCODE_SENDSC); 567b8e80941Smrg return (brw_inst_bits(inst, 95, 80) << 16 | 568b8e80941Smrg brw_inst_bits(inst, 67, 64) << 6); 569b8e80941Smrg } 570b8e80941Smrg} 571b8e80941Smrg 572b8e80941Smrg/** 573b8e80941Smrg * Fields for SEND messages: 574b8e80941Smrg * @{ 575b8e80941Smrg */ 576b8e80941SmrgF(eot, 127, 127) 577b8e80941SmrgFF(mlen, 578b8e80941Smrg /* 4: */ 119, 116, 579b8e80941Smrg /* 4.5: */ 119, 116, 580b8e80941Smrg /* 5: */ 124, 121, 581b8e80941Smrg /* 6: */ 124, 121, 582b8e80941Smrg /* 7: */ 124, 121, 583b8e80941Smrg /* 8: */ 124, 121); 584b8e80941SmrgFF(rlen, 585b8e80941Smrg /* 4: */ 115, 112, 586b8e80941Smrg /* 4.5: */ 115, 112, 587b8e80941Smrg /* 5: */ 120, 116, 588b8e80941Smrg /* 6: */ 120, 116, 589b8e80941Smrg /* 7: */ 120, 116, 590b8e80941Smrg /* 8: */ 120, 116); 591b8e80941SmrgFF(header_present, 592b8e80941Smrg /* 4: doesn't exist */ -1, -1, -1, -1, 593b8e80941Smrg /* 5: */ 115, 115, 594b8e80941Smrg /* 6: */ 115, 115, 595b8e80941Smrg /* 7: */ 115, 115, 596b8e80941Smrg /* 8: */ 115, 115) 597b8e80941SmrgF(gateway_notify, MD(16), MD(15)) 598b8e80941SmrgFF(function_control, 599b8e80941Smrg /* 4: */ 111, 96, 600b8e80941Smrg /* 4.5: */ 111, 96, 601b8e80941Smrg /* 5: */ 114, 96, 602b8e80941Smrg /* 6: */ 114, 96, 603b8e80941Smrg /* 7: */ 114, 96, 604b8e80941Smrg /* 8: */ 114, 96) 605b8e80941SmrgFF(gateway_subfuncid, 606b8e80941Smrg /* 4: */ MD(1), MD(0), 607b8e80941Smrg /* 4.5: */ MD(1), MD(0), 608b8e80941Smrg /* 5: */ MD(1), MD(0), /* 2:0, but bit 2 is reserved MBZ */ 609b8e80941Smrg /* 6: */ MD(2), MD(0), 610b8e80941Smrg /* 7: */ MD(2), MD(0), 611b8e80941Smrg /* 8: */ MD(2), MD(0)) 612b8e80941SmrgFF(sfid, 613b8e80941Smrg /* 4: */ 123, 120, /* called msg_target */ 614b8e80941Smrg /* 4.5 */ 123, 120, 615b8e80941Smrg /* 5: */ 95, 92, 616b8e80941Smrg /* 6: */ 27, 24, 617b8e80941Smrg /* 7: */ 27, 24, 618b8e80941Smrg /* 8: */ 27, 24) 619b8e80941SmrgFF(null_rt, 620b8e80941Smrg /* 4-7: */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 621b8e80941Smrg /* 8: */ 80, 80) /* actually only Gen11+ */ 622b8e80941SmrgFC(base_mrf, 27, 24, devinfo->gen < 6); 623b8e80941Smrg/** @} */ 624b8e80941Smrg 625b8e80941Smrg/** 626b8e80941Smrg * URB message function control bits: 627b8e80941Smrg * @{ 628b8e80941Smrg */ 629b8e80941SmrgFF(urb_per_slot_offset, 630b8e80941Smrg /* 4-6: */ -1, -1, -1, -1, -1, -1, -1, -1, 631b8e80941Smrg /* 7: */ MD(16), MD(16), 632b8e80941Smrg /* 8: */ MD(17), MD(17)) 633b8e80941SmrgFC(urb_channel_mask_present, MD(15), MD(15), devinfo->gen >= 8) 634b8e80941SmrgFC(urb_complete, MD(15), MD(15), devinfo->gen < 8) 635b8e80941SmrgFC(urb_used, MD(14), MD(14), devinfo->gen < 7) 636b8e80941SmrgFC(urb_allocate, MD(13), MD(13), devinfo->gen < 7) 637b8e80941SmrgFF(urb_swizzle_control, 638b8e80941Smrg /* 4: */ MD(11), MD(10), 639b8e80941Smrg /* 4.5: */ MD(11), MD(10), 640b8e80941Smrg /* 5: */ MD(11), MD(10), 641b8e80941Smrg /* 6: */ MD(11), MD(10), 642b8e80941Smrg /* 7: */ MD(14), MD(14), 643b8e80941Smrg /* 8: */ MD(15), MD(15)) 644b8e80941SmrgFF(urb_global_offset, 645b8e80941Smrg /* 4: */ MD( 9), MD(4), 646b8e80941Smrg /* 4.5: */ MD( 9), MD(4), 647b8e80941Smrg /* 5: */ MD( 9), MD(4), 648b8e80941Smrg /* 6: */ MD( 9), MD(4), 649b8e80941Smrg /* 7: */ MD(13), MD(3), 650b8e80941Smrg /* 8: */ MD(14), MD(4)) 651b8e80941SmrgFF(urb_opcode, 652b8e80941Smrg /* 4: */ MD( 3), MD(0), 653b8e80941Smrg /* 4.5: */ MD( 3), MD(0), 654b8e80941Smrg /* 5: */ MD( 3), MD(0), 655b8e80941Smrg /* 6: */ MD( 3), MD(0), 656b8e80941Smrg /* 7: */ MD( 2), MD(0), 657b8e80941Smrg /* 8: */ MD( 3), MD(0)) 658b8e80941Smrg/** @} */ 659b8e80941Smrg 660b8e80941Smrg/** 661b8e80941Smrg * Gen4-5 math messages: 662b8e80941Smrg * @{ 663b8e80941Smrg */ 664b8e80941SmrgFC(math_msg_data_type, MD(7), MD(7), devinfo->gen < 6) 665b8e80941SmrgFC(math_msg_saturate, MD(6), MD(6), devinfo->gen < 6) 666b8e80941SmrgFC(math_msg_precision, MD(5), MD(5), devinfo->gen < 6) 667b8e80941SmrgFC(math_msg_signed_int, MD(4), MD(4), devinfo->gen < 6) 668b8e80941SmrgFC(math_msg_function, MD(3), MD(0), devinfo->gen < 6) 669b8e80941Smrg/** @} */ 670b8e80941Smrg 671b8e80941Smrg/** 672b8e80941Smrg * Sampler message function control bits: 673b8e80941Smrg * @{ 674b8e80941Smrg */ 675b8e80941SmrgFF(sampler_simd_mode, 676b8e80941Smrg /* 4: doesn't exist */ -1, -1, -1, -1, 677b8e80941Smrg /* 5: */ MD(17), MD(16), 678b8e80941Smrg /* 6: */ MD(17), MD(16), 679b8e80941Smrg /* 7: */ MD(18), MD(17), 680b8e80941Smrg /* 8: */ MD(18), MD(17)) 681b8e80941SmrgFF(sampler_msg_type, 682b8e80941Smrg /* 4: */ MD(15), MD(14), 683b8e80941Smrg /* 4.5: */ MD(15), MD(12), 684b8e80941Smrg /* 5: */ MD(15), MD(12), 685b8e80941Smrg /* 6: */ MD(15), MD(12), 686b8e80941Smrg /* 7: */ MD(16), MD(12), 687b8e80941Smrg /* 8: */ MD(16), MD(12)) 688b8e80941SmrgFC(sampler_return_format, MD(13), MD(12), devinfo->gen == 4 && !devinfo->is_g4x) 689b8e80941SmrgF(sampler, MD(11), MD(8)) 690b8e80941SmrgF(binding_table_index, MD( 7), MD(0)) /* also used by other messages */ 691b8e80941Smrg/** @} */ 692b8e80941Smrg 693b8e80941Smrg/** 694b8e80941Smrg * Data port message function control bits: 695b8e80941Smrg * @{ 696b8e80941Smrg */ 697b8e80941SmrgFC(dp_category, MD(18), MD(18), devinfo->gen >= 7) 698b8e80941Smrg 699b8e80941Smrg/* Gen4-5 store fields in different bits for read/write messages. */ 700b8e80941SmrgFF(dp_read_msg_type, 701b8e80941Smrg /* 4: */ MD(13), MD(12), 702b8e80941Smrg /* 4.5: */ MD(13), MD(11), 703b8e80941Smrg /* 5: */ MD(13), MD(11), 704b8e80941Smrg /* 6: */ MD(16), MD(13), 705b8e80941Smrg /* 7: */ MD(17), MD(14), 706b8e80941Smrg /* 8: */ MD(17), MD(14)) 707b8e80941SmrgFF(dp_write_msg_type, 708b8e80941Smrg /* 4: */ MD(14), MD(12), 709b8e80941Smrg /* 4.5: */ MD(14), MD(12), 710b8e80941Smrg /* 5: */ MD(14), MD(12), 711b8e80941Smrg /* 6: */ MD(16), MD(13), 712b8e80941Smrg /* 7: */ MD(17), MD(14), 713b8e80941Smrg /* 8: */ MD(17), MD(14)) 714b8e80941SmrgFF(dp_read_msg_control, 715b8e80941Smrg /* 4: */ MD(11), MD( 8), 716b8e80941Smrg /* 4.5: */ MD(10), MD( 8), 717b8e80941Smrg /* 5: */ MD(10), MD( 8), 718b8e80941Smrg /* 6: */ MD(12), MD( 8), 719b8e80941Smrg /* 7: */ MD(13), MD( 8), 720b8e80941Smrg /* 8: */ MD(13), MD( 8)) 721b8e80941SmrgFF(dp_write_msg_control, 722b8e80941Smrg /* 4: */ MD(11), MD( 8), 723b8e80941Smrg /* 4.5: */ MD(11), MD( 8), 724b8e80941Smrg /* 5: */ MD(11), MD( 8), 725b8e80941Smrg /* 6: */ MD(12), MD( 8), 726b8e80941Smrg /* 7: */ MD(13), MD( 8), 727b8e80941Smrg /* 8: */ MD(13), MD( 8)) 728b8e80941SmrgFC(dp_read_target_cache, MD(15), MD(14), devinfo->gen < 6); 729b8e80941Smrg 730b8e80941SmrgFF(dp_write_commit, 731b8e80941Smrg /* 4: */ MD(15), MD(15), 732b8e80941Smrg /* 4.5: */ MD(15), MD(15), 733b8e80941Smrg /* 5: */ MD(15), MD(15), 734b8e80941Smrg /* 6: */ MD(17), MD(17), 735b8e80941Smrg /* 7+: does not exist */ -1, -1, -1, -1) 736b8e80941Smrg 737b8e80941Smrg/* Gen6+ use the same bit locations for everything. */ 738b8e80941SmrgFF(dp_msg_type, 739b8e80941Smrg /* 4-5: use dp_read_msg_type or dp_write_msg_type instead */ 740b8e80941Smrg -1, -1, -1, -1, -1, -1, 741b8e80941Smrg /* 6: */ MD(16), MD(13), 742b8e80941Smrg /* 7: */ MD(17), MD(14), 743b8e80941Smrg /* 8: */ MD(18), MD(14)) 744b8e80941SmrgFF(dp_msg_control, 745b8e80941Smrg /* 4: */ MD(11), MD( 8), 746b8e80941Smrg /* 4.5-5: use dp_read_msg_control or dp_write_msg_control */ -1, -1, -1, -1, 747b8e80941Smrg /* 6: */ MD(12), MD( 8), 748b8e80941Smrg /* 7: */ MD(13), MD( 8), 749b8e80941Smrg /* 8: */ MD(13), MD( 8)) 750b8e80941Smrg/** @} */ 751b8e80941Smrg 752b8e80941Smrg/** 753b8e80941Smrg * Scratch message bits (Gen7+): 754b8e80941Smrg * @{ 755b8e80941Smrg */ 756b8e80941SmrgFC(scratch_read_write, MD(17), MD(17), devinfo->gen >= 7) /* 0 = read, 1 = write */ 757b8e80941SmrgFC(scratch_type, MD(16), MD(16), devinfo->gen >= 7) /* 0 = OWord, 1 = DWord */ 758b8e80941SmrgFC(scratch_invalidate_after_read, MD(15), MD(15), devinfo->gen >= 7) 759b8e80941SmrgFC(scratch_block_size, MD(13), MD(12), devinfo->gen >= 7) 760b8e80941SmrgFC(scratch_addr_offset, MD(11), MD( 0), devinfo->gen >= 7) 761b8e80941Smrg/** @} */ 762b8e80941Smrg 763b8e80941Smrg/** 764b8e80941Smrg * Render Target message function control bits: 765b8e80941Smrg * @{ 766b8e80941Smrg */ 767b8e80941SmrgFF(rt_last, 768b8e80941Smrg /* 4: */ MD(11), MD(11), 769b8e80941Smrg /* 4.5: */ MD(11), MD(11), 770b8e80941Smrg /* 5: */ MD(11), MD(11), 771b8e80941Smrg /* 6: */ MD(12), MD(12), 772b8e80941Smrg /* 7: */ MD(12), MD(12), 773b8e80941Smrg /* 8: */ MD(12), MD(12)) 774b8e80941SmrgFC(rt_slot_group, MD(11), MD(11), devinfo->gen >= 6) 775b8e80941SmrgF(rt_message_type, MD(10), MD( 8)) 776b8e80941Smrg/** @} */ 777b8e80941Smrg 778b8e80941Smrg/** 779b8e80941Smrg * Thread Spawn message function control bits: 780b8e80941Smrg * @{ 781b8e80941Smrg */ 782b8e80941SmrgF(ts_resource_select, MD( 4), MD( 4)) 783b8e80941SmrgF(ts_request_type, MD( 1), MD( 1)) 784b8e80941SmrgF(ts_opcode, MD( 0), MD( 0)) 785b8e80941Smrg/** @} */ 786b8e80941Smrg 787b8e80941Smrg/** 788b8e80941Smrg * Pixel Interpolator message function control bits: 789b8e80941Smrg * @{ 790b8e80941Smrg */ 791b8e80941SmrgF(pi_simd_mode, MD(16), MD(16)) 792b8e80941SmrgF(pi_nopersp, MD(14), MD(14)) 793b8e80941SmrgF(pi_message_type, MD(13), MD(12)) 794b8e80941SmrgF(pi_slot_group, MD(11), MD(11)) 795b8e80941SmrgF(pi_message_data, MD(7), MD(0)) 796b8e80941Smrg/** @} */ 797b8e80941Smrg 798b8e80941Smrg/** 799b8e80941Smrg * Immediates: 800b8e80941Smrg * @{ 801b8e80941Smrg */ 802b8e80941Smrgstatic inline int 803b8e80941Smrgbrw_inst_imm_d(const struct gen_device_info *devinfo, const brw_inst *insn) 804b8e80941Smrg{ 805b8e80941Smrg (void) devinfo; 806b8e80941Smrg return brw_inst_bits(insn, 127, 96); 807b8e80941Smrg} 808b8e80941Smrg 809b8e80941Smrgstatic inline unsigned 810b8e80941Smrgbrw_inst_imm_ud(const struct gen_device_info *devinfo, const brw_inst *insn) 811b8e80941Smrg{ 812b8e80941Smrg (void) devinfo; 813b8e80941Smrg return brw_inst_bits(insn, 127, 96); 814b8e80941Smrg} 815b8e80941Smrg 816b8e80941Smrgstatic inline uint64_t 817b8e80941Smrgbrw_inst_imm_uq(MAYBE_UNUSED const struct gen_device_info *devinfo, 818b8e80941Smrg const brw_inst *insn) 819b8e80941Smrg{ 820b8e80941Smrg assert(devinfo->gen >= 8); 821b8e80941Smrg return brw_inst_bits(insn, 127, 64); 822b8e80941Smrg} 823b8e80941Smrg 824b8e80941Smrgstatic inline float 825b8e80941Smrgbrw_inst_imm_f(const struct gen_device_info *devinfo, const brw_inst *insn) 826b8e80941Smrg{ 827b8e80941Smrg union { 828b8e80941Smrg float f; 829b8e80941Smrg uint32_t u; 830b8e80941Smrg } ft; 831b8e80941Smrg (void) devinfo; 832b8e80941Smrg ft.u = brw_inst_bits(insn, 127, 96); 833b8e80941Smrg return ft.f; 834b8e80941Smrg} 835b8e80941Smrg 836b8e80941Smrgstatic inline double 837b8e80941Smrgbrw_inst_imm_df(const struct gen_device_info *devinfo, const brw_inst *insn) 838b8e80941Smrg{ 839b8e80941Smrg union { 840b8e80941Smrg double d; 841b8e80941Smrg uint64_t u; 842b8e80941Smrg } dt; 843b8e80941Smrg (void) devinfo; 844b8e80941Smrg dt.u = brw_inst_bits(insn, 127, 64); 845b8e80941Smrg return dt.d; 846b8e80941Smrg} 847b8e80941Smrg 848b8e80941Smrgstatic inline void 849b8e80941Smrgbrw_inst_set_imm_d(const struct gen_device_info *devinfo, 850b8e80941Smrg brw_inst *insn, int value) 851b8e80941Smrg{ 852b8e80941Smrg (void) devinfo; 853b8e80941Smrg return brw_inst_set_bits(insn, 127, 96, value); 854b8e80941Smrg} 855b8e80941Smrg 856b8e80941Smrgstatic inline void 857b8e80941Smrgbrw_inst_set_imm_ud(const struct gen_device_info *devinfo, 858b8e80941Smrg brw_inst *insn, unsigned value) 859b8e80941Smrg{ 860b8e80941Smrg (void) devinfo; 861b8e80941Smrg return brw_inst_set_bits(insn, 127, 96, value); 862b8e80941Smrg} 863b8e80941Smrg 864b8e80941Smrgstatic inline void 865b8e80941Smrgbrw_inst_set_imm_f(const struct gen_device_info *devinfo, 866b8e80941Smrg brw_inst *insn, float value) 867b8e80941Smrg{ 868b8e80941Smrg union { 869b8e80941Smrg float f; 870b8e80941Smrg uint32_t u; 871b8e80941Smrg } ft; 872b8e80941Smrg (void) devinfo; 873b8e80941Smrg ft.f = value; 874b8e80941Smrg brw_inst_set_bits(insn, 127, 96, ft.u); 875b8e80941Smrg} 876b8e80941Smrg 877b8e80941Smrgstatic inline void 878b8e80941Smrgbrw_inst_set_imm_df(const struct gen_device_info *devinfo, 879b8e80941Smrg brw_inst *insn, double value) 880b8e80941Smrg{ 881b8e80941Smrg union { 882b8e80941Smrg double d; 883b8e80941Smrg uint64_t u; 884b8e80941Smrg } dt; 885b8e80941Smrg (void) devinfo; 886b8e80941Smrg dt.d = value; 887b8e80941Smrg brw_inst_set_bits(insn, 127, 64, dt.u); 888b8e80941Smrg} 889b8e80941Smrg 890b8e80941Smrgstatic inline void 891b8e80941Smrgbrw_inst_set_imm_uq(const struct gen_device_info *devinfo, 892b8e80941Smrg brw_inst *insn, uint64_t value) 893b8e80941Smrg{ 894b8e80941Smrg (void) devinfo; 895b8e80941Smrg brw_inst_set_bits(insn, 127, 64, value); 896b8e80941Smrg} 897b8e80941Smrg 898b8e80941Smrg/** @} */ 899b8e80941Smrg 900b8e80941Smrg#define REG_TYPE(reg) \ 901b8e80941Smrgstatic inline void \ 902b8e80941Smrgbrw_inst_set_##reg##_file_type(const struct gen_device_info *devinfo, \ 903b8e80941Smrg brw_inst *inst, enum brw_reg_file file, \ 904b8e80941Smrg enum brw_reg_type type) \ 905b8e80941Smrg{ \ 906b8e80941Smrg assert(file <= BRW_IMMEDIATE_VALUE); \ 907b8e80941Smrg unsigned hw_type = brw_reg_type_to_hw_type(devinfo, file, type); \ 908b8e80941Smrg brw_inst_set_##reg##_reg_file(devinfo, inst, file); \ 909b8e80941Smrg brw_inst_set_##reg##_reg_hw_type(devinfo, inst, hw_type); \ 910b8e80941Smrg} \ 911b8e80941Smrg \ 912b8e80941Smrgstatic inline enum brw_reg_type \ 913b8e80941Smrgbrw_inst_##reg##_type(const struct gen_device_info *devinfo, \ 914b8e80941Smrg const brw_inst *inst) \ 915b8e80941Smrg{ \ 916b8e80941Smrg unsigned file = __builtin_strcmp("dst", #reg) == 0 ? \ 917b8e80941Smrg (unsigned) BRW_GENERAL_REGISTER_FILE : \ 918b8e80941Smrg brw_inst_##reg##_reg_file(devinfo, inst); \ 919b8e80941Smrg unsigned hw_type = brw_inst_##reg##_reg_hw_type(devinfo, inst); \ 920b8e80941Smrg return brw_hw_type_to_reg_type(devinfo, (enum brw_reg_file)file, hw_type); \ 921b8e80941Smrg} 922b8e80941Smrg 923b8e80941SmrgREG_TYPE(dst) 924b8e80941SmrgREG_TYPE(src0) 925b8e80941SmrgREG_TYPE(src1) 926b8e80941Smrg#undef REG_TYPE 927b8e80941Smrg 928b8e80941Smrg 929b8e80941Smrg/* The AddrImm fields are split into two discontiguous sections on Gen8+ */ 930b8e80941Smrg#define BRW_IA1_ADDR_IMM(reg, g4_high, g4_low, g8_nine, g8_high, g8_low) \ 931b8e80941Smrgstatic inline void \ 932b8e80941Smrgbrw_inst_set_##reg##_ia1_addr_imm(const struct gen_device_info *devinfo, \ 933b8e80941Smrg brw_inst *inst, \ 934b8e80941Smrg unsigned value) \ 935b8e80941Smrg{ \ 936b8e80941Smrg assert((value & ~0x3ff) == 0); \ 937b8e80941Smrg if (devinfo->gen >= 8) { \ 938b8e80941Smrg brw_inst_set_bits(inst, g8_high, g8_low, value & 0x1ff); \ 939b8e80941Smrg brw_inst_set_bits(inst, g8_nine, g8_nine, value >> 9); \ 940b8e80941Smrg } else { \ 941b8e80941Smrg brw_inst_set_bits(inst, g4_high, g4_low, value); \ 942b8e80941Smrg } \ 943b8e80941Smrg} \ 944b8e80941Smrgstatic inline unsigned \ 945b8e80941Smrgbrw_inst_##reg##_ia1_addr_imm(const struct gen_device_info *devinfo, \ 946b8e80941Smrg const brw_inst *inst) \ 947b8e80941Smrg{ \ 948b8e80941Smrg if (devinfo->gen >= 8) { \ 949b8e80941Smrg return brw_inst_bits(inst, g8_high, g8_low) | \ 950b8e80941Smrg (brw_inst_bits(inst, g8_nine, g8_nine) << 9); \ 951b8e80941Smrg } else { \ 952b8e80941Smrg return brw_inst_bits(inst, g4_high, g4_low); \ 953b8e80941Smrg } \ 954b8e80941Smrg} 955b8e80941Smrg 956b8e80941Smrg/* AddrImm[9:0] for Align1 Indirect Addressing */ 957b8e80941Smrg/* -Gen 4- ----Gen8---- */ 958b8e80941SmrgBRW_IA1_ADDR_IMM(src1, 105, 96, 121, 104, 96) 959b8e80941SmrgBRW_IA1_ADDR_IMM(src0, 73, 64, 95, 72, 64) 960b8e80941SmrgBRW_IA1_ADDR_IMM(dst, 57, 48, 47, 56, 48) 961b8e80941Smrg 962b8e80941Smrg#define BRW_IA16_ADDR_IMM(reg, g4_high, g4_low, g8_nine, g8_high, g8_low) \ 963b8e80941Smrgstatic inline void \ 964b8e80941Smrgbrw_inst_set_##reg##_ia16_addr_imm(const struct gen_device_info *devinfo, \ 965b8e80941Smrg brw_inst *inst, unsigned value) \ 966b8e80941Smrg{ \ 967b8e80941Smrg assert((value & ~0x3ff) == 0); \ 968b8e80941Smrg if (devinfo->gen >= 8) { \ 969b8e80941Smrg assert(GET_BITS(value, 3, 0) == 0); \ 970b8e80941Smrg brw_inst_set_bits(inst, g8_high, g8_low, GET_BITS(value, 8, 4)); \ 971b8e80941Smrg brw_inst_set_bits(inst, g8_nine, g8_nine, GET_BITS(value, 9, 9)); \ 972b8e80941Smrg } else { \ 973b8e80941Smrg brw_inst_set_bits(inst, g4_high, g4_low, value); \ 974b8e80941Smrg } \ 975b8e80941Smrg} \ 976b8e80941Smrgstatic inline unsigned \ 977b8e80941Smrgbrw_inst_##reg##_ia16_addr_imm(const struct gen_device_info *devinfo, \ 978b8e80941Smrg const brw_inst *inst) \ 979b8e80941Smrg{ \ 980b8e80941Smrg if (devinfo->gen >= 8) { \ 981b8e80941Smrg return (brw_inst_bits(inst, g8_high, g8_low) << 4) | \ 982b8e80941Smrg (brw_inst_bits(inst, g8_nine, g8_nine) << 9); \ 983b8e80941Smrg } else { \ 984b8e80941Smrg return brw_inst_bits(inst, g4_high, g4_low); \ 985b8e80941Smrg } \ 986b8e80941Smrg} 987b8e80941Smrg 988b8e80941Smrg/* AddrImm[9:0] for Align16 Indirect Addressing: 989b8e80941Smrg * Compared to Align1, these are missing the low 4 bits. 990b8e80941Smrg * -Gen 4- ----Gen8---- 991b8e80941Smrg */ 992b8e80941SmrgBRW_IA16_ADDR_IMM(src1, 105, 96, 121, 104, 100) 993b8e80941SmrgBRW_IA16_ADDR_IMM(src0, 73, 64, 95, 72, 68) 994b8e80941SmrgBRW_IA16_ADDR_IMM(dst, 57, 52, 47, 56, 52) 995b8e80941SmrgBRW_IA16_ADDR_IMM(send_src0, -1, -1, 78, 72, 68) 996b8e80941SmrgBRW_IA16_ADDR_IMM(send_dst, -1, -1, 62, 56, 52) 997b8e80941Smrg 998b8e80941Smrg/** 999b8e80941Smrg * Fetch a set of contiguous bits from the instruction. 1000b8e80941Smrg * 1001b8e80941Smrg * Bits indices range from 0..127; fields may not cross 64-bit boundaries. 1002b8e80941Smrg */ 1003b8e80941Smrgstatic inline uint64_t 1004b8e80941Smrgbrw_inst_bits(const brw_inst *inst, unsigned high, unsigned low) 1005b8e80941Smrg{ 1006b8e80941Smrg /* We assume the field doesn't cross 64-bit boundaries. */ 1007b8e80941Smrg const unsigned word = high / 64; 1008b8e80941Smrg assert(word == low / 64); 1009b8e80941Smrg 1010b8e80941Smrg high %= 64; 1011b8e80941Smrg low %= 64; 1012b8e80941Smrg 1013b8e80941Smrg const uint64_t mask = (~0ull >> (64 - (high - low + 1))); 1014b8e80941Smrg 1015b8e80941Smrg return (inst->data[word] >> low) & mask; 1016b8e80941Smrg} 1017b8e80941Smrg 1018b8e80941Smrg/** 1019b8e80941Smrg * Set bits in the instruction, with proper shifting and masking. 1020b8e80941Smrg * 1021b8e80941Smrg * Bits indices range from 0..127; fields may not cross 64-bit boundaries. 1022b8e80941Smrg */ 1023b8e80941Smrgstatic inline void 1024b8e80941Smrgbrw_inst_set_bits(brw_inst *inst, unsigned high, unsigned low, uint64_t value) 1025b8e80941Smrg{ 1026b8e80941Smrg const unsigned word = high / 64; 1027b8e80941Smrg assert(word == low / 64); 1028b8e80941Smrg 1029b8e80941Smrg high %= 64; 1030b8e80941Smrg low %= 64; 1031b8e80941Smrg 1032b8e80941Smrg const uint64_t mask = (~0ull >> (64 - (high - low + 1))) << low; 1033b8e80941Smrg 1034b8e80941Smrg /* Make sure the supplied value actually fits in the given bitfield. */ 1035b8e80941Smrg assert((value & (mask >> low)) == value); 1036b8e80941Smrg 1037b8e80941Smrg inst->data[word] = (inst->data[word] & ~mask) | (value << low); 1038b8e80941Smrg} 1039b8e80941Smrg 1040b8e80941Smrg#undef BRW_IA16_ADDR_IMM 1041b8e80941Smrg#undef BRW_IA1_ADDR_IMM 1042b8e80941Smrg#undef MD 1043b8e80941Smrg#undef F8 1044b8e80941Smrg#undef FF 1045b8e80941Smrg#undef BOUNDS 1046b8e80941Smrg#undef F 1047b8e80941Smrg#undef FC 1048b8e80941Smrg 1049b8e80941Smrgtypedef struct { 1050b8e80941Smrg uint64_t data; 1051b8e80941Smrg} brw_compact_inst; 1052b8e80941Smrg 1053b8e80941Smrg/** 1054b8e80941Smrg * Fetch a set of contiguous bits from the compacted instruction. 1055b8e80941Smrg * 1056b8e80941Smrg * Bits indices range from 0..63. 1057b8e80941Smrg */ 1058b8e80941Smrgstatic inline unsigned 1059b8e80941Smrgbrw_compact_inst_bits(const brw_compact_inst *inst, unsigned high, unsigned low) 1060b8e80941Smrg{ 1061b8e80941Smrg const uint64_t mask = (1ull << (high - low + 1)) - 1; 1062b8e80941Smrg 1063b8e80941Smrg return (inst->data >> low) & mask; 1064b8e80941Smrg} 1065b8e80941Smrg 1066b8e80941Smrg/** 1067b8e80941Smrg * Set bits in the compacted instruction. 1068b8e80941Smrg * 1069b8e80941Smrg * Bits indices range from 0..63. 1070b8e80941Smrg */ 1071b8e80941Smrgstatic inline void 1072b8e80941Smrgbrw_compact_inst_set_bits(brw_compact_inst *inst, unsigned high, unsigned low, 1073b8e80941Smrg uint64_t value) 1074b8e80941Smrg{ 1075b8e80941Smrg const uint64_t mask = ((1ull << (high - low + 1)) - 1) << low; 1076b8e80941Smrg 1077b8e80941Smrg /* Make sure the supplied value actually fits in the given bitfield. */ 1078b8e80941Smrg assert((value & (mask >> low)) == value); 1079b8e80941Smrg 1080b8e80941Smrg inst->data = (inst->data & ~mask) | (value << low); 1081b8e80941Smrg} 1082b8e80941Smrg 1083b8e80941Smrg#define FC(name, high, low, assertions) \ 1084b8e80941Smrgstatic inline void \ 1085b8e80941Smrgbrw_compact_inst_set_##name(const struct gen_device_info *devinfo, \ 1086b8e80941Smrg brw_compact_inst *inst, unsigned v) \ 1087b8e80941Smrg{ \ 1088b8e80941Smrg assert(assertions); \ 1089b8e80941Smrg (void) devinfo; \ 1090b8e80941Smrg brw_compact_inst_set_bits(inst, high, low, v); \ 1091b8e80941Smrg} \ 1092b8e80941Smrgstatic inline unsigned \ 1093b8e80941Smrgbrw_compact_inst_##name(const struct gen_device_info *devinfo, \ 1094b8e80941Smrg const brw_compact_inst *inst) \ 1095b8e80941Smrg{ \ 1096b8e80941Smrg assert(assertions); \ 1097b8e80941Smrg (void) devinfo; \ 1098b8e80941Smrg return brw_compact_inst_bits(inst, high, low); \ 1099b8e80941Smrg} 1100b8e80941Smrg 1101b8e80941Smrg/* A simple macro for fields which stay in the same place on all generations. */ 1102b8e80941Smrg#define F(name, high, low) FC(name, high, low, true) 1103b8e80941Smrg 1104b8e80941SmrgF(src1_reg_nr, 63, 56) 1105b8e80941SmrgF(src0_reg_nr, 55, 48) 1106b8e80941SmrgF(dst_reg_nr, 47, 40) 1107b8e80941SmrgF(src1_index, 39, 35) 1108b8e80941SmrgF(src0_index, 34, 30) 1109b8e80941SmrgF(cmpt_control, 29, 29) /* Same location as brw_inst */ 1110b8e80941SmrgFC(flag_subreg_nr, 28, 28, devinfo->gen <= 6) 1111b8e80941SmrgF(cond_modifier, 27, 24) /* Same location as brw_inst */ 1112b8e80941SmrgFC(acc_wr_control, 23, 23, devinfo->gen >= 6) 1113b8e80941SmrgFC(mask_control_ex, 23, 23, devinfo->is_g4x || devinfo->gen == 5) 1114b8e80941SmrgF(subreg_index, 22, 18) 1115b8e80941SmrgF(datatype_index, 17, 13) 1116b8e80941SmrgF(control_index, 12, 8) 1117b8e80941SmrgF(debug_control, 7, 7) 1118b8e80941SmrgF(opcode, 6, 0) /* Same location as brw_inst */ 1119b8e80941Smrg 1120b8e80941Smrg/** 1121b8e80941Smrg * (Gen8+) Compacted three-source instructions: 1122b8e80941Smrg * @{ 1123b8e80941Smrg */ 1124b8e80941SmrgFC(3src_src2_reg_nr, 63, 57, devinfo->gen >= 8) 1125b8e80941SmrgFC(3src_src1_reg_nr, 56, 50, devinfo->gen >= 8) 1126b8e80941SmrgFC(3src_src0_reg_nr, 49, 43, devinfo->gen >= 8) 1127b8e80941SmrgFC(3src_src2_subreg_nr, 42, 40, devinfo->gen >= 8) 1128b8e80941SmrgFC(3src_src1_subreg_nr, 39, 37, devinfo->gen >= 8) 1129b8e80941SmrgFC(3src_src0_subreg_nr, 36, 34, devinfo->gen >= 8) 1130b8e80941SmrgFC(3src_src2_rep_ctrl, 33, 33, devinfo->gen >= 8) 1131b8e80941SmrgFC(3src_src1_rep_ctrl, 32, 32, devinfo->gen >= 8) 1132b8e80941SmrgFC(3src_saturate, 31, 31, devinfo->gen >= 8) 1133b8e80941SmrgFC(3src_debug_control, 30, 30, devinfo->gen >= 8) 1134b8e80941SmrgFC(3src_cmpt_control, 29, 29, devinfo->gen >= 8) 1135b8e80941SmrgFC(3src_src0_rep_ctrl, 28, 28, devinfo->gen >= 8) 1136b8e80941Smrg/* Reserved */ 1137b8e80941SmrgFC(3src_dst_reg_nr, 18, 12, devinfo->gen >= 8) 1138b8e80941SmrgFC(3src_source_index, 11, 10, devinfo->gen >= 8) 1139b8e80941SmrgFC(3src_control_index, 9, 8, devinfo->gen >= 8) 1140b8e80941Smrg/* Bit 7 is Reserved (for future Opcode expansion) */ 1141b8e80941SmrgFC(3src_opcode, 6, 0, devinfo->gen >= 8) 1142b8e80941Smrg/** @} */ 1143b8e80941Smrg 1144b8e80941Smrg#undef F 1145b8e80941Smrg 1146b8e80941Smrg#ifdef __cplusplus 1147b8e80941Smrg} 1148b8e80941Smrg#endif 1149b8e80941Smrg 1150b8e80941Smrg#endif 1151