assembly 一个全新的64位指令集只使用64位寄存器有意义吗?无需关心向后兼容[closed]

svgewumm  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(112)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新问题,以便editing this post可以用事实与引用来回答.

四个月前关门了。
Improve this question
如果我们可以重新设计一个不需要8/16/32位寄存器(只有64位)的CPU,并计划只运行新程序(没有后端口),我们只有64位寄存器有意义吗?
(no寄存器)。
不打算设计CPU,只是好奇。

sigwle7e

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 64 add x0, x1, x2add 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来做。

相关问题