花一个虚假的 mov eax, esi 可以吗?
Is it ok to spend a spurious mov eax, esi?
我正在用高级语言编写 JIT 编译器,有时会出现两种情况。在第一种情况下,接收对象在 eax
中,在另一种情况下,它在 esi
中。因此,几个例程有两个版本,一个基于eax
,一个在esi
。除此之外,这两个版本在语义上是相同的。因此我有两个选择:
- 有条件地生成一个或另一个例程,或者
- 有条件地
mov eax, esi
并且只生成基于eax
的例程
假设不会有任何副作用,选项 2 更适合高级代码,因为它简化了(本机)代码生成功能。但是,本机代码将执行额外的 mov eax, esi
而不是使用 esi
作为基地址寄存器。
问题:哪个选项更好?
我应该尝试节省几个 CPU 周期并避免额外的 mov
,还是应该选择简化高级代码,因为性能差异可以忽略不计?
例子
注意:imm8
只是适当字节常量的占位符
基于 EAX 的例程:
test byte ptr [eax + imm8], imm8 ; EAX
jz @1
mov eax, [eax + imm8] ; EAX
jmp @2
@1:
mov al, [eax + imm8] ; EAX
and eax, 255
@2:
sal eax
inc eax
基于 ESI 的例程(选项 1):
test byte ptr [esi + imm8], imm8 ; ESI
jz @1
mov eax, [esi + imm8] ; ESI
jmp @2
@1:
mov al, [esi + imm8] ; ESI
and eax, 255
@2:
sal eax
inc eax
基于 ESI 的例程(选项 2):
mov eax, esi ; not present in option 1
test byte ptr [eax + imm8], imm8 ; EAX-based from now on
jz @1
mov eax, [eax + imm8]
jmp @2
@1:
mov al, [eax + imm8]
and eax, 255
@2:
sal eax
inc eax
您应该选择简化代码的选项。一旦您的产品完成,如果您发现额外的移动是一个重大的性能问题,您可以重新审视该决定。不同之处在于您拥有可以帮助您做出决定的分析器数据。
+1 给你,只为解决一个 JTI。
你会学到很多东西。
我正在用高级语言编写 JIT 编译器,有时会出现两种情况。在第一种情况下,接收对象在 eax
中,在另一种情况下,它在 esi
中。因此,几个例程有两个版本,一个基于eax
,一个在esi
。除此之外,这两个版本在语义上是相同的。因此我有两个选择:
- 有条件地生成一个或另一个例程,或者
- 有条件地
mov eax, esi
并且只生成基于eax
的例程
假设不会有任何副作用,选项 2 更适合高级代码,因为它简化了(本机)代码生成功能。但是,本机代码将执行额外的 mov eax, esi
而不是使用 esi
作为基地址寄存器。
问题:哪个选项更好?
我应该尝试节省几个 CPU 周期并避免额外的 mov
,还是应该选择简化高级代码,因为性能差异可以忽略不计?
例子
注意:imm8
只是适当字节常量的占位符
基于 EAX 的例程:
test byte ptr [eax + imm8], imm8 ; EAX
jz @1
mov eax, [eax + imm8] ; EAX
jmp @2
@1:
mov al, [eax + imm8] ; EAX
and eax, 255
@2:
sal eax
inc eax
基于 ESI 的例程(选项 1):
test byte ptr [esi + imm8], imm8 ; ESI
jz @1
mov eax, [esi + imm8] ; ESI
jmp @2
@1:
mov al, [esi + imm8] ; ESI
and eax, 255
@2:
sal eax
inc eax
基于 ESI 的例程(选项 2):
mov eax, esi ; not present in option 1
test byte ptr [eax + imm8], imm8 ; EAX-based from now on
jz @1
mov eax, [eax + imm8]
jmp @2
@1:
mov al, [eax + imm8]
and eax, 255
@2:
sal eax
inc eax
您应该选择简化代码的选项。一旦您的产品完成,如果您发现额外的移动是一个重大的性能问题,您可以重新审视该决定。不同之处在于您拥有可以帮助您做出决定的分析器数据。
+1 给你,只为解决一个 JTI。 你会学到很多东西。