1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdint.h>
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h>
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtypedef struct {
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint64_t high;
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint64_t low;
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng} quad_word;
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengtest(quad_word op1_init, uint64_t op2_init, quad_word op3_init)
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   int cc; // unused
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   quad_word op1 = op1_init;
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint64_t  op2 = op2_init;
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   quad_word op3 = op3_init;
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   __asm__ volatile (
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     "lmg     %%r0,%%r1,%1\n\t"
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     "lmg     %%r2,%%r3,%3\n\t"
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     "cds     %%r0,%%r2,%2\n\t"  //  cds 1st,3rd,2nd
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     "stmg    %%r0,%%r1,%1\n"    // store r0,r1 to op1
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     "stmg    %%r2,%%r3,%3\n"    // store r2,r3 to op3
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     : "=d" (cc), "+QS" (op1), "+QS" (op2), "+QS" (op3)
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     :
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng                     : "r0", "r1", "r2", "r3", "cc");
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng// Return a quad-word that only bits low[32:63] are undefined
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengquad_word
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengmake_undefined(void)
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   quad_word val;
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   val.high = 0;
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   val.low |= 0xFFFFFFFF00000000ull;
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return val;
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid op1_undefined(void)
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   quad_word op1, op3;
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint64_t op2;
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // op1 undefined
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op1 = make_undefined();
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op2 = 42;
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op3.high = op3.low = 0xdeadbeefdeadbabeull;
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test(op1, op2, op3);  // complaint
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid op2_undefined(void)
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   quad_word op1, op3;
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint64_t op2;
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op1.high = op1.low = 42;
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   // op2 undefined
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op3.high = op3.low = 0xdeadbeefdeadbabeull;
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test(op1, op2, op3);  // complaint
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid op3_undefined(void)
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   quad_word op1, op3;
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   uint64_t op2;
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op1.high = op1.low = 42;
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op2 = 100;
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op3 = make_undefined();
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   test(op1, op2, op3);  // no complaint; op3 is just copied around
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main ()
76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op1_undefined();
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op2_undefined();
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   op3_undefined();
80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng   return 0;
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
83