11. 将复杂指令集分割为简单指令 (PPlain 及 PMMX)

优质
小牛编辑
120浏览
2023-12-01

你可以把 读/修改 和 读/修改/写 指令切开来提高配对机会。 例如:

ADD [mem1],EAX / ADD [mem2],EBX ; 5 个时钟周期

这个代码可以切开, 而只需要消耗 3 个时钟周期:

MOV ECX,[mem1] / MOV EDX,[mem2] / ADD ECX,EAX / ADD EDX,EBX
MOV [mem1],ECX / MOV [mem2],EDX

同样的你可以把不能配对的指令切开让它们可以配对:

PUSH [mem1]
PUSH [mem2] ; 不能配对

切开变成:

MOV EAX,[mem1]
MOV EBX,[mem2]
PUSH EAX
PUSH EBX ; 所有的都配对了

下面还有另一些例子, 展示了一些不能配对的指令切开后变成简单的可配对指令:

CDQ 切成: MOV EDX,EAX / SAR EDX,31
NOT EAX 改为 XOR EAX,-1
NEG EAX 切成 XOR EAX,-1 / INC EAX
MOVZX EAX,BYTE PTR [mem] 切成 XOR EAX,EAX / MOV AL,BYTE PTR [mem]
JECXZ 切成 TEST ECX,ECX / JZ
LOOP 切成 DEC ECX / JNZ
XLAT 改为 MOV AL,[EBX+EAX]

如果切开指令并不能提高速度,你应该保持复杂指令或不能配对的指令, 这样可以减小代码的尺寸。

对于 PPro, PII and PIII,不需要将指令切开, 除非能产生更小的代码。