История изменений
Исправление 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