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