1#include <stdint.h> 2#include <stdio.h> 3#include <string.h> 4 5void 6test(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 46int 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