1//===--- AMDHSAKernelDescriptor.h -----------------------------*- C++ -*---===// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7//===----------------------------------------------------------------------===// 10/// AMDHSA kernel descriptor definitions. For more information, visit 11/// https://llvm.org/docs/AMDGPUUsage.html#kernel-descriptor 14/// Any changes to this file should also be audited for corresponding changes 15/// needed in both the assembler and disassembler, namely: 16/// * AMDGPUAsmPrinter.{cpp,h} 17/// * AMDGPUTargetStreamer.{cpp,h} 18/// * AMDGPUDisassembler.{cpp,h} 20//===----------------------------------------------------------------------===// 22#ifndef LLVM_SUPPORT_AMDHSAKERNELDESCRIPTOR_H 23#define LLVM_SUPPORT_AMDHSAKERNELDESCRIPTOR_H 28// Gets offset of specified member in specified type. 30#define offsetof(TYPE, MEMBER) ((size_t)&((TYPE*)0)->MEMBER) 33// Creates enumeration entries used for packing bits into integers. Enumeration 34// entries include bit shift amount, bit width, and bit mask. 35#ifndef AMDHSA_BITS_ENUM_ENTRY 36#define AMDHSA_BITS_ENUM_ENTRY(NAME, SHIFT, WIDTH) \ 37 NAME ## _SHIFT = (SHIFT), \ 38 NAME ## _WIDTH = (WIDTH), \ 39 NAME = (((1 << (WIDTH)) - 1) << (SHIFT)) 40#endif// AMDHSA_BITS_ENUM_ENTRY 42// Gets bits for specified bit mask from specified source. 43#ifndef AMDHSA_BITS_GET 44#define AMDHSA_BITS_GET(SRC, MSK) ((SRC & MSK) >> MSK ## _SHIFT) 45#endif// AMDHSA_BITS_GET 47// Sets bits for specified bit mask in specified destination. 48#ifndef AMDHSA_BITS_SET 49#define AMDHSA_BITS_SET(DST, MSK, VAL) \ 53 DST |= ((local << MSK##_SHIFT) & MSK); \ 55#endif// AMDHSA_BITS_SET 60// Floating point rounding modes. Must match hardware definition. 68// Floating point denorm modes. Must match hardware definition. 76// System VGPR workitem IDs. Must match hardware definition. 84// Compute program resource register 1. Must match hardware definition. 86#define COMPUTE_PGM_RSRC1(NAME, SHIFT, WIDTH) \ 87 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC1_ ## NAME, SHIFT, WIDTH) 89#define COMPUTE_PGM_RSRC1_GFX6_GFX8(NAME, SHIFT, WIDTH) \ 90 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC1_GFX6_GFX8_ ## NAME, SHIFT, WIDTH) 92#define COMPUTE_PGM_RSRC1_GFX6_GFX9(NAME, SHIFT, WIDTH) \ 93 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC1_GFX6_GFX9_ ## NAME, SHIFT, WIDTH) 95#define COMPUTE_PGM_RSRC1_GFX6_GFX11(NAME, SHIFT, WIDTH) \ 96 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC1_GFX6_GFX11_##NAME, SHIFT, WIDTH) 98#define COMPUTE_PGM_RSRC1_GFX9_PLUS(NAME, SHIFT, WIDTH) \ 99 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC1_GFX9_PLUS_ ## NAME, SHIFT, WIDTH) 101#define COMPUTE_PGM_RSRC1_GFX10_PLUS(NAME, SHIFT, WIDTH) \ 102 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC1_GFX10_PLUS_ ## NAME, SHIFT, WIDTH) 104#define COMPUTE_PGM_RSRC1_GFX12_PLUS(NAME, SHIFT, WIDTH) \ 105 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC1_GFX12_PLUS_##NAME, SHIFT, WIDTH) 130#undef COMPUTE_PGM_RSRC1 132// Compute program resource register 2. Must match hardware definition. 134#define COMPUTE_PGM_RSRC2(NAME, SHIFT, WIDTH) \ 135 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC2_ ## NAME, SHIFT, WIDTH) 137#define COMPUTE_PGM_RSRC2_GFX6_GFX11(NAME, SHIFT, WIDTH) \ 138 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC2_GFX6_GFX11_##NAME, SHIFT, WIDTH) 140#define COMPUTE_PGM_RSRC2_GFX12_PLUS(NAME, SHIFT, WIDTH) \ 141 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC2_GFX12_PLUS_##NAME, SHIFT, WIDTH) 164#undef COMPUTE_PGM_RSRC2 166// Compute program resource register 3 for GFX90A+. Must match hardware 168#define COMPUTE_PGM_RSRC3_GFX90A(NAME, SHIFT, WIDTH) \ 169 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC3_GFX90A_ ## NAME, SHIFT, WIDTH) 176#undef COMPUTE_PGM_RSRC3_GFX90A 178// Compute program resource register 3 for GFX10+. Must match hardware 181#define COMPUTE_PGM_RSRC3_GFX10_PLUS(NAME, SHIFT, WIDTH) \ 182 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC3_GFX10_PLUS_ ## NAME, SHIFT, WIDTH) 184#define COMPUTE_PGM_RSRC3_GFX10(NAME, SHIFT, WIDTH) \ 185 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC3_GFX10_##NAME, SHIFT, WIDTH) 187#define COMPUTE_PGM_RSRC3_GFX10_GFX11(NAME, SHIFT, WIDTH) \ 188 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC3_GFX10_GFX11_##NAME, SHIFT, WIDTH) 190#define COMPUTE_PGM_RSRC3_GFX11_PLUS(NAME, SHIFT, WIDTH) \ 191 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC3_GFX11_PLUS_ ## NAME, SHIFT, WIDTH) 193#define COMPUTE_PGM_RSRC3_GFX11(NAME, SHIFT, WIDTH) \ 194 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC3_GFX11_##NAME, SHIFT, WIDTH) 196#define COMPUTE_PGM_RSRC3_GFX12_PLUS(NAME, SHIFT, WIDTH) \ 197 AMDHSA_BITS_ENUM_ENTRY(COMPUTE_PGM_RSRC3_GFX12_PLUS_##NAME, SHIFT, WIDTH) 213#undef COMPUTE_PGM_RSRC3_GFX10_PLUS 215// Kernel code properties. Must be kept backwards compatible. 216#define KERNEL_CODE_PROPERTY(NAME, SHIFT, WIDTH) \ 217 AMDHSA_BITS_ENUM_ENTRY(KERNEL_CODE_PROPERTY_ ## NAME, SHIFT, WIDTH) 231#undef KERNEL_CODE_PROPERTY 233// Kernarg preload specification. 234#define KERNARG_PRELOAD_SPEC(NAME, SHIFT, WIDTH) \ 235 AMDHSA_BITS_ENUM_ENTRY(KERNARG_PRELOAD_SPEC_##NAME, SHIFT, WIDTH) 240#undef KERNARG_PRELOAD_SPEC 242// Kernel descriptor. Must be kept backwards compatible. 274sizeof(kernel_descriptor_t) == 64,
275"invalid size for kernel_descriptor_t");
276static_assert(
offsetof(kernel_descriptor_t, group_segment_fixed_size) ==
278"invalid offset for group_segment_fixed_size");
279static_assert(
offsetof(kernel_descriptor_t, private_segment_fixed_size) ==
281"invalid offset for private_segment_fixed_size");
282static_assert(
offsetof(kernel_descriptor_t, kernarg_size) ==
284"invalid offset for kernarg_size");
286"invalid offset for reserved0");
287static_assert(
offsetof(kernel_descriptor_t, kernel_code_entry_byte_offset) ==
289"invalid offset for kernel_code_entry_byte_offset");
291"invalid offset for reserved1");
292static_assert(
offsetof(kernel_descriptor_t, compute_pgm_rsrc3) ==
294"invalid offset for compute_pgm_rsrc3");
295static_assert(
offsetof(kernel_descriptor_t, compute_pgm_rsrc1) ==
297"invalid offset for compute_pgm_rsrc1");
298static_assert(
offsetof(kernel_descriptor_t, compute_pgm_rsrc2) ==
300"invalid offset for compute_pgm_rsrc2");
301static_assert(
offsetof(kernel_descriptor_t, kernel_code_properties) ==
303"invalid offset for kernel_code_properties");
304static_assert(
offsetof(kernel_descriptor_t, kernarg_preload) ==
306"invalid offset for kernarg_preload");
308"invalid offset for reserved3");
310}
// end namespace amdhsa 311}
// end namespace llvm 313#endif// LLVM_SUPPORT_AMDHSAKERNELDESCRIPTOR_H #define offsetof(TYPE, MEMBER)
@ COMPUTE_PGM_RSRC3_GFX11
@ COMPUTE_PGM_RSRC3_GFX10
@ COMPUTE_PGM_RSRC3_GFX10_PLUS
@ COMPUTE_PGM_RSRC3_GFX12_PLUS
@ COMPUTE_PGM_RSRC3_GFX11_PLUS
@ COMPUTE_PGM_RSRC3_GFX10_GFX11
@ FLOAT_ROUND_MODE_PLUS_INFINITY
@ FLOAT_ROUND_MODE_NEAR_EVEN
@ FLOAT_ROUND_MODE_MINUS_INFINITY
@ COMPUTE_PGM_RSRC3_GFX90A
@ KERNEL_CODE_PROPERTIES_OFFSET
@ GROUP_SEGMENT_FIXED_SIZE_OFFSET
@ COMPUTE_PGM_RSRC3_OFFSET
@ KERNEL_CODE_ENTRY_BYTE_OFFSET_OFFSET
@ COMPUTE_PGM_RSRC1_OFFSET
@ COMPUTE_PGM_RSRC2_OFFSET
@ PRIVATE_SEGMENT_FIXED_SIZE_OFFSET
@ FLOAT_DENORM_MODE_FLUSH_SRC
@ FLOAT_DENORM_MODE_FLUSH_DST
@ FLOAT_DENORM_MODE_FLUSH_SRC_DST
@ FLOAT_DENORM_MODE_FLUSH_NONE
@ COMPUTE_PGM_RSRC1_GFX10_PLUS
@ COMPUTE_PGM_RSRC1_GFX12_PLUS
@ COMPUTE_PGM_RSRC1_GFX6_GFX8
@ COMPUTE_PGM_RSRC1_GFX6_GFX9
@ COMPUTE_PGM_RSRC1_GFX6_GFX11
@ COMPUTE_PGM_RSRC1_GFX9_PLUS
@ SYSTEM_VGPR_WORKITEM_ID_UNDEFINED
@ SYSTEM_VGPR_WORKITEM_ID_X
@ SYSTEM_VGPR_WORKITEM_ID_X_Y
@ SYSTEM_VGPR_WORKITEM_ID_X_Y_Z
@ COMPUTE_PGM_RSRC2_GFX6_GFX11
@ COMPUTE_PGM_RSRC2_GFX12_PLUS
This is an optimization pass for GlobalISel generic memory operations.
uint32_t group_segment_fixed_size
uint32_t compute_pgm_rsrc1
uint32_t private_segment_fixed_size
uint32_t compute_pgm_rsrc2
uint16_t kernel_code_properties
uint32_t compute_pgm_rsrc3
int64_t kernel_code_entry_byte_offset