1 2#include <stdio.h> 3 4typedef 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 25INSN_SRADI(0) 26INSN_SRADI(1) 27INSN_SRADI(2) 28INSN_SRADI(3) 29INSN_SRADI(4) 30INSN_SRADI(5) 31INSN_SRADI(6) 32INSN_SRADI(7) 33INSN_SRADI(8) 34INSN_SRADI(9) 35INSN_SRADI(10) 36INSN_SRADI(11) 37INSN_SRADI(12) 38INSN_SRADI(13) 39INSN_SRADI(14) 40INSN_SRADI(15) 41INSN_SRADI(16) 42INSN_SRADI(17) 43INSN_SRADI(18) 44INSN_SRADI(19) 45INSN_SRADI(20) 46INSN_SRADI(21) 47INSN_SRADI(22) 48INSN_SRADI(23) 49INSN_SRADI(24) 50INSN_SRADI(25) 51INSN_SRADI(26) 52INSN_SRADI(27) 53INSN_SRADI(28) 54INSN_SRADI(29) 55INSN_SRADI(30) 56INSN_SRADI(31) 57INSN_SRADI(32) 58INSN_SRADI(33) 59INSN_SRADI(34) 60INSN_SRADI(35) 61INSN_SRADI(36) 62INSN_SRADI(37) 63INSN_SRADI(38) 64INSN_SRADI(39) 65INSN_SRADI(40) 66INSN_SRADI(41) 67INSN_SRADI(42) 68INSN_SRADI(43) 69INSN_SRADI(44) 70INSN_SRADI(45) 71INSN_SRADI(46) 72INSN_SRADI(47) 73INSN_SRADI(48) 74INSN_SRADI(49) 75INSN_SRADI(50) 76INSN_SRADI(51) 77INSN_SRADI(52) 78INSN_SRADI(53) 79INSN_SRADI(54) 80INSN_SRADI(55) 81INSN_SRADI(56) 82INSN_SRADI(57) 83INSN_SRADI(58) 84INSN_SRADI(59) 85INSN_SRADI(60) 86INSN_SRADI(61) 87INSN_SRADI(62) 88INSN_SRADI(63) 89 90static 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 177INSN_SRAWI(0) 178INSN_SRAWI(1) 179INSN_SRAWI(2) 180INSN_SRAWI(3) 181INSN_SRAWI(4) 182INSN_SRAWI(5) 183INSN_SRAWI(6) 184INSN_SRAWI(7) 185INSN_SRAWI(8) 186INSN_SRAWI(9) 187INSN_SRAWI(10) 188INSN_SRAWI(11) 189INSN_SRAWI(12) 190INSN_SRAWI(13) 191INSN_SRAWI(14) 192INSN_SRAWI(15) 193INSN_SRAWI(16) 194INSN_SRAWI(17) 195INSN_SRAWI(18) 196INSN_SRAWI(19) 197INSN_SRAWI(20) 198INSN_SRAWI(21) 199INSN_SRAWI(22) 200INSN_SRAWI(23) 201INSN_SRAWI(24) 202INSN_SRAWI(25) 203INSN_SRAWI(26) 204INSN_SRAWI(27) 205INSN_SRAWI(28) 206INSN_SRAWI(29) 207INSN_SRAWI(30) 208INSN_SRAWI(31) 209 210static 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 248void 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 269void 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 289void 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 310void 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 331void 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 352void 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 377ULong 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 429void 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 446void 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 464int 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/* 4780 4791 4802 4813 4824 4835 4846 4857 4868 4879 48810 48911 49012 49113 49214 49315 49416 49517 49618 49719 49820 49921 50022 50123 50224 50325 50426 50527 50628 50729 50830 50931 51032 51133 51234 51335 51436 51537 51638 51739 51840 51941 52042 52143 52244 52345 52446 52547 52648 52749 52850 52951 53052 53153 53254 53355 53456 53557 53658 53759 53860 53961 54062 54163 542*/ 543 544