1 /* 2 * VISmoveImage.S: High speed moveImage operations utilizing the UltraSPARC 3 * Visual Instruction Set. 4 * 5 * Copyright (C) 1998,1999 Jakub Jelinek (jakub (at) redhat.com) 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a copy 8 * of this software and associated documentation files (the "Software"), to deal 9 * in the Software without restriction, including without limitation the rights 10 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 * copies of the Software, and to permit persons to whom the Software is 12 * furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included in 15 * all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * JAKUB JELINEK BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 21 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 26 /* NOTE NOTE NOTE: All loads in these routines _MUST_ be 64-byte block 27 * loads. If any non-block loads are done to the frame- 28 * buffer when prefetching is enabled (which we use, when 29 * available) this will cause lockups on FFB2 due to a 30 * hardware bug. -DaveM 31 */ 32 33 /* 34 void 35 VISmoveImageLR(unsigned char *src, unsigned char *dst, long w, long h, long skind, long dkind) 36 { 37 int i; 38 39 // Handles copying non-overlapping images and for overlapping images 40 // copying where dstx <= srcx. 41 // To copy overlapping images where dsty > srcy, set src and dst 42 // to start of the last scanline and negate both skind and dkind arguments. 43 44 assert(abs(skind) >= w && abs(dkind) >= w); 45 46 while (h--) { 47 for (i = 0; i < w; i++) 48 *d++ = *s++; 49 s += skind - w; 50 d += dkind - w; 51 } 52 } 53 54 void 55 VISmoveImageRL(unsigned char *src, unsigned char *dst, long w, long h, long skind, long dkind) 56 { 57 int i; 58 59 // Handles copying non-overlapping images and for overlapping images 60 // copying where dstx >= srcx. 61 // To copy overlapping images where dsty > srcy, set src and dst 62 // to start of the last scanline and negate both skind and dkind arguments. 63 64 assert(abs(skind) >= w && abs(dkind) >= w); 65 66 s += w; 67 d += w; 68 while (h--) { 69 for (i = 0; i < w; i++) 70 *--d = *--s; 71 s += skind + w; 72 d += dkind + w; 73 } 74 } 75 76 */ 77 78 #if defined(__sparc_v9__) || defined(__sparcv9) || defined(__arch64__) 79 80 .register %g2, #scratch 81 .register %g3, #scratch 82 83 #define SMUL mulx 84 #define ICC xcc 85 .register %g2,#scratch 86 .register %g3,#scratch 87 #else 88 #define SMUL smul 89 #define ICC icc 90 #endif 91 92 #define ASI_PST8_P 0xc0 93 #define ASI_BLK_P 0xf0 94 #define SYNC 0x40 95 96 /* Register usage: */ 97 /* integer registers: */ 98 #define src i0 99 #define dst i1 100 #define w i2 101 #define h i3 102 #define skind i4 103 #define dkind i5 104 #define branchbase l0 105 #define tmp1 l1 106 #define tmp4 l2 107 #define tmp5 l3 108 #define leftw l4 109 #define rightw l5 110 #define srcstart l6 111 #define mode l7 112 #define fregset o0 /* Must be [og]? for v8plusa */ 113 #define srcend o1 114 #define srcn o2 115 #define srcnext o3 116 #define rightw2 o4 117 #define tmp2 o5 /* Must be [og]? for v8plusa */ 118 #define narrow o7 119 #define prepw g1 /* Must be [og]? for v8plusa */ 120 #define srcstop g2 121 #define srcnotdone g3 122 #define curw g4 /* Must be [og]? for v8plusa */ 123 #define leftw2 rightw2 124 #define tmp3 g5 /* Must be [og]? for v8plusa */ 125 /* floating point registers: */ 126 #define ftmp1 f0 127 #define ftmp2 f2 128 #define ftmp3 f4 129 #define ftmp4 f6 130 #define ftmp5 f8 131 #define ftmp6 f10 132 #define ftmp7 f12 133 #define ftmp8 f14 134 #define store_regs f16-f31 135 #define load_bank1 f32-f46 136 #define load_bank2 f48-f62 137 #define fnop fmovd %ftmp2, %ftmp2 138 139 #define LOAD(f32,f46,tgt,tgtr) \ 140 subcc %curw, 64, %curw; \ 141 bleu,pn %ICC, tgt; \ 142 fmovd %f46, %ftmp1; \ 143 ldda [%src] ASI_BLK_P, %f32; \ 144 add %src, 64, %src; \ 145 tgtr: 146 147 #define PREPLOAD(f32,f46,tgt,tgtr) \ 148 brlez,pn %prepw, tgt; \ 149 fmovd %f46, %ftmp1; \ 150 ldda [%src] ASI_BLK_P, %f32; \ 151 add %src, 64, %src; \ 152 tgtr: 153 154 #define STORE \ 155 stda %f16, [%dst] ASI_BLK_P; 156 157 #define FREG_FROB(f0,A0,F2,f2,A1,F4,f4,A2,F6,f6,A3,F8,f8,A4,F10,f10,A5,F12,f12,A6,F14,f14,A7,F16) \ 158 A0 \ 159 faligndata %f0,%F2,%f16; \ 160 A1 \ 161 faligndata %f2,%F4,%f18; \ 162 A2 \ 163 faligndata %f4,%F6,%f20; \ 164 A3 \ 165 faligndata %f6,%F8,%f22; \ 166 A4 \ 167 faligndata %f8,%F10,%f24; \ 168 A5 \ 169 faligndata %f10,%F12,%f26; \ 170 A6 \ 171 faligndata %f12,%F14,%f28; \ 172 A7 \ 173 faligndata %f14,%F16,%f30; 174 175 .section ".rodata" 176 .asciz "VISmoveImage (C) 1998,1999 Jakub Jelinek" 177 178 /* The code might not be self-explanatory, but it was written to be processed 179 * by machines, not humans. Comments are deliberately left as an exercise 180 * to the occasional reader. */ 181 182 .text 183 .globl VISmoveImageLR 184 .align 32 185 VISmoveImageLR: 186 #ifdef __arch64__ 187 save %sp, -192, %sp ! Group 0 188 #else 189 save %sp, -96, %sp ! Group 0 190 #endif 191 0: rd %pc, %tmp3 ! Group 1 192 sub %src, %dst, %mode ! Group 7 193 brz,pn %h, return 194 neg %dst, %leftw ! Group 8 195 mov %src, %srcstart 196 andn %src, 63, %src ! Group 9 197 cmp %w, 128 198 blu,pn %ICC, prepare_narrow 199 and %mode, 63, %mode ! Group 10 200 add %dst, %w, %rightw 201 ldda [%src] ASI_BLK_P, %f32 ! Group 11 202 add %src, 64, %src ! Group 12 203 clr %narrow 204 ldda [%src] ASI_BLK_P, %f48 ! Group 13 205 and %leftw, 63, %leftw ! Group 14 206 sub %rightw, 1, %rightw 207 andn %dst, 63, %dst ! Group 15 208 and %rightw, 63, %rightw 209 alignaddr %mode, %g0, %g0 ! Group 16 210 add %rightw, 1, %rightw ! Group 17 211 clr %fregset 212 add %src, 64, %src ! Group 18 213 add %tmp3, (BranchBase - 0b), %branchbase 214 mov 64, %prepw ! Group 19 215 ba,pt %xcc, roll_wide 216 sub %h, 1, %srcnotdone 217 prepare_narrow: 218 #if defined(__sparc_v9__) || defined(__sparcv9) || defined(__arch64__) 219 brlez,pn %w, return 220 #else 221 tst %w 222 ble,pn %icc, return 223 #endif 224 add %dst, %w, %rightw ! Group 11 225 and %leftw, 63, %leftw 226 ldda [%src] ASI_BLK_P, %f32 ! Group 12 227 sub %rightw, 1, %rightw ! Group 13 228 andn %dst, 63, %dst 229 and %rightw, 63, %rightw ! Group 14 230 sub %w, %leftw, %tmp2 231 add %rightw, 1, %rightw ! Group 15 232 clr %fregset 233 subcc %tmp2, %rightw, %curw ! Group 16 234 and %srcstart, 63, %tmp1 235 mov %curw, %prepw ! Group 17 236 add %tmp1, %w, %tmp1 237 bg,pt %ICC, 1f 238 add %src, 64, %src ! Group 18 239 cmp %tmp1, 128 240 movg %icc, 64, %prepw ! Group 19 241 1: add %srcstart, %w, %srcend 242 sub %h, 1, %srcnotdone ! Group 20 243 add %srcstart, %skind, %srcnext 244 add %srcend, 63, %tmp4 ! Group 21 245 andn %srcnext, 63, %srcnext 246 add %w, 64, %tmp2 ! Group 22 247 cmp %skind, 0 248 bl,pn %ICC, 1f 249 clr %srcstop ! Group 23 250 cmp %skind, %tmp2 251 bgeu,pt %ICC, 2f 252 andn %tmp4, 63, %tmp2 ! Group 24 253 SMUL %skind, %srcnotdone, %srcstop 254 ba,pt %xcc, 2f 255 add %tmp4, %srcstop, %srcstop 256 1: addcc %tmp2, %skind, %g0 257 ble,pt %ICC, 2f 258 sub %srcnext, 64, %tmp2 259 SMUL %skind, %srcnotdone, %srcstop 260 sub %srcstart, 64, %narrow 261 add %srcstop, %narrow, %srcstop 262 2: add %srcnext, 64, %narrow 263 andn %tmp4, 63, %srcend ! Group 25 264 mov %srcnext, %srcn 265 cmp %narrow, %srcend ! Group 26 266 andn %srcstop, 63, %srcstop 267 move %ICC, %tmp2, %srcnext ! Group 27 268 alignaddr %mode, %g0, %g0 ! Group 28 269 add %tmp3, (BranchBase - 0b), %branchbase 270 mov 1, %narrow ! Group 29 271 cmp %srcnext, %srcstop 272 move %ICC, 0, %srcnotdone ! Group 30 273 cmp %tmp1, 64 274 bleu,pn %ICC, 1f 275 dec %h ! Group 31 276 ldda [%src] ASI_BLK_P, %f48 ! Group 32 277 ba,pt %xcc, roll_narrow ! Group 33 278 addcc %src, 64, %src 279 1: brz,a,pn %srcnotdone, roll_narrow 280 membar #Sync 281 ldda [%srcnext] ASI_BLK_P, %f48 282 ba,pt %xcc, roll_narrow 283 addcc %srcnext, 64, %src 284 285 .align 32 286 prepr0: faligndata %f32, %f34, %f16 287 faligndata %f34, %f36, %f18 288 faligndata %f36, %f38, %f20 289 faligndata %f38, %f40, %f22 290 faligndata %f40, %f42, %f24 291 faligndata %f42, %f44, %f26 292 ba,pt %xcc, 4f 293 faligndata %f44, %f46, %f28 294 .align 32 295 prepr1: faligndata %f48, %f50, %f16 296 faligndata %f50, %f52, %f18 297 faligndata %f52, %f54, %f20 298 faligndata %f54, %f56, %f22 299 faligndata %f56, %f58, %f24 300 faligndata %f58, %f60, %f26 301 ba,pt %xcc, 5f 302 faligndata %f60, %f62, %f28 303 .align 32 304 prepr2: faligndata %f34, %f36, %f16 305 faligndata %f36, %f38, %f18 306 faligndata %f38, %f40, %f20 307 faligndata %f40, %f42, %f22 308 faligndata %f42, %f44, %f24 309 faligndata %f44, %f46, %f26 310 ba,pt %xcc, narrowst 311 faligndata %f46, %f0, %f28 312 .align 32 313 prepr3: faligndata %f50, %f52, %f16 314 faligndata %f52, %f54, %f18 315 faligndata %f54, %f56, %f20 316 faligndata %f56, %f58, %f22 317 faligndata %f58, %f60, %f24 318 faligndata %f60, %f62, %f26 319 ba,pt %xcc, narrowst 320 faligndata %f62, %f0, %f28 321 .align 32 322 prepr4: faligndata %f36, %f38, %f16 323 faligndata %f38, %f40, %f18 324 faligndata %f40, %f42, %f20 325 faligndata %f42, %f44, %f22 326 faligndata %f44, %f46, %f24 327 ba,pt %xcc, narrowst 328 faligndata %f46, %f0, %f26 329 .align 32 330 prepr5: faligndata %f52, %f54, %f16 331 faligndata %f54, %f56, %f18 332 faligndata %f56, %f58, %f20 333 faligndata %f58, %f60, %f22 334 faligndata %f60, %f62, %f24 335 ba,pt %xcc, narrowst 336 faligndata %f62, %f0, %f26 337 .align 32 338 prepr6: faligndata %f38, %f40, %f16 339 faligndata %f40, %f42, %f18 340 faligndata %f42, %f44, %f20 341 faligndata %f44, %f46, %f22 342 ba,pt %xcc, narrowst 343 faligndata %f46, %f0, %f24 344 .align 32 345 prepr7: faligndata %f54, %f56, %f16 346 faligndata %f56, %f58, %f18 347 faligndata %f58, %f60, %f20 348 faligndata %f60, %f62, %f22 349 ba,pt %xcc, narrowst 350 faligndata %f62, %f0, %f24 351 .align 32 352 prepr8: faligndata %f40, %f42, %f16 353 faligndata %f42, %f44, %f18 354 faligndata %f44, %f46, %f20 355 ba,pt %xcc, narrowst 356 faligndata %f46, %f0, %f22 357 .align 32 358 prepr9: faligndata %f56, %f58, %f16 359 faligndata %f58, %f60, %f18 360 faligndata %f60, %f62, %f20 361 ba,pt %xcc, narrowst 362 faligndata %f62, %f0, %f22 363 .align 32 364 prepr10:faligndata %f42, %f44, %f16 365 faligndata %f44, %f46, %f18 366 ba,pt %xcc, narrowst 367 faligndata %f46, %f0, %f20 368 .align 32 369 prepr11:faligndata %f58, %f60, %f16 370 faligndata %f60, %f62, %f18 371 ba,pt %xcc, narrowst 372 faligndata %f62, %f0, %f20 373 .align 32 374 prepr12:faligndata %f44, %f46, %f16 375 ba,pt %xcc, narrowst 376 faligndata %f46, %f0, %f18 377 .align 32 378 prepr13:faligndata %f60, %f62, %f16 379 ba,pt %xcc, narrowst 380 faligndata %f62, %f0, %f18 381 .align 32 382 prepr14:ba,pt %xcc, narrowst 383 faligndata %f46, %f0, %f16 384 nop 385 nop 386 4: ba,pt %xcc, narrowst 387 faligndata %f46, %f0, %f30 388 .align 32 389 prepr15:ba,pt %xcc, narrowst 390 faligndata %f62, %f0, %f16 391 nop 392 nop 393 5: ba,pt %xcc, narrowst 394 faligndata %f62, %f0, %f30 395 396 .align 32 397 prepn0: faligndata %ftmp1, %f32, %f30 398 ba,pt %xcc, leftst 399 mov (vis0 - BranchBase), %tmp3 400 nop 401 1: ba,pt %xcc, leftst 402 mov (vis12 - BranchBase), %tmp3 403 .align 32 404 prepn1: faligndata %ftmp1, %f48, %f30 405 ba,pt %xcc, leftst 406 mov (vis1 - BranchBase), %tmp3 407 nop 408 2: ba,pt %xcc, leftst 409 mov (vis13 - BranchBase), %tmp3 410 .align 32 411 prepn2: faligndata %ftmp1, %f32, %f28 412 faligndata %f32, %f34, %f30 413 ba,pt %xcc, leftst 414 mov (vis2 - BranchBase), %tmp3 415 3: faligndata %f44, %f46, %f30 416 ba,pt %xcc, leftst 417 mov (vis14 - BranchBase), %tmp3 418 .align 32 419 prepn3: faligndata %ftmp1, %f48, %f28 420 faligndata %f48, %f50, %f30 421 ba,pt %xcc, leftst 422 mov (vis3 - BranchBase), %tmp3 423 .align 32 424 prepn4: faligndata %ftmp1, %f32, %f26 425 faligndata %f32, %f34, %f28 426 faligndata %f34, %f36, %f30 427 ba,pt %xcc, leftst 428 mov (vis4 - BranchBase), %tmp3 429 .align 32 430 prepn5: faligndata %ftmp1, %f48, %f26 431 faligndata %f48, %f50, %f28 432 faligndata %f50, %f52, %f30 433 ba,pt %xcc, leftst 434 mov (vis5 - BranchBase), %tmp3 435 .align 32 436 prepn6: faligndata %ftmp1, %f32, %f24 437 faligndata %f32, %f34, %f26 438 faligndata %f34, %f36, %f28 439 faligndata %f36, %f38, %f30 440 ba,pt %xcc, leftst 441 mov (vis6 - BranchBase), %tmp3 442 .align 32 443 prepn7: faligndata %ftmp1, %f48, %f24 444 faligndata %f48, %f50, %f26 445 faligndata %f50, %f52, %f28 446 faligndata %f52, %f54, %f30 447 ba,pt %xcc, leftst 448 mov (vis7 - BranchBase), %tmp3 449 .align 32 450 prepn8: faligndata %ftmp1, %f32, %f22 451 faligndata %f32, %f34, %f24 452 faligndata %f34, %f36, %f26 453 faligndata %f36, %f38, %f28 454 faligndata %f38, %f40, %f30 455 ba,pt %xcc, leftst 456 mov (vis8 - BranchBase), %tmp3 457 .align 32 458 prepn9: faligndata %ftmp1, %f48, %f22 459 faligndata %f48, %f50, %f24 460 faligndata %f50, %f52, %f26 461 faligndata %f52, %f54, %f28 462 faligndata %f54, %f56, %f30 463 ba,pt %xcc, leftst 464 mov (vis9 - BranchBase), %tmp3 465 .align 32 466 prepn10:faligndata %ftmp1, %f32, %f20 467 faligndata %f32, %f34, %f22 468 faligndata %f34, %f36, %f24 469 faligndata %f36, %f38, %f26 470 faligndata %f38, %f40, %f28 471 faligndata %f40, %f42, %f30 472 ba,pt %xcc, leftst 473 mov (vis10 - BranchBase), %tmp3 474 .align 32 475 prepn11:faligndata %ftmp1, %f48, %f20 476 faligndata %f48, %f50, %f22 477 faligndata %f50, %f52, %f24 478 faligndata %f52, %f54, %f26 479 faligndata %f54, %f56, %f28 480 faligndata %f56, %f58, %f30 481 ba,pt %xcc, leftst 482 mov (vis11 - BranchBase), %tmp3 483 .align 32 484 prepn12:faligndata %ftmp1, %f32, %f18 485 faligndata %f32, %f34, %f20 486 faligndata %f34, %f36, %f22 487 faligndata %f36, %f38, %f24 488 faligndata %f38, %f40, %f26 489 faligndata %f40, %f42, %f28 490 ba,pt %xcc, 1b 491 faligndata %f42, %f44, %f30 492 .align 32 493 prepn13:faligndata %ftmp1, %f48, %f18 494 faligndata %f48, %f50, %f20 495 faligndata %f50, %f52, %f22 496 faligndata %f52, %f54, %f24 497 faligndata %f54, %f56, %f26 498 faligndata %f56, %f58, %f28 499 ba,pt %xcc, 2b 500 faligndata %f58, %f60, %f30 501 .align 32 502 prepn14:faligndata %ftmp1, %f32, %f16 503 faligndata %f32, %f34, %f18 504 faligndata %f34, %f36, %f20 505 faligndata %f36, %f38, %f22 506 faligndata %f38, %f40, %f24 507 faligndata %f40, %f42, %f26 508 ba,pt %xcc, 3b 509 faligndata %f42, %f44, %f28 510 .align 32 511 prepn15:faligndata %ftmp1, %f48, %f16 512 faligndata %f48, %f50, %f18 513 faligndata %f50, %f52, %f20 514 faligndata %f52, %f54, %f22 515 faligndata %f54, %f56, %f24 516 faligndata %f56, %f58, %f26 517 faligndata %f58, %f60, %f28 518 faligndata %f60, %f62, %f30 519 ba,pt %xcc, leftst 520 mov (vis15 - BranchBase), %tmp3 521 522 .align 64 523 BranchBase: 524 prepl0: FREG_FROB(f32,,f34,f34,,f36,f36,,f38,f38,,f40,f40,,f42,f42,,f44,f44,,f46,ftmp1,PREPLOAD(f32,f46,prep0e,prep0r),f48) 525 ba,pt %xcc, leftst 526 mov (vis1 - BranchBase), %tmp3 527 .align 64 528 prepl1: FREG_FROB(f48,,f50,f50,,f52,f52,,f54,f54,,f56,f56,,f58,f58,,f60,f60,,f62,ftmp1,PREPLOAD(f48,f62,prep1e,prep1r),f32) 529 ba,pt %xcc, leftst 530 mov (vis0 - BranchBase), %tmp3 531 .align 64 532 prepl2: FREG_FROB(f34,,f36,f36,,f38,f38,,f40,f40,,f42,f42,,f44,f44,,f46,ftmp1,PREPLOAD(f32,f46,prep2e,prep2r),f48,f48,,f50) 533 ba,pt %xcc, leftst 534 mov (vis3 - BranchBase), %tmp3 535 .align 64 536 prepl3: FREG_FROB(f50,,f52,f52,,f54,f54,,f56,f56,,f58,f58,,f60,f60,,f62,ftmp1,PREPLOAD(f48,f62,prep3e,prep3r),f32,f32,,f34) 537 ba,pt %xcc, leftst 538 mov (vis2 - BranchBase), %tmp3 539 .align 64 540 prepl4: FREG_FROB(f36,,f38,f38,,f40,f40,,f42,f42,,f44,f44,,f46,ftmp1,PREPLOAD(f32,f46,prep4e,prep4r),f48,f48,,f50,f50,,f52) 541 ba,pt %xcc, leftst 542 mov (vis5 - BranchBase), %tmp3 543 .align 64 544 prepl5: FREG_FROB(f52,,f54,f54,,f56,f56,,f58,f58,,f60,f60,,f62,ftmp1,PREPLOAD(f48,f62,prep5e,prep5r),f32,f32,,f34,f34,,f36) 545 ba,pt %xcc, leftst 546 mov (vis4 - BranchBase), %tmp3 547 .align 64 548 prepl6: FREG_FROB(f38,,f40,f40,,f42,f42,,f44,f44,,f46,ftmp1,PREPLOAD(f32,f46,prep6e,prep6r),f48,f48,,f50,f50,,f52,f52,,f54) 549 ba,pt %xcc, leftst 550 mov (vis7 - BranchBase), %tmp3 551 .align 64 552 prepl7: FREG_FROB(f54,,f56,f56,,f58,f58,,f60,f60,,f62,ftmp1,PREPLOAD(f48,f62,prep7e,prep7r),f32,f32,,f34,f34,,f36,f36,,f38) 553 ba,pt %xcc, leftst 554 mov (vis6 - BranchBase), %tmp3 555 .align 64 556 prepl8: FREG_FROB(f40,,f42,f42,,f44,f44,,f46,ftmp1,PREPLOAD(f32,f46,prep8e,prep8r),f48,f48,,f50,f50,,f52,f52,,f54,f54,,f56) 557 ba,pt %xcc, leftst 558 mov (vis9 - BranchBase), %tmp3 559 .align 64 560 prepl9: FREG_FROB(f56,,f58,f58,,f60,f60,,f62,ftmp1,PREPLOAD(f48,f62,prep9e,prep9r),f32,f32,,f34,f34,,f36,f36,,f38,f38,,f40) 561 ba,pt %xcc, leftst 562 mov (vis8 - BranchBase), %tmp3 563 .align 64 564 prepl10:FREG_FROB(f42,,f44,f44,,f46,ftmp1,PREPLOAD(f32,f46,prep10e,prep10r),f48,f48,,f50,f50,,f52,f52,,f54,f54,,f56,f56,,f58) 565 ba,pt %xcc, leftst 566 mov (vis11 - BranchBase), %tmp3 567 .align 64 568 prepl11:FREG_FROB(f58,,f60,f60,,f62,ftmp1,PREPLOAD(f48,f62,prep11e,prep11r),f32,f32,,f34,f34,,f36,f36,,f38,f38,,f40,f40,,f42) 569 ba,pt %xcc, leftst 570 mov (vis10 - BranchBase), %tmp3 571 .align 64 572 prepl12:FREG_FROB(f44,,f46,ftmp1,PREPLOAD(f32,f46,prep12e,prep12r),f48,f48,,f50,f50,,f52,f52,,f54,f54,,f56,f56,,f58,f58,,f60) 573 ba,pt %xcc, leftst 574 mov (vis13 - BranchBase), %tmp3 575 .align 64 576 prepl13:FREG_FROB(f60,,f62,ftmp1,PREPLOAD(f48,f62,prep13e,prep13r),f32,f32,,f34,f34,,f36,f36,,f38,f38,,f40,f40,,f42,f42,,f44) 577 ba,pt %xcc, leftst 578 mov (vis12 - BranchBase), %tmp3 579 .align 64 580 prepl14:FREG_FROB(ftmp1,PREPLOAD(f32,f46,prep14e,prep14r),f48,f48,,f50,f50,,f52,f52,,f54,f54,,f56,f56,,f58,f58,,f60,f60,,f62) 581 ba,pt %xcc, leftst 582 mov (vis15 - BranchBase), %tmp3 583 .align 64 584 prepl15:FREG_FROB(ftmp1,PREPLOAD(f48,f62,prep15e,prep15r),f32,f32,,f34,f34,,f36,f36,,f38,f38,,f40,f40,,f42,f42,,f44,f44,,f46) 585 ba,pt %xcc, leftst 586 mov (vis14 - BranchBase), %tmp3 587 588 .align 128 589 vis0: FREG_FROB(f32,,f34,f34,,f36,f36,,f38,f38,,f40,f40,,f42,f42,,f44,f44,,f46,ftmp1,LOAD(f32,f46,vis0e,vis0r),f48) 590 STORE 591 add %dst, 64, %dst 592 vis1: FREG_FROB(f48,,f50,f50,,f52,f52,,f54,f54,,f56,f56,,f58,f58,,f60,f60,,f62,ftmp1,LOAD(f48,f62,vis1e,vis1r),f32) 593 STORE 594 ba,pt %xcc, vis0 595 add %dst, 64, %dst 596 .align 128 597 vis2: FREG_FROB(f34,,f36,f36,,f38,f38,,f40,f40,,f42,f42,,f44,f44,,f46,ftmp1,LOAD(f32,f46,vis2e,vis2r),f48,f48,,f50) 598 STORE 599 add %dst, 64, %dst 600 vis3: FREG_FROB(f50,,f52,f52,,f54,f54,,f56,f56,,f58,f58,,f60,f60,,f62,ftmp1,LOAD(f48,f62,vis3e,vis3r),f32,f32,,f34) 601 STORE 602 ba,pt %xcc, vis2 603 add %dst, 64, %dst 604 .align 128 605 vis4: FREG_FROB(f36,,f38,f38,,f40,f40,,f42,f42,,f44,f44,,f46,ftmp1,LOAD(f32,f46,vis4e,vis4r),f48,f48,,f50,f50,,f52) 606 STORE 607 add %dst, 64, %dst 608 vis5: FREG_FROB(f52,,f54,f54,,f56,f56,,f58,f58,,f60,f60,,f62,ftmp1,LOAD(f48,f62,vis5e,vis5r),f32,f32,,f34,f34,,f36) 609 STORE 610 ba,pt %xcc, vis4 611 add %dst, 64, %dst 612 .align 128 613 vis6: FREG_FROB(f38,,f40,f40,,f42,f42,,f44,f44,,f46,ftmp1,LOAD(f32,f46,vis6e,vis6r),f48,f48,,f50,f50,,f52,f52,,f54) 614 STORE 615 add %dst, 64, %dst 616 vis7: FREG_FROB(f54,,f56,f56,,f58,f58,,f60,f60,,f62,ftmp1,LOAD(f48,f62,vis7e,vis7r),f32,f32,,f34,f34,,f36,f36,,f38) 617 STORE 618 ba,pt %xcc, vis6 619 add %dst, 64, %dst 620 .align 128 621 vis8: FREG_FROB(f40,,f42,f42,,f44,f44,,f46,ftmp1,LOAD(f32,f46,vis8e,vis8r),f48,f48,,f50,f50,,f52,f52,,f54,f54,,f56) 622 STORE 623 add %dst, 64, %dst 624 vis9: FREG_FROB(f56,,f58,f58,,f60,f60,,f62,ftmp1,LOAD(f48,f62,vis9e,vis9r),f32,f32,,f34,f34,,f36,f36,,f38,f38,,f40) 625 STORE 626 ba,pt %xcc, vis8 627 add %dst, 64, %dst 628 .align 128 629 vis10: FREG_FROB(f42,,f44,f44,,f46,ftmp1,LOAD(f32,f46,vis10e,vis10r),f48,f48,,f50,f50,,f52,f52,,f54,f54,,f56,f56,,f58) 630 STORE 631 add %dst, 64, %dst 632 vis11: FREG_FROB(f58,,f60,f60,,f62,ftmp1,LOAD(f48,f62,vis11e,vis11r),f32,f32,,f34,f34,,f36,f36,,f38,f38,,f40,f40,,f42) 633 STORE 634 ba,pt %xcc, vis10 635 add %dst, 64, %dst 636 .align 128 637 vis12: FREG_FROB(f44,,f46,ftmp1,LOAD(f32,f46,vis12e,vis12r),f48,f48,,f50,f50,,f52,f52,,f54,f54,,f56,f56,,f58,f58,,f60) 638 STORE 639 add %dst, 64, %dst 640 vis13: FREG_FROB(f60,,f62,ftmp1,LOAD(f48,f62,vis13e,vis13r),f32,f32,,f34,f34,,f36,f36,,f38,f38,,f40,f40,,f42,f42,,f44) 641 STORE 642 ba,pt %xcc, vis12 643 add %dst, 64, %dst 644 .align 128 645 vis14: FREG_FROB(ftmp1,LOAD(f32,f46,vis14e,vis14r),f48,f48,,f50,f50,,f52,f52,,f54,f54,,f56,f56,,f58,f58,,f60,f60,,f62) 646 STORE 647 add %dst, 64, %dst 648 vis15: FREG_FROB(ftmp1,LOAD(f48,f62,vis15e,vis15r),f32,f32,,f34,f34,,f36,f36,,f38,f38,,f40,f40,,f42,f42,,f44,f44,,f46) 649 STORE 650 ba,pt %xcc, vis14 651 add %dst, 64, %dst 652 653 leftst: brlz,pn %curw, narrowst + 4 654 and %leftw, 0x38, %tmp1 655 andcc %leftw, 7, %g0 656 be,pn %icc, 1f 657 neg %tmp1 658 sub %dst, %leftw, %tmp4 659 add %branchbase, (2f - BranchBase - 8), %tmp2 660 edge8 %tmp4, %g0, %tmp5 661 jmpl %tmp2 + %tmp1, %g0 662 andn %tmp4, 7, %tmp4 663 1: addcc %branchbase, (3f - BranchBase), %tmp2 664 sra %tmp1, 1, %tmp1 665 jmpl %tmp2 + %tmp1, %g0 666 nop 667 ba,pt %xcc, 2f+0x00 668 stda %f16, [%tmp4 + %tmp5] ASI_PST8_P 669 ba,pt %xcc, 2f+0x04 670 stda %f18, [%tmp4 + %tmp5] ASI_PST8_P 671 ba,pt %xcc, 2f+0x08 672 stda %f20, [%tmp4 + %tmp5] ASI_PST8_P 673 ba,pt %xcc, 2f+0x0c 674 stda %f22, [%tmp4 + %tmp5] ASI_PST8_P 675 ba,pt %xcc, 2f+0x10 676 stda %f24, [%tmp4 + %tmp5] ASI_PST8_P 677 ba,pt %xcc, 2f+0x14 678 stda %f26, [%tmp4 + %tmp5] ASI_PST8_P 679 ba,pt %xcc, 2f+0x18 680 stda %f28, [%tmp4 + %tmp5] ASI_PST8_P 681 jmpl %branchbase + %tmp3, %g0 682 stda %f30, [%tmp4 + %tmp5] ASI_PST8_P 683 2: std %f18, [%dst - 0x38] 684 std %f20, [%dst - 0x30] 685 std %f22, [%dst - 0x28] 686 std %f24, [%dst - 0x20] 687 std %f26, [%dst - 0x18] 688 std %f28, [%dst - 0x10] 689 std %f30, [%dst - 0x08] 690 3: jmpl %branchbase + %tmp3, %g0 691 nop 692 693 rightst:cmp %rightw, 64 694 be,pn %icc, 2f 695 and %rightw, 0x38, %tmp1 696 andcc %rightw, 7, %g0 697 be,pn %icc, 1f 698 neg %tmp1 699 sub %g0, %rightw, %tmp5 700 add %branchbase, (3f - BranchBase - 8), %tmp2 701 edge8l %tmp5, %g0, %tmp5 702 add %mode, %skind, %mode 703 jmpl %tmp1 + %tmp2, %g0 704 sub %dst, %tmp1, %tmp4 705 1: addcc %branchbase, (4f - BranchBase), %tmp2 706 sra %tmp1, 1, %tmp1 707 jmpl %tmp1 + %tmp2, %g0 708 2: add %mode, %skind, %mode 709 ba,pt %xcc, 4f 710 stda %f16, [%dst] ASI_BLK_P 711 ba,pt %xcc, 3f+0x00 712 stda %f30, [%tmp4 + %tmp5] ASI_PST8_P 713 ba,pt %xcc, 3f+0x04 714 stda %f28, [%tmp4 + %tmp5] ASI_PST8_P 715 ba,pt %xcc, 3f+0x08 716 stda %f26, [%tmp4 + %tmp5] ASI_PST8_P 717 ba,pt %xcc, 3f+0x0c 718 stda %f24, [%tmp4 + %tmp5] ASI_PST8_P 719 ba,pt %xcc, 3f+0x10 720 stda %f22, [%tmp4 + %tmp5] ASI_PST8_P 721 ba,pt %xcc, 3f+0x14 722 stda %f20, [%tmp4 + %tmp5] ASI_PST8_P 723 ba,pt %xcc, 3f+0x18 724 stda %f18, [%tmp4 + %tmp5] ASI_PST8_P 725 ba,pt %xcc, 3f+0x1c 726 stda %f16, [%tmp4 + %tmp5] ASI_PST8_P 727 3: std %f28, [%dst + 0x30] 728 std %f26, [%dst + 0x28] 729 std %f24, [%dst + 0x20] 730 std %f22, [%dst + 0x18] 731 std %f20, [%dst + 0x10] 732 std %f18, [%dst + 0x08] 733 std %f16, [%dst + 0x00] 734 4: brnz,pn %narrow, narrow_cont 735 deccc %srcnotdone 736 blu,pn %ICC, return 737 sub %mode, %dkind, %mode 738 alignaddr %mode, %g0, %g0 739 and %mode, 63, %mode 740 cmp %srcnext, %srcn 741 bne,a,pn %ICC, 6f 742 xor %fregset, 64, %fregset 743 brnz,a,pn %fregset, 5f 744 ldda [%src] ASI_BLK_P, %f32 745 ldda [%src] ASI_BLK_P, %f48 746 5: add %src, 64, %src 747 6: add %dst, %dkind, %dst 748 sub %w, %rightw, %tmp1 749 add %srcstart, %skind, %srcstart 750 sub %dst, %tmp1, %dst 751 add %rightw, %dkind, %rightw 752 andn %dst, 63, %dst 753 sub %rightw, 1, %rightw 754 sub %leftw, %dkind, %leftw 755 and %rightw, 63, %rightw 756 and %leftw, 63, %leftw 757 add %rightw, 1, %rightw 758 roll_wide: 759 add %srcstart, %w, %srcend 760 add %srcstart, %skind, %srcnext 761 fnop 762 add %srcend, 63, %srcend 763 andncc %srcnext, 63, %srcnext 764 fnop 765 sll %mode, 4, %tmp1 766 andn %srcend, 63, %srcend 767 fnop 768 mov %srcnext, %srcn 769 and %mode, 7, %rightw2 770 fnop 771 andn %tmp1, 127, %tmp1 772 add %rightw2, %rightw, %rightw2 773 fnop 774 add %tmp1, %fregset, %tmp1 775 subcc %w, %leftw, %tmp3 776 fnop 777 srl %tmp1, 1, %tmp2 778 add %srcnext, 64, %tmp4 779 fnop 780 add %tmp2, (prepn0 - BranchBase), %tmp2 781 cmp %mode, %leftw 782 movgeu %icc, %tmp2, %tmp1 783 cmp %tmp4, %srcend 784 add %dst, 64, %tmp4 785 move %ICC, %srcend, %srcnext 786 movrnz %leftw, %tmp4, %dst 787 jmpl %branchbase + %tmp1, %g0 788 sub %tmp3, %rightw, %curw 789 790 return: return %i7+8 791 #if defined(__NetBSD__) 792 wr %g0, 4, %fprs 793 #else 794 wr %g0, 0, %fprs 795 #endif 796 797 narrowst: 798 and %leftw, 0x38, %tmp1 799 sub %dst, %leftw, %tmp5 800 sub %w, 1, %fregset 801 andcc %leftw, 7, %tmp4 802 add %fregset, %tmp5, %fregset 803 neg %tmp1 804 and %fregset, 7, %srcend 805 be,pn %icc, 1f 806 edge8 %g0, %srcend, %srcend 807 add %tmp1, (2f - BranchBase - 8), %tmp1 808 edge8 %tmp5, %fregset, %tmp2 809 andn %tmp5, 7, %tmp5 810 andn %fregset, 7, %fregset 811 jmpl %branchbase + %tmp1, %g0 812 sub %w, %tmp4, %tmp4 813 1: addcc %branchbase, (3f - BranchBase - 8), %tmp2 814 sll %tmp1, 1, %tmp1 815 andn %fregset, 7, %fregset 816 jmpl %tmp2 + %tmp1, %g0 817 mov %w, %tmp4 818 ba,pt %xcc, 2f+0x00 819 stda %f16, [%tmp5 + %tmp2] ASI_PST8_P 820 ba,pt %xcc, 2f+0x10 821 stda %f18, [%tmp5 + %tmp2] ASI_PST8_P 822 ba,pt %xcc, 2f+0x20 823 stda %f20, [%tmp5 + %tmp2] ASI_PST8_P 824 ba,pt %xcc, 2f+0x30 825 stda %f22, [%tmp5 + %tmp2] ASI_PST8_P 826 ba,pt %xcc, 2f+0x40 827 stda %f24, [%tmp5 + %tmp2] ASI_PST8_P 828 ba,pt %xcc, 2f+0x50 829 stda %f26, [%tmp5 + %tmp2] ASI_PST8_P 830 ba,pt %xcc, 2f+0x60 831 stda %f28, [%tmp5 + %tmp2] ASI_PST8_P 832 ba,pt %xcc, 4f 833 stda %f30, [%tmp5 + %tmp2] ASI_PST8_P 834 2: subcc %tmp4, 8, %tmp4 835 bl,pn %icc, 3f+0x00 836 fnop 837 std %f18, [%dst - 0x38] 838 subcc %tmp4, 8, %tmp4 839 bl,pn %icc, 3f+0x10 840 fnop 841 std %f20, [%dst - 0x30] 842 subcc %tmp4, 8, %tmp4 843 bl,pn %icc, 3f+0x20 844 fnop 845 std %f22, [%dst - 0x28] 846 subcc %tmp4, 8, %tmp4 847 bl,pn %icc, 3f+0x30 848 fnop 849 std %f24, [%dst - 0x20] 850 subcc %tmp4, 8, %tmp4 851 bl,pn %icc, 3f+0x40 852 fnop 853 std %f26, [%dst - 0x18] 854 subcc %tmp4, 8, %tmp4 855 bl,pn %icc, 3f+0x50 856 fnop 857 std %f28, [%dst - 0x10] 858 subcc %tmp4, 8, %tmp4 859 bl,pn %icc, 3f+0x60 860 fnop 861 std %f30, [%dst - 0x08] 862 ba,pt %xcc, 4f 863 nop 864 3: cmp %tmp4, -8 865 bg,a,pn %ICC, 4f 866 stda %f18, [%fregset + %srcend] ASI_PST8_P 867 ba,a,pt %xcc, 4f 868 cmp %tmp4, -8 869 bg,a,pn %ICC, 4f 870 stda %f20, [%fregset + %srcend] ASI_PST8_P 871 ba,a,pt %xcc, 4f 872 cmp %tmp4, -8 873 bg,a,pn %ICC, 4f 874 stda %f22, [%fregset + %srcend] ASI_PST8_P 875 ba,a,pt %xcc, 4f 876 cmp %tmp4, -8 877 bg,a,pn %ICC, 4f 878 stda %f24, [%fregset + %srcend] ASI_PST8_P 879 ba,a,pt %xcc, 4f 880 cmp %tmp4, -8 881 bg,a,pn %ICC, 4f 882 stda %f26, [%fregset + %srcend] ASI_PST8_P 883 ba,a,pt %xcc, 4f 884 cmp %tmp4, -8 885 bg,a,pn %ICC, 4f 886 stda %f28, [%fregset + %srcend] ASI_PST8_P 887 ba,a,pt %xcc, 4f 888 cmp %tmp4, -8 889 bg,a,pn %ICC, 4f 890 stda %f30, [%fregset + %srcend] ASI_PST8_P 891 4: and %tmp3, 60, %tmp3 892 sub %dst, 64, %dst 893 add %tmp3, 96, %tmp3 894 add %mode, %skind, %mode 895 brz,pn %h, return 896 and %tmp3, 64, %fregset 897 narrow_cont: 898 deccc %h 899 blu,pn %ICC, return 900 sub %mode, %dkind, %mode 901 alignaddr %mode, %g0, %g0 902 and %mode, 63, %mode 903 sub %srcnext, %srcn, %tmp4 904 add %dst, %dkind, %dst 905 sub %w, %rightw, %tmp1 906 add %srcstart, %skind, %srcstart 907 sub %dst, %tmp1, %dst 908 add %rightw, %dkind, %rightw 909 sub %leftw, %dkind, %leftw 910 sub %rightw, 1, %rightw 911 and %leftw, 63, %leftw 912 and %rightw, 63, %rightw 913 add %srcstart, %w, %srcend 914 add %rightw, 1, %rightw 915 add %srcstart, %skind, %srcnext 916 add %srcend, 63, %srcend 917 andn %srcnext, 63, %srcnext 918 andn %srcend, 63, %srcend 919 sub %w, %leftw, %prepw 920 mov %srcnext, %srcn 921 add %srcnext, 64, %tmp2 922 sub %srcnext, 64, %tmp3 923 and %srcstart, 63, %tmp1 924 cmp %skind, 0 925 movg %ICC, %srcend, %tmp3 926 sub %prepw, %rightw, %prepw 927 add %tmp1, %w, %tmp1 928 cmp %tmp2, %srcend 929 mov %prepw, %curw 930 move %ICC, %tmp3, %srcnext 931 mov %h, %srcnotdone 932 cmp %tmp1, 128 933 movg %ICC, 64, %prepw 934 andn %dst, 63, %dst 935 cmp %srcnext, %srcstop 936 move %ICC, 0, %srcnotdone 937 brnz,a,pn %tmp4, roll_narrow 938 xor %fregset, 64, %fregset 939 cmp %tmp1, 64 940 bg,pt %ICC, 5f 941 tst %srcnotdone 942 be,a,pn %ICC, roll_narrow 943 membar SYNC 944 mov %srcnext, %src 945 5: brnz,a,pn %fregset, 6f 946 ldda [%src] ASI_BLK_P, %f32 947 ldda [%src] ASI_BLK_P, %f48 948 6: addcc %src, 64, %src 949 roll_narrow: 950 fnop 951 sll %mode, 4, %tmp2 952 and %mode, 7, %rightw2 953 fnop 954 andn %tmp2, 127, %tmp2 955 add %dst, 64, %tmp4 956 fnop 957 add %tmp2, %fregset, %tmp2 958 addcc %rightw2, %rightw, %rightw2 959 fnop 960 srl %tmp2, 1, %tmp3 961 movrnz %leftw, %tmp4, %dst 962 fnop 963 add %tmp3, (prepr0 - BranchBase), %tmp4 964 cmp %tmp1, 64 965 movleu %icc, %tmp4, %tmp2 966 fnop 967 add %tmp3, (prepn0 - BranchBase), %tmp4 968 cmp %mode, %leftw 969 fnop 970 movgeu %icc, %tmp4, %tmp2 971 jmpl %branchbase + %tmp2, %g0 972 and %tmp3, 32, %tmp3 973 974 #define VISEND(i,tgt,tgtr,fi,fset) \ 975 tgt: \ 976 brnz,pt %curw, 1f; \ 977 cmp %rightw2, (64 - (i&14)*4); \ 978 bgu,pn %icc, tgtr - 8; \ 979 tst %srcnotdone; \ 980 be,a,pn %ICC, tgtr; \ 981 membar SYNC; \ 982 ba,pt %xcc, tgtr - 8; \ 983 mov %srcnext, %src; \ 984 1: mov ((i & 1) ^ 1) * 64, %fregset; \ 985 bleu,pn %icc, rightst; \ 986 faligndata %ftmp1, %ftmp2, %fi; \ 987 brz,a,pn %srcnotdone, 3f; \ 988 membar SYNC; \ 989 ldda [%srcnext] ASI_BLK_P, %fset; \ 990 add %srcnext, 64, %src; \ 991 3: mov (i & 1) * 64, %fregset; 992 993 VISEND(0,vis0e,vis0r,f30,f32) 994 ba,pt %xcc, rightst 995 faligndata %ftmp1, %f48, %f30 996 VISEND(1,vis1e,vis1r,f30,f48) 997 ba,pt %xcc, rightst 998 faligndata %ftmp1, %f32, %f30 999 VISEND(2,vis2e,vis2r,f28,f32) 1000 faligndata %ftmp1, %f48, %f28 1001 ba,pt %xcc, rightst 1002 faligndata %f48, %f50, %f30 1003 VISEND(3,vis3e,vis3r,f28,f48) 1004 faligndata %ftmp1, %f32, %f28 1005 ba,pt %xcc, rightst 1006 faligndata %f32, %f34, %f30 1007 VISEND(4,vis4e,vis4r,f26,f32) 1008 faligndata %ftmp1, %f48, %f26 1009 faligndata %f48, %f50, %f28 1010 ba,pt %xcc, rightst 1011 faligndata %f50, %f52, %f30 1012 VISEND(5,vis5e,vis5r,f26,f48) 1013 faligndata %ftmp1, %f32, %f26 1014 faligndata %f32, %f34, %f28 1015 ba,pt %xcc, rightst 1016 faligndata %f34, %f36, %f30 1017 VISEND(6,vis6e,vis6r,f24,f32) 1018 faligndata %ftmp1, %f48, %f24 1019 faligndata %f48, %f50, %f26 1020 faligndata %f50, %f52, %f28 1021 ba,pt %xcc, rightst 1022 faligndata %f52, %f54, %f30 1023 VISEND(7,vis7e,vis7r,f24,f48) 1024 faligndata %ftmp1, %f32, %f24 1025 faligndata %f32, %f34, %f26 1026 faligndata %f34, %f36, %f28 1027 ba,pt %xcc, rightst 1028 faligndata %f36, %f38, %f30 1029 VISEND(8,vis8e,vis8r,f22,f32) 1030 faligndata %ftmp1, %f48, %f22 1031 faligndata %f48, %f50, %f24 1032 faligndata %f50, %f52, %f26 1033 faligndata %f52, %f54, %f28 1034 ba,pt %xcc, rightst 1035 faligndata %f54, %f56, %f30 1036 VISEND(9,vis9e,vis9r,f22,f48) 1037 faligndata %ftmp1, %f32, %f22 1038 faligndata %f32, %f34, %f24 1039 faligndata %f34, %f36, %f26 1040 faligndata %f36, %f38, %f28 1041 ba,pt %xcc, rightst 1042 faligndata %f38, %f40, %f30 1043 VISEND(10,vis10e,vis10r,f20,f32) 1044 faligndata %ftmp1, %f48, %f20 1045 faligndata %f48, %f50, %f22 1046 faligndata %f50, %f52, %f24 1047 faligndata %f52, %f54, %f26 1048 faligndata %f54, %f56, %f28 1049 ba,pt %xcc, rightst 1050 faligndata %f56, %f58, %f30 1051 VISEND(11,vis11e,vis11r,f20,f48) 1052 faligndata %ftmp1, %f32, %f20 1053 faligndata %f32, %f34, %f22 1054 faligndata %f34, %f36, %f24 1055 faligndata %f36, %f38, %f26 1056 faligndata %f38, %f40, %f28 1057 ba,pt %xcc, rightst 1058 faligndata %f40, %f42, %f30 1059 VISEND(12,vis12e,vis12r,f18,f32) 1060 faligndata %ftmp1, %f48, %f18 1061 faligndata %f48, %f50, %f20 1062 faligndata %f50, %f52, %f22 1063 faligndata %f52, %f54, %f24 1064 faligndata %f54, %f56, %f26 1065 faligndata %f56, %f58, %f28 1066 ba,pt %xcc, rightst 1067 faligndata %f58, %f60, %f30 1068 VISEND(13,vis13e,vis13r,f18,f48) 1069 faligndata %ftmp1, %f32, %f18 1070 faligndata %f32, %f34, %f20 1071 faligndata %f34, %f36, %f22 1072 faligndata %f36, %f38, %f24 1073 faligndata %f38, %f40, %f26 1074 faligndata %f40, %f42, %f28 1075 ba,pt %xcc, rightst 1076 faligndata %f42, %f44, %f30 1077 VISEND(14,vis14e,vis14r,f16,f32) 1078 faligndata %ftmp1, %f48, %f16 1079 faligndata %f48, %f50, %f18 1080 faligndata %f50, %f52, %f20 1081 faligndata %f52, %f54, %f22 1082 faligndata %f54, %f56, %f24 1083 faligndata %f56, %f58, %f26 1084 faligndata %f58, %f60, %f28 1085 ba,pt %xcc, rightst 1086 faligndata %f60, %f62, %f30 1087 VISEND(15,vis15e,vis15r,f16,f48) 1088 faligndata %ftmp1, %f32, %f16 1089 faligndata %f32, %f34, %f18 1090 faligndata %f34, %f36, %f20 1091 faligndata %f36, %f38, %f22 1092 faligndata %f38, %f40, %f24 1093 faligndata %f40, %f42, %f26 1094 faligndata %f42, %f44, %f28 1095 ba,pt %xcc, rightst 1096 faligndata %f44, %f46, %f30 1097 1098 #define PREPEND(tgt,tgtr) \ 1099 tgt: \ 1100 brnz,pt %srcnotdone, tgtr - 8; \ 1101 mov %srcnext, %src; \ 1102 ba,pt %xcc, tgtr; \ 1103 membar SYNC; 1104 1105 .align 16 1106 PREPEND(prep0e,prep0r) 1107 PREPEND(prep1e,prep1r) 1108 PREPEND(prep2e,prep2r) 1109 PREPEND(prep3e,prep3r) 1110 PREPEND(prep4e,prep4r) 1111 PREPEND(prep5e,prep5r) 1112 PREPEND(prep6e,prep6r) 1113 PREPEND(prep7e,prep7r) 1114 PREPEND(prep8e,prep8r) 1115 PREPEND(prep9e,prep9r) 1116 PREPEND(prep10e,prep10r) 1117 PREPEND(prep11e,prep11r) 1118 PREPEND(prep12e,prep12r) 1119 PREPEND(prep13e,prep13r) 1120 PREPEND(prep14e,prep14r) 1121 PREPEND(prep15e,prep15r) 1122 1123 /* The other way is even more complicated, as the hardware prefers 1124 * going from lower addresses up. */ 1125 1126 #define RLOAD(f32,tgt,tgtr) \ 1127 subcc %curw, 64, %curw; \ 1128 bleu,pn %ICC, tgt; \ 1129 fmovd %f32, %ftmp1; \ 1130 ldda [%src] ASI_BLK_P, %f32; \ 1131 sub %src, 64, %src; \ 1132 tgtr: 1133 1134 #if defined(__sparc_v9__) || defined(__sparcv9) || defined(__arch64__) || !defined(SIGNAL_CLOBBERS_OG_REGS) 1135 1136 #define RPREPLOAD(f32,tgt,tgtr) \ 1137 brlez,pn %prepw, tgt; \ 1138 fmovd %f32, %ftmp1; \ 1139 ldda [%src] ASI_BLK_P, %f32; \ 1140 sub %src, 64, %src; \ 1141 tgtr: 1142 1143 #else 1144 1145 #define RPREPLOAD(f32,tgt,tgtr) \ 1146 tst %prepw; \ 1147 ble,pn %ICC, tgt; \ 1148 fmovd %f32, %ftmp1; \ 1149 ldda [%src] ASI_BLK_P, %f32; \ 1150 sub %src, 64, %src; \ 1151 tgtr: 1152 1153 #endif 1154 1155 .globl VISmoveImageRL 1156 .align 32 1157 VISmoveImageRL: 1158 #ifdef __arch64__ 1159 save %sp, -192, %sp ! Group 0 1160 #else 1161 save %sp, -96, %sp ! Group 0 1162 #endif 1163 0: rd %pc, %tmp3 ! Group 1 1164 and %dst, 63, %leftw ! Group 7 1165 mov 64, %tmp1 1166 add %src, %w, %src ! Group 8 1167 add %dst, %w, %dst 1168 sub %src, %dst, %mode ! Group 9 1169 brz,pn %h, rreturn 1170 sub %dst, 1, %rightw ! Group 10 1171 mov %src, %srcstart 1172 dec %src ! Group 11 1173 cmp %w, 128 1174 blu,pn %ICC, rprepare_narrow 1175 and %mode, 63, %mode ! Group 12 1176 andn %src, 63, %src 1177 ldda [%src] ASI_BLK_P, %f32 ! Group 13 1178 sub %src, 64, %src ! Group 14 1179 clr %narrow 1180 ldda [%src] ASI_BLK_P, %f48 ! Group 15 1181 sub %tmp1, %leftw, %leftw ! Group 16 1182 and %rightw, 63, %rightw 1183 dec %dst ! Group 17 1184 add %rightw, 1, %rightw 1185 alignaddr %mode, %g0, %g0 ! Group 18 1186 andn %dst, 63, %dst ! Group 19 1187 clr %fregset 1188 sub %src, 64, %src ! Group 20 1189 add %tmp3, (BranchBaseR - 0b), %branchbase 1190 mov 64, %prepw ! Group 21 1191 ba,pt %xcc, rroll_wide 1192 sub %h, 1, %srcnotdone 1193 rprepare_narrow: 1194 #if defined(__sparc_v9__) || defined(__sparcv9) || defined(__arch64__) 1195 brlez,pn %w, rreturn 1196 #else 1197 tst %w 1198 ble,pn %icc, rreturn 1199 #endif 1200 andn %src, 63, %src ! Group 12 1201 sub %tmp1, %leftw, %leftw 1202 ldda [%src] ASI_BLK_P, %f32 ! Group 13 1203 and %rightw, 63, %rightw ! Group 14 1204 dec %dst 1205 add %rightw, 1, %rightw ! Group 15 1206 andn %dst, 63, %dst 1207 sub %w, %leftw, %tmp2 ! Group 16 1208 sub %srcstart, 1, %tmp1 1209 subcc %tmp2, %rightw, %curw ! Group 17 1210 and %tmp1, 63, %tmp1 1211 mov %curw, %prepw ! Group 18 1212 sub %tmp1, %w, %tmp1 1213 bg,pt %ICC, 1f 1214 sub %src, 64, %src ! Group 19 1215 cmp %tmp1, -65 1216 movl %ICC, 64, %prepw ! Group 20 1217 1: add %srcstart, %skind, %srcnext 1218 sub %h, 1, %srcnotdone ! Group 21 1219 sub %srcstart, %w, %tmp4 1220 sub %srcnext, 1, %srcnext ! Group 22 1221 andn %tmp4, 63, %srcend 1222 andn %srcnext, 63, %srcnext ! Group 23 1223 cmp %skind, 0 1224 add %w, 64, %tmp2 ! Group 24 1225 mov %srcnext, %srcn 1226 bl,pn %ICC, 1f 1227 clr %srcstop ! Group 25 1228 cmp %skind, %tmp2 1229 bgeu,pt %ICC, 3f 1230 add %srcnext, 64, %fregset 1231 SMUL %skind, %srcnotdone, %srcstop 1232 ba,pt %xcc, 2f 1233 add %srcstart, 63, %tmp4 1234 1: addcc %tmp2, %skind, %g0 1235 ble,pt %ICC, 3f 1236 sub %srcnext, 64, %fregset 1237 SMUL %skind, %srcnotdone, %srcstop 1238 sub %tmp4, 64, %tmp4 1239 2: add %srcstop, %tmp4, %srcstop 1240 3: cmp %srcnext, %srcend 1241 andn %srcstop, 63, %srcstop 1242 move %ICC, %fregset, %srcnext 1243 cmp %srcnext, %srcstop 1244 clr %fregset 1245 move %ICC, 0, %srcnotdone 1246 alignaddr %mode, %g0, %g0 1247 add %tmp3, (BranchBaseR - 0b), %branchbase 1248 mov 1, %narrow 1249 cmp %tmp1, -1 1250 bge,pn %ICC, 1f 1251 dec %h 1252 ldda [%src] ASI_BLK_P, %f48 1253 ba,pt %xcc, rroll_narrow 1254 subcc %src, 64, %src 1255 1: brz,a,pn %srcnotdone, rroll_narrow 1256 membar #Sync 1257 ldda [%srcnext] ASI_BLK_P, %f48 1258 ba,pt %xcc, rroll_narrow 1259 subcc %srcnext, 64, %src 1260 1261 .align 32 1262 rrepr0: ba,pt %xcc, narrowstr 1263 faligndata %ftmp1, %f32, %f30 1264 nop 1265 nop 1266 1: ba,pt %xcc, narrowstr 1267 faligndata %ftmp1, %f32, %f16 1268 .align 32 1269 rrepr1: ba,pt %xcc, narrowstr 1270 faligndata %ftmp1, %f48, %f30 1271 nop 1272 nop 1273 2: ba,pt %xcc, narrowstr 1274 faligndata %ftmp1, %f48, %f16 1275 .align 32 1276 rrepr2: faligndata %f32, %f34, %f30 1277 ba,pt %xcc, narrowstr 1278 faligndata %ftmp1, %f32, %f28 1279 .align 32 1280 rrepr3: faligndata %f48, %f50, %f30 1281 ba,pt %xcc, narrowstr 1282 faligndata %ftmp1, %f48, %f28 1283 .align 32 1284 rrepr4: faligndata %f34, %f36, %f30 1285 faligndata %f32, %f34, %f28 1286 ba,pt %xcc, narrowstr 1287 faligndata %ftmp1, %f32, %f26 1288 .align 32 1289 rrepr5: faligndata %f50, %f52, %f30 1290 faligndata %f48, %f50, %f28 1291 ba,pt %xcc, narrowstr 1292 faligndata %ftmp1, %f48, %f26 1293 .align 32 1294 rrepr6: faligndata %f36, %f38, %f30 1295 faligndata %f34, %f36, %f28 1296 faligndata %f32, %f34, %f26 1297 ba,pt %xcc, narrowstr 1298 faligndata %ftmp1, %f32, %f24 1299 .align 32 1300 rrepr7: faligndata %f52, %f54, %f30 1301 faligndata %f50, %f52, %f28 1302 faligndata %f48, %f50, %f26 1303 ba,pt %xcc, narrowstr 1304 faligndata %ftmp1, %f48, %f24 1305 .align 32 1306 rrepr8: faligndata %f38, %f40, %f30 1307 faligndata %f36, %f38, %f28 1308 faligndata %f34, %f36, %f26 1309 faligndata %f32, %f34, %f24 1310 ba,pt %xcc, narrowstr 1311 faligndata %ftmp1, %f32, %f22 1312 .align 32 1313 rrepr9: faligndata %f54, %f56, %f30 1314 faligndata %f52, %f54, %f28 1315 faligndata %f50, %f52, %f26 1316 faligndata %f48, %f50, %f24 1317 ba,pt %xcc, narrowstr 1318 faligndata %ftmp1, %f48, %f22 1319 .align 32 1320 rrepr10:faligndata %f40, %f42, %f30 1321 faligndata %f38, %f40, %f28 1322 faligndata %f36, %f38, %f26 1323 faligndata %f34, %f36, %f24 1324 faligndata %f32, %f34, %f22 1325 ba,pt %xcc, narrowstr 1326 faligndata %ftmp1, %f32, %f20 1327 .align 32 1328 rrepr11:faligndata %f56, %f58, %f30 1329 faligndata %f54, %f56, %f28 1330 faligndata %f52, %f54, %f26 1331 faligndata %f50, %f52, %f24 1332 faligndata %f48, %f50, %f22 1333 ba,pt %xcc, narrowstr 1334 faligndata %ftmp1, %f48, %f20 1335 .align 32 1336 rrepr12:faligndata %f42, %f44, %f30 1337 faligndata %f40, %f42, %f28 1338 faligndata %f38, %f40, %f26 1339 faligndata %f36, %f38, %f24 1340 faligndata %f34, %f36, %f22 1341 faligndata %f32, %f34, %f20 1342 ba,pt %xcc, narrowstr 1343 faligndata %ftmp1, %f32, %f18 1344 .align 32 1345 rrepr13:faligndata %f58, %f60, %f30 1346 faligndata %f56, %f58, %f28 1347 faligndata %f54, %f56, %f26 1348 faligndata %f52, %f54, %f24 1349 faligndata %f50, %f52, %f22 1350 faligndata %f48, %f50, %f20 1351 ba,pt %xcc, narrowstr 1352 faligndata %ftmp1, %f48, %f18 1353 .align 32 1354 rrepr14:faligndata %f44, %f46, %f30 1355 faligndata %f42, %f44, %f28 1356 faligndata %f40, %f42, %f26 1357 faligndata %f38, %f40, %f24 1358 faligndata %f36, %f38, %f22 1359 faligndata %f34, %f36, %f20 1360 ba,pt %xcc, 1b 1361 faligndata %f32, %f34, %f18 1362 .align 32 1363 rrepr15:faligndata %f60, %f62, %f30 1364 faligndata %f58, %f60, %f28 1365 faligndata %f56, %f58, %f26 1366 faligndata %f54, %f56, %f24 1367 faligndata %f52, %f54, %f22 1368 faligndata %f50, %f52, %f20 1369 ba,pt %xcc, 2b 1370 faligndata %f48, %f50, %f18 1371 1372 .align 32 1373 rrepn0: faligndata %f46, %ftmp1, %f30 1374 faligndata %f44, %f46, %f28 1375 faligndata %f42, %f44, %f26 1376 faligndata %f40, %f42, %f24 1377 faligndata %f38, %f40, %f22 1378 faligndata %f36, %f38, %f20 1379 ba,pt %xcc, 1f 1380 faligndata %f34, %f36, %f18 1381 .align 32 1382 rrepn1: faligndata %f62, %ftmp1, %f30 1383 faligndata %f60, %f62, %f28 1384 faligndata %f58, %f60, %f26 1385 faligndata %f56, %f58, %f24 1386 faligndata %f54, %f56, %f22 1387 faligndata %f52, %f54, %f20 1388 ba,pt %xcc, 2f 1389 faligndata %f50, %f52, %f18 1390 .align 32 1391 rrepn2: faligndata %f46, %ftmp1, %f28 1392 faligndata %f44, %f46, %f26 1393 faligndata %f42, %f44, %f24 1394 faligndata %f40, %f42, %f22 1395 faligndata %f38, %f40, %f20 1396 faligndata %f36, %f38, %f18 1397 ba,pt %xcc, 3f 1398 faligndata %f34, %f36, %f16 1399 .align 32 1400 rrepn3: faligndata %f62, %ftmp1, %f28 1401 faligndata %f60, %f62, %f26 1402 faligndata %f58, %f60, %f24 1403 faligndata %f56, %f58, %f22 1404 faligndata %f54, %f56, %f20 1405 faligndata %f52, %f54, %f18 1406 ba,pt %xcc, 4f 1407 faligndata %f50, %f52, %f16 1408 .align 32 1409 rrepn4: faligndata %f46, %ftmp1, %f26 1410 faligndata %f44, %f46, %f24 1411 faligndata %f42, %f44, %f22 1412 faligndata %f40, %f42, %f20 1413 faligndata %f38, %f40, %f18 1414 faligndata %f36, %f38, %f16 1415 ba,pt %xcc, rightstr 1416 mov (rvis4 - BranchBaseR), %tmp3 1417 .align 32 1418 rrepn5: faligndata %f62, %ftmp1, %f26 1419 faligndata %f60, %f62, %f24 1420 faligndata %f58, %f60, %f22 1421 faligndata %f56, %f58, %f20 1422 faligndata %f54, %f56, %f18 1423 faligndata %f52, %f54, %f16 1424 ba,pt %xcc, rightstr 1425 mov (rvis5 - BranchBaseR), %tmp3 1426 .align 32 1427 rrepn6: faligndata %f46, %ftmp1, %f24 1428 faligndata %f44, %f46, %f22 1429 faligndata %f42, %f44, %f20 1430 faligndata %f40, %f42, %f18 1431 faligndata %f38, %f40, %f16 1432 ba,pt %xcc, rightstr 1433 mov (rvis6 - BranchBaseR), %tmp3 1434 .align 32 1435 rrepn7: faligndata %f62, %ftmp1, %f24 1436 faligndata %f60, %f62, %f22 1437 faligndata %f58, %f60, %f20 1438 faligndata %f56, %f58, %f18 1439 faligndata %f54, %f56, %f16 1440 ba,pt %xcc, rightstr 1441 mov (rvis7 - BranchBaseR), %tmp3 1442 .align 32 1443 rrepn8: faligndata %f46, %ftmp1, %f22 1444 faligndata %f44, %f46, %f20 1445 faligndata %f42, %f44, %f18 1446 faligndata %f40, %f42, %f16 1447 ba,pt %xcc, rightstr 1448 mov (rvis8 - BranchBaseR), %tmp3 1449 .align 32 1450 rrepn9: faligndata %f62, %ftmp1, %f22 1451 faligndata %f60, %f62, %f20 1452 faligndata %f58, %f60, %f18 1453 faligndata %f56, %f58, %f16 1454 ba,pt %xcc, rightstr 1455 mov (rvis9 - BranchBaseR), %tmp3 1456 .align 32 1457 rrepn10:faligndata %f46, %ftmp1, %f20 1458 faligndata %f44, %f46, %f18 1459 faligndata %f42, %f44, %f16 1460 ba,pt %xcc, rightstr 1461 mov (rvis10 - BranchBaseR), %tmp3 1462 .align 32 1463 rrepn11:faligndata %f62, %ftmp1, %f20 1464 faligndata %f60, %f62, %f18 1465 faligndata %f58, %f60, %f16 1466 ba,pt %xcc, rightstr 1467 mov (rvis11 - BranchBaseR), %tmp3 1468 .align 32 1469 rrepn12:faligndata %f46, %ftmp1, %f18 1470 faligndata %f44, %f46, %f16 1471 ba,pt %xcc, rightstr 1472 mov (rvis12 - BranchBaseR), %tmp3 1473 nop 1474 nop 1475 3: ba,pt %xcc, rightstr 1476 mov (rvis2 - BranchBaseR), %tmp3 1477 .align 32 1478 rrepn13:faligndata %f62, %ftmp1, %f18 1479 faligndata %f60, %f62, %f16 1480 ba,pt %xcc, rightstr 1481 mov (rvis13 - BranchBaseR), %tmp3 1482 nop 1483 nop 1484 4: ba,pt %xcc, rightstr 1485 mov (rvis3 - BranchBaseR), %tmp3 1486 .align 32 1487 rrepn14:faligndata %f46, %ftmp1, %f16 1488 ba,pt %xcc, rightstr 1489 mov (rvis14 - BranchBaseR), %tmp3 1490 nop 1491 1: faligndata %f32, %f34, %f16 1492 ba,pt %xcc, rightstr 1493 mov (rvis0 - BranchBaseR), %tmp3 1494 .align 32 1495 rrepn15:faligndata %f62, %ftmp1, %f16 1496 ba,pt %xcc, rightstr 1497 mov (rvis15 - BranchBaseR), %tmp3 1498 nop 1499 2: faligndata %f48, %f50, %f16 1500 ba,pt %xcc, rightstr 1501 mov (rvis1 - BranchBaseR), %tmp3 1502 1503 .align 64 1504 BranchBaseR: 1505 rrepl0: RPREPLOAD(f32,rrep0e,rrep0r) 1506 fnop 1507 faligndata %f48, %f50, %f16 1508 faligndata %f50, %f52, %f18 1509 faligndata %f52, %f54, %f20 1510 faligndata %f54, %f56, %f22 1511 faligndata %f56, %f58, %f24 1512 faligndata %f58, %f60, %f26 1513 faligndata %f60, %f62, %f28 1514 faligndata %f62, %ftmp1, %f30 1515 ba,pt %xcc, rightstr 1516 mov (rvis1 - BranchBaseR), %tmp3 1517 nop 1518 nop 1519 .align 32 1520 rrepl1: RPREPLOAD(f48,rrep1e,rrep1r) 1521 fnop 1522 faligndata %f32, %f34, %f16 1523 faligndata %f34, %f36, %f18 1524 faligndata %f36, %f38, %f20 1525 faligndata %f38, %f40, %f22 1526 faligndata %f40, %f42, %f24 1527 faligndata %f42, %f44, %f26 1528 faligndata %f44, %f46, %f28 1529 faligndata %f46, %ftmp1, %f30 1530 ba,pt %xcc, rightstr 1531 mov (rvis0 - BranchBaseR), %tmp3 1532 nop 1533 nop 1534 .align 32 1535 rrepl2: faligndata %f32, %f34, %f30 1536 RPREPLOAD(f32,rrep2e,rrep2r) 1537 fnop 1538 fnop 1539 faligndata %f50, %f52, %f16 1540 faligndata %f52, %f54, %f18 1541 faligndata %f54, %f56, %f20 1542 faligndata %f56, %f58, %f22 1543 faligndata %f58, %f60, %f24 1544 faligndata %f60, %f62, %f26 1545 faligndata %f62, %ftmp1, %f28 1546 ba,pt %xcc, rightstr 1547 mov (rvis3 - BranchBaseR), %tmp3 1548 nop 1549 .align 32 1550 rrepl3: faligndata %f48, %f50, %f30 1551 RPREPLOAD(f48,rrep3e,rrep3r) 1552 fnop 1553 fnop 1554 faligndata %f34, %f36, %f16 1555 faligndata %f36, %f38, %f18 1556 faligndata %f38, %f40, %f20 1557 faligndata %f40, %f42, %f22 1558 faligndata %f42, %f44, %f24 1559 faligndata %f44, %f46, %f26 1560 faligndata %f46, %ftmp1, %f28 1561 ba,pt %xcc, rightstr 1562 mov (rvis2 - BranchBaseR), %tmp3 1563 nop 1564 .align 32 1565 rrepl4: faligndata %f32, %f34, %f28 1566 faligndata %f34, %f36, %f30 1567 RPREPLOAD(f32,rrep4e,rrep4r) 1568 fnop 1569 fnop 1570 fnop 1571 faligndata %f52, %f54, %f16 1572 faligndata %f54, %f56, %f18 1573 faligndata %f56, %f58, %f20 1574 faligndata %f58, %f60, %f22 1575 faligndata %f60, %f62, %f24 1576 faligndata %f62, %ftmp1, %f26 1577 ba,pt %xcc, rightstr 1578 mov (rvis5 - BranchBaseR), %tmp3 1579 .align 32 1580 rrepl5: faligndata %f48, %f50, %f28 1581 faligndata %f50, %f52, %f30 1582 RPREPLOAD(f48,rrep5e,rrep5r) 1583 fnop 1584 fnop 1585 fnop 1586 faligndata %f36, %f38, %f16 1587 faligndata %f38, %f40, %f18 1588 faligndata %f40, %f42, %f20 1589 faligndata %f42, %f44, %f22 1590 faligndata %f44, %f46, %f24 1591 faligndata %f46, %ftmp1, %f26 1592 ba,pt %xcc, rightstr 1593 mov (rvis4 - BranchBaseR), %tmp3 1594 .align 32 1595 rrepl6: faligndata %f32, %f34, %f26 1596 faligndata %f34, %f36, %f28 1597 faligndata %f36, %f38, %f30 1598 RPREPLOAD(f32,rrep6e,rrep6r) 1599 fnop 1600 fnop 1601 fnop 1602 fnop 1603 faligndata %f54, %f56, %f16 1604 faligndata %f56, %f58, %f18 1605 faligndata %f58, %f60, %f20 1606 faligndata %f60, %f62, %f22 1607 faligndata %f62, %ftmp1, %f24 1608 ba,pt %xcc, rightstr 1609 mov (rvis7 - BranchBaseR), %tmp3 1610 .align 32 1611 rrepl7: faligndata %f48, %f50, %f26 1612 faligndata %f50, %f52, %f28 1613 faligndata %f52, %f54, %f30 1614 RPREPLOAD(f48,rrep7e,rrep7r) 1615 fnop 1616 fnop 1617 fnop 1618 fnop 1619 faligndata %f38, %f40, %f16 1620 faligndata %f40, %f42, %f18 1621 faligndata %f42, %f44, %f20 1622 faligndata %f44, %f46, %f22 1623 faligndata %f46, %ftmp1, %f24 1624 ba,pt %xcc, rightstr 1625 mov (rvis6 - BranchBaseR), %tmp3 1626 .align 32 1627 rrepl8: faligndata %f32, %f34, %f24 1628 faligndata %f34, %f36, %f26 1629 faligndata %f36, %f38, %f28 1630 faligndata %f38, %f40, %f30 1631 RPREPLOAD(f32,rrep8e,rrep8r) 1632 fnop 1633 fnop 1634 fnop 1635 fnop 1636 fnop 1637 faligndata %f56, %f58, %f16 1638 faligndata %f58, %f60, %f18 1639 faligndata %f60, %f62, %f20 1640 faligndata %f62, %ftmp1, %f22 1641 ba,pt %xcc, rightstr 1642 mov (rvis9 - BranchBaseR), %tmp3 1643 .align 32 1644 rrepl9: faligndata %f48, %f50, %f24 1645 faligndata %f50, %f52, %f26 1646 faligndata %f52, %f54, %f28 1647 faligndata %f54, %f56, %f30 1648 RPREPLOAD(f48,rrep9e,rrep9r) 1649 fnop 1650 fnop 1651 fnop 1652 fnop 1653 fnop 1654 faligndata %f40, %f42, %f16 1655 faligndata %f42, %f44, %f18 1656 faligndata %f44, %f46, %f20 1657 faligndata %f46, %ftmp1, %f22 1658 ba,pt %xcc, rightstr 1659 mov (rvis8 - BranchBaseR), %tmp3 1660 .align 32 1661 rrepl10:faligndata %f32, %f34, %f22 1662 faligndata %f34, %f36, %f24 1663 faligndata %f36, %f38, %f26 1664 faligndata %f38, %f40, %f28 1665 faligndata %f40, %f42, %f30 1666 RPREPLOAD(f32,rrep10e,rrep10r) 1667 fnop 1668 fnop 1669 fnop 1670 fnop 1671 fnop 1672 fnop 1673 faligndata %f58, %f60, %f16 1674 faligndata %f60, %f62, %f18 1675 faligndata %f62, %ftmp1, %f20 1676 ba,pt %xcc, rightstr 1677 mov (rvis11 - BranchBaseR), %tmp3 1678 .align 32 1679 rrepl11:faligndata %f48, %f50, %f22 1680 faligndata %f50, %f52, %f24 1681 faligndata %f52, %f54, %f26 1682 faligndata %f54, %f56, %f28 1683 faligndata %f56, %f58, %f30 1684 RPREPLOAD(f48,rrep11e,rrep11r) 1685 fnop 1686 fnop 1687 fnop 1688 fnop 1689 fnop 1690 fnop 1691 faligndata %f42, %f44, %f16 1692 faligndata %f44, %f46, %f18 1693 faligndata %f46, %ftmp1, %f20 1694 ba,pt %xcc, rightstr 1695 mov (rvis10 - BranchBaseR), %tmp3 1696 .align 32 1697 rrepl12:faligndata %f32, %f34, %f20 1698 faligndata %f34, %f36, %f22 1699 faligndata %f36, %f38, %f24 1700 faligndata %f38, %f40, %f26 1701 faligndata %f40, %f42, %f28 1702 faligndata %f42, %f44, %f30 1703 RPREPLOAD(f32,rrep12e,rrep12r) 1704 fnop 1705 fnop 1706 fnop 1707 fnop 1708 fnop 1709 fnop 1710 fnop 1711 faligndata %f60, %f62, %f16 1712 faligndata %f62, %ftmp1, %f18 1713 ba,pt %xcc, rightstr 1714 mov (rvis13 - BranchBaseR), %tmp3 1715 .align 32 1716 rrepl13:faligndata %f48, %f50, %f20 1717 faligndata %f50, %f52, %f22 1718 faligndata %f52, %f54, %f24 1719 faligndata %f54, %f56, %f26 1720 faligndata %f56, %f58, %f28 1721 faligndata %f58, %f60, %f30 1722 RPREPLOAD(f48,rrep13e,rrep13r) 1723 fnop 1724 fnop 1725 fnop 1726 fnop 1727 fnop 1728 fnop 1729 fnop 1730 faligndata %f44, %f46, %f16 1731 faligndata %f46, %ftmp1, %f18 1732 ba,pt %xcc, rightstr 1733 mov (rvis12 - BranchBaseR), %tmp3 1734 .align 32 1735 rrepl14:faligndata %f32, %f34, %f18 1736 faligndata %f34, %f36, %f20 1737 faligndata %f36, %f38, %f22 1738 faligndata %f38, %f40, %f24 1739 faligndata %f40, %f42, %f26 1740 faligndata %f42, %f44, %f28 1741 faligndata %f44, %f46, %f30 1742 RPREPLOAD(f32,rrep14e,rrep14r) 1743 fnop 1744 fnop 1745 fnop 1746 fnop 1747 fnop 1748 fnop 1749 fnop 1750 faligndata %f62, %ftmp1, %f16 1751 ba,pt %xcc, rightstr 1752 mov (rvis15 - BranchBaseR), %tmp3 1753 .align 32 1754 rrepl15:faligndata %f48, %f50, %f18 1755 faligndata %f50, %f52, %f20 1756 faligndata %f52, %f54, %f22 1757 faligndata %f54, %f56, %f24 1758 faligndata %f56, %f58, %f26 1759 faligndata %f58, %f60, %f28 1760 faligndata %f60, %f62, %f30 1761 RPREPLOAD(f48,rrep15e,rrep15r) 1762 fnop 1763 fnop 1764 fnop 1765 fnop 1766 fnop 1767 fnop 1768 fnop 1769 faligndata %f46, %ftmp1, %f16 1770 ba,pt %xcc, rightstr 1771 mov (rvis14 - BranchBaseR), %tmp3 1772 1773 .align 64 1774 rvis0: nop 1775 RLOAD(f32,rvis0e,rvis0r) 1776 fnop 1777 faligndata %f48, %f50, %f16 1778 faligndata %f50, %f52, %f18 1779 faligndata %f52, %f54, %f20 1780 faligndata %f54, %f56, %f22 1781 faligndata %f56, %f58, %f24 1782 faligndata %f58, %f60, %f26 1783 faligndata %f60, %f62, %f28 1784 faligndata %f62, %ftmp1, %f30 1785 STORE 1786 sub %dst, 64, %dst 1787 rvis1: RLOAD(f48,rvis1e,rvis1r) 1788 fnop 1789 faligndata %f32, %f34, %f16 1790 faligndata %f34, %f36, %f18 1791 faligndata %f36, %f38, %f20 1792 faligndata %f38, %f40, %f22 1793 faligndata %f40, %f42, %f24 1794 faligndata %f42, %f44, %f26 1795 faligndata %f44, %f46, %f28 1796 faligndata %f46, %ftmp1, %f30 1797 STORE 1798 ba,pt %xcc, rvis0+0x04 1799 sub %dst, 64, %dst 1800 .align 64 1801 rvis2: faligndata %f32, %f34, %ftmp8 1802 RLOAD(f32,rvis2e,rvis2r) 1803 fnop 1804 fnop 1805 faligndata %f50, %f52, %f16 1806 faligndata %f52, %f54, %f18 1807 faligndata %f54, %f56, %f20 1808 faligndata %f56, %f58, %f22 1809 faligndata %f58, %f60, %f24 1810 faligndata %f60, %f62, %f26 1811 faligndata %f62, %ftmp1, %f28 1812 fmovd %ftmp8, %f30 1813 STORE 1814 sub %dst, 64, %dst 1815 rvis3: faligndata %f48, %f50, %ftmp8 1816 RLOAD(f48,rvis3e,rvis3r) 1817 fnop 1818 fnop 1819 faligndata %f34, %f36, %f16 1820 faligndata %f36, %f38, %f18 1821 faligndata %f38, %f40, %f20 1822 faligndata %f40, %f42, %f22 1823 faligndata %f42, %f44, %f24 1824 faligndata %f44, %f46, %f26 1825 faligndata %f46, %ftmp1, %f28 1826 fmovd %ftmp8, %f30 1827 STORE 1828 ba,pt %xcc, rvis2 1829 sub %dst, 64, %dst 1830 .align 64 1831 rvis4: faligndata %f32, %f34, %ftmp7 1832 faligndata %f34, %f36, %ftmp8 1833 RLOAD(f32,rvis4e,rvis4r) 1834 fnop 1835 fnop 1836 fnop 1837 faligndata %f52, %f54, %f16 1838 faligndata %f54, %f56, %f18 1839 faligndata %f56, %f58, %f20 1840 faligndata %f58, %f60, %f22 1841 faligndata %f60, %f62, %f24 1842 faligndata %f62, %ftmp1, %f26 1843 fmovd %ftmp7, %f28 1844 fmovd %ftmp8, %f30 1845 STORE 1846 sub %dst, 64, %dst 1847 rvis5: faligndata %f48, %f50, %ftmp7 1848 faligndata %f50, %f52, %ftmp8 1849 RLOAD(f48,rvis5e,rvis5r) 1850 fnop 1851 fnop 1852 fnop 1853 faligndata %f36, %f38, %f16 1854 faligndata %f38, %f40, %f18 1855 faligndata %f40, %f42, %f20 1856 faligndata %f42, %f44, %f22 1857 faligndata %f44, %f46, %f24 1858 faligndata %f46, %ftmp1, %f26 1859 fmovd %ftmp7, %f28 1860 fmovd %ftmp8, %f30 1861 STORE 1862 ba,pt %xcc, rvis4 1863 sub %dst, 64, %dst 1864 .align 64 1865 rvis6: faligndata %f32, %f34, %ftmp6 1866 faligndata %f34, %f36, %ftmp7 1867 faligndata %f36, %f38, %ftmp8 1868 RLOAD(f32,rvis6e,rvis6r) 1869 fnop 1870 fmovd %ftmp6, %f26 1871 fmovd %ftmp7, %f28 1872 fmovd %ftmp8, %f30 1873 faligndata %f54, %f56, %f16 1874 faligndata %f56, %f58, %f18 1875 faligndata %f58, %f60, %f20 1876 faligndata %f60, %f62, %f22 1877 faligndata %f62, %ftmp1, %f24 1878 STORE 1879 sub %dst, 64, %dst 1880 rvis7: faligndata %f48, %f50, %ftmp6 1881 faligndata %f50, %f52, %ftmp7 1882 faligndata %f52, %f54, %ftmp8 1883 RLOAD(f48,rvis7e,rvis7r) 1884 fnop 1885 fmovd %ftmp6, %f26 1886 fmovd %ftmp7, %f28 1887 fmovd %ftmp8, %f30 1888 faligndata %f38, %f40, %f16 1889 faligndata %f40, %f42, %f18 1890 faligndata %f42, %f44, %f20 1891 faligndata %f44, %f46, %f22 1892 faligndata %f46, %ftmp1, %f24 1893 STORE 1894 ba,pt %xcc, rvis6 1895 sub %dst, 64, %dst 1896 .align 64 1897 rvis8: faligndata %f32, %f34, %ftmp5 1898 faligndata %f34, %f36, %ftmp6 1899 faligndata %f36, %f38, %ftmp7 1900 faligndata %f38, %f40, %ftmp8 1901 RLOAD(f32,rvis8e,rvis8r) 1902 fnop 1903 fmovd %ftmp5, %f24 1904 fmovd %ftmp6, %f26 1905 fmovd %ftmp7, %f28 1906 fmovd %ftmp8, %f30 1907 faligndata %f56, %f58, %f16 1908 faligndata %f58, %f60, %f18 1909 faligndata %f60, %f62, %f20 1910 faligndata %f62, %ftmp1, %f22 1911 STORE 1912 sub %dst, 64, %dst 1913 rvis9: faligndata %f48, %f50, %ftmp5 1914 faligndata %f50, %f52, %ftmp6 1915 faligndata %f52, %f54, %ftmp7 1916 faligndata %f54, %f56, %ftmp8 1917 RLOAD(f48,rvis9e,rvis9r) 1918 fnop 1919 fmovd %ftmp5, %f24 1920 fmovd %ftmp6, %f26 1921 fmovd %ftmp7, %f28 1922 fmovd %ftmp8, %f30 1923 faligndata %f40, %f42, %f16 1924 faligndata %f42, %f44, %f18 1925 faligndata %f44, %f46, %f20 1926 faligndata %f46, %ftmp1, %f22 1927 STORE 1928 ba,pt %xcc, rvis8 1929 sub %dst, 64, %dst 1930 .align 64 1931 rvis10: faligndata %f32, %f34, %ftmp4 1932 faligndata %f34, %f36, %ftmp5 1933 faligndata %f36, %f38, %ftmp6 1934 faligndata %f38, %f40, %ftmp7 1935 faligndata %f40, %f42, %ftmp8 1936 RLOAD(f32,rvis10e,rvis10r) 1937 fnop 1938 fmovd %ftmp4, %f22 1939 fmovd %ftmp5, %f24 1940 fmovd %ftmp6, %f26 1941 fmovd %ftmp7, %f28 1942 fmovd %ftmp8, %f30 1943 faligndata %f58, %f60, %f16 1944 faligndata %f60, %f62, %f18 1945 faligndata %f62, %ftmp1, %f20 1946 STORE 1947 sub %dst, 64, %dst 1948 rvis11: faligndata %f48, %f50, %ftmp4 1949 faligndata %f50, %f52, %ftmp5 1950 faligndata %f52, %f54, %ftmp6 1951 faligndata %f54, %f56, %ftmp7 1952 faligndata %f56, %f58, %ftmp8 1953 RLOAD(f48,rvis11e,rvis11r) 1954 fnop 1955 fmovd %ftmp4, %f22 1956 fmovd %ftmp5, %f24 1957 fmovd %ftmp6, %f26 1958 fmovd %ftmp7, %f28 1959 fmovd %ftmp8, %f30 1960 faligndata %f42, %f44, %f16 1961 faligndata %f44, %f46, %f18 1962 faligndata %f46, %ftmp1, %f20 1963 STORE 1964 ba,pt %xcc, rvis10 1965 sub %dst, 64, %dst 1966 .align 64 1967 rvis12: faligndata %f32, %f34, %ftmp3 1968 faligndata %f34, %f36, %ftmp4 1969 faligndata %f36, %f38, %ftmp5 1970 faligndata %f38, %f40, %ftmp6 1971 faligndata %f40, %f42, %ftmp7 1972 faligndata %f42, %f44, %ftmp8 1973 RLOAD(f32,rvis12e,rvis12r) 1974 fnop 1975 fmovd %ftmp3, %f20 1976 fmovd %ftmp4, %f22 1977 fmovd %ftmp5, %f24 1978 fmovd %ftmp6, %f26 1979 fmovd %ftmp7, %f28 1980 fmovd %ftmp8, %f30 1981 faligndata %f60, %f62, %f16 1982 faligndata %f62, %ftmp1, %f18 1983 STORE 1984 sub %dst, 64, %dst 1985 rvis13: faligndata %f48, %f50, %ftmp3 1986 faligndata %f50, %f52, %ftmp4 1987 faligndata %f52, %f54, %ftmp5 1988 faligndata %f54, %f56, %ftmp6 1989 faligndata %f56, %f58, %ftmp7 1990 faligndata %f58, %f60, %ftmp8 1991 RLOAD(f48,rvis13e,rvis13r) 1992 fnop 1993 fmovd %ftmp3, %f20 1994 fmovd %ftmp4, %f22 1995 fmovd %ftmp5, %f24 1996 fmovd %ftmp6, %f26 1997 fmovd %ftmp7, %f28 1998 fmovd %ftmp8, %f30 1999 faligndata %f44, %f46, %f16 2000 faligndata %f46, %ftmp1, %f18 2001 STORE 2002 ba,pt %xcc, rvis12 2003 sub %dst, 64, %dst 2004 .align 64 2005 rvis14: fnop 2006 faligndata %f32, %f34, %f18 2007 faligndata %f34, %f36, %f20 2008 faligndata %f36, %f38, %f22 2009 faligndata %f38, %f40, %f24 2010 faligndata %f40, %f42, %f26 2011 faligndata %f42, %f44, %f28 2012 faligndata %f44, %f46, %f30 2013 RLOAD(f32,rvis14e,rvis14r) 2014 fnop 2015 fnop 2016 fnop 2017 fnop 2018 fnop 2019 fnop 2020 fnop 2021 faligndata %f62, %ftmp1, %f16 2022 STORE 2023 sub %dst, 64, %dst 2024 rvis15: fnop 2025 faligndata %f48, %f50, %f18 2026 faligndata %f50, %f52, %f20 2027 faligndata %f52, %f54, %f22 2028 faligndata %f54, %f56, %f24 2029 faligndata %f56, %f58, %f26 2030 faligndata %f58, %f60, %f28 2031 faligndata %f60, %f62, %f30 2032 RLOAD(f48,rvis15e,rvis15r) 2033 fnop 2034 fnop 2035 fnop 2036 fnop 2037 fnop 2038 fnop 2039 fnop 2040 faligndata %f46, %ftmp1, %f16 2041 STORE 2042 ba,pt %xcc, rvis14 2043 sub %dst, 64, %dst 2044 2045 rightstr: 2046 brlz,pn %curw, narrowstr + 4 2047 cmp %rightw, 64 2048 be,pn %icc, 2f 2049 and %rightw, 0x38, %tmp1 2050 andcc %rightw, 7, %g0 2051 be,pn %icc, 1f 2052 neg %tmp1 2053 sub %g0, %rightw, %tmp5 2054 add %branchbase, (3f - BranchBaseR - 8), %tmp2 2055 edge8l %tmp5, %g0, %tmp5 2056 sub %dst, %tmp1, %tmp4 2057 jmpl %tmp1 + %tmp2, %g0 2058 add %tmp4, 0x40, %tmp4 2059 1: addcc %branchbase, (4f - BranchBaseR), %tmp2 2060 sra %tmp1, 1, %tmp1 2061 jmpl %tmp1 + %tmp2, %g0 2062 2: add %dst, 0x40, %tmp1 2063 jmpl %branchbase + %tmp3, %g0 2064 stda %f16, [%tmp1] ASI_BLK_P 2065 ba,pt %xcc, 3f+0x00 2066 stda %f30, [%tmp4 + %tmp5] ASI_PST8_P 2067 ba,pt %xcc, 3f+0x04 2068 stda %f28, [%tmp4 + %tmp5] ASI_PST8_P 2069 ba,pt %xcc, 3f+0x08 2070 stda %f26, [%tmp4 + %tmp5] ASI_PST8_P 2071 ba,pt %xcc, 3f+0x0c 2072 stda %f24, [%tmp4 + %tmp5] ASI_PST8_P 2073 ba,pt %xcc, 3f+0x10 2074 stda %f22, [%tmp4 + %tmp5] ASI_PST8_P 2075 ba,pt %xcc, 3f+0x14 2076 stda %f20, [%tmp4 + %tmp5] ASI_PST8_P 2077 ba,pt %xcc, 3f+0x18 2078 stda %f18, [%tmp4 + %tmp5] ASI_PST8_P 2079 jmpl %branchbase + %tmp3, %g0 2080 stda %f16, [%tmp4 + %tmp5] ASI_PST8_P 2081 3: std %f28, [%dst + 0x70] 2082 std %f26, [%dst + 0x68] 2083 std %f24, [%dst + 0x60] 2084 std %f22, [%dst + 0x58] 2085 std %f20, [%dst + 0x50] 2086 std %f18, [%dst + 0x48] 2087 std %f16, [%dst + 0x40] 2088 4: jmpl %branchbase + %tmp3, %g0 2089 nop 2090 2091 leftstr:cmp %leftw, 64 2092 be,pn %icc, 2f 2093 and %leftw, 0x38, %tmp1 2094 andcc %leftw, 7, %g0 2095 be,pn %icc, 1f 2096 neg %tmp1 2097 sub %dst, %leftw, %tmp4 2098 add %branchbase, (3f - BranchBaseR - 8), %tmp2 2099 edge8 %tmp4, %g0, %tmp5 2100 andn %tmp4, 7, %tmp4 2101 add %mode, %skind, %mode 2102 jmpl %tmp2 + %tmp1, %g0 2103 add %tmp4, 0x40, %tmp4 2104 1: add %branchbase, (4f - BranchBaseR), %tmp2 2105 sra %tmp1, 1, %tmp1 2106 jmpl %tmp2 + %tmp1, %g0 2107 2: add %mode, %skind, %mode 2108 ba,pt %xcc, 4f 2109 stda %f16, [%dst] ASI_BLK_P 2110 ba,pt %xcc, 3f+0x00 2111 stda %f16, [%tmp4 + %tmp5] ASI_PST8_P 2112 ba,pt %xcc, 3f+0x04 2113 stda %f18, [%tmp4 + %tmp5] ASI_PST8_P 2114 ba,pt %xcc, 3f+0x08 2115 stda %f20, [%tmp4 + %tmp5] ASI_PST8_P 2116 ba,pt %xcc, 3f+0x0c 2117 stda %f22, [%tmp4 + %tmp5] ASI_PST8_P 2118 ba,pt %xcc, 3f+0x10 2119 stda %f24, [%tmp4 + %tmp5] ASI_PST8_P 2120 ba,pt %xcc, 3f+0x14 2121 stda %f26, [%tmp4 + %tmp5] ASI_PST8_P 2122 ba,pt %xcc, 3f+0x18 2123 stda %f28, [%tmp4 + %tmp5] ASI_PST8_P 2124 ba,pt %xcc, 3f+0x1c 2125 stda %f30, [%tmp4 + %tmp5] ASI_PST8_P 2126 3: std %f18, [%dst + 0x08] 2127 std %f20, [%dst + 0x10] 2128 std %f22, [%dst + 0x18] 2129 std %f24, [%dst + 0x20] 2130 std %f26, [%dst + 0x28] 2131 std %f28, [%dst + 0x30] 2132 std %f30, [%dst + 0x38] 2133 4: brnz,pn %narrow, rnarrow_cont 2134 deccc %srcnotdone 2135 blu,pn %ICC, rreturn 2136 sub %mode, %dkind, %mode 2137 alignaddr %mode, %g0, %g0 2138 and %mode, 63, %mode 2139 cmp %srcnext, %srcn 2140 bne,a,pn %ICC, 6f 2141 xor %fregset, 64, %fregset 2142 brnz,a,pn %fregset, 5f 2143 ldda [%src] ASI_BLK_P, %f32 2144 ldda [%src] ASI_BLK_P, %f48 2145 5: sub %src, 64, %src 2146 6: add %dst, %dkind, %dst 2147 sub %w, %leftw, %tmp1 2148 add %srcstart, %skind, %srcstart 2149 add %dst, %tmp1, %dst 2150 add %rightw, %dkind, %rightw 2151 add %dst, 63, %dst 2152 sub %rightw, 1, %rightw 2153 sub %dkind, %leftw, %leftw 2154 and %rightw, 63, %rightw 2155 and %leftw, 63, %leftw 2156 add %rightw, 1, %rightw 2157 mov 64, %tmp1 2158 andn %dst, 63, %dst 2159 sub %tmp1, %leftw, %leftw 2160 rroll_wide: 2161 add %srcstart, %skind, %srcnext 2162 sub %srcstart, %w, %srcend 2163 fnop 2164 deccc %srcnext 2165 sll %mode, 4, %tmp4 2166 fnop 2167 andn %srcnext, 63, %srcnext 2168 andn %srcend, 63, %srcend 2169 fnop 2170 mov %srcnext, %srcn 2171 and %mode, 7, %leftw2 2172 fnop 2173 andn %tmp4, 127, %tmp4 2174 sub %leftw, %leftw2, %leftw2 2175 fnop 2176 add %tmp4, %fregset, %tmp4 2177 subcc %w, %leftw, %curw 2178 fnop 2179 srl %tmp4, 1, %tmp3 2180 sub %tmp1, %mode, %tmp1 2181 fnop 2182 add %tmp3, (rrepn0 - BranchBaseR), %tmp2 2183 cmp %tmp1, %rightw 2184 add %tmp4, %tmp3, %tmp4 2185 sub %srcnext, 64, %tmp1 2186 movgeu %icc, %tmp2, %tmp4 2187 cmp %srcnext, %srcend 2188 sub %dst, 64, %dst 2189 move %ICC, %tmp1, %srcnext 2190 jmpl %branchbase + %tmp4, %g0 2191 sub %curw, %rightw, %curw 2192 2193 rreturn:return %i7+8 2194 #if defined(__NetBSD__) 2195 wr %g0, 4, %fprs 2196 #else 2197 wr %g0, 0, %fprs 2198 #endif 2199 2200 narrowstr: 2201 cmp %rightw, 64 2202 add %dst, 0x80, %fregset 2203 and %rightw, 0x38, %tmp1 2204 sub %fregset, %leftw, %tmp2 2205 mov %w, %tmp4 2206 andn %tmp2, 7, %fregset 2207 be,pn %icc, 2f 2208 edge8 %tmp2, %g0, %srcend 2209 andcc %rightw, 7, %g0 2210 be,pn %icc, 1f 2211 neg %tmp1 2212 sub %g0, %rightw, %tmp4 2213 add %tmp1, (2f - BranchBaseR - 8), %tmp1 2214 add %dst, 0x40, %tmp5 2215 sub %leftw, 0x41, %tmp2 2216 add %tmp5, %rightw, %tmp5 2217 edge8l %tmp4, %tmp2, %tmp2 2218 and %rightw, 7, %tmp4 2219 andn %tmp5, 7, %tmp5 2220 jmpl %branchbase + %tmp1, %g0 2221 sub %w, %tmp4, %tmp4 2222 1: addcc %branchbase, (4f - BranchBaseR - 8), %tmp2 2223 sll %tmp1, 1, %tmp1 2224 jmpl %tmp2 + %tmp1, %g0 2225 nop 2226 ba,pt %xcc, 3f+0x00 2227 stda %f30, [%tmp5 + %tmp2] ASI_PST8_P 2228 ba,pt %xcc, 3f+0x10 2229 stda %f28, [%tmp5 + %tmp2] ASI_PST8_P 2230 ba,pt %xcc, 3f+0x20 2231 stda %f26, [%tmp5 + %tmp2] ASI_PST8_P 2232 ba,pt %xcc, 3f+0x30 2233 stda %f24, [%tmp5 + %tmp2] ASI_PST8_P 2234 ba,pt %xcc, 3f+0x40 2235 stda %f22, [%tmp5 + %tmp2] ASI_PST8_P 2236 ba,pt %xcc, 3f+0x50 2237 stda %f20, [%tmp5 + %tmp2] ASI_PST8_P 2238 ba,pt %xcc, 3f+0x60 2239 stda %f18, [%tmp5 + %tmp2] ASI_PST8_P 2240 ba,pt %xcc, 3f+0x70 2241 stda %f16, [%tmp5 + %tmp2] ASI_PST8_P 2242 2: subcc %tmp4, 8, %tmp4 2243 bl,pn %icc, 4f+0x00 2244 fnop 2245 std %f30, [%dst + 0x78] 2246 3: subcc %tmp4, 8, %tmp4 2247 bl,pn %icc, 4f+0x10 2248 fnop 2249 std %f28, [%dst + 0x70] 2250 subcc %tmp4, 8, %tmp4 2251 bl,pn %icc, 4f+0x20 2252 fnop 2253 std %f26, [%dst + 0x68] 2254 subcc %tmp4, 8, %tmp4 2255 bl,pn %icc, 4f+0x30 2256 fnop 2257 std %f24, [%dst + 0x60] 2258 subcc %tmp4, 8, %tmp4 2259 bl,pn %icc, 4f+0x40 2260 fnop 2261 std %f22, [%dst + 0x58] 2262 subcc %tmp4, 8, %tmp4 2263 bl,pn %icc, 4f+0x50 2264 fnop 2265 std %f20, [%dst + 0x50] 2266 subcc %tmp4, 8, %tmp4 2267 bl,pn %icc, 4f+0x60 2268 fnop 2269 std %f18, [%dst + 0x48] 2270 subcc %tmp4, 8, %tmp4 2271 bl,pn %icc, 4f+0x70 2272 fnop 2273 std %f16, [%dst + 0x40] 2274 ba,pt %xcc, 5f 2275 nop 2276 4: cmp %tmp4, -8 2277 bg,a,pn %ICC, 5f 2278 stda %f30, [%fregset + %srcend] ASI_PST8_P 2279 ba,a,pt %xcc, 5f 2280 cmp %tmp4, -8 2281 bg,a,pn %ICC, 5f 2282 stda %f28, [%fregset + %srcend] ASI_PST8_P 2283 ba,a,pt %xcc, 5f 2284 cmp %tmp4, -8 2285 bg,a,pn %ICC, 5f 2286 stda %f26, [%fregset + %srcend] ASI_PST8_P 2287 ba,a,pt %xcc, 5f 2288 cmp %tmp4, -8 2289 bg,a,pn %ICC, 5f 2290 stda %f24, [%fregset + %srcend] ASI_PST8_P 2291 ba,a,pt %xcc, 5f 2292 cmp %tmp4, -8 2293 bg,a,pn %ICC, 5f 2294 stda %f22, [%fregset + %srcend] ASI_PST8_P 2295 ba,a,pt %xcc, 5f 2296 cmp %tmp4, -8 2297 bg,a,pn %ICC, 5f 2298 stda %f20, [%fregset + %srcend] ASI_PST8_P 2299 ba,a,pt %xcc, 5f 2300 cmp %tmp4, -8 2301 bg,a,pn %ICC, 5f 2302 stda %f18, [%fregset + %srcend] ASI_PST8_P 2303 ba,a,pt %xcc, 5f 2304 cmp %tmp4, -8 2305 bg,a,pn %ICC, 5f 2306 stda %f16, [%fregset + %srcend] ASI_PST8_P 2307 5: and %tmp3, 60, %tmp3 2308 add %dst, 64, %dst 2309 xor %tmp3, 60, %tmp3 2310 add %mode, %skind, %mode 2311 add %tmp3, 4, %tmp3 2312 brz,pn %h, rreturn 2313 and %tmp3, 64, %fregset 2314 rnarrow_cont: 2315 deccc %h 2316 blu,pn %ICC, rreturn 2317 sub %mode, %dkind, %mode 2318 alignaddr %mode, %g0, %g0 2319 and %mode, 63, %mode 2320 sub %srcnext, %srcn, %tmp4 2321 add %dst, %dkind, %dst 2322 sub %w, %leftw, %tmp1 2323 add %srcstart, %skind, %srcstart 2324 add %dst, %tmp1, %dst 2325 add %rightw, %dkind, %rightw 2326 sub %dkind, %leftw, %leftw 2327 sub %rightw, 1, %rightw 2328 and %leftw, 63, %leftw 2329 add %dst, 63, %dst 2330 mov 64, %tmp1 2331 and %rightw, 63, %rightw 2332 sub %tmp1, %leftw, %leftw 2333 add %srcstart, %skind, %srcnext 2334 add %rightw, 1, %rightw 2335 sub %srcstart, %w, %srcend 2336 dec %srcnext 2337 andn %srcend, 63, %srcend 2338 andn %srcnext, 63, %srcnext 2339 sub %w, %leftw, %prepw 2340 mov %srcnext, %srcn 2341 sub %srcnext, 64, %tmp3 2342 add %srcnext, 64, %tmp2 2343 cmp %skind, 0 2344 movg %ICC, %tmp2, %tmp3 2345 mov %h, %srcnotdone 2346 sub %prepw, %rightw, %prepw 2347 sub %srcstart, 1, %tmp1 2348 cmp %srcnext, %srcend 2349 move %ICC, %tmp3, %srcnext 2350 and %tmp1, 63, %tmp1 2351 sub %srcnext, 64, %tmp3 2352 sub %tmp1, %w, %tmp1 2353 cmp %srcnext, %srcend 2354 move %ICC, %tmp3, %srcnext 2355 mov %prepw, %curw 2356 cmp %tmp1, -65 2357 movl %ICC, 64, %prepw 2358 andn %dst, 63, %dst 2359 cmp %srcnext, %srcstop 2360 move %ICC, 0, %srcnotdone 2361 brnz,a,pn %tmp4, rroll_narrow 2362 xor %fregset, 64, %fregset 2363 cmp %tmp1, -1 2364 bl,pt %ICC, 6f 2365 tst %srcnotdone 2366 be,a,pn %ICC, rroll_narrow 2367 membar SYNC 2368 mov %srcnext, %src 2369 6: brnz,a,pn %fregset, 7f 2370 ldda [%src] ASI_BLK_P, %f32 2371 ldda [%src] ASI_BLK_P, %f48 2372 7: subcc %src, 64, %src 2373 rroll_narrow: 2374 fnop 2375 sll %mode, 4, %tmp2 2376 and %mode, 7, %leftw2 2377 fnop 2378 andn %tmp2, 127, %tmp2 2379 sub %dst, 64, %dst 2380 fnop 2381 add %tmp2, %fregset, %tmp2 2382 subcc %leftw, %leftw2, %leftw2 2383 fnop 2384 srl %tmp2, 1, %tmp3 2385 add %tmp3, (rrepr0 - BranchBaseR), %tmp4 2386 fnop 2387 add %tmp2, %tmp3, %tmp2 2388 cmp %tmp1, -1 2389 fnop 2390 mov 64, %tmp1 2391 movge %icc, %tmp4, %tmp2 2392 sub %tmp1, %mode, %tmp1 2393 add %tmp3, (rrepn0 - BranchBaseR), %tmp4 2394 fnop 2395 cmp %tmp1, %rightw 2396 movgeu %icc, %tmp4, %tmp2 2397 jmpl %branchbase + %tmp2, %g0 2398 and %tmp3, 32, %tmp3 2399 2400 #define RVISEND1(i,tgt,tgtr) \ 2401 tgt: \ 2402 brnz,pt %curw, 1f; \ 2403 cmp %leftw2, ((i&14)*4); \ 2404 bg,pn %icc, tgtr - 8; \ 2405 tst %srcnotdone; \ 2406 be,a,pn %ICC, tgtr; \ 2407 membar SYNC; \ 2408 ba,pt %xcc, tgtr - 8; \ 2409 mov %srcnext, %src; \ 2410 1: mov ((i & 1) ^ 1) * 64, %fregset; 2411 2412 #define RVISEND2(i,fset) \ 2413 brz,a,pn %srcnotdone, 3f; \ 2414 membar SYNC; \ 2415 ldda [%srcnext] ASI_BLK_P, %fset; \ 2416 sub %srcnext, 64, %src; \ 2417 3: mov (i & 1) * 64, %fregset; 2418 2419 RVISEND1(0,rvis0e,rvis0r) 2420 fnop 2421 fnop 2422 fnop 2423 fnop 2424 fnop 2425 fnop 2426 ble,pn %icc, leftstr 2427 faligndata %ftmp2, %ftmp1, %f30 2428 RVISEND2(0,f32) 2429 fnop 2430 faligndata %f48, %f50, %f16 2431 faligndata %f50, %f52, %f18 2432 faligndata %f52, %f54, %f20 2433 faligndata %f54, %f56, %f22 2434 faligndata %f56, %f58, %f24 2435 faligndata %f58, %f60, %f26 2436 faligndata %f60, %f62, %f28 2437 ba,pt %xcc, leftstr 2438 faligndata %f62, %ftmp1, %f30 2439 RVISEND1(1,rvis1e,rvis1r) 2440 fnop 2441 fnop 2442 fnop 2443 fnop 2444 fnop 2445 fnop 2446 ble,pn %icc, leftstr 2447 faligndata %ftmp2, %ftmp1, %f30 2448 RVISEND2(1,f48) 2449 fnop 2450 faligndata %f32, %f34, %f16 2451 faligndata %f34, %f36, %f18 2452 faligndata %f36, %f38, %f20 2453 faligndata %f38, %f40, %f22 2454 faligndata %f40, %f42, %f24 2455 faligndata %f42, %f44, %f26 2456 faligndata %f44, %f46, %f28 2457 ba,pt %xcc, leftstr 2458 faligndata %f46, %ftmp1, %f30 2459 RVISEND1(2,rvis2e,rvis2r) 2460 fnop 2461 fnop 2462 fnop 2463 fnop 2464 faligndata %ftmp2, %ftmp1, %f28 2465 ble,pn %icc, leftstr 2466 fmovd %ftmp8, %f30 2467 RVISEND2(2,f32) 2468 fnop 2469 fnop 2470 faligndata %f50, %f52, %f16 2471 faligndata %f52, %f54, %f18 2472 faligndata %f54, %f56, %f20 2473 faligndata %f56, %f58, %f22 2474 faligndata %f58, %f60, %f24 2475 faligndata %f60, %f62, %f26 2476 ba,pt %xcc, leftstr 2477 faligndata %f62, %ftmp1, %f28 2478 RVISEND1(3,rvis3e,rvis3r) 2479 fnop 2480 fnop 2481 fnop 2482 fnop 2483 faligndata %ftmp2, %ftmp1, %f28 2484 ble,pn %icc, leftstr 2485 fmovd %ftmp8, %f30 2486 RVISEND2(3,f48) 2487 fnop 2488 fnop 2489 faligndata %f34, %f36, %f16 2490 faligndata %f36, %f38, %f18 2491 faligndata %f38, %f40, %f20 2492 faligndata %f40, %f42, %f22 2493 faligndata %f42, %f44, %f24 2494 faligndata %f44, %f46, %f26 2495 ba,pt %xcc, leftstr 2496 faligndata %f46, %ftmp1, %f28 2497 RVISEND1(4,rvis4e,rvis4r) 2498 fnop 2499 fnop 2500 faligndata %ftmp2, %ftmp1, %f26 2501 fmovd %ftmp7, %f28 2502 ble,pn %icc, leftstr 2503 fmovd %ftmp8, %f30 2504 RVISEND2(4,f32) 2505 fnop 2506 fnop 2507 fnop 2508 faligndata %f52, %f54, %f16 2509 faligndata %f54, %f56, %f18 2510 faligndata %f56, %f58, %f20 2511 faligndata %f58, %f60, %f22 2512 faligndata %f60, %f62, %f24 2513 ba,pt %xcc, leftstr 2514 faligndata %f62, %ftmp1, %f26 2515 RVISEND1(5,rvis5e,rvis5r) 2516 fnop 2517 fnop 2518 faligndata %ftmp2, %ftmp1, %f26 2519 fmovd %ftmp7, %f28 2520 ble,pn %icc, leftstr 2521 fmovd %ftmp8, %f30 2522 RVISEND2(5,f48) 2523 fnop 2524 fnop 2525 fnop 2526 faligndata %f36, %f38, %f16 2527 faligndata %f38, %f40, %f18 2528 faligndata %f40, %f42, %f20 2529 faligndata %f42, %f44, %f22 2530 faligndata %f44, %f46, %f24 2531 ba,pt %xcc, leftstr 2532 faligndata %f46, %ftmp1, %f26 2533 RVISEND1(6,rvis6e,rvis6r) 2534 faligndata %ftmp2, %ftmp1, %f24 2535 fmovd %ftmp6, %f26 2536 fmovd %ftmp7, %f28 2537 ble,pn %icc, leftstr 2538 fmovd %ftmp8, %f30 2539 RVISEND2(6,f32) 2540 fnop 2541 fnop 2542 fnop 2543 fnop 2544 faligndata %f54, %f56, %f16 2545 faligndata %f56, %f58, %f18 2546 faligndata %f58, %f60, %f20 2547 faligndata %f60, %f62, %f22 2548 ba,pt %xcc, leftstr 2549 faligndata %f62, %ftmp1, %f24 2550 RVISEND1(7,rvis7e,rvis7r) 2551 faligndata %ftmp2, %ftmp1, %f24 2552 fmovd %ftmp6, %f26 2553 fmovd %ftmp7, %f28 2554 ble,pn %icc, leftstr 2555 fmovd %ftmp8, %f30 2556 RVISEND2(7,f48) 2557 fnop 2558 fnop 2559 fnop 2560 fnop 2561 faligndata %f38, %f40, %f16 2562 faligndata %f40, %f42, %f18 2563 faligndata %f42, %f44, %f20 2564 faligndata %f44, %f46, %f22 2565 ba,pt %xcc, leftstr 2566 faligndata %f46, %ftmp1, %f24 2567 RVISEND1(8,rvis8e,rvis8r) 2568 faligndata %ftmp2, %ftmp1, %f22 2569 fmovd %ftmp5, %f24 2570 fmovd %ftmp6, %f26 2571 fmovd %ftmp7, %f28 2572 ble,pn %icc, leftstr 2573 fmovd %ftmp8, %f30 2574 RVISEND2(8,f32) 2575 fnop 2576 fnop 2577 fnop 2578 fnop 2579 fnop 2580 faligndata %f56, %f58, %f16 2581 faligndata %f58, %f60, %f18 2582 faligndata %f60, %f62, %f20 2583 ba,pt %xcc, leftstr 2584 faligndata %f62, %ftmp1, %f22 2585 RVISEND1(9,rvis9e,rvis9r) 2586 faligndata %ftmp2, %ftmp1, %f22 2587 fmovd %ftmp5, %f24 2588 fmovd %ftmp6, %f26 2589 fmovd %ftmp7, %f28 2590 ble,pn %icc, leftstr 2591 fmovd %ftmp8, %f30 2592 RVISEND2(9,f48) 2593 fnop 2594 fnop 2595 fnop 2596 fnop 2597 fnop 2598 faligndata %f40, %f42, %f16 2599 faligndata %f42, %f44, %f18 2600 faligndata %f44, %f46, %f20 2601 ba,pt %xcc, leftstr 2602 faligndata %f46, %ftmp1, %f22 2603 RVISEND1(10,rvis10e,rvis10r) 2604 faligndata %ftmp2, %ftmp1, %f20 2605 fmovd %ftmp4, %f22 2606 fmovd %ftmp5, %f24 2607 fmovd %ftmp6, %f26 2608 fmovd %ftmp7, %f28 2609 ble,pn %icc, leftstr 2610 fmovd %ftmp8, %f30 2611 RVISEND2(10,f32) 2612 fnop 2613 fnop 2614 fnop 2615 fnop 2616 fnop 2617 fnop 2618 faligndata %f58, %f60, %f16 2619 faligndata %f60, %f62, %f18 2620 ba,pt %xcc, leftstr 2621 faligndata %f62, %ftmp1, %f20 2622 RVISEND1(11,rvis11e,rvis11r) 2623 faligndata %ftmp2, %ftmp1, %f20 2624 fmovd %ftmp4, %f22 2625 fmovd %ftmp5, %f24 2626 fmovd %ftmp6, %f26 2627 fmovd %ftmp7, %f28 2628 ble,pn %icc, leftstr 2629 fmovd %ftmp8, %f30 2630 RVISEND2(11,f48) 2631 fnop 2632 fnop 2633 fnop 2634 fnop 2635 fnop 2636 fnop 2637 faligndata %f42, %f44, %f16 2638 faligndata %f44, %f46, %f18 2639 ba,pt %xcc, leftstr 2640 faligndata %f46, %ftmp1, %f20 2641 RVISEND1(12,rvis12e,rvis12r) 2642 faligndata %ftmp2, %ftmp1, %f18 2643 fmovd %ftmp3, %f20 2644 fmovd %ftmp4, %f22 2645 fmovd %ftmp5, %f24 2646 fmovd %ftmp6, %f26 2647 fmovd %ftmp7, %f28 2648 ble,pn %icc, leftstr 2649 fmovd %ftmp8, %f30 2650 RVISEND2(12,f32) 2651 fnop 2652 fnop 2653 fnop 2654 fnop 2655 fnop 2656 fnop 2657 fnop 2658 faligndata %f60, %f62, %f16 2659 ba,pt %xcc, leftstr 2660 faligndata %f62, %ftmp1, %f18 2661 RVISEND1(13,rvis13e,rvis13r) 2662 faligndata %ftmp2, %ftmp1, %f18 2663 fmovd %ftmp3, %f20 2664 fmovd %ftmp4, %f22 2665 fmovd %ftmp5, %f24 2666 fmovd %ftmp6, %f26 2667 fmovd %ftmp7, %f28 2668 ble,pn %icc, leftstr 2669 fmovd %ftmp8, %f30 2670 RVISEND2(13,f48) 2671 fnop 2672 fnop 2673 fnop 2674 fnop 2675 fnop 2676 fnop 2677 fnop 2678 faligndata %f44, %f46, %f16 2679 ba,pt %xcc, leftstr 2680 faligndata %f46, %ftmp1, %f18 2681 RVISEND1(14,rvis14e,rvis14r) 2682 ble,pn %icc, leftstr 2683 faligndata %ftmp2, %ftmp1, %f16 2684 RVISEND2(14,f32) 2685 fnop 2686 fnop 2687 fnop 2688 fnop 2689 fnop 2690 fnop 2691 fnop 2692 ba,pt %xcc, leftstr 2693 faligndata %f62, %ftmp1, %f16 2694 RVISEND1(15,rvis15e,rvis15r) 2695 ble,pn %icc, leftstr 2696 faligndata %ftmp2, %ftmp1, %f16 2697 RVISEND2(15,f48) 2698 fnop 2699 fnop 2700 fnop 2701 fnop 2702 fnop 2703 fnop 2704 fnop 2705 ba,pt %xcc, leftstr 2706 faligndata %f46, %ftmp1, %f16 2707 2708 #define RREPEND(tgt,tgtr) \ 2709 tgt: \ 2710 brnz,pt %srcnotdone, tgtr - 8; \ 2711 mov %srcnext, %src; \ 2712 ba,pt %xcc, tgtr; \ 2713 membar SYNC; 2714 2715 .align 16 2716 RREPEND(rrep0e,rrep0r) 2717 RREPEND(rrep1e,rrep1r) 2718 RREPEND(rrep2e,rrep2r) 2719 RREPEND(rrep3e,rrep3r) 2720 RREPEND(rrep4e,rrep4r) 2721 RREPEND(rrep5e,rrep5r) 2722 RREPEND(rrep6e,rrep6r) 2723 RREPEND(rrep7e,rrep7r) 2724 RREPEND(rrep8e,rrep8r) 2725 RREPEND(rrep9e,rrep9r) 2726 RREPEND(rrep10e,rrep10r) 2727 RREPEND(rrep11e,rrep11r) 2728 RREPEND(rrep12e,rrep12r) 2729 RREPEND(rrep13e,rrep13r) 2730 RREPEND(rrep14e,rrep14r) 2731 RREPEND(rrep15e,rrep15r) 2732