1 #include <stdint.h>
2 #include <stdio.h>
3 #include <string.h>
4
5 void
test(int64_t op1_init,int64_t op2_init,int64_t op3_init,int expected_cc)6 test(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
main()45 int main ()
46 {
47 test(0x1000000000000000ull, 0x1000000000000000ull, 0x1234567887654321ull, 0);
48 test(0x1000000000000000ull, 0x2000000000000000ull, 0x1234567887654321ull, 1);
49
50 return 0;
51 }
52