sewardj | 918345e | 2006-02-12 18:56:16 +0000 | [diff] [blame] | 1 | |
| 2 | #include <stdio.h> |
| 3 | |
| 4 | typedef unsigned long long int ULong; |
| 5 | |
| 6 | /* ------------------------ SRADI ------------------------ */ |
| 7 | |
| 8 | #define INSN_SRADI(nnn) \ |
| 9 | void do_sradi_##nnn ( ULong arg, /*OUT*/ULong* res, /*OUT*/ULong* xer ) \ |
| 10 | { \ |
| 11 | ULong argW = arg; \ |
| 12 | ULong resW = 0; \ |
| 13 | ULong xerW = 0; \ |
| 14 | __asm__ __volatile__( \ |
| 15 | "sradi %0,%2, " #nnn "\n\t" \ |
| 16 | "mfxer %1" \ |
| 17 | : /*out*/ "=b"(resW), "=b"(xerW) \ |
| 18 | : /*in*/ "b"(argW) \ |
| 19 | : /*trash*/ "cc" \ |
| 20 | ); \ |
| 21 | *res = resW; \ |
| 22 | *xer = xerW; \ |
| 23 | } |
| 24 | |
| 25 | INSN_SRADI(0) |
| 26 | INSN_SRADI(1) |
| 27 | INSN_SRADI(2) |
| 28 | INSN_SRADI(3) |
| 29 | INSN_SRADI(4) |
| 30 | INSN_SRADI(5) |
| 31 | INSN_SRADI(6) |
| 32 | INSN_SRADI(7) |
| 33 | INSN_SRADI(8) |
| 34 | INSN_SRADI(9) |
| 35 | INSN_SRADI(10) |
| 36 | INSN_SRADI(11) |
| 37 | INSN_SRADI(12) |
| 38 | INSN_SRADI(13) |
| 39 | INSN_SRADI(14) |
| 40 | INSN_SRADI(15) |
| 41 | INSN_SRADI(16) |
| 42 | INSN_SRADI(17) |
| 43 | INSN_SRADI(18) |
| 44 | INSN_SRADI(19) |
| 45 | INSN_SRADI(20) |
| 46 | INSN_SRADI(21) |
| 47 | INSN_SRADI(22) |
| 48 | INSN_SRADI(23) |
| 49 | INSN_SRADI(24) |
| 50 | INSN_SRADI(25) |
| 51 | INSN_SRADI(26) |
| 52 | INSN_SRADI(27) |
| 53 | INSN_SRADI(28) |
| 54 | INSN_SRADI(29) |
| 55 | INSN_SRADI(30) |
| 56 | INSN_SRADI(31) |
| 57 | INSN_SRADI(32) |
| 58 | INSN_SRADI(33) |
| 59 | INSN_SRADI(34) |
| 60 | INSN_SRADI(35) |
| 61 | INSN_SRADI(36) |
| 62 | INSN_SRADI(37) |
| 63 | INSN_SRADI(38) |
| 64 | INSN_SRADI(39) |
| 65 | INSN_SRADI(40) |
| 66 | INSN_SRADI(41) |
| 67 | INSN_SRADI(42) |
| 68 | INSN_SRADI(43) |
| 69 | INSN_SRADI(44) |
| 70 | INSN_SRADI(45) |
| 71 | INSN_SRADI(46) |
| 72 | INSN_SRADI(47) |
| 73 | INSN_SRADI(48) |
| 74 | INSN_SRADI(49) |
| 75 | INSN_SRADI(50) |
| 76 | INSN_SRADI(51) |
| 77 | INSN_SRADI(52) |
| 78 | INSN_SRADI(53) |
| 79 | INSN_SRADI(54) |
| 80 | INSN_SRADI(55) |
| 81 | INSN_SRADI(56) |
| 82 | INSN_SRADI(57) |
| 83 | INSN_SRADI(58) |
| 84 | INSN_SRADI(59) |
| 85 | INSN_SRADI(60) |
| 86 | INSN_SRADI(61) |
| 87 | INSN_SRADI(62) |
| 88 | INSN_SRADI(63) |
| 89 | |
| 90 | static void* all_sradi[64] |
| 91 | = { |
| 92 | (void*)&do_sradi_0, |
| 93 | (void*)&do_sradi_1, |
| 94 | (void*)&do_sradi_2, |
| 95 | (void*)&do_sradi_3, |
| 96 | (void*)&do_sradi_4, |
| 97 | (void*)&do_sradi_5, |
| 98 | (void*)&do_sradi_6, |
| 99 | (void*)&do_sradi_7, |
| 100 | (void*)&do_sradi_8, |
| 101 | (void*)&do_sradi_9, |
| 102 | (void*)&do_sradi_10, |
| 103 | (void*)&do_sradi_11, |
| 104 | (void*)&do_sradi_12, |
| 105 | (void*)&do_sradi_13, |
| 106 | (void*)&do_sradi_14, |
| 107 | (void*)&do_sradi_15, |
| 108 | (void*)&do_sradi_16, |
| 109 | (void*)&do_sradi_17, |
| 110 | (void*)&do_sradi_18, |
| 111 | (void*)&do_sradi_19, |
| 112 | (void*)&do_sradi_20, |
| 113 | (void*)&do_sradi_21, |
| 114 | (void*)&do_sradi_22, |
| 115 | (void*)&do_sradi_23, |
| 116 | (void*)&do_sradi_24, |
| 117 | (void*)&do_sradi_25, |
| 118 | (void*)&do_sradi_26, |
| 119 | (void*)&do_sradi_27, |
| 120 | (void*)&do_sradi_28, |
| 121 | (void*)&do_sradi_29, |
| 122 | (void*)&do_sradi_30, |
| 123 | (void*)&do_sradi_31, |
| 124 | (void*)&do_sradi_32, |
| 125 | (void*)&do_sradi_33, |
| 126 | (void*)&do_sradi_34, |
| 127 | (void*)&do_sradi_35, |
| 128 | (void*)&do_sradi_36, |
| 129 | (void*)&do_sradi_37, |
| 130 | (void*)&do_sradi_38, |
| 131 | (void*)&do_sradi_39, |
| 132 | (void*)&do_sradi_40, |
| 133 | (void*)&do_sradi_41, |
| 134 | (void*)&do_sradi_42, |
| 135 | (void*)&do_sradi_43, |
| 136 | (void*)&do_sradi_44, |
| 137 | (void*)&do_sradi_45, |
| 138 | (void*)&do_sradi_46, |
| 139 | (void*)&do_sradi_47, |
| 140 | (void*)&do_sradi_48, |
| 141 | (void*)&do_sradi_49, |
| 142 | (void*)&do_sradi_50, |
| 143 | (void*)&do_sradi_51, |
| 144 | (void*)&do_sradi_52, |
| 145 | (void*)&do_sradi_53, |
| 146 | (void*)&do_sradi_54, |
| 147 | (void*)&do_sradi_55, |
| 148 | (void*)&do_sradi_56, |
| 149 | (void*)&do_sradi_57, |
| 150 | (void*)&do_sradi_58, |
| 151 | (void*)&do_sradi_59, |
| 152 | (void*)&do_sradi_60, |
| 153 | (void*)&do_sradi_61, |
| 154 | (void*)&do_sradi_62, |
| 155 | (void*)&do_sradi_63 |
| 156 | }; |
| 157 | |
| 158 | /* ------------------------ SRAWI ------------------------ */ |
| 159 | |
| 160 | #define INSN_SRAWI(nnn) \ |
| 161 | void do_srawi_##nnn ( ULong arg, /*OUT*/ULong* res, /*OUT*/ULong* xer ) \ |
| 162 | { \ |
| 163 | ULong argW = arg; \ |
| 164 | ULong resW = 0; \ |
| 165 | ULong xerW = 0; \ |
| 166 | __asm__ __volatile__( \ |
| 167 | "srawi %0,%2, " #nnn "\n\t" \ |
| 168 | "mfxer %1" \ |
| 169 | : /*out*/ "=b"(resW), "=b"(xerW) \ |
| 170 | : /*in*/ "b"(argW) \ |
| 171 | : /*trash*/ "cc" \ |
| 172 | ); \ |
| 173 | *res = resW; \ |
| 174 | *xer = xerW; \ |
| 175 | } |
| 176 | |
| 177 | INSN_SRAWI(0) |
| 178 | INSN_SRAWI(1) |
| 179 | INSN_SRAWI(2) |
| 180 | INSN_SRAWI(3) |
| 181 | INSN_SRAWI(4) |
| 182 | INSN_SRAWI(5) |
| 183 | INSN_SRAWI(6) |
| 184 | INSN_SRAWI(7) |
| 185 | INSN_SRAWI(8) |
| 186 | INSN_SRAWI(9) |
| 187 | INSN_SRAWI(10) |
| 188 | INSN_SRAWI(11) |
| 189 | INSN_SRAWI(12) |
| 190 | INSN_SRAWI(13) |
| 191 | INSN_SRAWI(14) |
| 192 | INSN_SRAWI(15) |
| 193 | INSN_SRAWI(16) |
| 194 | INSN_SRAWI(17) |
| 195 | INSN_SRAWI(18) |
| 196 | INSN_SRAWI(19) |
| 197 | INSN_SRAWI(20) |
| 198 | INSN_SRAWI(21) |
| 199 | INSN_SRAWI(22) |
| 200 | INSN_SRAWI(23) |
| 201 | INSN_SRAWI(24) |
| 202 | INSN_SRAWI(25) |
| 203 | INSN_SRAWI(26) |
| 204 | INSN_SRAWI(27) |
| 205 | INSN_SRAWI(28) |
| 206 | INSN_SRAWI(29) |
| 207 | INSN_SRAWI(30) |
| 208 | INSN_SRAWI(31) |
| 209 | |
| 210 | static void* all_srawi[32] |
| 211 | = { |
| 212 | (void*)&do_srawi_0, |
| 213 | (void*)&do_srawi_1, |
| 214 | (void*)&do_srawi_2, |
| 215 | (void*)&do_srawi_3, |
| 216 | (void*)&do_srawi_4, |
| 217 | (void*)&do_srawi_5, |
| 218 | (void*)&do_srawi_6, |
| 219 | (void*)&do_srawi_7, |
| 220 | (void*)&do_srawi_8, |
| 221 | (void*)&do_srawi_9, |
| 222 | (void*)&do_srawi_10, |
| 223 | (void*)&do_srawi_11, |
| 224 | (void*)&do_srawi_12, |
| 225 | (void*)&do_srawi_13, |
| 226 | (void*)&do_srawi_14, |
| 227 | (void*)&do_srawi_15, |
| 228 | (void*)&do_srawi_16, |
| 229 | (void*)&do_srawi_17, |
| 230 | (void*)&do_srawi_18, |
| 231 | (void*)&do_srawi_19, |
| 232 | (void*)&do_srawi_20, |
| 233 | (void*)&do_srawi_21, |
| 234 | (void*)&do_srawi_22, |
| 235 | (void*)&do_srawi_23, |
| 236 | (void*)&do_srawi_24, |
| 237 | (void*)&do_srawi_25, |
| 238 | (void*)&do_srawi_26, |
| 239 | (void*)&do_srawi_27, |
| 240 | (void*)&do_srawi_28, |
| 241 | (void*)&do_srawi_29, |
| 242 | (void*)&do_srawi_30, |
| 243 | (void*)&do_srawi_31 |
| 244 | }; |
| 245 | |
| 246 | /* ------------------------ SRAD ------------------------ */ |
| 247 | |
| 248 | void do_srad ( ULong arg1, ULong arg2, |
| 249 | /*OUT*/ULong* res, /*OUT*/ULong* xer ) |
| 250 | { |
| 251 | ULong arg1W = arg1; |
| 252 | ULong arg2W = arg2; |
| 253 | ULong resW = 0; |
| 254 | ULong xerW = 0; |
| 255 | __asm__ __volatile__( |
| 256 | "srad %0,%2,%3\n\t" |
| 257 | "mfxer %1" |
| 258 | : /*out*/ "=b"(resW), "=b"(xerW) |
| 259 | : /*in*/ "b"(arg1W), "b"(arg2W) |
| 260 | : /*trash*/ "cc" |
| 261 | ); |
| 262 | *res = resW; |
| 263 | *xer = xerW; |
| 264 | } |
| 265 | |
| 266 | |
| 267 | /* ------------------------ SRAW ------------------------ */ |
| 268 | |
| 269 | void do_sraw ( ULong arg1, ULong arg2, |
| 270 | /*OUT*/ULong* res, /*OUT*/ULong* xer ) |
| 271 | { |
| 272 | ULong arg1W = arg1; |
| 273 | ULong arg2W = arg2; |
| 274 | ULong resW = 0; |
| 275 | ULong xerW = 0; |
| 276 | __asm__ __volatile__( |
| 277 | "sraw %0,%2,%3\n\t" |
| 278 | "mfxer %1" |
| 279 | : /*out*/ "=b"(resW), "=b"(xerW) |
| 280 | : /*in*/ "b"(arg1W), "b"(arg2W) |
| 281 | : /*trash*/ "cc" |
| 282 | ); |
| 283 | *res = resW; |
| 284 | *xer = xerW; |
| 285 | } |
| 286 | |
| 287 | /* ------------------------ SRD ------------------------ */ |
| 288 | |
| 289 | void do_srd ( ULong arg1, ULong arg2, |
| 290 | /*OUT*/ULong* res, /*OUT*/ULong* xer ) |
| 291 | { |
| 292 | ULong arg1W = arg1; |
| 293 | ULong arg2W = arg2; |
| 294 | ULong resW = 0; |
| 295 | ULong xerW = 0; |
| 296 | __asm__ __volatile__( |
| 297 | "srd %0,%2,%3\n\t" |
| 298 | "mfxer %1" |
| 299 | : /*out*/ "=b"(resW), "=b"(xerW) |
| 300 | : /*in*/ "b"(arg1W), "b"(arg2W) |
| 301 | : /*trash*/ "cc" |
| 302 | ); |
| 303 | *res = resW; |
| 304 | *xer = xerW; |
| 305 | } |
| 306 | |
| 307 | |
| 308 | /* ------------------------ SRW ------------------------ */ |
| 309 | |
| 310 | void do_srw ( ULong arg1, ULong arg2, |
| 311 | /*OUT*/ULong* res, /*OUT*/ULong* xer ) |
| 312 | { |
| 313 | ULong arg1W = arg1; |
| 314 | ULong arg2W = arg2; |
| 315 | ULong resW = 0; |
| 316 | ULong xerW = 0; |
| 317 | __asm__ __volatile__( |
| 318 | "srw %0,%2,%3\n\t" |
| 319 | "mfxer %1" |
| 320 | : /*out*/ "=b"(resW), "=b"(xerW) |
| 321 | : /*in*/ "b"(arg1W), "b"(arg2W) |
| 322 | : /*trash*/ "cc" |
| 323 | ); |
| 324 | *res = resW; |
| 325 | *xer = xerW; |
| 326 | } |
| 327 | |
| 328 | |
| 329 | /* ------------------------ SLD ------------------------ */ |
| 330 | |
| 331 | void do_sld ( ULong arg1, ULong arg2, |
| 332 | /*OUT*/ULong* res, /*OUT*/ULong* xer ) |
| 333 | { |
| 334 | ULong arg1W = arg1; |
| 335 | ULong arg2W = arg2; |
| 336 | ULong resW = 0; |
| 337 | ULong xerW = 0; |
| 338 | __asm__ __volatile__( |
| 339 | "sld %0,%2,%3\n\t" |
| 340 | "mfxer %1" |
| 341 | : /*out*/ "=b"(resW), "=b"(xerW) |
| 342 | : /*in*/ "b"(arg1W), "b"(arg2W) |
| 343 | : /*trash*/ "cc" |
| 344 | ); |
| 345 | *res = resW; |
| 346 | *xer = xerW; |
| 347 | } |
| 348 | |
| 349 | |
| 350 | /* ------------------------ SLW ------------------------ */ |
| 351 | |
| 352 | void do_slw ( ULong arg1, ULong arg2, |
| 353 | /*OUT*/ULong* res, /*OUT*/ULong* xer ) |
| 354 | { |
| 355 | ULong arg1W = arg1; |
| 356 | ULong arg2W = arg2; |
| 357 | ULong resW = 0; |
| 358 | ULong xerW = 0; |
| 359 | __asm__ __volatile__( |
| 360 | "slw %0,%2,%3\n\t" |
| 361 | "mfxer %1" |
| 362 | : /*out*/ "=b"(resW), "=b"(xerW) |
| 363 | : /*in*/ "b"(arg1W), "b"(arg2W) |
| 364 | : /*trash*/ "cc" |
| 365 | ); |
| 366 | *res = resW; |
| 367 | *xer = xerW; |
| 368 | } |
| 369 | |
| 370 | |
| 371 | /* ------------------------ ------------------------ */ |
| 372 | /* ------------------------ ------------------------ */ |
| 373 | /* ------------------------ ------------------------ */ |
| 374 | |
| 375 | #define N_ARGS64 41 |
| 376 | |
| 377 | ULong args64[N_ARGS64] = { |
| 378 | 0x0000000000000000ULL, |
| 379 | |
| 380 | 0x0000000000000001ULL, |
| 381 | 0x0000000031415927ULL, |
| 382 | 0x000000007FFFFFFFULL, |
| 383 | 0x0000000080000000ULL, |
| 384 | 0x00000000FFFFFFFFULL, |
| 385 | |
| 386 | 0x0000000100000000ULL, |
| 387 | 0x3141592700000000ULL, |
| 388 | 0x7FFFFFFF00000000ULL, |
| 389 | 0x8000000000000000ULL, |
| 390 | 0xFFFFFFFF00000000ULL, |
| 391 | |
| 392 | 0x7FFFFFFF00000001ULL, |
| 393 | 0x7FFFFFFF31415927ULL, |
| 394 | 0x7FFFFFFF7FFFFFFFULL, |
| 395 | 0x7FFFFFFF80000000ULL, |
| 396 | 0x7FFFFFFFFFFFFFFFULL, |
| 397 | |
| 398 | 0x000000017FFFFFFFULL, |
| 399 | 0x314159277FFFFFFFULL, |
| 400 | 0x7FFFFFFF7FFFFFFFULL, |
| 401 | 0x800000007FFFFFFFULL, |
| 402 | 0xFFFFFFFF7FFFFFFFULL, |
| 403 | |
| 404 | 0x8000000000000001ULL, |
| 405 | 0x8000000031415927ULL, |
| 406 | 0x800000007FFFFFFFULL, |
| 407 | 0x8000000080000000ULL, |
| 408 | 0x80000000FFFFFFFFULL, |
| 409 | |
| 410 | 0x0000000180000000ULL, |
| 411 | 0x3141592780000000ULL, |
| 412 | 0x7FFFFFFF80000000ULL, |
| 413 | 0x8000000080000000ULL, |
| 414 | 0xFFFFFFFF80000000ULL, |
| 415 | |
| 416 | 0xFFFFFFFF00000001ULL, |
| 417 | 0xFFFFFFFF31415927ULL, |
| 418 | 0xFFFFFFFF7FFFFFFFULL, |
| 419 | 0xFFFFFFFF80000000ULL, |
| 420 | 0xFFFFFFFFFFFFFFFFULL, |
| 421 | |
| 422 | 0x00000001FFFFFFFFULL, |
| 423 | 0x31415927FFFFFFFFULL, |
| 424 | 0x7FFFFFFFFFFFFFFFULL, |
| 425 | 0x80000000FFFFFFFFULL, |
| 426 | 0xFFFFFFFFFFFFFFFFULL |
| 427 | }; |
| 428 | |
| 429 | void do_unary ( char* name, void** fns, int n_fns ) |
| 430 | { |
| 431 | int i, j; |
| 432 | ULong arg, res, xer; |
| 433 | void(*fn)(ULong,ULong*,ULong*); |
| 434 | for (i = 0; i < n_fns; i++) { /* shift */ |
| 435 | for (j = 0; j < N_ARGS64; j++) { /* arg */ |
| 436 | arg = args64[j]; |
| 437 | res = xer = 0; |
| 438 | fn = fns[i]; |
| 439 | fn( arg, &res, &xer ); |
| 440 | printf("%5s(0x%016llx, %2d) = 0x%016llx, %d\n", |
| 441 | name, arg, (int)i, res, (int)((xer >> 29 & 1))); |
| 442 | } |
| 443 | } |
| 444 | } |
| 445 | |
| 446 | void do_binary ( char* name, void* fnV ) |
| 447 | { |
| 448 | int i, j; |
| 449 | ULong arg1, arg2, res, xer; |
| 450 | void(*fn)(ULong,ULong,ULong*,ULong*); |
| 451 | for (i = 0; i < 64+10; i++) { /* shift */ |
| 452 | for (j = 0; j < N_ARGS64; j++) { /* arg */ |
| 453 | arg1 = args64[j]; |
| 454 | arg2 = i; |
| 455 | res = xer = 0; |
| 456 | fn = fnV; |
| 457 | fn( arg1, arg2, &res, &xer ); |
| 458 | printf("%5s(0x%016llx, %2d) = 0x%016llx, %d\n", |
| 459 | name, arg1, (int)arg2, res, (int)((xer >> 29 & 1))); |
| 460 | } |
| 461 | } |
| 462 | } |
| 463 | |
| 464 | int main ( void ) |
| 465 | { |
| 466 | do_unary("sradi", all_sradi, 64); |
| 467 | do_unary("srawi", all_srawi, 32); |
| 468 | do_binary("srad", do_srad); |
| 469 | do_binary("sraw", do_sraw); |
| 470 | do_binary("srd", do_srd); |
| 471 | do_binary("srw", do_srw); |
| 472 | do_binary("sld", do_sld); |
| 473 | do_binary("slw", do_slw); |
| 474 | return 0; |
| 475 | } |
| 476 | |
| 477 | /* |
| 478 | 0 |
| 479 | 1 |
| 480 | 2 |
| 481 | 3 |
| 482 | 4 |
| 483 | 5 |
| 484 | 6 |
| 485 | 7 |
| 486 | 8 |
| 487 | 9 |
| 488 | 10 |
| 489 | 11 |
| 490 | 12 |
| 491 | 13 |
| 492 | 14 |
| 493 | 15 |
| 494 | 16 |
| 495 | 17 |
| 496 | 18 |
| 497 | 19 |
| 498 | 20 |
| 499 | 21 |
| 500 | 22 |
| 501 | 23 |
| 502 | 24 |
| 503 | 25 |
| 504 | 26 |
| 505 | 27 |
| 506 | 28 |
| 507 | 29 |
| 508 | 30 |
| 509 | 31 |
| 510 | 32 |
| 511 | 33 |
| 512 | 34 |
| 513 | 35 |
| 514 | 36 |
| 515 | 37 |
| 516 | 38 |
| 517 | 39 |
| 518 | 40 |
| 519 | 41 |
| 520 | 42 |
| 521 | 43 |
| 522 | 44 |
| 523 | 45 |
| 524 | 46 |
| 525 | 47 |
| 526 | 48 |
| 527 | 49 |
| 528 | 50 |
| 529 | 51 |
| 530 | 52 |
| 531 | 53 |
| 532 | 54 |
| 533 | 55 |
| 534 | 56 |
| 535 | 57 |
| 536 | 58 |
| 537 | 59 |
| 538 | 60 |
| 539 | 61 |
| 540 | 62 |
| 541 | 63 |
| 542 | */ |
| 543 | |