RVV1.0中的向量加载指令如何将有符号向量加载和无符号向量加载合并到一条指令中?

问题描述 投票:0回答:2

在RISC-V Vector指令中,有2个主要版本rvv0.7.1和rvv1.0。以加载32位为例。在rvv0.7.1中,有2条指令:

vlwu
vlw
,分别加载无符号数和有符号数。然而,在 rvv1.0 中,只有一条指令
vle32
。 问题是rvv1.0怎样才能达到同样的效果呢?此外,编译器稍后如何判断加载的数字是有符号的还是无符号的?

vectorization riscv
2个回答
0
投票

在RISC-V Vector指令中,有2个主要版本rvv0.7.1和rvv1.0。

不,目前只有 RVV 1.0。您所指的RVV 0.7.1是一些玄铁芯片使用的非标准、非确认扩展(XTheadVector),基于RVV的不兼容的早期工作草案。

在rvv0.7.1中,有2条指令:vlwu和vlw,分别加载无符号数和有符号数

  • vlwu
    :加载一个无符号字并将其 unsgined 扩展至当前 SEW
  • vlw
    :加载一个签名单词并将其签名扩展至当前SEW

注:SEW=设置元素宽度,EEW=有效元素宽度

然而,在rvv1.0中,只有一条指令vle32。问题是rvv1.0怎样才能达到同样的效果呢?

他们没有。

vle32
将 32 位元素(一个字)加载到向量寄存器中。 无论SEW如何,它都会执行此操作并且不会扩展元素。如果您还想对元素进行无符号/有符号扩展,则必须分别使用
vzext
/
vsext

请参阅规范的“矢量加载/存储宽度编码”部分:

向量加载和存储的 EEW 直接编码在指令中。相应的 EMUL 计算公式为 EMUL = (EEW/SEW)*LMUL。如果 EMUL 超出范围(EMUL>8 或 EMUL<1/8), the instruction encoding is reserved. The vector register groups must have legal register specifiers for the selected EMUL, otherwise the instruction encoding is reserved

因此,如果您的 SEW=64 LMUL=2,并且您使用

vle32
加载数据,那么 EEW 将是 EEW=32,并且 EMUL 将是 EMUL=(32/64)*2=1。

此外,编译器稍后如何判断加载的数字是有符号的还是无符号的?

组装说明不关心类型。您可以愉快地加载一些数据,对其执行无符号最大操作,然后进行有符号比较,即使使用 XTheadVector 扩展也是如此。有符号表示被定义为二进制补码,因此行为是明确定义的。请注意,例如不是

vadd
的无符号版本,但
vmsgt
/
vmsgtu
有符号和无符号版本,这是因为二进制补码加法与无符号加法相同。


0
投票

有符号与无符号是数据类型的属性,而不是值的属性。相比之下,对于值属性的示例,正与负是(签名数据的)值属性。

此外,编译器稍后如何判断加载的数字是有符号的还是无符号的?

这是倒退的。编译器/处理器不会告诉我们数据类型。

相反,我们通过在变量声明上使用数据类型来告诉编译器,然后编译器生成机器代码,机器代码告诉处理器。

因为处理器不知道变量声明(因此也不知道变量的数据类型) - 它从不读取变量声明,它只看到机器代码指令 -

每次使用变量时都必须被告知要使用什么大小和类型使用(重要时,例如比较);这是通过机器代码程序的指令进行通信。

因此,每次使用变量时,编译器都会为该变量的大小和类型以及访问该变量的操作(例如添加或比较或读取或写入)生成正确的机器代码。

如果您正在编写汇编代码而不是高级语言,那么除了在您的头部和注释中之外,您没有变量声明(对某些汇编器(如 masm)进行模数)。

需要逻辑一致性,但在汇编语言中没有什么可以强制执行它,除非程序员使用正确的指令,以便处理器根据数据类型执行正确的操作。

这是一个逻辑错误,如果您认为同一数据在伪代码或算法中已签名,则将其视为显式未签名。

(顺便说一句,溢出也是程序员关心的问题;程序员必须选择能够避免或处理溢出的数据类型和算法。像 C 这样的语言甚至不会尝试在运行时检测普通算术的溢出。)

© www.soinside.com 2019 - 2024. All rights reserved.