1 #include <stdio.h> 2 3 #define MUL_REG_MEM(insn, m1, m2) \ 4 ({ \ 5 unsigned long tmp1 = m1; \ 6 unsigned long tmp2 = m1; \ 7 asm volatile( "lgr 2, %0\n" \ 8 "lgr 3, %1\n" \ 9 #insn " 2, %2\n" \ 10 "lgr %0,2\n" \ 11 "lgr %1,3\n" \ 12 : "+d" (tmp1), "+d" (tmp2) \ 13 : "Q" (m2) \ 14 : "2","3"); \ 15 printf(#insn " %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, m2, tmp1, tmp2); \ 16 }) 17 18 #define MUL_REG_REG(insn, m1, m2) \ 19 ({ \ 20 unsigned long tmp1 = m1; \ 21 unsigned long tmp2 = m1; \ 22 asm volatile( "lgr 2, %0\n" \ 23 "lgr 3, %1\n" \ 24 #insn " 2, %2\n" \ 25 "lgr %0,2\n" \ 26 "lgr %1,3\n" \ 27 : "+d" (tmp1), "+d" (tmp2) \ 28 : "d" (m2) \ 29 : "2","3"); \ 30 printf(#insn " %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, m2, tmp1, tmp2); \ 31 }) 32 33 #define MUL_REG_IMM(insn, m1, m2) \ 34 ({ \ 35 unsigned long tmp1 = m1; \ 36 unsigned long tmp2 = m1; \ 37 asm volatile( "lgr 2, %0\n" \ 38 "lgr 3, %1\n" \ 39 #insn " 2, " #m2 "\n" \ 40 "lgr %0,2\n" \ 41 "lgr %1,3\n" \ 42 : "+d" (tmp1), "+d" (tmp2) \ 43 :: "2","3"); \ 44 printf(#insn " %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, (unsigned long) m2, tmp1, tmp2); \ 45 }) 46 47 #define MUL_REG_XIMM(insn, m1, um2, m2) \ 48 ({ \ 49 unsigned long tmp1 = m1; \ 50 unsigned long tmp2 = m1; \ 51 asm volatile( "lgr 2, %0\n" \ 52 "lgr 3, %1\n" \ 53 insn(2,m2) \ 54 "lgr %0,2\n" \ 55 "lgr %1,3\n" \ 56 : "+d" (tmp1), "+d" (tmp2) \ 57 :: "2","3"); \ 58 printf(#insn " %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, (unsigned long) 0x##um2##m2, tmp1, tmp2); \ 59 }) 60 61 62 #define memsweep(i, m2) \ 63 ({ \ 64 MUL_REG_MEM(i, 0ul, m2); \ 65 MUL_REG_MEM(i, 1ul, m2); \ 66 MUL_REG_MEM(i, 0xfffful, m2); \ 67 MUL_REG_MEM(i, 0x7ffful, m2); \ 68 MUL_REG_MEM(i, 0x8000ul, m2); \ 69 MUL_REG_MEM(i, 0xfffffffful, m2); \ 70 MUL_REG_MEM(i, 0x80000000ul, m2); \ 71 MUL_REG_MEM(i, 0x7ffffffful, m2); \ 72 MUL_REG_MEM(i, 0xfffffffffffffffful, m2); \ 73 MUL_REG_MEM(i, 0x8000000000000000ul, m2); \ 74 MUL_REG_MEM(i, 0x7ffffffffffffffful, m2); \ 75 }) 76 77 #define regsweep(i, m2) \ 78 ({ \ 79 MUL_REG_REG(i, 0ul, m2); \ 80 MUL_REG_REG(i, 1ul, m2); \ 81 MUL_REG_REG(i, 0xfffful, m2); \ 82 MUL_REG_REG(i, 0x7ffful, m2); \ 83 MUL_REG_REG(i, 0x8000ul, m2); \ 84 MUL_REG_REG(i, 0xfffffffful, m2); \ 85 MUL_REG_REG(i, 0x80000000ul, m2); \ 86 MUL_REG_REG(i, 0x7ffffffful, m2); \ 87 MUL_REG_REG(i, 0xfffffffffffffffful, m2); \ 88 MUL_REG_REG(i, 0x8000000000000000ul, m2); \ 89 MUL_REG_REG(i, 0x7ffffffffffffffful, m2); \ 90 }) 91 92 #define immsweep(i, m2) \ 93 ({ \ 94 MUL_REG_IMM(i, 0ul, m2); \ 95 MUL_REG_IMM(i, 1ul, m2); \ 96 MUL_REG_IMM(i, 0xfffful, m2); \ 97 MUL_REG_IMM(i, 0x7ffful, m2); \ 98 MUL_REG_IMM(i, 0x8000ul, m2); \ 99 MUL_REG_IMM(i, 0xfffffffful, m2); \ 100 MUL_REG_IMM(i, 0x80000000ul, m2); \ 101 MUL_REG_IMM(i, 0x7ffffffful, m2); \ 102 MUL_REG_IMM(i, 0xfffffffffffffffful, m2); \ 103 MUL_REG_IMM(i, 0x8000000000000000ul, m2); \ 104 MUL_REG_IMM(i, 0x7ffffffffffffffful, m2); \ 105 }) 106 107 #define ximmsweep(i, um2, m2) \ 108 ({ \ 109 MUL_REG_XIMM(i, 0ul, um2, m2); \ 110 MUL_REG_XIMM(i, 1ul, um2, m2); \ 111 MUL_REG_XIMM(i, 0xfffful, um2, m2); \ 112 MUL_REG_XIMM(i, 0x7ffful, um2, m2); \ 113 MUL_REG_XIMM(i, 0x8000ul, um2, m2); \ 114 MUL_REG_XIMM(i, 0xfffffffful, um2, m2); \ 115 MUL_REG_XIMM(i, 0x80000000ul, um2, m2); \ 116 MUL_REG_XIMM(i, 0x7ffffffful, um2, m2); \ 117 MUL_REG_XIMM(i, 0xfffffffffffffffful, um2, m2); \ 118 MUL_REG_XIMM(i, 0x8000000000000000ul, um2, m2); \ 119 MUL_REG_XIMM(i, 0x7ffffffffffffffful, um2, m2); \ 120 }) 121 122 #define MUL_MSY(m1, m2) \ 123 ({ \ 124 unsigned long tmp1 = m1; \ 125 unsigned long tmp2 = m1; \ 126 register unsigned long *addr asm("5") = &m2; \ 127 asm volatile( "lgr 2, %0\n" \ 128 "lgr 3, %1\n" \ 129 MSY(2,0,5,000,00) \ 130 "lgr %0,2\n" \ 131 "lgr %1,3\n" \ 132 : "+d" (tmp1), "+d" (tmp2) \ 133 : "Q" (m2), "d" (addr) \ 134 : "2","3"); \ 135 printf("msy %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, m2, tmp1, tmp2); \ 136 }) 137 138 #define msysweep(s2) \ 139 ({ \ 140 MUL_MSY(0ul, s2); \ 141 MUL_MSY(1ul, s2); \ 142 MUL_MSY(0xfffful, s2); \ 143 MUL_MSY(0x7ffful, s2); \ 144 MUL_MSY(0x8000ul, s2); \ 145 MUL_MSY(0xfffffffful, s2); \ 146 MUL_MSY(0x80000000ul, s2); \ 147 MUL_MSY(0x7ffffffful, s2); \ 148 MUL_MSY(0xfffffffffffffffful, s2); \ 149 MUL_MSY(0x8000000000000000ul, s2); \ 150 MUL_MSY(0x7ffffffffffffffful, s2); \ 151 }) 152 153 #define MUL_MHY(m1, m2) \ 154 ({ \ 155 unsigned long tmp1 = m1; \ 156 unsigned long tmp2 = m1; \ 157 register unsigned long *addr asm("5") = &m2; \ 158 asm volatile( "lgr 2, %0\n" \ 159 "lgr 3, %1\n" \ 160 MHY(2,0,5,000,00) \ 161 "lgr %0,2\n" \ 162 "lgr %1,3\n" \ 163 : "+d" (tmp1), "+d" (tmp2) \ 164 : "Q" (m2), "d" (addr) \ 165 : "2","3"); \ 166 printf("mhy %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, m2, tmp1, tmp2); \ 167 }) 168 169 #define mhysweep(s2) \ 170 ({ \ 171 MUL_MHY(0ul, s2); \ 172 MUL_MHY(1ul, s2); \ 173 MUL_MHY(0xfffful, s2); \ 174 MUL_MHY(0x7ffful, s2); \ 175 MUL_MHY(0x8000ul, s2); \ 176 MUL_MHY(0xfffffffful, s2); \ 177 MUL_MHY(0x80000000ul, s2); \ 178 MUL_MHY(0x7ffffffful, s2); \ 179 MUL_MHY(0xfffffffffffffffful, s2); \ 180 MUL_MHY(0x8000000000000000ul, s2); \ 181 MUL_MHY(0x7ffffffffffffffful, s2); \ 182 }) 183 184 #define MUL_MFY(m1, m2) \ 185 ({ \ 186 unsigned long tmp1 = m1; \ 187 unsigned long tmp2 = m1; \ 188 register unsigned long *addr asm("5") = &m2; \ 189 asm volatile( "lgr 2, %0\n" \ 190 "lgr 3, %1\n" \ 191 MFY(2,0,5,000,00) \ 192 "lgr %0,2\n" \ 193 "lgr %1,3\n" \ 194 : "+d" (tmp1), "+d" (tmp2) \ 195 : "Q" (m2), "d" (addr) \ 196 : "2","3"); \ 197 printf("mfy %16.16lX * %16.16lX = %16.16lX%16.16lX\n", m1, m2, tmp1, tmp2); \ 198 }) 199 200 #define mfysweep(s2) \ 201 ({ \ 202 MUL_MFY(0ul, s2); \ 203 MUL_MFY(1ul, s2); \ 204 MUL_MFY(0xfffful, s2); \ 205 MUL_MFY(0x7ffful, s2); \ 206 MUL_MFY(0x8000ul, s2); \ 207 MUL_MFY(0xfffffffful, s2); \ 208 MUL_MFY(0x80000000ul, s2); \ 209 MUL_MFY(0x7ffffffful, s2); \ 210 MUL_MFY(0xfffffffffffffffful, s2); \ 211 MUL_MFY(0x8000000000000000ul, s2); \ 212 MUL_MFY(0x7ffffffffffffffful, s2); \ 213 }) 214