1 #include <stdint.h> 2 #include <unistd.h> 3 4 int main(void) 5 { 6 char op1[] = {0, 1, 2, 3}; 7 char op2[256]; 8 register uint64_t r1 asm("r1") = 0xffffffffffffffffull; 9 register uint64_t r2 asm("r2") = 0xffffffffffffffffull; 10 uint64_t cc; 11 int i; 12 13 for (i = 0; i < 256; i++) { 14 if (i == 1) { 15 op2[i] = 0xbb; 16 } else { 17 op2[i] = 0; 18 } 19 } 20 asm volatile( 21 " j 2f\n" 22 "1: trtr 3(1,%[op1]),%[op2]\n" 23 "2: exrl %[op1_len],1b\n" 24 " ipm %[cc]\n" 25 : [r1] "+r" (r1), 26 [r2] "+r" (r2), 27 [cc] "=r" (cc) 28 : [op1] "a" (&op1), 29 [op1_len] "a" (3), 30 [op2] "Q" (op2) 31 : "cc"); 32 cc = (cc >> 28) & 3; 33 if (cc != 1) { 34 write(1, "bad cc\n", 7); 35 return 1; 36 } 37 if ((char *)r1 != &op1[1]) { 38 write(1, "bad r1\n", 7); 39 return 1; 40 } 41 if (r2 != 0xffffffffffffffbbull) { 42 write(1, "bad r2\n", 7); 43 return 1; 44 } 45 return 0; 46 } 47