#include <stdint.h>
#include <stdio.h>
typedef struct {
uint64_t high;
uint64_t low;
} __attribute__((aligned(16))) quad_word;
/* CDSG needs quad-word alignment */
quad_word _op1, _op2, _op3;
void
test(quad_word op1_init, quad_word op2_init, quad_word op3_init)
{
int cc; // unused
_op1 = op1_init;
_op2 = op2_init;
_op3 = op3_init;
__asm__ volatile (
"lmg %%r0,%%r1,%1\n\t"
"lmg %%r2,%%r3,%3\n\t"
"cdsg %%r0,%%r2,%2\n\t" // cdsg 1st,3rd,2nd
"stmg %%r0,%%r1,%1\n" // store r0,r1 to op1
"stmg %%r2,%%r3,%3\n" // store r2,r3 to op3
: "=d"(cc), "+QS" (_op1), "+QS" (_op2), "+QS" (_op3)
:
: "r0", "r1", "r2", "r3", "cc");
}
void op1_undefined(void)
{
quad_word op1, op2, op3;
// op1 undefined
op2.high = op2.low = 42;
op3.high = op3.low = 0xdeadbeefdeadbabeull;
test(op1, op2, op3); // complaint
}
void op2_undefined(void)
{
quad_word op1, op2, op3;
op1.high = op1.low = 42;
// op2 undefined
op3.high = op3.low = 0xdeadbeefdeadbabeull;
test(op1, op2, op3); // complaint
}
void op3_undefined(void)
{
quad_word op1, op2, op3;
op1.high = op1.low = 42;
op2 = op1;
// op3 undefined
test(op1, op2, op3); // no complaint; op3 is just copied around
}
int main ()
{
op1_undefined();
op2_undefined();
op3_undefined();
return 0;
}