相关疑难解决方法(0)

clang 如何生成平方和的非循环代码?

我承认这个问题的答案可能是“一些非常具体的魔法”,但我对在这里观察到的情况感到有点震惊。我想知道是否有人了解这些类型的优化是如何工作的。我发现编译器的设计非常有趣,我真的无法想象它是如何工作的。我确信答案就在 clang 源代码中的某个地方,但我什至不知道该在哪里查找。

我是大学课程的助教,最近有人要求我帮助解决一个简单的家庭作业问题。这让我走上了一条有趣的道路......

问题很简单:在 x86_64 汇编中,编写一个给定(正)整数 n 返回的函数1^2 + 2^2 + 3^2 + ... + n^2

我决定尝试一下,在帮助他们在 x86_64 汇编中编写此代码后,我(拥有一台 M1 macbook)决定看看是否可以在 arm64 汇编中创建一个不错的解决方案。我想出了一个相对简单直接的解决方案:

_sum_squares:
    mov x1, x0  ; Do multiplication from x1
    mov x0, xzr ; Clear x0

    Lloop:
        ; x0 <-- (x1 * x1) + x0
        madd x0, x1, x1, x0

        ; Loop until x1 == 0
        subs x1, x1, #1
        bne Lloop

    ret
Run Code Online (Sandbox Code Playgroud)

(我希望有某种很好的方法可以--x1 == 0在一条指令中进行分支,但我想不出任何方法)

注意:任何基础数论课程中都有一个简单的公式,即[n(n + 1)(2n + 1)] / …

optimization assembly llvm clang arm64

45
推荐指数
2
解决办法
3298
查看次数

标签 统计

arm64 ×1

assembly ×1

clang ×1

llvm ×1

optimization ×1