乱序处理器中条件码的工作机制是怎样的?
RISC-V与x86条件分支机制差异及乱序执行疑问
RISC-V这类架构的条件分支指令会直接将寄存器操作数包含在指令本身中,比如可以使用ble rs1, rs2, label指令,当rs1 ≤ rs2时就跳转到label。而x86架构则依赖FLAGS寄存器存储之前数学运算产生的条件码,示例代码如下:
mov rdi, 1 mov rsi, -1 mov rcx, 0 add rdi, rsi ; 将ZF置1(同时把0存入rdi) jle label1 ; 会执行跳转,因为SF或ZF任一为真 sub rcx, rsi ; 将SF置1,ZF置0(把-1存入rcx) jle label2 ; 同样会执行跳转
严格来说,这里应该用cmp指令而非实际的数学运算指令,但上面的操作依然能达到预期效果。
那么问题来了:在乱序(OoO)处理器中,sub指令会不会被判定为独立指令,进而被调度到第一条jle指令之前?
我自己想到了一种处理方案:把FLAGS寄存器的值存储在一个缓冲区中,缓冲区的条目由数学指令的解码阶段(重命名操作之前)确定;当解码分支指令时,直接使用条件码的最新条目——因为此时还没有进行指令重排序操作。
内容的提问来源于stack exchange,提问作者XtremeBlaze777
相关产品推荐
相关产品推荐

