已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新问题,以便editing this post可以用事实与引用来回答.
四个月前关门了。
Improve this question
如果我们可以重新设计一个不需要8/16/32位寄存器(只有64位)的CPU,并计划只运行新程序(没有后端口),我们只有64位寄存器有意义吗?
(no寄存器)。
不打算设计CPU,只是好奇。
已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新问题,以便editing this post可以用事实与引用来回答.
四个月前关门了。
Improve this question
如果我们可以重新设计一个不需要8/16/32位寄存器(只有64位)的CPU,并计划只运行新程序(没有后端口),我们只有64位寄存器有意义吗?
(no寄存器)。
不打算设计CPU,只是好奇。
1条答案
按热度按时间sigwle7e1#
你是对的,你肯定不会包括高8部分寄存器,也可能不会包括8位和16位操作数大小,除了加载/存储和符号/零扩展。对uint8_t数据的操作可以在需要时通过零扩展到32/64来完成,通常不需要在操作之间重做扩展,除非在右移位或除法之前,因为在这些操作之前,高垃圾会是个问题。
看看AArch 64。与x86扩展到x86-64不同,它们从机器码格式和寄存器开始,进行了全新的设计。与大多数现代64位RISC ISA一样,它们的操作数大小为32位和64位,适合大多数指令。
通过对寄存器或内存中的窄值进行零扩展或符号扩展的指令,甚至一些使用32位寄存器作为64位指针索引的寻址模式,旨在支持
foo(int *p, int idx) { return p[idx]; }
等情况,在这种情况下,索引必须以某种方式进行符号扩展,以达到指针宽度。即使是DEC Alpha,这是 * 积极 * 64位,有一些支持一些常见的32位操作。
当然,这只是一个命名约定的问题无论您是针对64位加法还是32位加法执行MIPS 64
dadd $t0, $t1, $t2
还是add $t0, $t1, $t2
,操作数大小由助记符表示,或AArch 64add x0, x1, x2
与add w0, w1, w2
,操作数大小由寄存器名称表示(x0..31
而不是w0..31
作为它们下半部分的名称)。MIPS 64不具备AArch 64
ldr x0, [x1, w2, uxtw]
等特性(变址寻址模式,对x2
的低32位进行零扩展,即w2
)。因此MIPS不需要为不同的寄存器宽度提供不同的名称,因为它不会在同一条指令中混合宽度。它使用了助记符的前缀(d
表示双字)来表示这是哪种运算。(我忽略了MIPS 64需要32位指令而不是移位指令,以便将其输入和输出正确地符号扩展到64位,或类似的操作。)但实际上并没有根本不同,下半部分并不是一个不同的寄存器。您 * 可以 * 为MIPS 64设计一个asm语法,其中
addu $t1w, $t2w, $t3w
表示32位,$t1d
表示64位。PowerPC使用
l
(long = 64位)与w
(word = 32位)来实现大量的助记符,因此它与MIPS的风格类似。我所做的一个假设是,* 写入 * 一个“窄”寄存器可以零扩展到整个寄存器,就像32位寄存器的AArch 64和x86-64一样。
但是unlike x86-64 for legacy 8 and 16-bit partial registers,它与旧值合并,因为这些语义可以追溯到8086和386,在流水线实现之前,在无序exec之前,甚至被考虑用于x86,以使假依赖性明显是不好的。
你肯定会像AArch 64
add w0, w1, w2
那样做隐式的零扩展,并提供位域插入指令来进行合并,或者让软件用AND/OR来做。