csg.c revision 663860b1408516d02ebfcb3a9999a134e6cfb223
1#include <stdint.h>
2#include <stdio.h>
3#include <string.h>
4
5void
6test(int64_t op1_init, int64_t op2_init, int64_t op3_init, int expected_cc)
7{
8   register int64_t op1 asm("8") = op1_init;
9   register int64_t op3 asm("9") = op3_init;
10
11   int64_t op2 = op2_init;
12   int cc = 1 - expected_cc;
13
14   printf("before op1 = %#lx\n", op1);
15   printf("before op2 = %#lx\n", op2);
16   printf("before op3 = %#lx\n", op3);
17
18   __asm__ volatile (
19           "csg     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 = %#lx\n", op1);
27   printf("after  op2 = %#lx\n", op2);
28   printf("after  op3 = %#lx\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) {
35      if (op2 != op3) {
36         printf("operand #2 not updated\n");
37      }
38   } else {
39      if (op1 != op2) {
40         printf("operand #1 not updated\n");
41      }
42   }
43}
44
45int main ()
46{
47   test(0x1000000000000000ull, 0x1000000000000000ull, 0x1234567887654321ull, 0);
48   test(0x1000000000000000ull, 0x2000000000000000ull, 0x1234567887654321ull, 1);
49
50   return 0;
51}
52