1/*********************************************************************/ 2/* Copyright 2009, 2010 The University of Texas at Austin. */ 3/* All rights reserved. */ 4/* */ 5/* Redistribution and use in source and binary forms, with or */ 6/* without modification, are permitted provided that the following */ 7/* conditions are met: */ 8/* */ 9/* 1. Redistributions of source code must retain the above */ 10/* copyright notice, this list of conditions and the following */ 11/* disclaimer. */ 12/* */ 13/* 2. Redistributions in binary form must reproduce the above */ 14/* copyright notice, this list of conditions and the following */ 15/* disclaimer in the documentation and/or other materials */ 16/* provided with the distribution. */ 17/* */ 18/* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */ 19/* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */ 20/* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */ 21/* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */ 22/* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */ 23/* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */ 24/* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */ 25/* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */ 26/* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */ 27/* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */ 28/* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */ 29/* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */ 30/* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */ 31/* POSSIBILITY OF SUCH DAMAGE. */ 32/* */ 33/* The views and conclusions contained in the software and */ 34/* documentation are those of the authors and should not be */ 35/* interpreted as representing official policies, either expressed */ 36/* or implied, of The University of Texas at Austin. */ 37/*********************************************************************/ 38 39#define ASSEMBLER 40#include "common.h" 41 42#define RET r3 43#define X r4 44#define INCX r5 45 46#define N r6 47#define NN r7 48#define XX r8 49#define PREA r9 50 51#define FZERO f1 52 53#define STACKSIZE 160 54 55 PROLOGUE 56 PROFCODE 57 58 addi SP, SP, -STACKSIZE 59 li r0, 0 60 61 stfd f14, 0(SP) 62 stfd f15, 8(SP) 63 stfd f16, 16(SP) 64 stfd f17, 24(SP) 65 66 stfd f18, 32(SP) 67 stfd f19, 40(SP) 68 stfd f20, 48(SP) 69 stfd f21, 56(SP) 70 71 stfd f22, 64(SP) 72 stfd f23, 72(SP) 73 stfd f24, 80(SP) 74 stfd f25, 88(SP) 75 76 stfd f26, 96(SP) 77 stfd f27, 104(SP) 78 stfd f28, 112(SP) 79 stfd f29, 120(SP) 80 81 stfd f30, 128(SP) 82 stfd f31, 136(SP) 83 84 stw r0, 144(SP) 85 lfs FZERO,144(SP) 86 87#ifdef F_INTERFACE 88 LDINT N, 0(r3) 89 LDINT INCX, 0(INCX) 90#else 91 mr N, r3 92#endif 93 li RET, 0 94 mr NN, N 95 mr XX, X 96 97 slwi INCX, INCX, BASE_SHIFT 98 99 li PREA, L1_PREFETCHSIZE 100 101 cmpwi cr0, N, 0 102 ble- LL(9999) 103 cmpwi cr0, INCX, 0 104 ble- LL(9999) 105 106 LFD f1, 0 * SIZE(X) 107 add X, X, INCX 108 109 fabs f0, f1 110 fabs f2, f1 111 fabs f3, f1 112 fabs f4, f1 113 fabs f5, f1 114 fabs f6, f1 115 fabs f7, f1 116 fabs f1, f1 117 118 subi N, N, 1 119 120 cmpwi cr0, INCX, SIZE 121 bne- cr0, LL(100) 122 123 srawi. r0, N, 4 124 mtspr CTR, r0 125 beq- cr0, LL(50) 126 127 LFD f24, 0 * SIZE(X) 128 LFD f25, 1 * SIZE(X) 129 LFD f26, 2 * SIZE(X) 130 LFD f27, 3 * SIZE(X) 131 LFD f28, 4 * SIZE(X) 132 LFD f29, 5 * SIZE(X) 133 LFD f30, 6 * SIZE(X) 134 LFD f31, 7 * SIZE(X) 135 136 fabs f8, f24 137 fabs f9, f25 138 fabs f10, f26 139 fabs f11, f27 140 141 LFD f24, 8 * SIZE(X) 142 LFD f25, 9 * SIZE(X) 143 LFD f26, 10 * SIZE(X) 144 LFD f27, 11 * SIZE(X) 145 146 fabs f12, f28 147 fabs f13, f29 148 fabs f14, f30 149 fabs f15, f31 150 151 LFD f28, 12 * SIZE(X) 152 LFD f29, 13 * SIZE(X) 153 LFD f30, 14 * SIZE(X) 154 LFD f31, 15 * SIZE(X) 155 bdz LL(20) 156 .align 4 157 158LL(10): 159 fsub f16, f0, f8 160 fsub f17, f1, f9 161 fsub f18, f2, f10 162 fsub f19, f3, f11 163 fsub f20, f4, f12 164 fsub f21, f5, f13 165 fsub f22, f6, f14 166 fsub f23, f7, f15 167 168 fsel f0, f16, f0, f8 169 fabs f8, f24 170 fsel f1, f17, f1, f9 171 fabs f9, f25 172 fsel f2, f18, f2, f10 173 fabs f10, f26 174 fsel f3, f19, f3, f11 175 fabs f11, f27 176 177 LFD f24, 16 * SIZE(X) 178 LFD f25, 17 * SIZE(X) 179 LFD f26, 18 * SIZE(X) 180 LFD f27, 19 * SIZE(X) 181 182 fsel f4, f20, f4, f12 183 fabs f12, f28 184 fsel f5, f21, f5, f13 185 fabs f13, f29 186 fsel f6, f22, f6, f14 187 fabs f14, f30 188 fsel f7, f23, f7, f15 189 fabs f15, f31 190 191 LFD f28, 20 * SIZE(X) 192 LFD f29, 21 * SIZE(X) 193 LFD f30, 22 * SIZE(X) 194 LFD f31, 23 * SIZE(X) 195 196 fsub f16, f0, f8 197 fsub f17, f1, f9 198 fsub f18, f2, f10 199 fsub f19, f3, f11 200 fsub f20, f4, f12 201 fsub f21, f5, f13 202 fsub f22, f6, f14 203 fsub f23, f7, f15 204 205 fsel f0, f16, f0, f8 206 fabs f8, f24 207 fsel f1, f17, f1, f9 208 fabs f9, f25 209 fsel f2, f18, f2, f10 210 fabs f10, f26 211 fsel f3, f19, f3, f11 212 fabs f11, f27 213 214 LFD f24, 24 * SIZE(X) 215 LFD f25, 25 * SIZE(X) 216 LFD f26, 26 * SIZE(X) 217 LFD f27, 27 * SIZE(X) 218 219 fsel f4, f20, f4, f12 220 fabs f12, f28 221 fsel f5, f21, f5, f13 222 fabs f13, f29 223 fsel f6, f22, f6, f14 224 fabs f14, f30 225 fsel f7, f23, f7, f15 226 fabs f15, f31 227 228 LFD f28, 28 * SIZE(X) 229 LFD f29, 29 * SIZE(X) 230 LFD f30, 30 * SIZE(X) 231 LFD f31, 31 * SIZE(X) 232 233#ifndef POWER6 234 L1_PREFETCH X, PREA 235#endif 236 addi X, X, 16 * SIZE 237#ifdef POWER6 238 L1_PREFETCH X, PREA 239#endif 240 bdnz LL(10) 241 .align 4 242 243LL(20): 244 fsub f16, f0, f8 245 fsub f17, f1, f9 246 fsub f18, f2, f10 247 fsub f19, f3, f11 248 fsub f20, f4, f12 249 fsub f21, f5, f13 250 fsub f22, f6, f14 251 fsub f23, f7, f15 252 253 fsel f0, f16, f0, f8 254 fabs f8, f24 255 fsel f1, f17, f1, f9 256 fabs f9, f25 257 fsel f2, f18, f2, f10 258 fabs f10, f26 259 fsel f3, f19, f3, f11 260 fabs f11, f27 261 262 fsel f4, f20, f4, f12 263 fabs f12, f28 264 fsel f5, f21, f5, f13 265 fabs f13, f29 266 fsel f6, f22, f6, f14 267 fabs f14, f30 268 fsel f7, f23, f7, f15 269 fabs f15, f31 270 271 fsub f16, f0, f8 272 fsub f17, f1, f9 273 fsub f18, f2, f10 274 fsub f19, f3, f11 275 fsub f20, f4, f12 276 fsub f21, f5, f13 277 fsub f22, f6, f14 278 fsub f23, f7, f15 279 280 fsel f0, f16, f0, f8 281 fsel f1, f17, f1, f9 282 fsel f2, f18, f2, f10 283 fsel f3, f19, f3, f11 284 fsel f4, f20, f4, f12 285 fsel f5, f21, f5, f13 286 fsel f6, f22, f6, f14 287 fsel f7, f23, f7, f15 288 addi X, X, 16 * SIZE 289 .align 4 290 291LL(50): 292 andi. r0, N, 15 293 mtspr CTR, r0 294 beq LL(999) 295 .align 4 296 297LL(60): 298 LFD f8, 0 * SIZE(X) 299 addi X, X, 1 * SIZE 300 fabs f8, f8 301 fsub f16, f1, f8 302 fsel f1, f16, f1, f8 303 bdnz LL(60) 304 b LL(999) 305 .align 4 306 307LL(100): 308 sub X, X, INCX 309 310 srawi. r0, N, 4 311 mtspr CTR, r0 312 beq- LL(150) 313 314 LFDUX f24, X, INCX 315 LFDUX f25, X, INCX 316 LFDUX f26, X, INCX 317 LFDUX f27, X, INCX 318 LFDUX f28, X, INCX 319 LFDUX f29, X, INCX 320 LFDUX f30, X, INCX 321 LFDUX f31, X, INCX 322 323 fabs f8, f24 324 fabs f9, f25 325 fabs f10, f26 326 fabs f11, f27 327 328 LFDUX f24, X, INCX 329 LFDUX f25, X, INCX 330 LFDUX f26, X, INCX 331 LFDUX f27, X, INCX 332 333 fabs f12, f28 334 fabs f13, f29 335 fabs f14, f30 336 fabs f15, f31 337 338 LFDUX f28, X, INCX 339 LFDUX f29, X, INCX 340 LFDUX f30, X, INCX 341 LFDUX f31, X, INCX 342 bdz LL(120) 343 .align 4 344 345LL(110): 346 fsub f16, f0, f8 347 fsub f17, f1, f9 348 fsub f18, f2, f10 349 fsub f19, f3, f11 350 fsub f20, f4, f12 351 fsub f21, f5, f13 352 fsub f22, f6, f14 353 fsub f23, f7, f15 354 355 fsel f0, f16, f0, f8 356 fabs f8, f24 357 fsel f1, f17, f1, f9 358 fabs f9, f25 359 fsel f2, f18, f2, f10 360 fabs f10, f26 361 fsel f3, f19, f3, f11 362 fabs f11, f27 363 364 LFDUX f24, X, INCX 365 LFDUX f25, X, INCX 366 LFDUX f26, X, INCX 367 LFDUX f27, X, INCX 368 369 fsel f4, f20, f4, f12 370 fabs f12, f28 371 fsel f5, f21, f5, f13 372 fabs f13, f29 373 fsel f6, f22, f6, f14 374 fabs f14, f30 375 fsel f7, f23, f7, f15 376 fabs f15, f31 377 378 LFDUX f28, X, INCX 379 LFDUX f29, X, INCX 380 LFDUX f30, X, INCX 381 LFDUX f31, X, INCX 382 383 fsub f16, f0, f8 384 fsub f17, f1, f9 385 fsub f18, f2, f10 386 fsub f19, f3, f11 387 fsub f20, f4, f12 388 fsub f21, f5, f13 389 fsub f22, f6, f14 390 fsub f23, f7, f15 391 392 fsel f0, f16, f0, f8 393 fabs f8, f24 394 fsel f1, f17, f1, f9 395 fabs f9, f25 396 fsel f2, f18, f2, f10 397 fabs f10, f26 398 fsel f3, f19, f3, f11 399 fabs f11, f27 400 401 LFDUX f24, X, INCX 402 LFDUX f25, X, INCX 403 LFDUX f26, X, INCX 404 LFDUX f27, X, INCX 405 406 fsel f4, f20, f4, f12 407 fabs f12, f28 408 fsel f5, f21, f5, f13 409 fabs f13, f29 410 fsel f6, f22, f6, f14 411 fabs f14, f30 412 fsel f7, f23, f7, f15 413 fabs f15, f31 414 415 LFDUX f28, X, INCX 416 LFDUX f29, X, INCX 417 LFDUX f30, X, INCX 418 LFDUX f31, X, INCX 419 bdnz LL(110) 420 .align 4 421 422LL(120): 423 fsub f16, f0, f8 424 fsub f17, f1, f9 425 fsub f18, f2, f10 426 fsub f19, f3, f11 427 fsub f20, f4, f12 428 fsub f21, f5, f13 429 fsub f22, f6, f14 430 fsub f23, f7, f15 431 432 fsel f0, f16, f0, f8 433 fabs f8, f24 434 fsel f1, f17, f1, f9 435 fabs f9, f25 436 fsel f2, f18, f2, f10 437 fabs f10, f26 438 fsel f3, f19, f3, f11 439 fabs f11, f27 440 441 fsel f4, f20, f4, f12 442 fabs f12, f28 443 fsel f5, f21, f5, f13 444 fabs f13, f29 445 fsel f6, f22, f6, f14 446 fabs f14, f30 447 fsel f7, f23, f7, f15 448 fabs f15, f31 449 450 fsub f16, f0, f8 451 fsub f17, f1, f9 452 fsub f18, f2, f10 453 fsub f19, f3, f11 454 fsub f20, f4, f12 455 fsub f21, f5, f13 456 fsub f22, f6, f14 457 fsub f23, f7, f15 458 459 fsel f0, f16, f0, f8 460 fsel f1, f17, f1, f9 461 fsel f2, f18, f2, f10 462 fsel f3, f19, f3, f11 463 fsel f4, f20, f4, f12 464 fsel f5, f21, f5, f13 465 fsel f6, f22, f6, f14 466 fsel f7, f23, f7, f15 467 .align 4 468 469LL(150): 470 andi. r0, N, 15 471 mtspr CTR, r0 472 beq LL(999) 473 .align 4 474 475LL(160): 476 LFDUX f8, X, INCX 477 fabs f8, f8 478 fsub f16, f1, f8 479 fsel f1, f16, f1, f8 480 bdnz LL(160) 481 .align 4 482 483LL(999): 484 fsub f8, f0, f1 485 fsub f9, f2, f3 486 fsub f10, f4, f5 487 fsub f11, f6, f7 488 489 fsel f0, f8, f0, f1 490 fsel f2, f9, f2, f3 491 fsel f4, f10, f4, f5 492 fsel f6, f11, f6, f7 493 494 fsub f8, f0, f2 495 fsub f9, f4, f6 496 fsel f0, f8, f0, f2 497 fsel f4, f9, f4, f6 498 499 fsub f8, f0, f4 500 fsel f1, f8, f0, f4 501 .align 4 502 503LL(1000): 504 cmpwi cr0, INCX, SIZE 505 bne- cr0, LL(1100) 506 507 srawi. r0, NN, 3 508 mtspr CTR, r0 509 beq- cr0, LL(1050) 510 511 LFD f24, 0 * SIZE(XX) 512 LFD f25, 1 * SIZE(XX) 513 LFD f26, 2 * SIZE(XX) 514 LFD f27, 3 * SIZE(XX) 515 LFD f28, 4 * SIZE(XX) 516 LFD f29, 5 * SIZE(XX) 517 LFD f30, 6 * SIZE(XX) 518 LFD f31, 7 * SIZE(XX) 519 bdz LL(1020) 520 .align 4 521 522LL(1010): 523 fabs f8, f24 524 fabs f9, f25 525 fabs f10, f26 526 fabs f11, f27 527 528 LFD f24, 8 * SIZE(XX) 529 LFD f25, 9 * SIZE(XX) 530 LFD f26, 10 * SIZE(XX) 531 LFD f27, 11 * SIZE(XX) 532 533 fabs f12, f28 534 fabs f13, f29 535 fabs f14, f30 536 fabs f15, f31 537 538 LFD f28, 12 * SIZE(XX) 539 LFD f29, 13 * SIZE(XX) 540 LFD f30, 14 * SIZE(XX) 541 LFD f31, 15 * SIZE(XX) 542 543 addi RET, RET, 1 544 fcmpu cr0, f1, f8 545 beq cr0, LL(9999) 546 547 addi RET, RET, 1 548 fcmpu cr0, f1, f9 549 beq cr0, LL(9999) 550 551 addi RET, RET, 1 552 fcmpu cr0, f1, f10 553 beq cr0, LL(9999) 554 555 addi RET, RET, 1 556 fcmpu cr0, f1, f11 557 beq cr0, LL(9999) 558 559 addi RET, RET, 1 560 fcmpu cr0, f1, f12 561 beq cr0, LL(9999) 562 563 addi RET, RET, 1 564 fcmpu cr0, f1, f13 565 beq cr0, LL(9999) 566 567 addi RET, RET, 1 568 fcmpu cr0, f1, f14 569 beq cr0, LL(9999) 570 571 addi RET, RET, 1 572 fcmpu cr0, f1, f15 573 beq cr0, LL(9999) 574 575 addi XX, XX, 8 * SIZE 576 bdnz LL(1010) 577 .align 4 578 579LL(1020): 580 fabs f8, f24 581 fabs f9, f25 582 fabs f10, f26 583 fabs f11, f27 584 585 fabs f12, f28 586 fabs f13, f29 587 fabs f14, f30 588 fabs f15, f31 589 590 addi XX, XX, 8 * SIZE 591 592 addi RET, RET, 1 593 fcmpu cr0, f1, f8 594 beq cr0, LL(9999) 595 596 addi RET, RET, 1 597 fcmpu cr0, f1, f9 598 beq cr0, LL(9999) 599 600 addi RET, RET, 1 601 fcmpu cr0, f1, f10 602 beq cr0, LL(9999) 603 604 addi RET, RET, 1 605 fcmpu cr0, f1, f11 606 beq cr0, LL(9999) 607 608 addi RET, RET, 1 609 fcmpu cr0, f1, f12 610 beq cr0, LL(9999) 611 612 addi RET, RET, 1 613 fcmpu cr0, f1, f13 614 beq cr0, LL(9999) 615 616 addi RET, RET, 1 617 fcmpu cr0, f1, f14 618 beq cr0, LL(9999) 619 620 addi RET, RET, 1 621 fcmpu cr0, f1, f15 622 beq cr0, LL(9999) 623 .align 4 624 625LL(1050): 626 andi. r0, NN, 7 627 mtspr CTR, r0 628 beq LL(9999) 629 .align 4 630 631LL(1060): 632 LFD f8, 0 * SIZE(XX) 633 addi XX, XX, 1 * SIZE 634 fabs f8, f8 635 addi RET, RET, 1 636 fcmpu cr0, f1, f8 637 beq cr0, LL(9999) 638 bdnz LL(1060) 639 b LL(9999) 640 .align 4 641 642LL(1100): 643 sub XX, XX, INCX 644 645 srawi. r0, NN, 3 646 mtspr CTR, r0 647 beq- LL(1150) 648 649 LFDUX f24, XX, INCX 650 LFDUX f25, XX, INCX 651 LFDUX f26, XX, INCX 652 LFDUX f27, XX, INCX 653 LFDUX f28, XX, INCX 654 LFDUX f29, XX, INCX 655 LFDUX f30, XX, INCX 656 LFDUX f31, XX, INCX 657 bdz LL(1120) 658 .align 4 659 660LL(1110): 661 fabs f8, f24 662 fabs f9, f25 663 fabs f10, f26 664 fabs f11, f27 665 666 LFDUX f24, XX, INCX 667 LFDUX f25, XX, INCX 668 LFDUX f26, XX, INCX 669 LFDUX f27, XX, INCX 670 671 fabs f12, f28 672 fabs f13, f29 673 fabs f14, f30 674 fabs f15, f31 675 676 LFDUX f28, XX, INCX 677 LFDUX f29, XX, INCX 678 LFDUX f30, XX, INCX 679 LFDUX f31, XX, INCX 680 681 addi RET, RET, 1 682 fcmpu cr0, f1, f8 683 beq cr0, LL(9999) 684 685 addi RET, RET, 1 686 fcmpu cr0, f1, f9 687 beq cr0, LL(9999) 688 689 addi RET, RET, 1 690 fcmpu cr0, f1, f10 691 beq cr0, LL(9999) 692 693 addi RET, RET, 1 694 fcmpu cr0, f1, f11 695 beq cr0, LL(9999) 696 697 addi RET, RET, 1 698 fcmpu cr0, f1, f12 699 beq cr0, LL(9999) 700 701 addi RET, RET, 1 702 fcmpu cr0, f1, f13 703 beq cr0, LL(9999) 704 705 addi RET, RET, 1 706 fcmpu cr0, f1, f14 707 beq cr0, LL(9999) 708 709 addi RET, RET, 1 710 fcmpu cr0, f1, f15 711 beq cr0, LL(9999) 712 713 bdnz LL(1110) 714 .align 4 715 716LL(1120): 717 fabs f8, f24 718 fabs f9, f25 719 fabs f10, f26 720 fabs f11, f27 721 722 fabs f12, f28 723 fabs f13, f29 724 fabs f14, f30 725 fabs f15, f31 726 727 addi RET, RET, 1 728 fcmpu cr0, f1, f8 729 beq cr0, LL(9999) 730 731 addi RET, RET, 1 732 fcmpu cr0, f1, f9 733 beq cr0, LL(9999) 734 735 addi RET, RET, 1 736 fcmpu cr0, f1, f10 737 beq cr0, LL(9999) 738 739 addi RET, RET, 1 740 fcmpu cr0, f1, f11 741 beq cr0, LL(9999) 742 743 addi RET, RET, 1 744 fcmpu cr0, f1, f12 745 beq cr0, LL(9999) 746 747 addi RET, RET, 1 748 fcmpu cr0, f1, f13 749 beq cr0, LL(9999) 750 751 addi RET, RET, 1 752 fcmpu cr0, f1, f14 753 beq cr0, LL(9999) 754 755 addi RET, RET, 1 756 fcmpu cr0, f1, f15 757 beq cr0, LL(9999) 758 .align 4 759 760LL(1150): 761 andi. r0, NN, 7 762 mtspr CTR, r0 763 beq LL(9999) 764 .align 4 765 766LL(1160): 767 LFDUX f8, XX, INCX 768 fabs f8, f8 769 addi RET, RET, 1 770 fcmpu cr0, f1, f8 771 beq cr0, LL(9999) 772 bdnz LL(1160) 773 .align 4 774 775LL(9999): 776 lfd f14, 0(SP) 777 lfd f15, 8(SP) 778 lfd f16, 16(SP) 779 lfd f17, 24(SP) 780 781 lfd f18, 32(SP) 782 lfd f19, 40(SP) 783 lfd f20, 48(SP) 784 lfd f21, 56(SP) 785 786 lfd f22, 64(SP) 787 lfd f23, 72(SP) 788 lfd f24, 80(SP) 789 lfd f25, 88(SP) 790 791 lfd f26, 96(SP) 792 lfd f27, 104(SP) 793 lfd f28, 112(SP) 794 lfd f29, 120(SP) 795 796 lfd f30, 128(SP) 797 lfd f31, 136(SP) 798 799 addi SP, SP, STACKSIZE 800 blr 801 802 EPILOGUE 803