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 N r3 43#define X r4 44#define INCX r5 45 46#define PREA r8 47 48#define FZERO f1 49 50#define STACKSIZE 160 51 52 PROLOGUE 53 PROFCODE 54 55 addi SP, SP, -STACKSIZE 56 li r0, 0 57 58 stfd f14, 0(SP) 59 stfd f15, 8(SP) 60 stfd f16, 16(SP) 61 stfd f17, 24(SP) 62 63 stfd f18, 32(SP) 64 stfd f19, 40(SP) 65 stfd f20, 48(SP) 66 stfd f21, 56(SP) 67 68 stfd f22, 64(SP) 69 stfd f23, 72(SP) 70 stfd f24, 80(SP) 71 stfd f25, 88(SP) 72 73 stfd f26, 96(SP) 74 stfd f27, 104(SP) 75 stfd f28, 112(SP) 76 stfd f29, 120(SP) 77 78 stfd f30, 128(SP) 79 stfd f31, 136(SP) 80 81 stw r0, 144(SP) 82 lfs FZERO,144(SP) 83 84#ifdef F_INTERFACE 85 LDINT N, 0(N) 86 LDINT INCX, 0(INCX) 87#endif 88 89 slwi INCX, INCX, BASE_SHIFT 90 91 li PREA, 10 * 16 * SIZE 92 93 cmpwi cr0, N, 0 94 ble- LL(9999) 95 cmpwi cr0, INCX, 0 96 ble- LL(9999) 97 98 LFD f1, 0 * SIZE(X) 99 add X, X, INCX 100 101 fabs f0, f1 102 fabs f2, f1 103 fabs f3, f1 104 fabs f4, f1 105 fabs f5, f1 106 fabs f6, f1 107 fabs f7, f1 108 fabs f1, f1 109 110 subi N, N, 1 111 112 cmpwi cr0, INCX, SIZE 113 bne- cr0, LL(20) 114 115 srawi. r0, N, 4 116 mtspr CTR, r0 117 beq- cr0, LL(15) 118 119 LFD f8, 0 * SIZE(X) 120 LFD f9, 1 * SIZE(X) 121 122 bdz LL(13) 123 .align 4 124 125LL(12): 126 fabs f8, f8 127 LFD f10, 2 * SIZE(X) 128 fabs f9, f9 129 LFD f11, 3 * SIZE(X) 130 fabs f10, f10 131 LFD f12, 4 * SIZE(X) 132 fabs f11, f11 133 LFD f13, 5 * SIZE(X) 134 fabs f12, f12 135 LFD f14, 6 * SIZE(X) 136 fabs f13, f13 137 LFD f15, 7 * SIZE(X) 138 139 fabs f14, f14 140 dcbt X, PREA 141 fabs f15, f15 142 nop 143 144 fsub f16, f0, f8 145 fsub f17, f1, f9 146 fsub f18, f2, f10 147 fsub f19, f3, f11 148 fsub f20, f4, f12 149 fsub f21, f5, f13 150 fsub f22, f6, f14 151 fsub f23, f7, f15 152 153 fsel f0, f16, f0, f8 154 fsel f1, f17, f1, f9 155 fsel f2, f18, f2, f10 156 fsel f3, f19, f3, f11 157 fsel f4, f20, f4, f12 158 fsel f5, f21, f5, f13 159 160 fsel f6, f22, f6, f14 161 LFD f8, 8 * SIZE(X) 162 fsel f7, f23, f7, f15 163 LFD f9, 9 * SIZE(X) 164 165 fabs f8, f8 166 LFD f10, 10 * SIZE(X) 167 fabs f9, f9 168 LFD f11, 11 * SIZE(X) 169 fabs f10, f10 170 LFD f12, 12 * SIZE(X) 171 fabs f11, f11 172 LFD f13, 13 * SIZE(X) 173 fabs f12, f12 174 LFD f14, 14 * SIZE(X) 175 fabs f13, f13 176 LFD f15, 15 * SIZE(X) 177 178 fabs f14, f14 179 addi X, X, 16 * SIZE 180 fabs f15, f15 181 182 fsub f16, f0, f8 183 fsub f17, f1, f9 184 fsub f18, f2, f10 185 fsub f19, f3, f11 186 fsub f20, f4, f12 187 fsub f21, f5, f13 188 fsub f22, f6, f14 189 fsub f23, f7, f15 190 191 fsel f0, f16, f0, f8 192 fsel f1, f17, f1, f9 193 fsel f2, f18, f2, f10 194 fsel f3, f19, f3, f11 195 fsel f4, f20, f4, f12 196 fsel f5, f21, f5, f13 197 LFD f8, 0 * SIZE(X) 198 199 fsel f6, f22, f6, f14 200 LFD f9, 1 * SIZE(X) 201 fsel f7, f23, f7, f15 202 bdnz LL(12) 203 .align 4 204 205LL(13): 206 fabs f8, f8 207 LFD f10, 2 * SIZE(X) 208 fabs f9, f9 209 LFD f11, 3 * SIZE(X) 210 fabs f10, f10 211 LFD f12, 4 * SIZE(X) 212 fabs f11, f11 213 LFD f13, 5 * SIZE(X) 214 fabs f12, f12 215 LFD f14, 6 * SIZE(X) 216 fabs f13, f13 217 LFD f15, 7 * SIZE(X) 218 219 fabs f14, f14 220 fabs f15, f15 221 222 fsub f16, f0, f8 223 fsub f17, f1, f9 224 fsub f18, f2, f10 225 fsub f19, f3, f11 226 fsub f20, f4, f12 227 fsub f21, f5, f13 228 fsub f22, f6, f14 229 fsub f23, f7, f15 230 231 fsel f0, f16, f0, f8 232 fsel f1, f17, f1, f9 233 fsel f2, f18, f2, f10 234 fsel f3, f19, f3, f11 235 fsel f4, f20, f4, f12 236 fsel f5, f21, f5, f13 237 238 fsel f6, f22, f6, f14 239 LFD f8, 8 * SIZE(X) 240 fsel f7, f23, f7, f15 241 LFD f9, 9 * SIZE(X) 242 243 fabs f8, f8 244 LFD f10, 10 * SIZE(X) 245 fabs f9, f9 246 LFD f11, 11 * SIZE(X) 247 fabs f10, f10 248 LFD f12, 12 * SIZE(X) 249 fabs f11, f11 250 LFD f13, 13 * SIZE(X) 251 fabs f12, f12 252 LFD f14, 14 * SIZE(X) 253 fabs f13, f13 254 LFD f15, 15 * SIZE(X) 255 256 fabs f14, f14 257 addi X, X, 16 * SIZE 258 fabs f15, f15 259 nop 260 261 fsub f16, f0, f8 262 fsub f17, f1, f9 263 fsub f18, f2, f10 264 fsub f19, f3, f11 265 fsub f20, f4, f12 266 fsub f21, f5, f13 267 fsub f22, f6, f14 268 fsub f23, f7, f15 269 270 fsel f0, f16, f0, f8 271 fsel f1, f17, f1, f9 272 fsel f2, f18, f2, f10 273 fsel f3, f19, f3, f11 274 fsel f4, f20, f4, f12 275 fsel f5, f21, f5, f13 276 fsel f6, f22, f6, f14 277 fsel f7, f23, f7, f15 278 .align 4 279 280LL(15): 281 andi. r0, N, 15 282 beq LL(999) 283 284 andi. r0, N, 8 285 beq LL(16) 286 287 LFD f8, 0 * SIZE(X) 288 LFD f9, 1 * SIZE(X) 289 290 fabs f8, f8 291 LFD f10, 2 * SIZE(X) 292 fabs f9, f9 293 LFD f11, 3 * SIZE(X) 294 fabs f10, f10 295 LFD f12, 4 * SIZE(X) 296 fabs f11, f11 297 LFD f13, 5 * SIZE(X) 298 299 fabs f12, f12 300 LFD f14, 6 * SIZE(X) 301 fabs f13, f13 302 LFD f15, 7 * SIZE(X) 303 fabs f14, f14 304 fabs f15, f15 305 306 fsub f16, f0, f8 307 fsub f17, f1, f9 308 fsub f18, f2, f10 309 fsub f19, f3, f11 310 fsub f20, f4, f12 311 fsub f21, f5, f13 312 fsub f22, f6, f14 313 fsub f23, f7, f15 314 315 fsel f0, f16, f0, f8 316 fsel f1, f17, f1, f9 317 fsel f2, f18, f2, f10 318 fsel f3, f19, f3, f11 319 320 fsel f4, f20, f4, f12 321 fsel f5, f21, f5, f13 322 fsel f6, f22, f6, f14 323 nop 324 fsel f7, f23, f7, f15 325 addi X, X, 8 * SIZE 326 .align 4 327 328LL(16): 329 andi. r0, N, 4 330 beq LL(17) 331 332 LFD f8, 0 * SIZE(X) 333 LFD f9, 1 * SIZE(X) 334 335 fabs f8, f8 336 LFD f10, 2 * SIZE(X) 337 fabs f9, f9 338 LFD f11, 3 * SIZE(X) 339 fabs f10, f10 340 fabs f11, f11 341 342 fsub f16, f0, f8 343 fsub f17, f1, f9 344 fsub f18, f2, f10 345 fsub f19, f3, f11 346 347 fsel f0, f16, f0, f8 348 fsel f1, f17, f1, f9 349 fsel f2, f18, f2, f10 350 nop 351 fsel f3, f19, f3, f11 352 addi X, X, 4 * SIZE 353 .align 4 354 355LL(17): 356 andi. r0, N, 2 357 beq LL(18) 358 359 LFD f8, 0 * SIZE(X) 360 LFD f9, 1 * SIZE(X) 361 362 fabs f8, f8 363 fabs f9, f9 364 fsub f16, f0, f8 365 fsub f17, f1, f9 366 367 fsel f0, f16, f0, f8 368 nop 369 fsel f1, f17, f1, f9 370 addi X, X, 2 * SIZE 371 .align 4 372 373LL(18): 374 andi. r0, N, 1 375 beq LL(999) 376 377 LFD f8, 0 * SIZE(X) 378 fabs f8, f8 379 fsub f16, f0, f8 380 fsel f0, f16, f0, f8 381 b LL(999) 382 .align 4 383 384LL(20): 385 sub X, X, INCX 386 387 srawi. r0, N, 4 388 mtspr CTR, r0 389 beq- cr0, LL(25) 390 391 LFDUX f8, X, INCX 392 LFDUX f9, X, INCX 393 394 bdz LL(23) 395 .align 4 396 397LL(22): 398 fabs f8, f8 399 LFDUX f10, X, INCX 400 fabs f9, f9 401 LFDUX f11, X, INCX 402 fabs f10, f10 403 LFDUX f12, X, INCX 404 fabs f11, f11 405 LFDUX f13, X, INCX 406 fabs f12, f12 407 LFDUX f14, X, INCX 408 fabs f13, f13 409 LFDUX f15, X, INCX 410 411 fabs f14, f14 412 fabs f15, f15 413 414 fsub f16, f0, f8 415 fsub f17, f1, f9 416 fsub f18, f2, f10 417 fsub f19, f3, f11 418 fsub f20, f4, f12 419 fsub f21, f5, f13 420 fsub f22, f6, f14 421 fsub f23, f7, f15 422 423 fsel f0, f16, f0, f8 424 fsel f1, f17, f1, f9 425 fsel f2, f18, f2, f10 426 fsel f3, f19, f3, f11 427 fsel f4, f20, f4, f12 428 fsel f5, f21, f5, f13 429 430 fsel f6, f22, f6, f14 431 LFDUX f8, X, INCX 432 fsel f7, f23, f7, f15 433 LFDUX f9, X, INCX 434 435 fabs f8, f8 436 LFDUX f10, X, INCX 437 fabs f9, f9 438 LFDUX f11, X, INCX 439 fabs f10, f10 440 LFDUX f12, X, INCX 441 fabs f11, f11 442 LFDUX f13, X, INCX 443 fabs f12, f12 444 LFDUX f14, X, INCX 445 fabs f13, f13 446 LFDUX f15, X, INCX 447 448 fabs f14, f14 449 fabs f15, f15 450 451 fsub f16, f0, f8 452 fsub f17, f1, f9 453 fsub f18, f2, f10 454 fsub f19, f3, f11 455 fsub f20, f4, f12 456 fsub f21, f5, f13 457 fsub f22, f6, f14 458 fsub f23, f7, f15 459 460 fsel f0, f16, f0, f8 461 fsel f1, f17, f1, f9 462 fsel f2, f18, f2, f10 463 fsel f3, f19, f3, f11 464 fsel f4, f20, f4, f12 465 fsel f5, f21, f5, f13 466 LFDUX f8, X, INCX 467 468 fsel f6, f22, f6, f14 469 LFDUX f9, X, INCX 470 fsel f7, f23, f7, f15 471 bdnz LL(22) 472 .align 4 473 474LL(23): 475 fabs f8, f8 476 LFDUX f10, X, INCX 477 fabs f9, f9 478 LFDUX f11, X, INCX 479 fabs f10, f10 480 LFDUX f12, X, INCX 481 fabs f11, f11 482 LFDUX f13, X, INCX 483 fabs f12, f12 484 LFDUX f14, X, INCX 485 fabs f13, f13 486 LFDUX f15, X, INCX 487 488 fabs f14, f14 489 fabs f15, f15 490 491 fsub f16, f0, f8 492 fsub f17, f1, f9 493 fsub f18, f2, f10 494 fsub f19, f3, f11 495 fsub f20, f4, f12 496 fsub f21, f5, f13 497 fsub f22, f6, f14 498 fsub f23, f7, f15 499 500 fsel f0, f16, f0, f8 501 fsel f1, f17, f1, f9 502 fsel f2, f18, f2, f10 503 fsel f3, f19, f3, f11 504 fsel f4, f20, f4, f12 505 fsel f5, f21, f5, f13 506 507 fsel f6, f22, f6, f14 508 LFDUX f8, X, INCX 509 fsel f7, f23, f7, f15 510 LFDUX f9, X, INCX 511 512 fabs f8, f8 513 LFDUX f10, X, INCX 514 fabs f9, f9 515 LFDUX f11, X, INCX 516 fabs f10, f10 517 LFDUX f12, X, INCX 518 fabs f11, f11 519 LFDUX f13, X, INCX 520 fabs f12, f12 521 LFDUX f14, X, INCX 522 fabs f13, f13 523 LFDUX f15, X, INCX 524 525 fabs f14, f14 526 fabs f15, f15 527 528 fsub f16, f0, f8 529 fsub f17, f1, f9 530 fsub f18, f2, f10 531 fsub f19, f3, f11 532 fsub f20, f4, f12 533 fsub f21, f5, f13 534 fsub f22, f6, f14 535 fsub f23, f7, f15 536 537 fsel f0, f16, f0, f8 538 fsel f1, f17, f1, f9 539 fsel f2, f18, f2, f10 540 fsel f3, f19, f3, f11 541 fsel f4, f20, f4, f12 542 fsel f5, f21, f5, f13 543 fsel f6, f22, f6, f14 544 fsel f7, f23, f7, f15 545 .align 4 546 547LL(25): 548 andi. r0, N, 15 549 beq LL(999) 550 551 andi. r0, N, 8 552 beq LL(26) 553 554 LFDUX f8, X, INCX 555 LFDUX f9, X, INCX 556 557 fabs f8, f8 558 LFDUX f10, X, INCX 559 fabs f9, f9 560 LFDUX f11, X, INCX 561 fabs f10, f10 562 LFDUX f12, X, INCX 563 fabs f11, f11 564 LFDUX f13, X, INCX 565 566 fabs f12, f12 567 LFDUX f14, X, INCX 568 fabs f13, f13 569 LFDUX f15, X, INCX 570 fabs f14, f14 571 fabs f15, f15 572 573 fsub f16, f0, f8 574 fsub f17, f1, f9 575 fsub f18, f2, f10 576 fsub f19, f3, f11 577 fsub f20, f4, f12 578 fsub f21, f5, f13 579 fsub f22, f6, f14 580 fsub f23, f7, f15 581 582 fsel f0, f16, f0, f8 583 fsel f1, f17, f1, f9 584 fsel f2, f18, f2, f10 585 fsel f3, f19, f3, f11 586 587 fsel f4, f20, f4, f12 588 fsel f5, f21, f5, f13 589 fsel f6, f22, f6, f14 590 fsel f7, f23, f7, f15 591 .align 4 592 593LL(26): 594 andi. r0, N, 4 595 beq LL(27) 596 597 LFDUX f8, X, INCX 598 LFDUX f9, X, INCX 599 600 fabs f8, f8 601 LFDUX f10, X, INCX 602 fabs f9, f9 603 LFDUX f11, X, INCX 604 fabs f10, f10 605 fabs f11, f11 606 607 fsub f16, f0, f8 608 fsub f17, f1, f9 609 fsub f18, f2, f10 610 fsub f19, f3, f11 611 612 fsel f0, f16, f0, f8 613 fsel f1, f17, f1, f9 614 fsel f2, f18, f2, f10 615 fsel f3, f19, f3, f11 616 .align 4 617 618LL(27): 619 andi. r0, N, 2 620 beq LL(28) 621 622 LFDUX f8, X, INCX 623 LFDUX f9, X, INCX 624 625 fabs f8, f8 626 fabs f9, f9 627 fsub f16, f0, f8 628 fsub f17, f1, f9 629 630 fsel f0, f16, f0, f8 631 fsel f1, f17, f1, f9 632 .align 4 633 634LL(28): 635 andi. r0, N, 1 636 beq LL(999) 637 638 LFDUX f8, X, INCX 639 fabs f8, f8 640 fsub f16, f0, f8 641 fsel f0, f16, f0, f8 642 .align 4 643 644LL(999): 645 fsub f8, f0, f1 646 fsub f9, f2, f3 647 fsub f10, f4, f5 648 fsub f11, f6, f7 649 650 fsel f0, f8, f0, f1 651 fsel f2, f9, f2, f3 652 fsel f4, f10, f4, f5 653 fsel f6, f11, f6, f7 654 655 fsub f8, f0, f2 656 fsub f9, f4, f6 657 fsel f0, f8, f0, f2 658 fsel f4, f9, f4, f6 659 660 fsub f8, f0, f4 661 fsel f1, f8, f0, f4 662 .align 4 663 664LL(9999): 665 lfd f14, 0(SP) 666 lfd f15, 8(SP) 667 lfd f16, 16(SP) 668 lfd f17, 24(SP) 669 670 lfd f18, 32(SP) 671 lfd f19, 40(SP) 672 lfd f20, 48(SP) 673 lfd f21, 56(SP) 674 675 lfd f22, 64(SP) 676 lfd f23, 72(SP) 677 lfd f24, 80(SP) 678 lfd f25, 88(SP) 679 680 lfd f26, 96(SP) 681 lfd f27, 104(SP) 682 lfd f28, 112(SP) 683 lfd f29, 120(SP) 684 685 lfd f30, 128(SP) 686 lfd f31, 136(SP) 687 688 addi SP, SP, STACKSIZE 689 blr 690 691 EPILOGUE 692