gpt4 book ai didi

c - x86 addl 与 subl

转载 作者:太空狗 更新时间:2023-10-29 15:04:36 24 4
gpt4 key购买 nike

我只注意到 Clang 编译了这个语句(当然没有任何优化):

--x; /* int x; */

进入:

addl    $4294967295, %ecx       ## imm = 0xFFFFFFFF

为什么?使用 addl 而不是“明显的” subl 有什么好处吗?或者它只是一个实现事实?

让我着迷的是这个:

x -= 1;

变成:

subl    $1, %eax

clang 信息:

Apple clang version 3.0 (tags/Apple/clang-211.12) (based on LLVM 3.0svn)Target: x86_64-apple-darwin11.2.0Thread model: posix

最佳答案

此行为与 clang 处理预递减的方式有关,而不是像 sub-and-assign 这样的二元运算符。请注意,我将尝试在 clang 级别解释为什么您会看到此行为。我不知道为什么选择以这种方式实现它,但我想这只是为了便于实现。

我在这里引用的所有函数都可以在 lib/CodeGen/CGExprScalar.cpp 中的类 ScalarExprEmitter 中找到。

前/后递减/递增都由函数 EmitScalarPrePostIncDec 以相同的方式处理:LLVM add 指令使用 1 发出或 -1 作为第二个参数,具体取决于表达式分别是增量还是减量。

因此,

--x

在 LLVM IR 中最终会像这样

add i32 %x, -1

这很自然地转化为 x86 类似的东西

add $0xffffffff, %ecx

另一方面,二元运算符的处理方式各不相同。在你的情况下,

x -= 1

将由 EmitCompoundAssign 处理,后者又调用 EmitSub。将发出类似于以下 LLVM IR 的内容:

sub i32 %x, 1

关于c - x86 addl 与 subl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10127036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com