Home | History | Annotate | Download | only in s390x
      1 #include <stdint.h>
      2 #include <stdio.h>
      3 
      4 typedef struct {
      5    uint64_t high;
      6    uint64_t low;
      7 } __attribute__((aligned(16))) quad_word;
      8 
      9 
     10 /* CDSG needs quad-word alignment */
     11 quad_word _op1, _op2, _op3;
     12 
     13 void
     14 test(quad_word op1_init, quad_word op2_init, quad_word op3_init)
     15 {
     16    int cc; // unused
     17    _op1 = op1_init;
     18    _op2 = op2_init;
     19    _op3 = op3_init;
     20 
     21    __asm__ volatile (
     22                      "lmg     %%r0,%%r1,%1\n\t"
     23                      "lmg     %%r2,%%r3,%3\n\t"
     24                      "cdsg    %%r0,%%r2,%2\n\t"  //  cdsg 1st,3rd,2nd
     25                      "stmg    %%r0,%%r1,%1\n"    // store r0,r1 to op1
     26                      "stmg    %%r2,%%r3,%3\n"    // store r2,r3 to op3
     27                      : "=d"(cc), "+QS" (_op1), "+QS" (_op2), "+QS" (_op3)
     28                      :
     29                      : "r0", "r1", "r2", "r3", "cc");
     30 }
     31 
     32 void op1_undefined(void)
     33 {
     34    quad_word op1, op2, op3;
     35 
     36    // op1 undefined
     37    op2.high = op2.low = 42;
     38    op3.high = op3.low = 0xdeadbeefdeadbabeull;
     39    test(op1, op2, op3);  // complaint
     40 }
     41 
     42 void op2_undefined(void)
     43 {
     44    quad_word op1, op2, op3;
     45 
     46    op1.high = op1.low = 42;
     47    // op2 undefined
     48    op3.high = op3.low = 0xdeadbeefdeadbabeull;
     49    test(op1, op2, op3);  // complaint
     50 }
     51 
     52 void op3_undefined(void)
     53 {
     54    quad_word op1, op2, op3;
     55 
     56    op1.high = op1.low = 42;
     57    op2 = op1;
     58    // op3 undefined
     59    test(op1, op2, op3);  // no complaint; op3 is just copied around
     60 }
     61 
     62 int main ()
     63 {
     64    op1_undefined();
     65    op2_undefined();
     66    op3_undefined();
     67 
     68    return 0;
     69 }
     70