考虑在伪汇编中进行昂贵计算后寄存器的经典重用:
r2 = cos(r1)
*(r3) = r2
r2 = r5 + r6
*(r4) = r2
为了能够充分使用算术单元,执行单元可能会:
r2 = cos(r1)
*(r3) = r2
并并行:
r2bis = r5 + r6
*(r4) = r2bis
其中 r2bis 是虚拟化(或重命名)的 r2 寄存器。
现在假设我们在寄存器较差的 CPU 中工作(或者我们有很多但它们已经被使用)并将数据放在某个临时堆栈位置:
*(sp+C) = cos(r1)
*(r3) = *(sp+C)
*(sp+C) = r5 + r6
*(r4) = *(sp+C)
是否存在地址已知的内存位置(如 (sp+C) 已经可以计算)被执行单元虚拟化以允许相同的两个执行并行进行的情况?
这种情况可能看起来很愚蠢,因为编译器的任务是在不受限制的堆栈空间上找到另一个位置(与非常受限制的寄存器空间不同)。但其他情况可能不会那么愚蠢,因为虚拟化内存可以允许条件分支的推测执行,该条件分支必须在内存中存储短期数据。这对于没有简单方法将对象字段放入寄存器的语言尤其重要,例如 Java,除了最简单的情况外:您必须排除“引用”(指针)转义以避免new
动态分配并转向 Java类实例转换为 C++ 类自动实例(可以是堆栈分配的或寄存器中的)。this
(然后即使是 C++ 也很难在简单平面类的看似简单的使用中没有真正的指针。)