RISC-V 是否更喜欢对 8 位操作数进行符号扩展?

Does RISC-V prefer to sign-extend 8-bit operands?

在 64 位 RISC-V 上,当一个 32 位操作数被加载到一个寄存器中时,需要决定是符号扩展还是零扩展到 64 位,架构决定是更喜欢前者,大概是因为 C 系列语言中最常见的 int 类型是带符号的 32 位整数。所以符号扩展比零扩展稍微快一些。

8位操作数也是这样吗?换句话说,signed char是否比unsigned char更有效率?

如果您要将很多 8 位值扩展到 wchar_tunsigned char 就是您想要的,因为这是空操作而不是位掩码。如果您的 char 格式是 UTF-8,您还希望能够为您的班次使用无符号数学。如果您正在使用库函数,那么使用您的库期望的类型是最方便的。

The RISC-V architecture has LB 指令将符号扩展的 8 位值加载到寄存器,LBU 指令零扩展。两者同样有效。在 C 中,任何用于算术运算的 signed char 都被加宽为 int,而 C 标准库函数指定加宽 charint,因此这会将变量放在使用正确的格式。

存储是截断的问题,从任何整数类型转换为 unsigned char 是微不足道的(0xff 的位掩码)。从 unsigned char 到有符号值的转换可以在不超过两条指令中完成,没有条件或寄存器压力(SLLIchar 的符号位放入机器寄存器,后跟 SRLI 以对高位进行符号扩展)。

因此,在这个架构中使用任何一个都没有额外的开销。 API 指定符号扩展而不是符号数量的零扩展。

顺便说一句,RV64I 在体系结构上不喜欢符号扩展。即 the ABI convention,但指令集添加了一条 LWU 指令,用于从零扩展的内存中加载 32 位值,以及一条可以对零扩展的 32 进行符号扩展的 ADDIW位结果。 (对于 8 位数量没有相应的 ADDIB 或对于 16 位数量没有相应的 ADDIH。)