AMDGPU 指令修饰符语法

约定

以下符号贯穿本文档

符号

描述

{0..N}

从 0 到 N(包括 0 和 N)范围内的任何整数值。

<x>

x 的语法和含义在其他地方解释。

修饰符

DS 修饰符

offset0

指定第一个 8 位偏移量,以字节为单位。默认值为 0。

与需要两个地址的 DS 指令一起使用。

语法

描述

offset0:{0..0xFF}

将无符号 8 位偏移量指定为正整数绝对表达式

示例

offset0:0xff
offset0:2-x
offset0:-x-y

offset1

指定第二个 8 位偏移量,以字节为单位。默认值为 0。

与需要两个地址的 DS 指令一起使用。

语法

描述

offset1:{0..0xFF}

将无符号 8 位偏移量指定为正整数绝对表达式

示例

offset1:0xff
offset1:2-x
offset1:-x-y

offset

指定 16 位偏移量,以字节为单位。默认值为 0。

与需要单个地址的 DS 指令一起使用。

语法

描述

offset:{0..0xFFFF}

将无符号 16 位偏移量指定为正整数绝对表达式

示例

offset:65535
offset:0xffff
offset:-x-y

swizzle pattern

这是一个特殊修饰符,只能与 ds_swizzle_b32 指令一起使用。它以数字或符号形式指定一个 swizzle 模式。默认值为 0。

语法

描述

offset:{0..0xFFFF}

指定 16 位 swizzle 模式。

offset:swizzle(QUAD_PERM,{0..3},{0..3},{0..3},{0..3})

指定四路置换模式

每个数字都是一个通道id

offset:swizzle(BITMASK_PERM, “<mask>”)

指定位掩码置换模式。

该模式将 5 位通道id 转换为另一个通道id,该通道id 与该通道交互。

mask 是一个 5 个字符的序列,用于指定如何转换通道id的位。

允许使用以下字符

  • “0” - 将位设置为 0。

  • “1” - 将位设置为 1。

  • “p” - 保留位。

  • “i” - 反转位。

offset:swizzle(BROADCAST,{2..32},{0..N})

指定广播模式。

将任何特定通道的值广播到其组中的所有通道。

第一个数字参数是组大小,必须等于 2、4、8、16 或 32。

第二个数字参数是要广播的通道的索引。

索引不得超过组大小。

offset:swizzle(SWAP,{1..16})

指定交换模式。

交换 1、2、4、8 或 16 个通道的相邻组。

offset:swizzle(REVERSE,{2..32})

指定反转模式。

反转 2、4、8、16 或 32 个通道组的通道。

注意:数字值可以指定为整数绝对表达式

示例

offset:255
offset:0xffff
offset:swizzle(QUAD_PERM, 0, 1, 2, 3)
offset:swizzle(BITMASK_PERM, "01pi0")
offset:swizzle(BROADCAST, 2, 0)
offset:swizzle(SWAP, 8)
offset:swizzle(REVERSE, 30 + 2)

gds

指定是否使用 GDS 或 LDS 内存(默认为 LDS)。

语法

描述

gds

使用 GDS 内存。

EXP 修饰符

done

指定这是否是从着色器到目标的最后一次导出。默认情况下,export 指令不会结束导出序列。

语法

描述

done

指示最后一次导出操作。

compr

指示数据是否已压缩(默认情况下数据未压缩)。

语法

描述

compr

数据已压缩。

vm

指定exec 掩码对于此 export 指令是否有效(默认情况下掩码无效)。

语法

描述

vm

设置标志,指示有效的exec 掩码。

row_en

指定是导出一行数据还是多行数据。

语法

描述

row_en

使用来自 M0 的行索引导出多行。

FLAT 修饰符

offset12

指定一个立即无符号 12 位偏移量,以字节为单位。默认值为 0。

语法

描述

offset:{0..4095}

将 12 位无符号偏移量指定为正整数绝对表达式

示例

offset:4095
offset:x-0xff

offset13s

指定一个立即有符号 13 位偏移量,以字节为单位。默认值为 0。

语法

描述

offset:{-4096..4095}

将 13 位有符号偏移量指定为整数绝对表达式

示例

offset:-4000
offset:0x10
offset:-x

offset12s

指定一个立即有符号 12 位偏移量,以字节为单位。默认值为 0。

语法

描述

offset:{-2048..2047}

将 12 位有符号偏移量指定为整数绝对表达式

示例

offset:-2000
offset:0x10
offset:-x+y

offset11

指定一个立即无符号 11 位偏移量,以字节为单位。默认值为 0。

语法

描述

offset:{0..2047}

将 11 位无符号偏移量指定为正整数绝对表达式

示例

offset:2047
offset:x+0xff

dlc

请参阅此处的描述。

glc

请参阅此处的描述。

lds

请参阅此处的描述。

slc

请参阅此处的描述。

tfe

请参阅此处的描述。

nv

请参阅此处的描述。

sc0

请参阅此处的描述。

sc1

请参阅此处的描述。

nt

请参阅此处的描述。

MIMG 修饰符

dmask

指定操作使用哪些通道(图像分量)。默认情况下,不使用任何通道。

语法

描述

dmask:{0..15}

将图像通道指定为正整数绝对表达式

每个位对应于 4 个图像分量(RGBA)之一。

如果指定的位值为 0,则不使用图像分量,而值 1 表示使用该分量。

此修饰符有一些限制,具体取决于指令类型

指令类型

有效的 dmask 值

32 位原子 cmpswap

0x3

cmpswap 外的 32 位原子指令

0x1

64 位原子 cmpswap

0xF

cmpswap 外的 64 位原子指令

0x3

gather4

0x1, 0x2, 0x4, 0x8

GFX11+ msaa_load

0x1, 0x2, 0x4, 0x8

其他指令

任何值

示例

dmask:0xf
dmask:0b1111
dmask:x|y|z

unorm

指定地址是否已规范化(默认情况下地址已规范化)。

语法

描述

unorm

强制地址不规范化。

glc

请参阅此处的描述。

slc

请参阅此处的描述。

r128

指定纹理资源大小。默认大小为 256 位。

语法

描述

r128

指定 128 位纹理资源大小。

警告

使用此修饰符应将 rsrc 操作数大小从 8 个 dword 减少到 4 个 dword,但汇编器目前不支持此功能。

tfe

请参阅此处的描述。

lwe

指定 LOD 警告状态(默认情况下禁用 LOD 警告)。

语法

描述

lwe

启用 LOD 警告。

da

指定是否必须将数组索引发送到 TA。默认情况下,不发送数组索引。

语法

描述

da

将数组索引发送到 TA。

d16

指定数据大小:16 位或 32 位(默认为 32 位)。

语法

描述

d16

启用 16 位数据模式。

在加载时,将内存中的数据转换为 16 位格式,然后再将其存储在 VGPR 中。

对于存储,在将值写入内存之前,将 VGPR 中的 16 位数据转换为 32 位。

请注意,GFX8.0 不支持数据打包。每个 16 位数据元素占用 1 个 VGPR。

GFX8.1 和 GFX9+ 支持数据打包。每对 16 位数据元素占用 1 个 VGPR。

a16

指定图像地址分量的大小:16 位或 32 位(默认为 32 位)。

语法

描述

a16

启用 16 位图像地址分量。

dim

指定表面维度。这是一个强制修饰符。没有默认值。

语法

描述

dim:1D

一维图像。

dim:2D

二维图像。

dim:3D

三维图像。

dim:CUBE

立方体贴图数组。

dim:1D_ARRAY

一维图像数组。

dim:2D_ARRAY

二维图像数组。

dim:2D_MSAA

二维多重采样抗锯齿图像。

dim:2D_MSAA_ARRAY

二维多重采样抗锯齿图像数组。

下表定义了与 SP3 汇编器兼容的替代语法

语法

描述

dim:SQ_RSRC_IMG_1D

一维图像。

dim:SQ_RSRC_IMG_2D

二维图像。

dim:SQ_RSRC_IMG_3D

三维图像。

dim:SQ_RSRC_IMG_CUBE

立方体贴图数组。

dim:SQ_RSRC_IMG_1D_ARRAY

一维图像数组。

dim:SQ_RSRC_IMG_2D_ARRAY

二维图像数组。

dim:SQ_RSRC_IMG_2D_MSAA

二维多重采样抗锯齿图像。

dim:SQ_RSRC_IMG_2D_MSAA_ARRAY

二维多重采样抗锯齿图像数组。

dlc

请参阅此处的描述。

杂项修饰符

dlc

控制内存操作的设备级缓存策略。用于同步。指定后,强制操作绕过设备级缓存,使操作在设备级保持一致。默认情况下,指令使用设备级缓存。

语法

描述

dlc

绕过设备级缓存。

glc

对于原子操作码,此修饰符指示指令返回操作前内存中的值。对于其他操作码,它与slc 一起使用以指定缓存策略。

默认值为关闭 (0)。

语法

描述

glc

将 glc 位设置为 1。

lds

指定结果的存储位置:VGPR 或 LDS(默认为 VGPR)。

语法

描述

lds

将结果存储在 LDS 中。

nv

指定指令是否在非易失性内存上操作。默认情况下,内存是易失性的。

语法

描述

nv

指示指令在非易失性内存上操作。

slc

控制 L2 缓存的行为。默认值为关闭 (0)。

语法

描述

slc

将 slc 位设置为 1。

tfe

控制对部分驻留纹理的访问。默认值为关闭 (0)。

语法

描述

tfe

将 tfe 位设置为 1。

sc0

对于原子操作码,此修饰符指示指令返回操作前内存中的值。对于其他操作码,它与sc1 一起使用以指定缓存策略。

语法

描述

sc0

将 sc0 位设置为 1。

sc1

此修饰符与sc0 一起使用以指定缓存策略。

语法

描述

sc1

将 sc1 位设置为 1。

nt

指示使用非临时数据的操作。

语法

描述

nt

将 nt 位设置为 1。

MUBUF/MTBUF 修饰符

idxen

指定地址分量是否包含索引。默认情况下,不使用索引。

可以与offen 一起使用。

不能与addr64 一起使用。

语法

描述

idxen

地址分量包括索引。

offen

指定地址分量是否包含偏移量。默认情况下,不使用偏移量。

可以与idxen 一起使用。

不能与addr64 一起使用。

语法

描述

offen

地址分量包括偏移量。

addr64

指定是否使用 64 位地址。默认情况下,不使用地址。

不能与offenidxen 修饰符一起使用。

语法

描述

addr64

使用 64 位地址。

offset12

指定一个立即无符号 12 位偏移量,以字节为单位。默认值为 0。

语法

描述

offset:{0..0xFFF}

将 12 位无符号偏移量指定为正整数绝对表达式

示例

offset:x+y
offset:0x10

glc

请参阅此处的描述。

slc

请参阅此处的描述。

lds

请参阅此处的描述。

dlc

请参阅此处的描述。

tfe

请参阅此处的描述。

fmt

指定操作使用的数据和数字格式。默认数字格式为 BUF_NUM_FORMAT_UNORM。默认数据格式为 BUF_DATA_FORMAT_8。

语法

描述

format:{0..127}

使用以整数绝对表达式形式指定的格式。

format:[<数据格式>]

使用指定的数据格式和默认数字格式。

format:[<数字格式>]

使用指定的数字格式和默认数据格式。

format:[<数据格式>,<数字格式>]

使用指定的数据和数字格式。

format:[<数字格式>,<数据格式>]

使用指定的数据和数字格式。

下表定义了支持的数据格式

语法

注意

BUF_DATA_FORMAT_INVALID

BUF_DATA_FORMAT_8

默认值。

BUF_DATA_FORMAT_16

BUF_DATA_FORMAT_8_8

BUF_DATA_FORMAT_32

BUF_DATA_FORMAT_16_16

BUF_DATA_FORMAT_10_11_11

BUF_DATA_FORMAT_11_11_10

BUF_DATA_FORMAT_10_10_10_2

BUF_DATA_FORMAT_2_10_10_10

BUF_DATA_FORMAT_8_8_8_8

BUF_DATA_FORMAT_32_32

BUF_DATA_FORMAT_16_16_16_16

BUF_DATA_FORMAT_32_32_32

BUF_DATA_FORMAT_32_32_32_32

BUF_DATA_FORMAT_RESERVED_15

下面定义了支持的数字格式

语法

注意

BUF_NUM_FORMAT_UNORM

默认值。

BUF_NUM_FORMAT_SNORM

BUF_NUM_FORMAT_USCALED

BUF_NUM_FORMAT_SSCALED

BUF_NUM_FORMAT_UINT

BUF_NUM_FORMAT_SINT

BUF_NUM_FORMAT_SNORM_OGL

仅限 GFX7。

BUF_NUM_FORMAT_RESERVED_6

仅限 GFX8 和 GFX9。

BUF_NUM_FORMAT_FLOAT

示例

format:0
format:127
format:[BUF_DATA_FORMAT_16]
format:[BUF_DATA_FORMAT_16,BUF_NUM_FORMAT_SSCALED]
format:[BUF_NUM_FORMAT_FLOAT]

ufmt

指定操作使用的统一格式。默认格式为 BUF_FMT_8_UNORM。

语法

描述

format:{0..127}

使用以整数绝对表达式形式指定的统一格式。请注意,统一格式编号与 pre-GFX10 ISA 使用的格式编号不兼容。

format:[<统一格式>]

使用指定的统一格式。

统一格式是datanumeric 格式的替代品。为了与旧版 ISA 兼容,仍然接受具有数据和数字格式的语法,前提是格式的组合可以映射到统一格式。

下面定义了支持的统一格式以及等效的数据和数字格式组合

统一格式语法

等效数据格式

等效数字格式

注意

BUF_FMT_INVALID

BUF_DATA_FORMAT_INVALID

BUF_NUM_FORMAT_UNORM

BUF_FMT_8_UNORM

BUF_DATA_FORMAT_8

BUF_NUM_FORMAT_UNORM

BUF_FMT_8_SNORM

BUF_DATA_FORMAT_8

BUF_NUM_FORMAT_SNORM

BUF_FMT_8_USCALED

BUF_DATA_FORMAT_8

BUF_NUM_FORMAT_USCALED

BUF_FMT_8_SSCALED

BUF_DATA_FORMAT_8

BUF_NUM_FORMAT_SSCALED

BUF_FMT_8_UINT

BUF_DATA_FORMAT_8

BUF_NUM_FORMAT_UINT

BUF_FMT_8_SINT

BUF_DATA_FORMAT_8

BUF_NUM_FORMAT_SINT

BUF_FMT_16_UNORM

BUF_DATA_FORMAT_16

BUF_NUM_FORMAT_UNORM

BUF_FMT_16_SNORM

BUF_DATA_FORMAT_16

BUF_NUM_FORMAT_SNORM

BUF_FMT_16_USCALED

BUF_DATA_FORMAT_16

BUF_NUM_FORMAT_USCALED

BUF_FMT_16_SSCALED

BUF_DATA_FORMAT_16

BUF_NUM_FORMAT_SSCALED

BUF_FMT_16_UINT

BUF_DATA_FORMAT_16

BUF_NUM_FORMAT_UINT

BUF_FMT_16_SINT

BUF_DATA_FORMAT_16

BUF_NUM_FORMAT_SINT

BUF_FMT_16_FLOAT

BUF_DATA_FORMAT_16

BUF_NUM_FORMAT_FLOAT

BUF_FMT_8_8_UNORM

BUF_DATA_FORMAT_8_8

BUF_NUM_FORMAT_UNORM

BUF_FMT_8_8_SNORM

BUF_DATA_FORMAT_8_8

BUF_NUM_FORMAT_SNORM

BUF_FMT_8_8_USCALED

BUF_DATA_FORMAT_8_8

BUF_NUM_FORMAT_USCALED

BUF_FMT_8_8_SSCALED

BUF_DATA_FORMAT_8_8

BUF_NUM_FORMAT_SSCALED

BUF_FMT_8_8_UINT

BUF_DATA_FORMAT_8_8

BUF_NUM_FORMAT_UINT

BUF_FMT_8_8_SINT

BUF_DATA_FORMAT_8_8

BUF_NUM_FORMAT_SINT

BUF_FMT_32_UINT

BUF_DATA_FORMAT_32

BUF_NUM_FORMAT_UINT

BUF_FMT_32_SINT

BUF_DATA_FORMAT_32

BUF_NUM_FORMAT_SINT

BUF_FMT_32_FLOAT

BUF_DATA_FORMAT_32

BUF_NUM_FORMAT_FLOAT

BUF_FMT_16_16_UNORM

BUF_DATA_FORMAT_16_16

BUF_NUM_FORMAT_UNORM

BUF_FMT_16_16_SNORM

BUF_DATA_FORMAT_16_16

BUF_NUM_FORMAT_SNORM

BUF_FMT_16_16_USCALED

BUF_DATA_FORMAT_16_16

BUF_NUM_FORMAT_USCALED

BUF_FMT_16_16_SSCALED

BUF_DATA_FORMAT_16_16

BUF_NUM_FORMAT_SSCALED

BUF_FMT_16_16_UINT

BUF_DATA_FORMAT_16_16

BUF_NUM_FORMAT_UINT

BUF_FMT_16_16_SINT

BUF_DATA_FORMAT_16_16

BUF_NUM_FORMAT_SINT

BUF_FMT_16_16_FLOAT

BUF_DATA_FORMAT_16_16

BUF_NUM_FORMAT_FLOAT

BUF_FMT_10_11_11_UNORM

BUF_DATA_FORMAT_10_11_11

BUF_NUM_FORMAT_UNORM

仅限 GFX10

BUF_FMT_10_11_11_SNORM

BUF_DATA_FORMAT_10_11_11

BUF_NUM_FORMAT_SNORM

仅限 GFX10

BUF_FMT_10_11_11_USCALED

BUF_DATA_FORMAT_10_11_11

BUF_NUM_FORMAT_USCALED

仅限 GFX10

BUF_FMT_10_11_11_SSCALED

BUF_DATA_FORMAT_10_11_11

BUF_NUM_FORMAT_SSCALED

仅限 GFX10

BUF_FMT_10_11_11_UINT

BUF_DATA_FORMAT_10_11_11

BUF_NUM_FORMAT_UINT

仅限 GFX10

BUF_FMT_10_11_11_SINT

BUF_DATA_FORMAT_10_11_11

BUF_NUM_FORMAT_SINT

仅限 GFX10

BUF_FMT_10_11_11_FLOAT

BUF_DATA_FORMAT_10_11_11

BUF_NUM_FORMAT_FLOAT

BUF_FMT_11_11_10_UNORM

BUF_DATA_FORMAT_11_11_10

BUF_NUM_FORMAT_UNORM

仅限 GFX10

BUF_FMT_11_11_10_SNORM

BUF_DATA_FORMAT_11_11_10

BUF_NUM_FORMAT_SNORM

仅限 GFX10

BUF_FMT_11_11_10_USCALED

BUF_DATA_FORMAT_11_11_10

BUF_NUM_FORMAT_USCALED

仅限 GFX10

BUF_FMT_11_11_10_SSCALED

BUF_DATA_FORMAT_11_11_10

BUF_NUM_FORMAT_SSCALED

仅限 GFX10

BUF_FMT_11_11_10_UINT

BUF_DATA_FORMAT_11_11_10

BUF_NUM_FORMAT_UINT

仅限 GFX10

BUF_FMT_11_11_10_SINT

BUF_DATA_FORMAT_11_11_10

BUF_NUM_FORMAT_SINT

仅限 GFX10

BUF_FMT_11_11_10_FLOAT

BUF_DATA_FORMAT_11_11_10

BUF_NUM_FORMAT_FLOAT

BUF_FMT_10_10_10_2_UNORM

BUF_DATA_FORMAT_10_10_10_2

BUF_NUM_FORMAT_UNORM

BUF_FMT_10_10_10_2_SNORM

BUF_DATA_FORMAT_10_10_10_2

BUF_NUM_FORMAT_SNORM

BUF_FMT_10_10_10_2_USCALED

BUF_DATA_FORMAT_10_10_10_2

BUF_NUM_FORMAT_USCALED

仅限 GFX10

BUF_FMT_10_10_10_2_SSCALED

BUF_DATA_FORMAT_10_10_10_2

BUF_NUM_FORMAT_SSCALED

仅限 GFX10

BUF_FMT_10_10_10_2_UINT

BUF_DATA_FORMAT_10_10_10_2

BUF_NUM_FORMAT_UINT

BUF_FMT_10_10_10_2_SINT

BUF_DATA_FORMAT_10_10_10_2

BUF_NUM_FORMAT_SINT

BUF_FMT_2_10_10_10_UNORM

BUF_DATA_FORMAT_2_10_10_10

BUF_NUM_FORMAT_UNORM

BUF_FMT_2_10_10_10_SNORM

BUF_DATA_FORMAT_2_10_10_10

BUF_NUM_FORMAT_SNORM

BUF_FMT_2_10_10_10_USCALED

BUF_DATA_FORMAT_2_10_10_10

BUF_NUM_FORMAT_USCALED

BUF_FMT_2_10_10_10_SSCALED

BUF_DATA_FORMAT_2_10_10_10

BUF_NUM_FORMAT_SSCALED

BUF_FMT_2_10_10_10_UINT

BUF_DATA_FORMAT_2_10_10_10

BUF_NUM_FORMAT_UINT

BUF_FMT_2_10_10_10_SINT

BUF_DATA_FORMAT_2_10_10_10

BUF_NUM_FORMAT_SINT

BUF_FMT_8_8_8_8_UNORM

BUF_DATA_FORMAT_8_8_8_8

BUF_NUM_FORMAT_UNORM

BUF_FMT_8_8_8_8_SNORM

BUF_DATA_FORMAT_8_8_8_8

BUF_NUM_FORMAT_SNORM

BUF_FMT_8_8_8_8_USCALED

BUF_DATA_FORMAT_8_8_8_8

BUF_NUM_FORMAT_USCALED

BUF_FMT_8_8_8_8_SSCALED

BUF_DATA_FORMAT_8_8_8_8

BUF_NUM_FORMAT_SSCALED

BUF_FMT_8_8_8_8_UINT

BUF_DATA_FORMAT_8_8_8_8

BUF_NUM_FORMAT_UINT

BUF_FMT_8_8_8_8_SINT

BUF_DATA_FORMAT_8_8_8_8

BUF_NUM_FORMAT_SINT

BUF_FMT_32_32_UINT

BUF_DATA_FORMAT_32_32

BUF_NUM_FORMAT_UINT

BUF_FMT_32_32_SINT

BUF_DATA_FORMAT_32_32

BUF_NUM_FORMAT_SINT

BUF_FMT_32_32_FLOAT

BUF_DATA_FORMAT_32_32

BUF_NUM_FORMAT_FLOAT

BUF_FMT_16_16_16_16_UNORM

BUF_DATA_FORMAT_16_16_16_16

BUF_NUM_FORMAT_UNORM

BUF_FMT_16_16_16_16_SNORM

BUF_DATA_FORMAT_16_16_16_16

BUF_NUM_FORMAT_SNORM

BUF_FMT_16_16_16_16_USCALED

BUF_DATA_FORMAT_16_16_16_16

BUF_NUM_FORMAT_USCALED

BUF_FMT_16_16_16_16_SSCALED

BUF_DATA_FORMAT_16_16_16_16

BUF_NUM_FORMAT_SSCALED

BUF_FMT_16_16_16_16_UINT

BUF_DATA_FORMAT_16_16_16_16

BUF_NUM_FORMAT_UINT

BUF_FMT_16_16_16_16_SINT

BUF_DATA_FORMAT_16_16_16_16

BUF_NUM_FORMAT_SINT

BUF_FMT_16_16_16_16_FLOAT

BUF_DATA_FORMAT_16_16_16_16

BUF_NUM_FORMAT_FLOAT

BUF_FMT_32_32_32_UINT

BUF_DATA_FORMAT_32_32_32

BUF_NUM_FORMAT_UINT

BUF_FMT_32_32_32_SINT

BUF_DATA_FORMAT_32_32_32

BUF_NUM_FORMAT_SINT

BUF_FMT_32_32_32_FLOAT

BUF_DATA_FORMAT_32_32_32

BUF_NUM_FORMAT_FLOAT

BUF_FMT_32_32_32_32_UINT

BUF_DATA_FORMAT_32_32_32_32

BUF_NUM_FORMAT_UINT

BUF_FMT_32_32_32_32_SINT

BUF_DATA_FORMAT_32_32_32_32

BUF_NUM_FORMAT_SINT

BUF_FMT_32_32_32_32_FLOAT

BUF_DATA_FORMAT_32_32_32_32

BUF_NUM_FORMAT_FLOAT

示例

format:0
format:[BUF_FMT_32_UINT]

SMRD/SMEM 修饰符

glc

请参阅此处的描述。

nv

请参阅此处的描述。

dlc

请参阅此处的描述。

offset20u

指定一个无符号 20 位偏移量,以字节为单位。默认值为 0。

语法

描述

offset:{0..0xFFFFF}

将偏移量指定为正整数绝对表达式

示例

offset:1
offset:0xfffff
offset:x-y

offset21s

指定一个有符号 21 位偏移量,以字节为单位。默认值为 0。

语法

描述

offset:{-0x100000..0xFFFFF}

将偏移量指定为整数绝对表达式

示例

offset:-1
offset:0xfffff
offset:-x

VINTRP/VINTERP/LDSDIR 修饰符

high

指定要使用的 LDS 字的哪一半。默认情况下使用 LDS 字的低半部分。

语法

描述

high

使用 LDS 字的高半部分。

neg

请参阅此处的描述。

wait_exp

指定在发出当前指令之前等待 EXP 计数器。计数器必须小于或等于此值,然后才能发出指令。如果设置为 7,则不执行等待。

默认值为零。这是一个安全值,但可能不是最优值。

语法

描述

wait_exp:{0..7}

在发出此指令之前,额外等待 EXP 计数器。

wait_vdst

指定在发出当前指令之前等待 VA_VDST 计数器。计数器必须小于或等于此值,然后才能发出指令。如果设置为 15,则不执行等待。

默认值为零。这是一个安全值,但可能不是最优值。

语法

描述

wait_vdst:{0..15}

在发出此指令之前,额外等待 VA_VDST 计数器。

DPP8 修饰符

dpp8_sel

选择从 8 个通道组中的哪些通道拉取数据。这是一个强制修饰符。没有默认值。

dpp8_sel 修饰符必须准确指定 8 个值。第一个值选择要从中读取数据的通道,以向通道 0 提供数据。第二个值控制通道 1,依此类推。

每个值都可以指定为整数绝对表达式

语法

描述

dpp8:[{0..7},{0..7},{0..7},{0..7},{0..7},{0..7},{0..7},{0..7}]

选择要从中读取数据的通道。

示例

dpp8:[7,6,5,4,3,2,1,0]
dpp8:[0,1,0,1,0,1,0,1]

fi

控制 dpp8 指令与非活动通道的交互。默认值为零。

注意:非活动 通道是那些 exec 掩码位为零的通道。

语法

描述

fi:0

当从非活动通道访问数据时,获取零。

fi:1

从非活动通道获取预先存在的值。

注意:数字值可以指定为整数绝对表达式

DPP 修饰符

dpp_ctrl

指定如何在线程之间共享数据。这是一个强制修饰符。没有默认值。

注意:波前的通道组织成四个和四个bank

语法

描述

quad_perm:[{0..3},{0..3},{0..3},{0..3}]

4 个线程的完全置换。

row_mirror

镜像行内的线程。

row_half_mirror

镜像 1/2 行(8 个线程)内的线程。

row_bcast:15

将每行的第 15 个线程广播到下一行。

row_bcast:31

将线程 31 广播到第 2 行和第 3 行。

wave_shl:1

波前左移 1 个线程。

wave_rol:1

波前左旋 1 个线程。

wave_shr:1

波前右移 1 个线程。

wave_ror:1

波前右旋 1 个线程。

row_shl:{1..15}

行左移 1-15 个线程。

row_shr:{1..15}

行右移 1-15 个线程。

row_ror:{1..15}

行右旋 1-15 个线程。

注意:数字值可以指定为整数绝对表达式

示例

quad_perm:[0, 1, 2, 3]
row_shl:3

dpp16_ctrl

指定如何在线程之间共享数据。这是一个强制修饰符。没有默认值。

注意:波前的通道组织成四个和四个bank。(在 wave32 模式下只有两行。)

语法

描述

quad_perm:[{0..3},{0..3},{0..3},{0..3}]

4 个线程的完全置换。

row_mirror

镜像行内的线程。

row_half_mirror

镜像 1/2 行(8 个线程)内的线程。

row_share:{0..15}

与行中的其他通道共享来自指定通道的值。

row_xmask:{0..15}

从 XOR(<当前通道 id>,<指定通道 id>) 获取。

row_shl:{1..15}

行左移 1-15 个线程。

row_shr:{1..15}

行右移 1-15 个线程。

row_ror:{1..15}

行右旋 1-15 个线程。

注意:数字值可以指定为整数绝对表达式

示例

quad_perm:[0, 1, 2, 3]
row_shl:3

dpp32_ctrl

指定如何在线程之间共享数据。这是一个强制修饰符。没有默认值。

注意:波前的通道组织成四个和四个bank

语法

描述

quad_perm:[{0..3},{0..3},{0..3},{0..3}]

4 个线程的完全置换。

row_mirror

镜像行内的线程。

row_half_mirror

镜像 1/2 行(8 个线程)内的线程。

row_bcast:15

将每行的第 15 个线程广播到下一行。

row_bcast:31

将线程 31 广播到第 2 行和第 3 行。

wave_shl:1

波前左移 1 个线程。

wave_rol:1

波前左旋 1 个线程。

wave_shr:1

波前右移 1 个线程。

wave_ror:1

波前右旋 1 个线程。

row_shl:{1..15}

行左移 1-15 个线程。

row_shr:{1..15}

行右移 1-15 个线程。

row_ror:{1..15}

行右旋 1-15 个线程。

row_newbcast:{1..15}

将行内的线程广播到整行。

注意:数字值可以指定为整数绝对表达式

示例

quad_perm:[0, 1, 2, 3]
row_shl:3

dpp64_ctrl

指定如何在线程之间共享数据。这是一个强制修饰符。没有默认值。

注意:波前的通道组织成四个和四个bank

语法

描述

row_newbcast:{1..15}

将行内的线程广播到整行。

注意:数字值可以指定为整数绝对表达式

示例

row_newbcast:3

row_mask

控制哪些行启用数据共享。默认情况下,所有行都已启用。

注意:波前的通道组织成四个和四个bank。(在 wave32 模式下只有两行。)

语法

描述

row_mask:{0..15}

行掩码指定为正整数绝对表达式

掩码中的 4 位中的每一位控制一行(0 - 禁用,1 - 启用)。

wave32 模式下,值应限制为 {0..7}。

示例

row_mask:0xf
row_mask:0b1010
row_mask:x|y

bank_mask

控制哪些 bank 启用数据共享。默认情况下,所有 bank 都已启用。

注意:波前的通道组织成四个和四个bank。(在 wave32 模式下只有两行。)

语法

描述

bank_mask:{0..15}

指定bank mask 为正 整数绝对表达式

掩码中的每 4 位控制一个 bank (0 - 禁用, 1 - 启用)。

示例

bank_mask:0x3
bank_mask:0b0011
bank_mask:x&y

bound_ctrl

控制访问无效 lane 时的数据共享。默认情况下,禁用与无效 lane 的数据共享。

语法

描述

bound_ctrl:1

启用与无效 lane 的数据共享。

从无效 lane 访问数据将返回零。

bound_ctrl:0 (GFX11+)

禁用与无效 lane 的数据共享。

警告

由于历史原因,对于较旧的架构,bound_ctrl:0bound_ctrl:1 具有相同的含义。

fi

控制 dpp16 指令与非活动 lane 的交互。默认值为零。

注意:非活动 通道是那些 exec 掩码位为零的通道。

语法

描述

fi:0

与非活动 lane 的交互由 bound_ctrl 控制。

fi:1

从非活动通道获取预先存在的值。

注意:数字值可以指定为整数绝对表达式

SDWA 修饰符

clamp

请参阅 此处 的描述。

omod

请参阅 此处 的描述。

dst_sel

选择目标寄存器中受影响的位。默认情况下,所有位都受影响。

语法

描述

dst_sel:DWORD

使用位 31:0。

dst_sel:BYTE_0

使用位 7:0。

dst_sel:BYTE_1

使用位 15:8。

dst_sel:BYTE_2

使用位 23:16。

dst_sel:BYTE_3

使用位 31:24。

dst_sel:WORD_0

使用位 15:0。

dst_sel:WORD_1

使用位 31:16。

dst_unused

控制如何处理目标寄存器中未被 dst_sel 选中的位。默认情况下,未使用的位会被保留。

语法

描述

dst_unused:UNUSED_PAD

用零填充。

dst_unused:UNUSED_SEXT

符号扩展高位,零填充低位。

dst_unused:UNUSED_PRESERVE

保留位。

src0_sel

控制使用 src0 中的哪些位。默认情况下,使用所有位。

语法

描述

src0_sel:DWORD

使用位 31:0。

src0_sel:BYTE_0

使用位 7:0。

src0_sel:BYTE_1

使用位 15:8。

src0_sel:BYTE_2

使用位 23:16。

src0_sel:BYTE_3

使用位 31:24。

src0_sel:WORD_0

使用位 15:0。

src0_sel:WORD_1

使用位 31:16。

src1_sel

控制使用 src1 中的哪些位。默认情况下,使用所有位。

语法

描述

src1_sel:DWORD

使用位 31:0。

src1_sel:BYTE_0

使用位 7:0。

src1_sel:BYTE_1

使用位 15:8。

src1_sel:BYTE_2

使用位 23:16。

src1_sel:BYTE_3

使用位 31:24。

src1_sel:WORD_0

使用位 15:0。

src1_sel:WORD_1

使用位 31:16。

SDWA 操作数修饰符

操作数修饰符不单独使用。它们应用于源操作数。

abs

请参阅 此处 的描述。

neg

请参阅此处的描述。

sext

符号扩展(子字)整数操作数的值以填充所有 32 位。

仅对整数操作数有效。

语法

描述

sext(<operand>)

符号扩展操作数值。

示例

sext(v4)
sext(v255)

VOP3 修饰符

op_sel

为源操作数和目标操作数选择低 [15:0] 位或高 [31:16] 位操作数位。默认情况下,所有操作数都使用低位。

与 op_sel 修饰符一起指定的值的数量必须与指令操作数(源操作数和目标操作数)的数量匹配。第一个值控制 src0,第二个值控制 src1,依此类推,但最后一个值控制目标寄存器。值 0 选择低位,而 1 选择高位。

注意:op_sel 修饰符仅影响 16 位操作数。对于 32 位操作数,op_sel 指定的值必须为 0。

语法

描述

op_sel:[{0..1},{0..1}]

为具有 1 个源操作数的指令选择操作数位。

op_sel:[{0..1},{0..1},{0..1}]

为具有 2 个源操作数的指令选择操作数位。

op_sel:[{0..1},{0..1},{0..1},{0..1}]

为具有 3 个源操作数的指令选择操作数位。

注意:数字值可以指定为整数绝对表达式

示例

op_sel:[0,0]
op_sel:[0,1]

dpp_op_sel

这是 op_sel 的特殊版本,用于 permlane 操作码,以指定类似 dpp 模式的位 - fibound_ctrl

语法

描述

op_sel:[{0..1},{0..1}]

第一位指定 fi,第二位指定 bound_ctrl

注意:数字值可以指定为整数绝对表达式

示例

op_sel:[0,0]

clamp

Clamp 的含义取决于指令。

对于 v_cmp 指令,clamp 修饰符表示如果发生浮点异常,则发出信号。默认情况下,禁用信号。

对于整数运算,clamp 修饰符表示结果必须 clamped 到最大和最小可表示值。默认情况下,没有 clamping。

对于浮点运算,clamp 修饰符表示结果必须 clamped 到范围 [0.0, 1.0]。默认情况下,没有 clamping。

注意:clamp 修饰符在 输出修饰符(如果有)之后应用。

语法

描述

clamp

启用 clamping(或信号)。

omod

指定是否必须将输出修饰符应用于结果。假定结果是浮点数。

默认情况下,不应用输出修饰符。

注意:输出修饰符在 clamping(如果有)之前应用。

语法

描述

mul:2

将结果乘以 2。

mul:4

将结果乘以 4。

div:2

将结果乘以 0.5。

注意:数字值可以指定为整数绝对表达式

示例

mul:2
mul:x      // x must be equal to 2 or 4

VOP3 操作数修饰符

操作数修饰符不单独使用。它们应用于源操作数。

abs

计算其操作数的绝对值。必须在 neg(如果有)之前应用。仅对浮点操作数有效。

语法

描述

abs(<operand>)

获取浮点操作数的绝对值。

|<operand>|

与上面相同(SP3 语法)。

注意:避免将 SP3 语法与指定为表达式的操作数一起使用,因为尾随的“|”可能会被误解。此类操作数应括在额外的括号中,如下例所示。

示例

abs(v36)
|v36|
abs(x|y)     // ok
|(x|y)|      // additional parentheses are required

neg

计算其操作数的负值。必须在 abs(如果有)之后应用。仅对浮点操作数有效。

语法

描述

neg(<operand>)

获取浮点操作数的负值。可选的 abs 修饰符可以在求反之前应用于操作数。

-\<operand>

与上面相同(SP3 语法)。

注意:由于潜在的歧义,SP3 语法受到限制。目前,在以下情况下允许使用:

  • 在寄存器之前。

  • abs 修饰符之前。

  • 在 SP3 abs 修饰符之前。

在所有其他情况下,“-”都作为符号后面的表达式的一部分处理。

示例

// Operands with negate modifiers
neg(v[0])
neg(1.0)
neg(abs(v0))
-v5
-abs(v5)
-|v5|

// Expressions where "-" has a different meaning
-1
-x+y

VOP3P 修饰符

本节介绍 regular VOP3P 指令的修饰符。

v_mad_mix*v_fma_mix* 指令以 特殊方式 使用这些修饰符。

op_sel

选择低 [15:0] 位或高 [31:16] 位操作数位作为操作的输入,这将导致目标的低半部分。默认情况下,所有操作数都使用低 16 位。

op_sel 修饰符指定的值的数量必须与源操作数的数量匹配。第一个值控制 src0,第二个值控制 src1,依此类推。

值 0 选择低位,而 1 选择高位。

语法

描述

op_sel:[{0..1}]

为具有 1 个源操作数的指令选择操作数位。

op_sel:[{0..1},{0..1}]

为具有 2 个源操作数的指令选择操作数位。

op_sel:[{0..1},{0..1},{0..1}]

为具有 3 个源操作数的指令选择操作数位。

注意:数字值可以指定为整数绝对表达式

示例

op_sel:[0,0]
op_sel:[0,1,0]

op_sel_hi

选择低 [15:0] 位或高 [31:16] 位操作数位作为操作的输入,这将导致目标的上半部分。默认情况下,所有操作数都使用高 16 位。

op_sel_hi 修饰符指定的值的数量必须与源操作数的数量匹配。第一个值控制 src0,第二个值控制 src1,依此类推。

值 0 选择低位,而 1 选择高位。

语法

描述

op_sel_hi:[{0..1}]

为具有 1 个源操作数的指令选择操作数位。

op_sel_hi:[{0..1},{0..1}]

为具有 2 个源操作数的指令选择操作数位。

op_sel_hi:[{0..1},{0..1},{0..1}]

为具有 3 个源操作数的指令选择操作数位。

注意:数字值可以指定为整数绝对表达式

示例

op_sel_hi:[0,0]
op_sel_hi:[0,0,1]

neg_lo

指定是否更改由 op_sel 选择的操作数值的符号。然后,这些值用作操作的输入,这将导致目标的上半部分。

由此修饰符指定的值的数量必须与源操作数的数量匹配。第一个值控制 src0,第二个值控制 src1,依此类推。

值 0 表示使用相应的未修改的操作数值,值 1 表示必须使用操作数的负值。

默认情况下,操作数值保持未修改。

此修饰符仅对浮点操作数有效。

语法

描述

neg_lo:[{0..1}]

为具有 1 个源操作数的指令选择受影响的操作数。

neg_lo:[{0..1},{0..1}]

为具有 2 个源操作数的指令选择受影响的操作数。

neg_lo:[{0..1},{0..1},{0..1}]

为具有 3 个源操作数的指令选择受影响的操作数。

注意:数字值可以指定为整数绝对表达式

示例

neg_lo:[0]
neg_lo:[0,1]

neg_hi

指定是否更改由 op_sel_hi 选择的操作数值的符号。然后,这些值用作操作的输入,这将导致目标的上半部分。

由此修饰符指定的值的数量必须与源操作数的数量匹配。第一个值控制 src0,第二个值控制 src1,依此类推。

值 0 表示使用相应的未修改的操作数值,值 1 表示必须使用操作数的负值。

默认情况下,操作数值保持未修改。

此修饰符仅对浮点操作数有效。

语法

描述

neg_hi:[{0..1}]

为具有 1 个源操作数的指令选择受影响的操作数。

neg_hi:[{0..1},{0..1}]

为具有 2 个源操作数的指令选择受影响的操作数。

neg_hi:[{0..1},{0..1},{0..1}]

为具有 3 个源操作数的指令选择受影响的操作数。

注意:数字值可以指定为整数绝对表达式

示例

neg_hi:[1,0]
neg_hi:[0,1,1]

clamp

请参阅 此处 的描述。

VOP3P MAD_MIX/FMA_MIX 修饰符

v_mad_mix*v_fma_mix* 指令以不同于 regular VOP3P 指令的方式使用 op_selop_sel_hi 修饰符。

请参阅下面的描述。

m_op_sel

此操作数仅对 16 位源操作数有意义,如 m_op_sel_hi 所示。它指定选择低 [15:0] 位或高 [31:16] 位操作数位作为操作的输入。

op_sel 修饰符指定的值的数量必须与源操作数的数量匹配。第一个值控制 src0,第二个值控制 src1,依此类推。

值 0 表示低位,值 1 表示高 16 位。

默认情况下,所有操作数都使用低位。

语法

描述

op_sel:[{0..1},{0..1},{0..1}]

选择每个 16 位源操作数的位置。

注意:数字值可以指定为整数绝对表达式

示例

op_sel:[0,1]

m_op_sel_hi

选择源操作数的大小:32 位或 16 位。默认情况下,所有源操作数都使用 32 位。

op_sel_hi 修饰符指定的值的数量必须与源操作数的数量匹配。第一个值控制 src0,第二个值控制 src1,依此类推。

值 0 表示 32 位,值 1 表示 16 位。

操作数中 16 位的位置可以由 m_op_sel 指定。

语法

描述

op_sel_hi:[{0..1},{0..1},{0..1}]

选择每个源操作数的大小。

注意:数字值可以指定为整数绝对表达式

示例

op_sel_hi:[1,1,1]

abs

请参阅 此处 的描述。

neg

请参阅此处的描述。

clamp

请参阅 此处 的描述。

VOP3P MFMA 修饰符

cbsz

指定广播模式。

语法

描述

cbsz:[{0..7}]

一种广播模式。

注意:数值可以指定为 整数绝对表达式

abid

指定矩阵 A 组选择。

语法

描述

abid:[{0..15}]

矩阵 A 组选择 ID。

注意:数值可以指定为 整数绝对表达式

blgp

指定矩阵 B lane 组模式。

语法

描述

blgp:[{0..7}]

矩阵 B lane 组模式。

注意:数值可以指定为 整数绝对表达式

neg

指示在操作之前必须取反的操作数。由此修饰符指定的值的数量必须与源操作数的数量匹配。第一个值控制 src0,第二个值控制 src1,依此类推。

值 0 表示使用相应的未修改的操作数值,值 1 表示在操作之前必须对操作数值取反。

默认情况下,操作数值保持未修改。

语法

描述

neg:[{0..1},{0..1},{0..1}]

选择在操作之前必须取反的操作数。

注意:数字值可以指定为整数绝对表达式

示例

neg:[0,1,1]