/* See if ADOX give expected results */ #include #include #include static uint64_t adoxq(bool *c_out, uint64_t a, uint64_t b, bool c) { asm ("addl $0x7fffffff, %k1\n\t" "adoxq %2, %0\n\t" "seto %b1" : "+r"(a), "=&r"(c) : "r"(b), "1"((int)c)); *c_out = c; return a; } static uint64_t adoxl(bool *c_out, uint64_t a, uint64_t b, bool c) { asm ("addl $0x7fffffff, %k1\n\t" "adoxl %k2, %k0\n\t" "seto %b1" : "+r"(a), "=&r"(c) : "r"(b), "1"((int)c)); *c_out = c; return a; } int main() { uint64_t r; bool c; r = adoxq(&c, 0, 0, 0); assert(r == 0); assert(c == 0); r = adoxl(&c, 0, 0, 0); assert(r == 0); assert(c == 0); r = adoxl(&c, 0x100000000, 0, 0); assert(r == 0); assert(c == 0); r = adoxq(&c, 0, 0, 1); assert(r == 1); assert(c == 0); r = adoxl(&c, 0, 0, 1); assert(r == 1); assert(c == 0); r = adoxq(&c, -1, -1, 0); assert(r == -2); assert(c == 1); r = adoxl(&c, -1, -1, 0); assert(r == 0xfffffffe); assert(c == 1); r = adoxq(&c, -1, -1, 1); assert(r == -1); assert(c == 1); r = adoxl(&c, -1, -1, 1); assert(r == 0xffffffff); assert(c == 1); return 0; }