是不是可以花一个虚假的mov eax,esi?

时间:2015-04-07 18:16:30

标签: assembly

我正在用高级语言编写JIT编译器,有时会出现两种情况。在第一种情况下,接收对象位于eax,而另一种情况则位于esi。因此,有几个例程有两个版本,一个基于eax,另一个基于esi。除此之外,这两个版本在语义上是相同的。因此,我有两个选择:

  1. 有条件地生成一个或另一个例程,或
  2. 有条件mov eax, esi并且仅生成基于eax的例程
  3. 如果不存在任何副作用,则选项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 个答案:

答案 0 :(得分:1)

您应该选择简化代码的选项。一旦您的产品完成,如果您发现额外的移动是一个重大的性能问题,您可以重新审视该决定。不同之处在于您拥有可帮助您做出决定的分析器数据。

+1给你,仅仅是为了解决JTI问题。 你会学到很多东西。