#include <iostream>
#include <ctime>
#ifdef _DEBUG
const signed num_tests = 10000000;
#else
const signed num_tests = 1000000000;
#endif
#ifdef _MSC_VER
#define noinline __declspec(noinline)
#else
#define noinline __attribute__((noinline))
#endif
void baseline(signed n, signed& cr0) {
cr0 = 4;
}
void AlfaOmega(signed n, signed& cr0) {
if (n < 0)
cr0 = 1;
else if (n > 0)
cr0 = 2;
else
cr0 = 4;
}
void jalf(signed n, signed& cr0) {
cr0 = 1 << ((n >= 0) + (n == 0));
}
void harold(signed n, signed& cr0) {
int y = ((n >> 31) & 1) | ((-n >> 31) & 2);
y &= 1 | ~(y << 1); // remove the 2 if odd
cr0 = (~(-y >> 31) & 4) | y;
}
void MichaelBurr(signed n, signed& cr0) {
cr0 = 4 >> ((2 * (n < 0)) + (n > 0));
}
void BenVoigt(signed n, signed& cr0) {
cr0 = (-(n | (n-1)) >> 31) & 6;
cr0 |= (n >> 31) & 5;
cr0 ^= 4;
}
void Manish(signed n, signed& cr0) {
cr0 = ((n >> 31 & 1) | (~n >> 30 & 2)) << !n;
}
void MooingDuck1(signed n, signed& cr0) {
cr0 = 1 << (!(unsigned(n)>>31)+(n==0));
}
void MooingDuck2(signed n, signed& cr0) {
cr0 = 2 << ((n == 0) - (unsigned(n) >> 31));
}
typedef void (*funcptr)(signed n, signed& cr0);
static noinline long test(funcptr func, const char* name, long overhead) {
signed nocheat = 0;
clock_t begin = clock();
for(int i=0; i<num_tests; ++i) {
signed t;
func(-i, t);
nocheat += t;
func(0, t);
nocheat += t;
func(i, t);
nocheat += t;
}
clock_t end = clock();
std::cout << name << " found " << nocheat << " in " << (end-begin-overhead) << " ticks.\n";
return end-begin;
}
int main() {
std::cout << "CLOCKS_PER_SEC is " << CLOCKS_PER_SEC << ".\n";
long overhead = test(baseline, "baseline", 0); //6359
test(AlfaOmega, "AlfaOmega", overhead); //2500
test(jalf, "jalf", overhead); //3297
test(harold, "harold", overhead); //6562
test(MichaelBurr, "MichaelBurr", overhead); //3281
test(BenVoigt, "BenVoigt", overhead); //0859
test(Manish, "Manish", overhead); //3688
test(MooingDuck1, "MooingDuck1", overhead); //3765
test(MooingDuck2, "MooingDuck2", overhead); //2031
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3RpbWU+CgojaWZkZWYgX0RFQlVHCiAgY29uc3Qgc2lnbmVkIG51bV90ZXN0cyA9IDEwMDAwMDAwOwojZWxzZQogIGNvbnN0IHNpZ25lZCBudW1fdGVzdHMgPSAxMDAwMDAwMDAwOyAKI2VuZGlmCgojaWZkZWYgX01TQ19WRVIKICAjZGVmaW5lIG5vaW5saW5lIF9fZGVjbHNwZWMobm9pbmxpbmUpCiNlbHNlCiAgI2RlZmluZSBub2lubGluZSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCiNlbmRpZgoKdm9pZCBiYXNlbGluZShzaWduZWQgbiwgc2lnbmVkJiBjcjApIHsKCWNyMCA9IDQ7Cn0KCnZvaWQgQWxmYU9tZWdhKHNpZ25lZCBuLCBzaWduZWQmIGNyMCkgewoJaWYgKG4gPCAwKQoJCWNyMCA9IDE7CgllbHNlIGlmIChuID4gMCkKCQljcjAgPSAyOwoJZWxzZQoJCWNyMCA9IDQ7Cn0KCnZvaWQgamFsZihzaWduZWQgbiwgc2lnbmVkJiBjcjApIHsKCWNyMCA9IDEgPDwgKChuID49IDApICsgKG4gPT0gMCkpOwp9Cgp2b2lkIGhhcm9sZChzaWduZWQgbiwgc2lnbmVkJiBjcjApIHsKCWludCB5ID0gKChuID4+IDMxKSAmIDEpIHwgKCgtbiA+PiAzMSkgJiAyKTsKCXkgJj0gMSB8IH4oeSA8PCAxKTsgIC8vIHJlbW92ZSB0aGUgMiBpZiBvZGQKCWNyMCA9ICh+KC15ID4+IDMxKSAmIDQpIHwgeTsKfQoKdm9pZCBNaWNoYWVsQnVycihzaWduZWQgbiwgc2lnbmVkJiBjcjApIHsKCWNyMCA9IDQgPj4gKCgyICogKG4gPCAwKSkgKyAobiA+IDApKTsKfQoKdm9pZCBCZW5Wb2lndChzaWduZWQgbiwgc2lnbmVkJiBjcjApIHsKCWNyMCA9ICgtKG4gfCAobi0xKSkgPj4gMzEpICYgNjsKCWNyMCB8PSAobiA+PiAzMSkgJiA1OwoJY3IwIF49IDQ7Cn0KCnZvaWQgTWFuaXNoKHNpZ25lZCBuLCBzaWduZWQmIGNyMCkgewoJY3IwID0gKChuID4+IDMxICYgMSkgfCAofm4gPj4gMzAgJiAyKSkgPDwgIW47Cn0KCnZvaWQgTW9vaW5nRHVjazEoc2lnbmVkIG4sIHNpZ25lZCYgY3IwKSB7CgljcjAgPSAxIDw8ICghKHVuc2lnbmVkKG4pPj4zMSkrKG49PTApKTsKfQoKdm9pZCBNb29pbmdEdWNrMihzaWduZWQgbiwgc2lnbmVkJiBjcjApIHsKCWNyMCA9IDIgPDwgKChuID09IDApIC0gKHVuc2lnbmVkKG4pID4+IDMxKSk7Cn0KCnR5cGVkZWYgdm9pZCAoKmZ1bmNwdHIpKHNpZ25lZCBuLCBzaWduZWQmIGNyMCk7CnN0YXRpYyBub2lubGluZSBsb25nIHRlc3QoZnVuY3B0ciBmdW5jLCBjb25zdCBjaGFyKiBuYW1lLCBsb25nIG92ZXJoZWFkKSB7CglzaWduZWQgbm9jaGVhdCA9IDA7CgljbG9ja190IGJlZ2luID0gY2xvY2soKTsKCWZvcihpbnQgaT0wOyBpPG51bV90ZXN0czsgKytpKSB7CgkJc2lnbmVkIHQ7CgkJZnVuYygtaSwgdCk7CgkJbm9jaGVhdCArPSB0OwoJCWZ1bmMoMCwgdCk7CgkJbm9jaGVhdCArPSB0OwoJCWZ1bmMoaSwgdCk7CgkJbm9jaGVhdCArPSB0OwoJfQoJY2xvY2tfdCBlbmQgPSBjbG9jaygpOwoJc3RkOjpjb3V0IDw8IG5hbWUgPDwgIiBmb3VuZCAiIDw8IG5vY2hlYXQgPDwgIiBpbiAiIDw8IChlbmQtYmVnaW4tb3ZlcmhlYWQpIDw8ICIgdGlja3MuXG4iOwoJcmV0dXJuIGVuZC1iZWdpbjsKfQoKaW50IG1haW4oKSB7CglzdGQ6OmNvdXQgPDwgIkNMT0NLU19QRVJfU0VDIGlzICIgPDwgQ0xPQ0tTX1BFUl9TRUMgPDwgIi5cbiI7Cglsb25nIG92ZXJoZWFkID0gdGVzdChiYXNlbGluZSwgImJhc2VsaW5lIiwgMCk7IC8vNjM1OQoJdGVzdChBbGZhT21lZ2EsICJBbGZhT21lZ2EiLCBvdmVyaGVhZCk7ICAgICAgICAvLzI1MDAKCXRlc3QoamFsZiwgImphbGYiLCBvdmVyaGVhZCk7ICAgICAgICAgICAgICAgICAgLy8zMjk3Cgl0ZXN0KGhhcm9sZCwgImhhcm9sZCIsIG92ZXJoZWFkKTsgICAgICAgICAgICAgIC8vNjU2MgoJdGVzdChNaWNoYWVsQnVyciwgIk1pY2hhZWxCdXJyIiwgb3ZlcmhlYWQpOyAgICAvLzMyODEKCXRlc3QoQmVuVm9pZ3QsICJCZW5Wb2lndCIsIG92ZXJoZWFkKTsgICAgICAgICAgLy8wODU5Cgl0ZXN0KE1hbmlzaCwgIk1hbmlzaCIsIG92ZXJoZWFkKTsgICAgICAgICAgICAgIC8vMzY4OAoJdGVzdChNb29pbmdEdWNrMSwgIk1vb2luZ0R1Y2sxIiwgb3ZlcmhlYWQpOyAgICAvLzM3NjUKCXRlc3QoTW9vaW5nRHVjazIsICJNb29pbmdEdWNrMiIsIG92ZXJoZWFkKTsgICAgLy8yMDMxCglyZXR1cm4gMDsKfQ==