1/*********************************************************************/ 2/* */ 3/* Optimized BLAS libraries */ 4/* By Kazushige Goto <kgoto@tacc.utexas.edu> */ 5/* */ 6/* Copyright (c) The University of Texas, 2009. All rights reserved. */ 7/* UNIVERSITY EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES CONCERNING */ 8/* THIS SOFTWARE AND DOCUMENTATION, INCLUDING ANY WARRANTIES OF */ 9/* MERCHANTABILITY, FITNESS FOR ANY PARTICULAR PURPOSE, */ 10/* NON-INFRINGEMENT AND WARRANTIES OF PERFORMANCE, AND ANY WARRANTY */ 11/* THAT MIGHT OTHERWISE ARISE FROM COURSE OF DEALING OR USAGE OF */ 12/* TRADE. NO WARRANTY IS EITHER EXPRESS OR IMPLIED WITH RESPECT TO */ 13/* THE USE OF THE SOFTWARE OR DOCUMENTATION. */ 14/* Under no circumstances shall University be liable for incidental, */ 15/* special, indirect, direct or consequential damages or loss of */ 16/* profits, interruption of business, or related expenses which may */ 17/* arise from use of Software or Documentation, including but not */ 18/* limited to those resulting from defects in Software and/or */ 19/* Documentation, or loss or inaccuracy of data of any kind. */ 20/*********************************************************************/ 21 22#define ASSEMBLER 23#include "common.h" 24 25#define RET r3 26#define X r4 27#define INCX r5 28 29#define N r6 30#define NN r7 31#define XX r8 32#define PRE r9 33#define INC1 r10 34 35#define FZERO f1 36 37#define STACKSIZE 160 38 39 PROLOGUE 40 PROFCODE 41 42 addi SP, SP, -STACKSIZE 43 li r0, 0 44 45 stfd f14, 0(SP) 46 stfd f15, 8(SP) 47 stfd f16, 16(SP) 48 stfd f17, 24(SP) 49 50 stfd f18, 32(SP) 51 stfd f19, 40(SP) 52 stfd f20, 48(SP) 53 stfd f21, 56(SP) 54 55 stfd f22, 64(SP) 56 stfd f23, 72(SP) 57 stfd f24, 80(SP) 58 stfd f25, 88(SP) 59 60 stfd f26, 96(SP) 61 stfd f27, 104(SP) 62 stfd f28, 112(SP) 63 stfd f29, 120(SP) 64 65 stfd f30, 128(SP) 66 stfd f31, 136(SP) 67 68 stw r0, 144(SP) 69 lfs FZERO,144(SP) 70 71#ifdef F_INTERFACE 72 LDINT N, 0(r3) 73 LDINT INCX, 0(INCX) 74#else 75 mr N, r3 76#endif 77 78 li RET, 0 79 80 slwi INCX, INCX, ZBASE_SHIFT 81 sub X, X, INCX 82 li INC1, SIZE 83 li PRE, 3 * 16 * SIZE 84 85 mr NN, N 86 mr XX, X 87 88 cmpwi cr0, N, 0 89 ble- LL(9999) 90 cmpwi cr0, INCX, 0 91 ble- LL(9999) 92 93 LFDUX f1, X, INCX 94 LFDX f2, X, INC1 95 96 fabs f1, f1 97 fabs f2, f2 98 fadd f1, f1, f2 99 100 subi N, N, 1 101 fmr f0, f1 102 srawi. r0, N, 3 103 fmr f2, f1 104 mtspr CTR, r0 105 fmr f3, f1 106 beq- LL(150) 107 108 LFDUX f24, X, INCX 109 LFDX f25, X, INC1 110 LFDUX f26, X, INCX 111 LFDX f27, X, INC1 112 LFDUX f28, X, INCX 113 LFDX f29, X, INC1 114 LFDUX f30, X, INCX 115 LFDX f31, X, INC1 116 117 fabs f8, f24 118 fabs f9, f25 119 fabs f10, f26 120 fabs f11, f27 121 fabs f12, f28 122 fabs f13, f29 123 fabs f14, f30 124 fabs f15, f31 125 126 LFDUX f24, X, INCX 127 LFDX f25, X, INC1 128 LFDUX f26, X, INCX 129 LFDX f27, X, INC1 130 LFDUX f28, X, INCX 131 LFDX f29, X, INC1 132 LFDUX f30, X, INCX 133 LFDX f31, X, INC1 134 135 bdz LL(120) 136 .align 4 137 138LL(110): 139 fadd f4, f8, f9 140#ifdef PPCG4 141 dcbt X, PRE 142#endif 143 fadd f5, f10, f11 144 fadd f6, f12, f13 145 fadd f7, f14, f15 146 147 fabs f8, f24 148 LFDUX f24, X, INCX 149 fabs f9, f25 150 LFDX f25, X, INC1 151 fabs f10, f26 152 LFDUX f26, X, INCX 153 fabs f11, f27 154 LFDX f27, X, INC1 155 156 fabs f12, f28 157#if defined(PPCG4) && defined(DOUBLE) 158 dcbt X, PRE 159#endif 160 fabs f13, f29 161 LFDUX f28, X, INCX 162 fabs f14, f30 163 LFDX f29, X, INC1 164 fabs f15, f31 165 LFDUX f30, X, INCX 166 167 fsub f16, f0, f4 168 LFDX f31, X, INC1 169 fsub f17, f1, f5 170 fsub f18, f2, f6 171 fsub f19, f3, f7 172 173 fadd f20, f8, f9 174#ifdef PPCG4 175 dcbt X, PRE 176#endif 177 fadd f21, f10, f11 178 fadd f22, f12, f13 179 fadd f23, f14, f15 180 181 fabs f8, f24 182 LFDUX f24, X, INCX 183 fabs f9, f25 184 LFDX f25, X, INC1 185 fabs f10, f26 186 LFDUX f26, X, INCX 187 fabs f11, f27 188 LFDX f27, X, INC1 189 190 fsel f0, f16, f4, f0 191#if defined(PPCG4) && defined(DOUBLE) 192 dcbt X, PRE 193#endif 194 fsel f1, f17, f5, f1 195 fsel f2, f18, f6, f2 196 fsel f3, f19, f7, f3 197 198 fabs f12, f28 199 LFDUX f28, X, INCX 200 fabs f13, f29 201 LFDX f29, X, INC1 202 fabs f14, f30 203 LFDUX f30, X, INCX 204 fabs f15, f31 205 LFDX f31, X, INC1 206 207 fsub f16, f0, f20 208 fsub f17, f1, f21 209 fsub f18, f2, f22 210 fsub f19, f3, f23 211 212 fsel f0, f16, f20, f0 213 fsel f1, f17, f21, f1 214 fsel f2, f18, f22, f2 215 fsel f3, f19, f23, f3 216 bdnz LL(110) 217 .align 4 218 219LL(120): 220 fadd f4, f8, f9 221 fadd f5, f10, f11 222 fadd f6, f12, f13 223 fadd f7, f14, f15 224 225 fabs f8, f24 226 fabs f9, f25 227 fabs f10, f26 228 fabs f11, f27 229 230 fabs f12, f28 231 fabs f13, f29 232 fabs f14, f30 233 fabs f15, f31 234 235 fsub f16, f0, f4 236 fsub f17, f1, f5 237 fsub f18, f2, f6 238 fsub f19, f3, f7 239 240 fadd f20, f8, f9 241 fadd f21, f10, f11 242 fadd f22, f12, f13 243 fadd f23, f14, f15 244 245 fsel f0, f16, f4, f0 246 fsel f1, f17, f5, f1 247 fsel f2, f18, f6, f2 248 fsel f3, f19, f7, f3 249 250 fsub f16, f0, f20 251 fsub f17, f1, f21 252 fsub f18, f2, f22 253 fsub f19, f3, f23 254 255 fsel f0, f16, f20, f0 256 fsel f1, f17, f21, f1 257 fsel f2, f18, f22, f2 258 fsel f3, f19, f23, f3 259 .align 4 260 261LL(150): 262 andi. r0, N, 7 263 mtspr CTR, r0 264 beq LL(999) 265 .align 4 266 267LL(160): 268 LFDUX f8, X, INCX 269 LFDX f9, X, INC1 270 271 fabs f8, f8 272 fabs f9, f9 273 fadd f8, f8, f9 274 fsub f16, f1, f8 275 fsel f1, f16, f8, f1 276 bdnz LL(160) 277 .align 4 278 279LL(999): 280 fsub f8, f0, f1 281 fsub f9, f2, f3 282 283 fsel f0, f8, f1, f0 284 fsel f2, f9, f3, f2 285 fsub f8, f0, f2 286 fsel f1, f8, f2, f0 287 .align 4 288 289LL(1000): 290 srawi. r0, NN, 3 291 mtspr CTR, r0 292 beq- LL(1150) 293 294 LFDUX f24, XX, INCX 295 LFDX f25, XX, INC1 296 LFDUX f26, XX, INCX 297 LFDX f27, XX, INC1 298 LFDUX f28, XX, INCX 299 LFDX f29, XX, INC1 300 LFDUX f30, XX, INCX 301 LFDX f31, XX, INC1 302 bdz LL(1120) 303 .align 4 304 305LL(1110): 306 fabs f8, f24 307 LFDUX f24, XX, INCX 308 fabs f9, f25 309 LFDX f25, XX, INC1 310 fabs f10, f26 311 LFDUX f26, XX, INCX 312 fabs f11, f27 313 LFDX f27, XX, INC1 314 315#ifdef PPCG4 316 dcbt XX, PRE 317#endif 318 319 fabs f12, f28 320 LFDUX f28, XX, INCX 321 fabs f13, f29 322 LFDX f29, XX, INC1 323 fabs f14, f30 324 LFDUX f30, XX, INCX 325 fabs f15, f31 326 LFDX f31, XX, INC1 327 328 fadd f4, f8, f9 329#if defined(PPCG4) && defined(DOUBLE) 330 dcbt X, PRE 331#endif 332 fadd f5, f10, f11 333 fadd f6, f12, f13 334 fadd f7, f14, f15 335 336 addi RET, RET, 1 337 fcmpu cr0, f1, f4 338 beq cr0, LL(9999) 339 340 addi RET, RET, 1 341 fcmpu cr0, f1, f5 342 beq cr0, LL(9999) 343 344 addi RET, RET, 1 345 fcmpu cr0, f1, f6 346 beq cr0, LL(9999) 347 348 addi RET, RET, 1 349 fcmpu cr0, f1, f7 350 beq cr0, LL(9999) 351 352 353 fabs f8, f24 354 LFDUX f24, XX, INCX 355 fabs f9, f25 356 LFDX f25, XX, INC1 357 fabs f10, f26 358 LFDUX f26, XX, INCX 359 fabs f11, f27 360 LFDX f27, XX, INC1 361 362#ifdef PPCG4 363 dcbt XX, PRE 364#endif 365 366 fabs f12, f28 367 LFDUX f28, XX, INCX 368 fabs f13, f29 369 LFDX f29, XX, INC1 370 fabs f14, f30 371 LFDUX f30, XX, INCX 372 fabs f15, f31 373 LFDX f31, XX, INC1 374 375 fadd f4, f8, f9 376#if defined(PPCG4) && defined(DOUBLE) 377 dcbt X, PRE 378#endif 379 fadd f5, f10, f11 380 fadd f6, f12, f13 381 fadd f7, f14, f15 382 383 addi RET, RET, 1 384 fcmpu cr0, f1, f4 385 beq cr0, LL(9999) 386 387 addi RET, RET, 1 388 fcmpu cr0, f1, f5 389 beq cr0, LL(9999) 390 391 addi RET, RET, 1 392 fcmpu cr0, f1, f6 393 beq cr0, LL(9999) 394 395 addi RET, RET, 1 396 fcmpu cr0, f1, f7 397 beq cr0, LL(9999) 398 399 bdnz LL(1110) 400 .align 4 401 402LL(1120): 403 fabs f8, f24 404 LFDUX f24, XX, INCX 405 fabs f9, f25 406 LFDX f25, XX, INC1 407 fabs f10, f26 408 LFDUX f26, XX, INCX 409 fabs f11, f27 410 LFDX f27, XX, INC1 411 412 fabs f12, f28 413 LFDUX f28, XX, INCX 414 fabs f13, f29 415 LFDX f29, XX, INC1 416 fabs f14, f30 417 LFDUX f30, XX, INCX 418 fabs f15, f31 419 LFDX f31, XX, INC1 420 421 fadd f4, f8, f9 422 fadd f5, f10, f11 423 fadd f6, f12, f13 424 fadd f7, f14, f15 425 426 addi RET, RET, 1 427 fcmpu cr0, f1, f4 428 beq cr0, LL(9999) 429 430 addi RET, RET, 1 431 fcmpu cr0, f1, f5 432 beq cr0, LL(9999) 433 434 addi RET, RET, 1 435 fcmpu cr0, f1, f6 436 beq cr0, LL(9999) 437 438 addi RET, RET, 1 439 fcmpu cr0, f1, f7 440 beq cr0, LL(9999) 441 442 fabs f8, f24 443 fabs f9, f25 444 fabs f10, f26 445 fabs f11, f27 446 447 fabs f12, f28 448 fabs f13, f29 449 fabs f14, f30 450 fabs f15, f31 451 452 fadd f4, f8, f9 453 fadd f5, f10, f11 454 fadd f6, f12, f13 455 fadd f7, f14, f15 456 457 addi RET, RET, 1 458 fcmpu cr0, f1, f4 459 beq cr0, LL(9999) 460 461 addi RET, RET, 1 462 fcmpu cr0, f1, f5 463 beq cr0, LL(9999) 464 465 addi RET, RET, 1 466 fcmpu cr0, f1, f6 467 beq cr0, LL(9999) 468 469 addi RET, RET, 1 470 fcmpu cr0, f1, f7 471 beq cr0, LL(9999) 472 .align 4 473 474LL(1150): 475 andi. r0, NN, 7 476 mtspr CTR, r0 477 beq LL(9999) 478 .align 4 479 480LL(1160): 481 LFDUX f8, XX, INCX 482 LFDX f9, XX, INC1 483 484 fabs f8, f8 485 fabs f9, f9 486 fadd f8, f8, f9 487 488 addi RET, RET, 1 489 fcmpu cr0, f1, f8 490 beq cr0, LL(9999) 491 bdnz LL(1160) 492 .align 4 493 494LL(9999): 495 lfd f14, 0(SP) 496 lfd f15, 8(SP) 497 lfd f16, 16(SP) 498 lfd f17, 24(SP) 499 500 lfd f18, 32(SP) 501 lfd f19, 40(SP) 502 lfd f20, 48(SP) 503 lfd f21, 56(SP) 504 505 lfd f22, 64(SP) 506 lfd f23, 72(SP) 507 lfd f24, 80(SP) 508 lfd f25, 88(SP) 509 510 lfd f26, 96(SP) 511 lfd f27, 104(SP) 512 lfd f28, 112(SP) 513 lfd f29, 120(SP) 514 515 lfd f30, 128(SP) 516 lfd f31, 136(SP) 517 518 addi SP, SP, STACKSIZE 519 blr 520 521 EPILOGUE 522