Home | History | Annotate | Download | only in s390x
      1 #include <stdint.h>
      2 #include <stdio.h>
      3 #include <string.h>
      4 
      5 void
      6 test(int32_t op1_init, int32_t op2_init, int32_t op3_init, int expected_cc)
      7 {
      8    register int32_t op1 asm("8") = op1_init;
      9    register int32_t op3 asm("9") = op3_init;
     10 
     11    int32_t op2 = op2_init;
     12    int cc = 1 - expected_cc;
     13 
     14    printf("before op1 = %#x\n", op1);
     15    printf("before op2 = %#x\n", op2);
     16    printf("before op3 = %#x\n", op3);
     17 
     18    __asm__ volatile (
     19            ".insn rsy,0xEB00000000f8, 8,9,%1\n\t"
     20            "ipm     %0\n\t"
     21            "srl     %0,28\n\t"
     22            : "=d" (cc), "+Q" (op2), "+d"(op1), "+d"(op3)
     23            :
     24            : "cc");
     25 
     26    printf("after  op1 = %#x\n", op1);
     27    printf("after  op2 = %#x\n", op2);
     28    printf("after  op3 = %#x\n", op3);
     29    printf("cc = %d\n", cc);
     30 
     31    if (cc != expected_cc) {
     32       printf("condition code is incorrect\n");
     33    }
     34    if (expected_cc == 0 && op2 != 0) {
     35       printf("cc = 0, but result != 0\n");
     36    }
     37    if (expected_cc == 1 && op2 >= 0) {
     38       printf("cc = 1, but result >= 0\n");
     39    }
     40    if (expected_cc == 2 && op2 <= 0) {
     41       printf("cc = 2, but result <= 0\n");
     42    }
     43    /* the test for cc = 3 is left as an exercise for the reader. */
     44 }
     45 
     46 int main ()
     47 {
     48    test(0, 0, 0, 0);
     49    test(-1, -1, -1, 1);
     50    test(0x10000000, 0x10000000, 0x12345678, 2);
     51    test(0x10000000, 0x20000000, 0x12345678, 2);
     52 
     53    test(-1, 3, -3, 0);
     54    test(0, -1, -1, 1);
     55    test(-1, 0x10000000, 0x12345678, 2);
     56    test(0x10000000, 0x7fffffff, 1, 3);
     57 
     58    return 0;
     59 }
     60