| #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; |
| } |