11. 将复杂指令集分割为简单指令 (PPlain 及 PMMX)
优质
小牛编辑
129浏览
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,不需要将指令切开, 除非能产生更小的代码。