qemu/tests/tcg/x86_64/adox.c
<<
>>
Prefs
   1/* See if ADOX give expected results */
   2
   3#include <assert.h>
   4#include <stdint.h>
   5#include <stdbool.h>
   6
   7static uint64_t adoxq(bool *c_out, uint64_t a, uint64_t b, bool c)
   8{
   9    asm ("addl $0x7fffffff, %k1\n\t"
  10         "adoxq %2, %0\n\t"
  11         "seto %b1"
  12         : "+r"(a), "=&r"(c) : "r"(b), "1"((int)c));
  13    *c_out = c;
  14    return a;
  15}
  16
  17static uint64_t adoxl(bool *c_out, uint64_t a, uint64_t b, bool c)
  18{
  19    asm ("addl $0x7fffffff, %k1\n\t"
  20         "adoxl %k2, %k0\n\t"
  21         "seto %b1"
  22         : "+r"(a), "=&r"(c) : "r"(b), "1"((int)c));
  23    *c_out = c;
  24    return a;
  25}
  26
  27int main()
  28{
  29    uint64_t r;
  30    bool c;
  31
  32    r = adoxq(&c, 0, 0, 0);
  33    assert(r == 0);
  34    assert(c == 0);
  35
  36    r = adoxl(&c, 0, 0, 0);
  37    assert(r == 0);
  38    assert(c == 0);
  39
  40    r = adoxl(&c, 0x100000000, 0, 0);
  41    assert(r == 0);
  42    assert(c == 0);
  43
  44    r = adoxq(&c, 0, 0, 1);
  45    assert(r == 1);
  46    assert(c == 0);
  47
  48    r = adoxl(&c, 0, 0, 1);
  49    assert(r == 1);
  50    assert(c == 0);
  51
  52    r = adoxq(&c, -1, -1, 0);
  53    assert(r == -2);
  54    assert(c == 1);
  55
  56    r = adoxl(&c, -1, -1, 0);
  57    assert(r == 0xfffffffe);
  58    assert(c == 1);
  59
  60    r = adoxq(&c, -1, -1, 1);
  61    assert(r == -1);
  62    assert(c == 1);
  63
  64    r = adoxl(&c, -1, -1, 1);
  65    assert(r == 0xffffffff);
  66    assert(c == 1);
  67
  68    return 0;
  69}
  70