タグ

ブックマーク / embedded.hatenadiary.org (2)

  • clang+llvmでさりげなくすごいコードが生成されていた話の補足。 - 組み込みの人。

    clang+llvmでさりげなくすごいコードが生成されていた話。 - 組み込みの人。で決着のついていなかった部分について。 1からnの総和を求める関数sum() int sum(int x) { int sum = 0; int i; for (i = 1; i <= x; i++) { sum += i; } return sum; } をclang -target arm -march=armv7-a -O -S sum.c で以下のコンパイル結果を得ましたが、これは正しいのか? sum: mov r1, #0 cmp r0, #1 blt .LBB0_2 sub r1, r0, #2 sub r2, r0, #1 umull r1, r2, r2, r1 and r2, r2, #1 lsrs r2, r2, #1 rrx r1, r1 add r0, r1, r0, lsl #1

    clang+llvmでさりげなくすごいコードが生成されていた話の補足。 - 組み込みの人。
    rryu
    rryu 2013/06/24
    ループを(n-(n-1))+ ... (n-2)+(n-1)+(n-0)という数列ということにして、途中演算がintで収まる範囲で畳み込んだという感じなのかな。
  • clang+llvmでさりげなくすごいコードが生成されていた話。 - 組み込みの人。

    先日llvm 3.3がリリースされました。aarch64(arm 64bit)のコードが生成できるようになったということなので、ソースからビルドして遊んでいたのですが、さりげなく凄く最適化されたコードが生成されているのに気がつきました。aarch64だと今は実行して確認できる環境が手元に無いので、普通のarmv7-aで同じことを試しました。 ここで使ったコードとその結果はgistに貼りました。 https://gist.github.com/tetsu-koba/5835724 ソースコード int sum(int x) { int sum = 0; int i; for (i = 1; i <= x; i++) { sum += i; } return sum; } 1からnまでの総和を求める関数です。1から100までの総和が5050なのはガウス少年の逸話で有名ですね。 gcc 4.8.

    clang+llvmでさりげなくすごいコードが生成されていた話。 - 組み込みの人。
    rryu
    rryu 2013/06/23
    chains of recurrencesでググっても日本語のページがヒットしない…
  • 1