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_t
,unsigned char
就是您想要的,因为这是空操作而不是位掩码。如果您的 char
格式是 UTF-8,您还希望能够为您的班次使用无符号数学。如果您正在使用库函数,那么使用您的库期望的类型是最方便的。
The RISC-V architecture has LB
指令将符号扩展的 8 位值加载到寄存器,LBU
指令零扩展。两者同样有效。在 C 中,任何用于算术运算的 signed char
都被加宽为 int
,而 C 标准库函数指定加宽 char
为 int
,因此这会将变量放在使用正确的格式。
存储是截断的问题,从任何整数类型转换为 unsigned char
是微不足道的(0xff
的位掩码)。从 unsigned char
到有符号值的转换可以在不超过两条指令中完成,没有条件或寄存器压力(SLLI
将 char
的符号位放入机器寄存器,后跟 SRLI
以对高位进行符号扩展)。
因此,在这个架构中使用任何一个都没有额外的开销。 API 指定符号扩展而不是符号数量的零扩展。
顺便说一句,RV64I 在体系结构上不喜欢符号扩展。即 the ABI convention,但指令集添加了一条 LWU
指令,用于从零扩展的内存中加载 32 位值,以及一条可以对零扩展的 32 进行符号扩展的 ADDIW
位结果。 (对于 8 位数量没有相应的 ADDIB
或对于 16 位数量没有相应的 ADDIH
。)
在 64 位 RISC-V 上,当一个 32 位操作数被加载到一个寄存器中时,需要决定是符号扩展还是零扩展到 64 位,架构决定是更喜欢前者,大概是因为 C 系列语言中最常见的 int
类型是带符号的 32 位整数。所以符号扩展比零扩展稍微快一些。
8位操作数也是这样吗?换句话说,signed char
是否比unsigned char
更有效率?
如果您要将很多 8 位值扩展到 wchar_t
,unsigned char
就是您想要的,因为这是空操作而不是位掩码。如果您的 char
格式是 UTF-8,您还希望能够为您的班次使用无符号数学。如果您正在使用库函数,那么使用您的库期望的类型是最方便的。
The RISC-V architecture has LB
指令将符号扩展的 8 位值加载到寄存器,LBU
指令零扩展。两者同样有效。在 C 中,任何用于算术运算的 signed char
都被加宽为 int
,而 C 标准库函数指定加宽 char
为 int
,因此这会将变量放在使用正确的格式。
存储是截断的问题,从任何整数类型转换为 unsigned char
是微不足道的(0xff
的位掩码)。从 unsigned char
到有符号值的转换可以在不超过两条指令中完成,没有条件或寄存器压力(SLLI
将 char
的符号位放入机器寄存器,后跟 SRLI
以对高位进行符号扩展)。
因此,在这个架构中使用任何一个都没有额外的开销。 API 指定符号扩展而不是符号数量的零扩展。
顺便说一句,RV64I 在体系结构上不喜欢符号扩展。即 the ABI convention,但指令集添加了一条 LWU
指令,用于从零扩展的内存中加载 32 位值,以及一条可以对零扩展的 32 进行符号扩展的 ADDIW
位结果。 (对于 8 位数量没有相应的 ADDIB
或对于 16 位数量没有相应的 ADDIH
。)