AMDGPU 指令语法

指令

语法

常规指令的语法

指令具有以下语法

<操作码助记符>    <操作数0>, <操作数1>,...    <修饰符0> <修饰符1>...

操作数 通常用逗号分隔,而 修饰符 用空格分隔。

操作数修饰符 的顺序是固定的。大多数 修饰符 是可选的,可以省略。

VOPD 指令的语法

VOPDXVOPDY 指令必须使用 :: 运算符连接以形成单个 VOPD 指令

<VOPDX 指令>  ::  <VOPDY 指令>

一个例子

v_dual_add_f32 v255, v255, v2 :: v_dual_fmaak_f32 v6, v2, v3, 1.0

请注意,VOPDXVOPDY 指令不能用作单独的操作码。

操作码助记符

操作码助记符描述了操作码语义,并且可以按此顺序包含一个或多个后缀

打包后缀

大多数对打包数据进行操作的指令都有 _pk 后缀。除非另有 说明,否则这些指令对由两个值组成的打包数据进行操作并生成打包数据。值的类型由 类型后缀 指示。

例如,以下指令将两对 f16 值相加并生成一对 f16 值

v_pk_add_f16 v1, v2, v3     // Each operand has f16x2 type

类型和大小后缀

使用数据操作的指令具有 data 操作数的隐含类型。此数据类型指定为指令助记符的后缀。

有些指令具有 2 个类型后缀:第一个是目标操作数的数据类型,第二个是源 data 操作数的数据类型。

请注意,指令指定的数据类型不适用于其他类型的操作数,例如 地址偏移量 等。

下表列出了最常用的类型后缀。

类型后缀

打包指令?

数据类型

_b512, _b256, _b128, _b64, _b32, _b16, _b8

位。

_u64, _u32, _u16, _u8

无符号整数。

_i64, _i32, _i16, _i8

有符号整数。

_f64, _f32, _f16

浮点。

_b16, _u16, _i16, _f16

打包 (b16x2, u16x2, 等)。

没有类型后缀的指令假定使用无类型数据进行操作。无类型数据的大小由大小后缀指定

大小后缀

隐含数据类型

dwords 中所需的寄存器大小

-

b32

1

x2

b64

2

x3

b96

3

x4

b128

4

x8

b256

8

x16

b512

16

x

b32

1

xy

b64

2

xyz

b96

3

xyzw

b128

4

d16_x

b16

1

d16_xy

b16x2

GFX8.0 为 2,GFX8.1 和 GFX9+ 为 1

d16_xyz

b16x3

GFX8.0 为 3,GFX8.1 和 GFX9+ 为 2

d16_xyzw

b16x4

GFX8.0 为 4,GFX8.1 和 GFX9+ 为 2

d16_format_x

b16

1

d16_format_xy

b16x2

1

d16_format_xyz

b16x3

2

d16_format_xyzw

b16x4

2

警告

上述规则存在例外。与操作码指定的类型不同的操作数在描述中被 标记

具有不同类型的源和目标操作数的指令示例

s_bcnt0_i32_b64
v_cvt_f32_u32

具有一种数据类型的指令示例

v_max3_f32
v_max3_i16

使用打包数据操作的指令示例

v_pk_add_u16
v_pk_add_i16
v_pk_add_f16

对 b128 数据进行操作的无类型指令示例

buffer_store_dwordx4
flat_load_dwordx4

编码后缀

大多数 VOP1VOP2VOPC 指令有几种变体:它们也可以用 VOP3DPPSDWA 格式编码。

汇编器会根据指令操作数和修饰符自动选择最佳编码,除非明确请求特定的编码。要强制使用特定的编码,可以在指令的操作码中添加后缀

编码

编码后缀

VOP1VOP2VOPC (32 位) 编码

_e32

VOP3 (64 位) 编码

_e64

DPP 编码

_dpp

SDWA 编码

_sdwa

VOP3 DPP 编码

_e64_dpp

本参考使用编码后缀来指定隐含的编码。当未指定后缀时,假定为本机指令编码。

操作数

语法

通用操作数的语法在 本文档 中描述。

有关操作数的详细信息,请参阅特定于 GPU 的文档中的操作数链接

修饰符

语法

修饰符的语法在 本文档 中描述。

有关单个指令支持的修饰符的信息,可以在特定于 GPU 的文档中找到。