#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#define T int
typedef struct FakeVector FakeVector;
struct FakeVector
{
T *mem;
size_t capacity;
size_t count;
};
#define CHECK_ADD 1
void Add(FakeVector *vec, T *item)
{
while (1)
{
#if CHECK_MULTIPLY
// This...
if (vec->capacity > vec->capacity * 2)
abort();
// ...generates:
// 0x00401504 mov 0x8(%rcx),%rdx
// 0x00401508 lea (%rdx,%rdx,1),%rax
// 0x0040150C cmp %rdx,%rax
// 0x0040150F jae 0x401516 <Add+22>
// 0x00401511 callq 0x4075d0 <abort>
// 0x00401516 test %rdx,%rdx
// 0x00401519 mov $0x10,%edx
// 0x0040151E cmove %rdx,%rax
// 0x00401522 incq 0x10(%rcx)
// 0x00401526 mov %rax,0x8(%rcx)
vec->capacity = vec->capacity
? (vec->capacity * 2)
: 16;
++vec->count;
#elif CHECK_ADD
//if (vec->capacity + 1 < vec->capacity)
if (vec->capacity > vec->capacity + 1)
abort();
// 0x00401504 mov 0x8(%rcx),%rdx
// 0x00401508 lea 0x1(%rdx),%rax
// 0x0040150C cmp %rdx,%rax
// 0x0040150F jae 0x401516 <Add+22>
// 0x00401511 callq 0x4075d0 <abort>
// 0x00401516 test %rdx,%rdx
// 0x00401519 mov $0x10,%edx
// 0x0040151E cmove %rdx,%rax
// 0x00401522 mov %rax,0x8(%rcx)
vec->capacity = vec->capacity
? (vec->capacity + 1)
: 16;
#endif
}
}
//volatile int trick;
int main()
{
DebugBreak();
FakeVector *vec;
vec = (FakeVector*)calloc(1, sizeof(*vec));
T val;
while (1)
Add(vec, &val);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KCiNpbmNsdWRlIDx3aW5kb3dzLmg+CgojZGVmaW5lIFQgaW50CnR5cGVkZWYgc3RydWN0IEZha2VWZWN0b3IgRmFrZVZlY3RvcjsKc3RydWN0IEZha2VWZWN0b3IKewogIFQgKm1lbTsKICBzaXplX3QgY2FwYWNpdHk7CiAgc2l6ZV90IGNvdW50Owp9OwoKI2RlZmluZSBDSEVDS19BREQgMQoKdm9pZCBBZGQoRmFrZVZlY3RvciAqdmVjLCBUICppdGVtKQp7CiAgd2hpbGUgKDEpCiAgewojaWYgQ0hFQ0tfTVVMVElQTFkKICAgIC8vIFRoaXMuLi4KICAgIGlmICh2ZWMtPmNhcGFjaXR5ID4gdmVjLT5jYXBhY2l0eSAqIDIpCiAgICAgIGFib3J0KCk7CiAgICAvLyAuLi5nZW5lcmF0ZXM6CiAgICAvLyAweDAwNDAxNTA0ICAgIG1vdiAgICAweDgoJXJjeCksJXJkeAogICAgLy8gMHgwMDQwMTUwOAlsZWEgICAgKCVyZHgsJXJkeCwxKSwlcmF4CiAgICAvLyAweDAwNDAxNTBDCWNtcCAgICAlcmR4LCVyYXgKICAgIC8vIDB4MDA0MDE1MEYJamFlICAgIDB4NDAxNTE2IDxBZGQrMjI+CiAgICAvLyAweDAwNDAxNTExCWNhbGxxICAweDQwNzVkMCA8YWJvcnQ+CiAgICAvLyAweDAwNDAxNTE2CXRlc3QgICAlcmR4LCVyZHgKICAgIC8vIDB4MDA0MDE1MTkJbW92ICAgICQweDEwLCVlZHgKICAgIC8vIDB4MDA0MDE1MUUJY21vdmUgICVyZHgsJXJheAogICAgLy8gMHgwMDQwMTUyMglpbmNxICAgMHgxMCglcmN4KQogICAgLy8gMHgwMDQwMTUyNgltb3YgICAgJXJheCwweDgoJXJjeCkKICAgIHZlYy0+Y2FwYWNpdHkgPSB2ZWMtPmNhcGFjaXR5CiAgICAgPyAodmVjLT5jYXBhY2l0eSAqIDIpCiAgICAgOiAxNjsKICAgICsrdmVjLT5jb3VudDsKCiNlbGlmIENIRUNLX0FERAoKICAgIC8vaWYgKHZlYy0+Y2FwYWNpdHkgKyAxIDwgdmVjLT5jYXBhY2l0eSkKICAgIGlmICh2ZWMtPmNhcGFjaXR5ID4gdmVjLT5jYXBhY2l0eSArIDEpCiAgICAgIGFib3J0KCk7CgogICAgLy8gMHgwMDQwMTUwNAltb3YgICAgMHg4KCVyY3gpLCVyZHgKICAgIC8vIDB4MDA0MDE1MDgJbGVhICAgIDB4MSglcmR4KSwlcmF4CiAgICAvLyAweDAwNDAxNTBDCWNtcCAgICAlcmR4LCVyYXgKICAgIC8vIDB4MDA0MDE1MEYJamFlICAgIDB4NDAxNTE2IDxBZGQrMjI+CiAgICAvLyAweDAwNDAxNTExCWNhbGxxICAweDQwNzVkMCA8YWJvcnQ+CiAgICAvLyAweDAwNDAxNTE2CXRlc3QgICAlcmR4LCVyZHgKICAgIC8vIDB4MDA0MDE1MTkJbW92ICAgICQweDEwLCVlZHgKICAgIC8vIDB4MDA0MDE1MUUJY21vdmUgICVyZHgsJXJheAogICAgLy8gMHgwMDQwMTUyMgltb3YgICAgJXJheCwweDgoJXJjeCkKCiAgICB2ZWMtPmNhcGFjaXR5ID0gdmVjLT5jYXBhY2l0eQogICAgID8gKHZlYy0+Y2FwYWNpdHkgKyAxKQogICAgIDogMTY7CiNlbmRpZgogIH0KfQoKLy92b2xhdGlsZSBpbnQgdHJpY2s7CgppbnQgbWFpbigpCnsKICBEZWJ1Z0JyZWFrKCk7CiAgRmFrZVZlY3RvciAqdmVjOwogIHZlYyA9IChGYWtlVmVjdG9yKiljYWxsb2MoMSwgc2l6ZW9mKCp2ZWMpKTsKICBUIHZhbDsKICB3aGlsZSAoMSkKICAgIEFkZCh2ZWMsICZ2YWwpOwogIHJldHVybiAwOwp9Cg==