P6体系结构 - 注册重命名,有限的用户注册会导致更多的操作溢出/加载吗?

cod*_*eim 6 x86 assembly compiler-theory x86-64 cpu-architecture

我正在研究关于动态语言VM实现的JIT设计.自8086/8088天以来,我没有做太多的装配,只是在这里或那里,所以如果我不合适,那就好了.

据我所知,x86(IA-32)架构目前仍然具有与之相同的基本限制寄存器集,但内部寄存器数量已经大幅增长,但这些内部寄存器通常不可用,并且与寄存器重命名一起使用实现无法并行化的代码的并行流水线操作.我很好地理解了这种优化,但我的感觉是,虽然这些优化有助于整体吞吐量和并行算法,但有限的寄存器集仍然会导致更多的寄存器溢出开销导致如果x86有两倍或四倍的寄存器对我们来说,典型指令流中的推/弹操作码可能会少得多吗?或者是否有其他处理器优化也可以优化这个我不知道的?基本上如果我有一个代码单元有4个寄存器来处理整数工作,但我的单元有十几个变量,我可能每2个左右的指令都有一个push/pop.

是否有任何研究或更好的个人经历?

编辑:x86_64有16个寄存器,这是双x86-32,感谢纠正和信息.

Cra*_*rks 10

除了重命名寄存器以隐藏由指令延迟引起的气泡外,大多数x86架构都足够聪明,可以计算推送和弹出,并将这些重命名为寄存器.请记住,x86上的指令解码器实际上执行了一种JIT编译,将x86指令流转换为存储在跟踪高速缓存中的小型微代码程序.此过程的一部分包括拦截小偏移堆栈负载并将其转换为寄存器.因此像(明显愚蠢和纯粹的例子):

lwz eax,[ebp]
lwz ebx,[ebp+4]
add eax,[edx+0]
push eax 
lwz eax,[ebp+8]
add eax,ebx
pop ebx
add eax,ebx
Run Code Online (Sandbox Code Playgroud)

煮成类似的东西(假装内部寄存器命名为例如 r0..r16):

lw r3, edx
lw r1, ebp
lw r2, ebp+4 ; the constant '4' is usually stored as an immediate operand
add r1,r2
or r4,r1,r1 ;; move r1 to r4
lw r1, ebp+8
add r1,r2
or r2,r4,r4
add r1,r2
Run Code Online (Sandbox Code Playgroud)

当然,一个神奇的智能解码器(与实际适合晶体管计数的解码器不同)会崩溃一些不必要的移动,但我要说的是推/弹和存储/加载esp+(some small number)实际上变成了影子寄存器.