首页 文章

PUSH / POP指令是否被认为是RISC或CISC?

提问于
浏览
7

如果 PUSHPOP 是RISC或CISC指令,我在接受采访时被问到 . 我说他们是RISC,但他们告诉我他们实际上是CISC指令 . 我建议ARM(一种常见的RISC实现)有这些指令,但他们指出ARM是混合的而不是纯粹的RISC .

我无法在网上找到任何明确的证据 . PUSHPOP 指令是否真的被认为是CISC架构的标志,还是可以在RISC系统上找到?为什么?

1 回答

  • 7

    RISC表示“精简指令集”(通常为LOAD寄存器,STORE寄存器,ADD寄存器,CMP寄存器,分支条件等) .

    理念和经验是,复杂的指令通常无法实现无法通过更简单的指令序列实现的有用效果,特别是如果将用于实现此类复杂指令的额外逻辑投入使简单的RISC指令运行快点 .

    PUSH和POP基本上是STORE / LOAD间接的简单组合,并且向寄存器添加常量 . 因此,如果一个专用于堆栈指针的寄存器,则可以轻松地模拟PUSH和POP,并且快速流水线机器可以执行PUSH和POP,速度与相应的RISC指令一样快 . 所以大多数人认为PUSH和POP是CISC指令;他们并没有真正为你买单 .

    如果考虑CALL(== PUSH PC JMP)和RET(POP PC),生活会变得更有趣 . 这些也很容易在正确的RISC架构上进行模拟 . 然而,POP PC导致管道泡沫,因为处理器很难预测新PC的位置,因此无法进行预取 . 由于内存“远离时间”,这可能是代码中的主要性能抑制因素,具有大量子例程调用 .

    在这里,有一种想要去CISC . 你真正想要的是一些预测返回PC的方法 . 许多现代CPU通过在硬件中保留“影子调用堆栈”来实现此目的 . 每个CALL将PC推入内存堆栈,也推送到卷影堆栈;每个RET从内存堆栈中弹出一个PC值,但是使用影子堆栈的顶部条目来预测指令流,它基本上是零时间访问(当然,弹出阴影堆栈) . 这样,指令流不会被中断,因此CISC机器在性能上获胜 .

    (人们想知道一个带有大量寄存器的RISC机器,编译叶函数调用以始终使用寄存器来存储返回PC,可能不如影子堆栈那么有效.Sun Sparc通过其寄存器窗口来实现这一点) .

    这告诉我们的是RISC与CISC过度简化了设计权衡 . 你想要的只是简单,除非更复杂的实际上给你带来了什么 . 例如,硬件中的IEEE浮点比使用RISC指令的任何模拟快得多 .

    因此,大多数现代机器并不是整齐的RISC或CISC . 性能分析选择 .

相关问题