/* See if ADOX give expected results */ | |
#include <assert.h> | |
#include <stdint.h> | |
#include <stdbool.h> | |
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; | |
} |