Hi,
   I wrote a test code like this:
void foo(int * a)
{
    a[0] = 0xfafafafb;
    a[1] = 0xfafafafc;
    a[2] = 0xfafafafe;
    a[3] = 0xfafafaff;
    a[4] = 0xfafafaf0;
    a[5] = 0xfafafaf1;
    a[6] = 0xfafafaf2;
    a[7] = 0xfafafaf3;
    a[8] = 0xfafafaf4;
    a[9] = 0xfafafaf5;
    a[10] = 0xfafafaf6;
    a[11] = 0xfafafaf7;
    a[12] = 0xfafafaf8;
    a[13] = 0xfafafaf9;
    a[14] = 0xfafafafa;
    a[15] = 0xfafaf0fa;
}
that was what gcc generated:
        movl    $-84215045, (%rdi)
        movl    $-84215044, 4(%rdi)
        movl    $-84215042, 8(%rdi)
        movl    $-84215041, 12(%rdi)
        movl    $-84215056, 16(%rdi)
    ...
that was what LLVM/clang generated:
        movabsq $-361700855600448773, %rax # imm = 0xFAFAFAFCFAFAFAFB
        movq    %rax, (%rdi)
        movabsq $-361700842715546882, %rax # imm = 0xFAFAFAFFFAFAFAFE
        movq    %rax, 8(%rdi)
        movabsq $-361700902845089040, %rax # imm = 0xFAFAFAF1FAFAFAF0
        movq    %rax, 16(%rdi)
        movabsq $-361700894255154446, %rax # imm = 0xFAFAFAF3FAFAFAF2
    ...
I ran the code on my i7 machine for 10000000000 times.Here was the result:
gcc:
real    0m50.613s
user    0m50.559s
sys     0m0.000s

LLVM/clang:
real    0m32.036s
user    0m32.001s
sys     0m0.000s

That mean movabsq did do a better job!
Should gcc peephole pass add such a combine?
--
Regards
lin zuojian

Reply via email to