相关疑难解决方法(0)

为什么MSVC在执行此位测试之前会发出无用的MOVSX?

在MSVC 2013中编译以下代码,64位版本构建,/O2优化:

while (*s == ' ' || *s == ',' || *s == '\r' || *s == '\n') {
    ++s;
}
Run Code Online (Sandbox Code Playgroud)

我得到了以下代码 - 使用64位寄存器作为带有bt(位测试)指令的查找表,它具有非常酷的优化.

    mov     rcx, 17596481020928             ; 0000100100002400H
    npad    5
$LL82@myFunc:
    movzx   eax, BYTE PTR [rsi]
    cmp     al, 44                          ; 0000002cH
    ja      SHORT $LN81@myFunc
    movsx   rax, al
    bt      rcx, rax
    jae     SHORT $LN81@myFunc
    inc     rsi
    jmp     SHORT $LL82@myFunc
$LN81@myFunc:
    ; code after loop...
Run Code Online (Sandbox Code Playgroud)

但我的问题是:movsx rax, al第一个分支后的目的是什么?

首先,我们从字符串中加载一个字节rax并对其进行零扩展:

movzx eax, BYTE …
Run Code Online (Sandbox Code Playgroud)

c++ x86 assembly x86-64 visual-studio

15
推荐指数
2
解决办法
918
查看次数

标签 统计

assembly ×1

c++ ×1

visual-studio ×1

x86 ×1

x86-64 ×1