LINUX.ORG.RU

История изменений

Исправление ilammy, (текущая версия) :

might be faster

ilammy /tmp % cat a.c
#define SWAP(A, B) (((A) ^ (B)) && ((B) ^= (A) ^= (B), (A) ^= (B)))

int main()
{
    volatile int a, b;
    SWAP(a, b);
}
ilammy /tmp % cat b.c
#define SWAP(A, B) do {                         \
    typeof(A) tmp = (A); (A) = (B); (B) = tmp;  \
} while (0)

int main()
{
    volatile int a, b;
    SWAP(a, b);
}
ilammy /tmp % gcc -O2 -S a.c
ilammy /tmp % gcc -O2 -S b.c
ilammy /tmp % cat a.s
...
main:
.LFB0:
        .cfi_startproc
        movl    -8(%rsp), %edx
        movl    -4(%rsp), %eax
        cmpl    %eax, %edx
        je      .L3
        movl    -8(%rsp), %edx
        movl    -4(%rsp), %eax
        xorl    %edx, %eax
        movl    %eax, -8(%rsp)
        movl    -4(%rsp), %edx
        xorl    %eax, %edx
        movl    %edx, -4(%rsp)
        movl    -8(%rsp), %edx
        movl    -4(%rsp), %eax
        xorl    %edx, %eax
        movl    %eax, -8(%rsp)
.L3:
        rep
        ret
        .cfi_endproc
...
ilammy /tmp % cat b.s
main:
.LFB0:
        .cfi_startproc
        movl    -12(%rsp), %eax
        movl    %eax, -4(%rsp)
        movl    -8(%rsp), %eax
        movl    %eax, -12(%rsp)
        movl    -4(%rsp), %eax
        movl    %eax, -8(%rsp)
        ret
        .cfi_endproc

(Исправил баг. На суть не повлияло.)

Исходная версия ilammy, :

might be faster

ilammy /tmp % cat a.c
#define SWAP(A, B) (((A) ^ (B)) && ((B) ^= (A) ^= (B), (A) ^= (B)))

int main()
{
    volatile int a, b;
    SWAP(a, b);
}
ilammy /tmp % cat b.c
#define SWAP(A, B) do {                         \
    typeof(A) tmp = (B); (A) = (B); (B) = tmp;  \
} while (0)

int main()
{
    volatile int a, b;
    SWAP(a, b);
}
ilammy /tmp % gcc -O2 -S a.c
ilammy /tmp % gcc -O2 -S b.c
ilammy /tmp % cat a.s
...
main:
.LFB0:
        .cfi_startproc
        movl    -8(%rsp), %edx
        movl    -4(%rsp), %eax
        cmpl    %eax, %edx
        je      .L3
        movl    -8(%rsp), %edx
        movl    -4(%rsp), %eax
        xorl    %edx, %eax
        movl    %eax, -8(%rsp)
        movl    -4(%rsp), %edx
        xorl    %eax, %edx
        movl    %edx, -4(%rsp)
        movl    -8(%rsp), %edx
        movl    -4(%rsp), %eax
        xorl    %edx, %eax
        movl    %eax, -8(%rsp)
.L3:
        rep
        ret
        .cfi_endproc
...
ilammy /tmp % cat b.s
main:
.LFB0:
        .cfi_startproc
        movl    -8(%rsp), %eax
        movl    %eax, -4(%rsp)
        movl    -8(%rsp), %eax
        movl    %eax, -12(%rsp)
        movl    -4(%rsp), %eax
        movl    %eax, -8(%rsp)
        ret
        .cfi_endproc