Assembly RISC体系结构中小数值的直接算术运算

Assembly RISC体系结构中小数值的直接算术运算,assembly,x86,cpu-architecture,instruction-set,risc,Assembly,X86,Cpu Architecture,Instruction Set,Risc,是否有任何RISC架构允许算术运算单独应用于字节、半字和其他数据单元,其大小小于CPU通用寄存器的大小 在英特尔x86(IA-32)和x86-64(称为EM64T或AMD64)处理器中,不仅可以使用整个寄存器,还可以使用其较小的部分。英特尔ISA允许对整个寄存器执行所有算术运算,它是半字节、四分之一字节和一个字节(更准确地说,寄存器中有两个字节可用,例如RAX中的AL和AH)。执行操作后,我们可以进行溢出检查,如果在上一次操作中发生溢出,则可以轻松处理。无论我们是对整个字(IA-32为32位宽,

是否有任何RISC架构允许算术运算单独应用于字节、半字和其他数据单元,其大小小于CPU通用寄存器的大小

在英特尔x86(IA-32)和x86-64(称为EM64T或AMD64)处理器中,不仅可以使用整个寄存器,还可以使用其较小的部分。英特尔ISA允许对整个寄存器执行所有算术运算,它是半字节、四分之一字节和一个字节(更准确地说,寄存器中有两个字节可用,例如RAX中的AL和AH)。执行操作后,我们可以进行溢出检查,如果在上一次操作中发生溢出,则可以轻松处理。无论我们是对整个字(IA-32为32位宽,EM64T为64位宽)进行操作,还是对较小的数据(半字、四分之一字或一个字节)执行算术指令,如果结果超过所选数据单元的大小,相应的标志(of或CF)将设置为1。因此,在英特尔体系结构中,不需要通过一系列指令分析结果的高位来模拟处理此类错误,这些错误发生在使用小数据的操作中


问题是,是否存在任何RISC体系结构,其中可以对小数据进行直接算术运算,这些运算是通过处理器硬件实现的(执行这些运算不需要软件仿真),并且这些运算中发生的溢出、携带和借用是以字节为单位的,半字等由处理器设备跟踪,不应以软件方式进行检查。或者,这种方法与整个RISC原理相矛盾,目前和过去都没有RISC处理器实现过它?

TL:DR:no,AFAIK没有标志设置部分寄存器操作小于32位的RISC ISA。但许多具有标志的64位RISC ISA(如AArch64)可以根据32位运算的结果设置标志

请参阅最后一节:这是因为对软件整数溢出检查的需求普遍不足,或者存在鸡/蛋问题通常您只需要比较/分支16位的值,您可以将它们设置为零或扩展为32或64位。

只有寄存器宽度为8或16位的RISC才能从该操作数大小设置标志。e、 具有32个寄存器和16位指令字的AVR 8位RISC。它需要扩展精度的add/adc来实现16位
int

这主要是一个历史事件:x86的所有操作数大小都是16位的,因为它是从16位的286演变而来的。在设计80386时,它必须能够以全速运行16位纯代码,并且他们提供了在16位代码中增加32位操作的方法。并使用相同的机制在32位代码中允许16位操作

x86 8位低/高寄存器(AX=AH:AL)的出现在一定程度上也是由于8086是如何被设计为8080的继承者,并使移植变得容易(甚至可以实现自动化)。(还因为同时拥有八个1字节寄存器和四个2字节寄存器非常有用。)


相关:对于许多计算,不必在每次操作后将高位重新归零,即可获得相同的结果。因此缺少8位/16位操作数大小并不是有效实现将结果逻辑包装为8位或16位的大多数代码的障碍。

64位RISC机器通常至少有一些重要指令的32位版本,如
add
,因此您可以免费获得零扩展
add
结果,而无需单独截断它,例如,使用
uint32_t i
和64位指针使
array[i++]
等代码高效但决不能在我听说过的任何RISC上使用小于32位的部分寄存器操作数。

DEC Alpha很有趣,因为它是一种全新的设计,从头开始是64位的,而不是像MIPS64那样对现有ISA进行64位扩展。这表明add/sub/mul/div有32位和64位两种形式,但移位和比较不可用。(也有字节操作指令,基本上是64位整数寄存器中的SIMD shuffle/mask/insert/extract,以及SIMD打包的比较,用于有效的字符串内容。)

根据这一点(第4.3节CPU寄存器)

MIPS64处理器始终生成64位结果,即使对于那些 在体系结构上定义为在32位上操作的指令。 此类指令通常会将其32位结果扩展为64位 位。在这样做时,32位程序按预期工作,尽管 寄存器实际上是64位宽,而不是32位宽

(对完整的64位寄存器使用特殊指令,如
DADDU
(双字添加无符号)而不是
ADDU
。请注意,
add
dadd
的非U版本会导致2的补码有符号溢出(操作数大小为32位或64位),因此必须使用U版本来包装有符号的数学。(ISA参考链接打开)。无论如何,MIPS没有针对32位的特殊模式,但操作系统需要关注32位程序与64位程序,因为32位将假定所有指针都位于虚拟地址空间的低位32


在RISC加载/存储计算机上,您通常只使用零扩展(或符号扩展)字节/半字加载。完成后,您将使用字节/半字存储来获得截断的结果。(对于无符号base2,或2的补码有符号,通常是您想要的。)这就是编译器(或人工)的方式将实现使用
short
uint8\u t
的C源代码

半相关:C的整数提升规则自动提升小于
intcmpi    Compare Integer
cmpib   Compare Integer Byte
cmpis   Compare Integer Short
cmpo    Compare Ordinal
cmpob   Compare Ordinal Byte
cmpos   Compare Ordinal Short
concmpi Conditional Compare Integer
concmpo Conditional Compare Ordinal