1 #include <stdio.h> 2 3 /* Dummy variable. Needed to work around GCC code generation bugs */ 4 volatile long v; 5 6 #define INSERT_REG_MEM(insn, s1, s2) \ 7 ({ \ 8 unsigned long tmp = s1; \ 9 int cc; \ 10 asm volatile( #insn " %0, %3\n" \ 11 "ipm %1\n" \ 12 "srl %1,28\n" \ 13 : "+d" (tmp), "=d" (cc) \ 14 : "d" (tmp), "Q" (s2) \ 15 : "0", "cc"); \ 16 printf(#insn " %16.16lX <- %16.16lX = %16.16lX\n", s1, s2, tmp); \ 17 }) 18 19 #define INSERT_REG_IMM(insn, s1, s2) \ 20 ({ \ 21 register unsigned long tmp asm("2") = s1; \ 22 int cc; \ 23 asm volatile( insn(2,s2) \ 24 "ipm %1\n" \ 25 "srl %1,28\n" \ 26 : "+d" (tmp), "=d" (cc) \ 27 : "d" (tmp) \ 28 : "cc"); \ 29 v = tmp; /* work around GCC code gen bug */ \ 30 printf(#insn " %16.16lX <- %16.16lX = %16.16lX\n", s1, (unsigned long) 0x##s2, v); \ 31 }) 32 33 34 #define memsweep(i, s2) \ 35 ({ \ 36 INSERT_REG_MEM(i, 0ul, s2); \ 37 INSERT_REG_MEM(i, 1ul, s2); \ 38 INSERT_REG_MEM(i, 0xfffful, s2); \ 39 INSERT_REG_MEM(i, 0x7ffful, s2); \ 40 INSERT_REG_MEM(i, 0x8000ul, s2); \ 41 INSERT_REG_MEM(i, 0xfffffffful, s2); \ 42 INSERT_REG_MEM(i, 0x80000000ul, s2); \ 43 INSERT_REG_MEM(i, 0x7ffffffful, s2); \ 44 INSERT_REG_MEM(i, 0xaaaaaaaaaaaaaaaaul, s2); \ 45 INSERT_REG_MEM(i, 0x8000000000000000ul, s2); \ 46 INSERT_REG_MEM(i, 0xfffffffffffffffful, s2); \ 47 INSERT_REG_MEM(i, 0x5555555555555555ul, s2); \ 48 }) 49 50 #define immsweep(i, s2) \ 51 ({ \ 52 INSERT_REG_IMM(i, 0ul, s2); \ 53 INSERT_REG_IMM(i, 1ul, s2); \ 54 INSERT_REG_IMM(i, 0xfffful, s2); \ 55 INSERT_REG_IMM(i, 0x7ffful, s2); \ 56 INSERT_REG_IMM(i, 0x8000ul, s2); \ 57 INSERT_REG_IMM(i, 0xfffffffful, s2); \ 58 INSERT_REG_IMM(i, 0x80000000ul, s2); \ 59 INSERT_REG_IMM(i, 0x7ffffffful, s2); \ 60 INSERT_REG_IMM(i, 0xaaaaaaaaaaaaaaaaul, s2); \ 61 INSERT_REG_IMM(i, 0x8000000000000000ul, s2); \ 62 INSERT_REG_IMM(i, 0xfffffffffffffffful, s2); \ 63 INSERT_REG_IMM(i, 0x5555555555555555ul, s2); \ 64 }) 65 66 #define INSERT_ICY(s1, s2) \ 67 ({ \ 68 register unsigned long tmp asm("1") = s1; \ 69 register unsigned long *addr asm("2") = &s2; \ 70 int cc; \ 71 asm volatile( ICY(1,0,2,000,00) \ 72 "ipm %1\n" \ 73 "srl %1,28\n" \ 74 : "+d" (tmp), "=d" (cc) \ 75 : "d" (tmp), "Q" (s2), "d" (addr) \ 76 : "cc"); \ 77 printf("icy %16.16lX <- %16.16lX = %16.16lX\n", s1, s2, tmp); \ 78 }) 79 80 #define icysweep(s2) \ 81 ({ \ 82 INSERT_ICY(0ul, s2); \ 83 INSERT_ICY(1ul, s2); \ 84 INSERT_ICY(0xfffful, s2); \ 85 INSERT_ICY(0x7ffful, s2); \ 86 INSERT_ICY(0x8000ul, s2); \ 87 INSERT_ICY(0xfffffffful, s2); \ 88 INSERT_ICY(0x80000000ul, s2); \ 89 INSERT_ICY(0x7ffffffful, s2); \ 90 INSERT_ICY(0xaaaaaaaaaaaaaaaaul, s2); \ 91 INSERT_ICY(0x8000000000000000ul, s2); \ 92 INSERT_ICY(0xfffffffffffffffful, s2); \ 93 INSERT_ICY(0x5555555555555555ul, s2); \ 94 }) 95