70 lines
1.3 KiB
C
70 lines
1.3 KiB
C
|
/* 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;
|
||
|
}
|