kubo39's blog

ただの雑記です。

小ネタ: コンパイラの最適化を信じる

以下のコードは同じアセンブラを生成している。

bool mod(size_t i)
{
    return i % 4 == 0;
}

bool bitOr(size_t i)
{
    return (i & 3) == 0;
}
% dmd --version
DMD64 D Compiler v2.071.0
Copyright (c) 1999-2015 by Digital Mars written by Walter Bright
% dmd -main -g -O fuga.d
% objdump -drS fuga| less
...
0000000000422b70 <_D4fuga3modFmZb>:
bool mod(size_t i)
  422b70:       50                      push   %rax
  422b71:       48 89 3c 24             mov    %rdi,(%rsp)
{
    return i % 4 == 0;
  422b75:       f6 04 24 03             testb  $0x3,(%rsp)
  422b79:       0f 94 c0                sete   %al
}
  422b7c:       59                      pop    %rcx
  422b7d:       c3                      retq
  422b7e:       66 90                   xchg   %ax,%ax

0000000000422b80 <_D4fuga5bitOrFmZb>:

bool bitOr(size_t i)
  422b80:       50                      push   %rax
  422b81:       48 89 3c 24             mov    %rdi,(%rsp)
{
    return (i & 3) == 0;
  422b85:       f6 04 24 03             testb  $0x3,(%rsp)
  422b89:       0f 94 c0                sete   %al
}
  422b8c:       59                      pop    %rcx
  422b8d:       c3                      retq
  422b8e:       66 90                   xchg   %ax,%ax

ちょっと凝ったコードを書く前に「それコンパイラがやってくれてないか」というのを調べてみてもいいんじゃない?というだけのはなし。