#include <stdlib.h>
#include <time.h>
#include <stdio.h>
#define TIMES 200000000
int main(){
volatile int a;
volatile int b;
volatile int c;
int i;
// # on x86_64 gcc 4.8.1
for( i = 0; i < TIMES; i++ ){
c = a;
// movl -36(%rbp), %eax
// movl %eax, -44(%rbp)
a = b;
// movl -40(%rbp), %eax
// movl %eax, -36(%rbp)
b = c;
// movl -44(%rbp), %eax
// movl %eax, -40(%rbp)
}
for( i = 0; i < TIMES; i++ ){
a ^= b;
// movl -36(%rbp), %edx
// movl -40(%rbp), %eax
// xorl %edx, %eax
// movl %eax, -36(%rbp)
b ^= a;
// movl -40(%rbp), %edx
// movl -36(%rbp), %eax
// xorl %edx, %eax
// movl %eax, -40(%rbp)
a ^= b;
// movl -36(%rbp), %edx
// movl -40(%rbp), %eax
// xorl %edx, %eax
// movl %eax, -36(%rbp)
}
double s_var = (double)(t2-t1)/CLOCKS_PER_SEC;
double s_xor = (double)(t3-t2)/CLOCKS_PER_SEC;
double s_all = (double)(t3-t1)/CLOCKS_PER_SEC;
printf("swap by var: %.2fs\n",s_var
); printf("swap by xor: %.2fs\n",s_xor
); printf("ratio%% var: %d\n",(int)((s_var
/s_all
)*100)); printf("ratio%% xor: %d\n",(int)((s_xor
/s_all
)*100)); printf("xor/var: %.2f\n",(s_xor
/s_var
)); return 0;
}
CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CgojZGVmaW5lIFRJTUVTIDIwMDAwMDAwMAoKaW50IG1haW4oKXsKICAgIHZvbGF0aWxlIGludCBhOwogICAgdm9sYXRpbGUgaW50IGI7CiAgICB2b2xhdGlsZSBpbnQgYzsKICAgIGludCBpOwogICAgY2xvY2tfdCB0MSA9IGNsb2NrKCk7CgogICAgc3JhbmQodGltZShOVUxMKSk7CiAgICBhID0gcmFuZCgpOwogICAgYiA9IHJhbmQoKTsKCgkvLyAjIG9uIHg4Nl82NCBnY2MgNC44LjEKCiAgICBmb3IoIGkgPSAwOyBpIDwgVElNRVM7IGkrKyApewogICAgICAgIGMgPSBhOwogICAgICAgIC8vIG1vdmwgICAgLTM2KCVyYnApLCAlZWF4CgkJLy8gbW92bCAgICAlZWF4LCAtNDQoJXJicCkKCiAgICAgICAgYSA9IGI7CgkgICAgLy8gbW92bCAgICAtNDAoJXJicCksICVlYXgKCSAgICAvLyBtb3ZsICAgICVlYXgsIC0zNiglcmJwKQoKICAgICAgICBiID0gYzsKCSAgICAvLyBtb3ZsICAgIC00NCglcmJwKSwgJWVheAoJICAgIC8vIG1vdmwgICAgJWVheCwgLTQwKCVyYnApCiAgICB9CgogICAgY2xvY2tfdCB0MiA9IGNsb2NrKCk7CiAgICBmb3IoIGkgPSAwOyBpIDwgVElNRVM7IGkrKyApewogICAgICAgIGEgXj0gYjsKICAgICAgICAvLyBtb3ZsICAgIC0zNiglcmJwKSwgJWVkeAogICAgICAgIC8vIG1vdmwgICAgLTQwKCVyYnApLCAlZWF4CiAgICAgICAgLy8geG9ybCAgICAlZWR4LCAlZWF4CiAgICAgICAgLy8gbW92bCAgICAlZWF4LCAtMzYoJXJicCkKICAgICAgICBiIF49IGE7CgkgICAgLy8gbW92bCAgICAtNDAoJXJicCksICVlZHgKICAgIAkvLyBtb3ZsICAgIC0zNiglcmJwKSwgJWVheAogICAgCS8vIHhvcmwgICAgJWVkeCwgJWVheAogICAgCS8vIG1vdmwgICAgJWVheCwgLTQwKCVyYnApCiAgICAgICAgYSBePSBiOwogICAgCS8vIG1vdmwgICAgLTM2KCVyYnApLCAlZWR4CiAgICAJLy8gbW92bCAgICAtNDAoJXJicCksICVlYXgKICAgIAkvLyB4b3JsICAgICVlZHgsICVlYXgKICAgIAkvLyBtb3ZsICAgICVlYXgsIC0zNiglcmJwKQogICAgfQogICAgY2xvY2tfdCB0MyA9IGNsb2NrKCk7CiAgICBkb3VibGUgc192YXIgPSAoZG91YmxlKSh0Mi10MSkvQ0xPQ0tTX1BFUl9TRUM7CiAgICBkb3VibGUgc194b3IgPSAoZG91YmxlKSh0My10MikvQ0xPQ0tTX1BFUl9TRUM7CiAgICBkb3VibGUgc19hbGwgPSAoZG91YmxlKSh0My10MSkvQ0xPQ0tTX1BFUl9TRUM7CgogICAgcHJpbnRmKCJzd2FwIGJ5IHZhcjogJS4yZnNcbiIsc192YXIpOwogICAgcHJpbnRmKCJzd2FwIGJ5IHhvcjogJS4yZnNcbiIsc194b3IpOwogICAgcHJpbnRmKCJyYXRpbyUlIHZhcjogJWRcbiIsKGludCkoKHNfdmFyL3NfYWxsKSoxMDApKTsKICAgIHByaW50ZigicmF0aW8lJSB4b3I6ICVkXG4iLChpbnQpKChzX3hvci9zX2FsbCkqMTAwKSk7CiAgICBwcmludGYoInhvci92YXI6ICUuMmZcbiIsKHNfeG9yL3NfdmFyKSk7CglyZXR1cm4gMDsKfQ==