|
|
1.1 ! root 1: # line 99999 ! 2: .file "bitblt.c" ! 3: .data ! 4: .text ! 5: .align 4 ! 6: .def bitblt; .val bitblt; .scl 2; .type 044; .endef ! 7: .globl bitblt ! 8: bitblt: ! 9: save &.R1 ! 10: addw2 &.F1,%sp ! 11: # /* BITBLT() Moves bits around on the screen, and does a LOT of it ! 12: # * ! 13: # * WARNING ! 14: # * WARNING: to any future modifier of this code. This is highly ! 15: # * hand optimized code, it pushes the frame pointer and ! 16: # * references locals off the stack pointer, ! 17: # * and it even simulates register ! 18: # * allocation. Be very careful if you edit this. ! 19: # */ ! 20: # ! 21: # #include <jerq.h> ! 22: # /* alignment codes for narrow rectangles */ ! 23: # #define S_STRADDLE 0x4 /* source straddles a word boundary */ ! 24: # #define D_STRADDLE 0x8 /* dest straddles a word boundary */ ! 25: # #define LEFTDIR 8 ! 26: # #define NOSHIFT 4 ! 27: # #define DAMMIT 4 /* you'll see why */ ! 28: # #undef sw ! 29: # #define DX1 m ! 30: # ! 31: # bitblt(sm,r,dm,p,fc) ! 32: # Bitmap *sm,*dm; ! 33: # Rectangle r; ! 34: # Point p; ! 35: # int fc; ! 36: # { ! 37: # register Word *source,*dest; /* %r8-%r7 */ ! 38: # register Word sw, dw; /* %r6-%r5 */ ! 39: # register UWord m; /* %r4 */ ! 40: # register int i; /* %r3 */ ! 41: # ! 42: # int a,b,j,h,w,dx1,px31,rx31; ! 43: # unsigned int mask1,mask2,mask3,mask4,ntmask1,ntmask2; ! 44: # int dummy1, dummy2; /* for future use, CANNOT CHANGE */ ! 45: # /* NUMBER OF LOCALS DUE TO %fp */ ! 46: # /* TRICKS */ ! 47: # /* clip to the source Bitmap */ ! 48: # if(r.origin.x < sm->rect.origin.x) ! 49: addw3 &8,0(%ap),%r0 ! 50: cmph 4(%ap),0(%r0) ! 51: jge .L32 ! 52: # r.origin.x=sm->rect.origin.x; ! 53: addw3 &8,0(%ap),%r0 ! 54: movh 0(%r0),4(%ap) ! 55: .L32: ! 56: # if(r.corner.x > sm->rect.corner.x) ! 57: addw3 &12,0(%ap),%r0 ! 58: cmph 8(%ap),0(%r0) ! 59: jle .L33 ! 60: # r.corner.x=sm->rect.corner.x; ! 61: addw3 &12,0(%ap),%r0 ! 62: movh 0(%r0),8(%ap) ! 63: .L33: ! 64: # if(r.origin.y < sm->rect.origin.y) ! 65: addw3 &10,0(%ap),%r0 ! 66: cmph 6(%ap),0(%r0) ! 67: jge .L34 ! 68: # r.origin.y=sm->rect.origin.y; ! 69: addw3 &10,0(%ap),%r0 ! 70: movh 0(%r0),6(%ap) ! 71: .L34: ! 72: # if(r.corner.y > sm->rect.corner.y) ! 73: addw3 &14,0(%ap),%r0 ! 74: cmph 10(%ap),0(%r0) ! 75: jle .L35 ! 76: # r.corner.y=sm->rect.corner.y; ! 77: addw3 &14,0(%ap),%r0 ! 78: movh 0(%r0),10(%ap) ! 79: .L35: ! 80: # /* ! 81: # * If the sm->rect and r are disjoint, r is now degenerate, ! 82: # * due to the clipping, and the next clipping code will reject it. ! 83: # * This is safe because we will only increase origin or decrease corner. ! 84: # */ ! 85: # /* clip to the destination Bitmap */ ! 86: # if(p.x < dm->rect.origin.x){ ! 87: addw3 &8,12(%ap),%r0 ! 88: cmph 16(%ap),0(%r0) ! 89: jge .L36 ! 90: # r.origin.x+=dm->rect.origin.x-p.x; ! 91: addw3 &8,12(%ap),%r0 ! 92: subh3 16(%ap),0(%r0),%r0 ! 93: addh2 %r0,4(%ap) ! 94: # p.x=dm->rect.origin.x; ! 95: addw3 &8,12(%ap),%r0 ! 96: movh 0(%r0),16(%ap) ! 97: .L36: ! 98: # } ! 99: # if(p.y < dm->rect.origin.y){ ! 100: addw3 &10,12(%ap),%r0 ! 101: cmph 18(%ap),0(%r0) ! 102: jge .L37 ! 103: # r.origin.y+=dm->rect.origin.y-p.y; ! 104: addw3 &10,12(%ap),%r0 ! 105: subh3 18(%ap),0(%r0),%r0 ! 106: addh2 %r0,6(%ap) ! 107: # p.y=dm->rect.origin.y; ! 108: addw3 &10,12(%ap),%r0 ! 109: movh 0(%r0),18(%ap) ! 110: .L37: ! 111: # } ! 112: # if(r.corner.x-r.origin.x > dm->rect.corner.x-p.x) ! 113: subh3 4(%ap),8(%ap),%r0 ! 114: addw3 &12,12(%ap),%r1 ! 115: subh3 16(%ap),0(%r1),%r1 ! 116: cmpw %r0,%r1 ! 117: jle .L38 ! 118: # r.corner.x=r.origin.x+(dm->rect.corner.x-p.x); ! 119: addw3 &12,12(%ap),%r0 ! 120: subh3 16(%ap),0(%r0),%r0 ! 121: addh2 4(%ap),%r0 ! 122: movh %r0,8(%ap) ! 123: .L38: ! 124: # if(r.corner.y-r.origin.y > dm->rect.corner.y-p.y) ! 125: subh3 6(%ap),10(%ap),%r0 ! 126: addw3 &14,12(%ap),%r1 ! 127: subh3 18(%ap),0(%r1),%r1 ! 128: cmpw %r0,%r1 ! 129: jle .L39 ! 130: # r.corner.y=r.origin.y+(dm->rect.corner.y-p.y); ! 131: addw3 &14,12(%ap),%r0 ! 132: subh3 18(%ap),0(%r0),%r0 ! 133: addh2 6(%ap),%r0 ! 134: movh %r0,10(%ap) ! 135: .L39: ! 136: # i = r.corner.y - r.origin.y; /* going to be h */ ! 137: subh3 6(%ap),10(%ap),%r0 ! 138: movw %r0,%r3 ! 139: # dw = r.corner.x - r.origin.x - 1; /* going to be dx1 */ ! 140: subh3 4(%ap),8(%ap),%r0 ! 141: subw2 &1,%r0 ! 142: movw %r0,%r5 ! 143: # if (i <= 0 || dw < 0) ! 144: cmpw %r3,&0 ! 145: jle .L41 ! 146: cmpw %r5,&0 ! 147: jge .L40 ! 148: .L41: ! 149: jmp .L31 ! 150: .L40: ! 151: # return; ! 152: # if (dw < 32) ! 153: cmpw %r5,&32 ! 154: jge .L42 ! 155: jmp .L43 ! 156: .L42: ! 157: # goto narrow; ! 158: # DX1 = dw; ! 159: movw %r5,%r4 ! 160: # h = i; ! 161: movw %r3,12(%fp) ! 162: # ntmask1 = topbits[p.x & 0x1f]; ! 163: andh3 &31,16(%ap),%r0 ! 164: LLSW3 &2,%r0,%r0 ! 165: movw topbits(%r0),48(%fp) ! 166: # mask1 = ~ntmask1; ! 167: mcomw 48(%fp),%r0 ! 168: movw %r0,32(%fp) ! 169: # mask2 = topbits[((p.x+DX1) & 31) + 1]; ! 170: movbhw 16(%ap),%r0 ! 171: addw2 %r4,%r0 ! 172: andw2 &31,%r0 ! 173: addw2 &1,%r0 ! 174: LLSW3 &2,%r0,%r0 ! 175: movw topbits(%r0),36(%fp) ! 176: # ntmask2 = ~mask2; ! 177: mcomw 36(%fp),%r0 ! 178: movw %r0,52(%fp) ! 179: # w = ((p.x+DX1) >> 5) - (p.x >> 5); /* inner loop+1: sub 1 later*/ ! 180: movbhw 16(%ap),%r0 ! 181: addw2 %r4,%r0 ! 182: LRSW3 &5,%r0,%r0 ! 183: movbhw 16(%ap),%r1 ! 184: LRSW3 &5,%r1,%r1 ! 185: subw2 %r1,%r0 ! 186: movw %r0,16(%fp) ! 187: # sw = ((sm->width - w) << 2); /* sleazy hack to avoid shift */ ! 188: addw3 &4,0(%ap),%r0 ! 189: subw3 16(%fp),0(%r0),%r0 ! 190: LLSW3 &2,%r0,%r0 ! 191: movw %r0,%r6 ! 192: # dw = ((dm->width - w) << 2); /* in outer, inner loops */ ! 193: addw3 &4,12(%ap),%r0 ! 194: subw3 16(%fp),0(%r0),%r0 ! 195: LLSW3 &2,%r0,%r0 ! 196: movw %r0,%r5 ! 197: # if (sm == dm) { /* may have to mess with loop order */ ! 198: cmpw 0(%ap),12(%ap) ! 199: jne .L44 ! 200: # if (r.origin.y < p.y) { /* swap top with bottom */ ! 201: cmph 6(%ap),18(%ap) ! 202: jge .L45 ! 203: # r.origin.y += i-1; ! 204: movtwh %r3,%r0 ! 205: subh2 &1,%r0 ! 206: addh2 %r0,6(%ap) ! 207: # p.y += i-1; ! 208: movtwh %r3,%r0 ! 209: subh2 &1,%r0 ! 210: addh2 %r0,18(%ap) ! 211: # if (r.origin.x < p.x) { /* swap left with right */ ! 212: cmph 4(%ap),16(%ap) ! 213: jge .L46 ! 214: # fc |= LEFTDIR; ! 215: orw2 &8,20(%ap) ! 216: # r.origin.x = r.origin.x + DX1; ! 217: movtwh %r4,%r0 ! 218: addh2 4(%ap),%r0 ! 219: movh %r0,4(%ap) ! 220: # p.x = p.x + DX1; ! 221: movtwh %r4,%r0 ! 222: addh2 16(%ap),%r0 ! 223: movh %r0,16(%ap) ! 224: # sw = -sw; ! 225: mnegw %r6,%r0 ! 226: movw %r0,%r6 ! 227: # dw = -dw; ! 228: mnegw %r5,%r0 ! 229: movw %r0,%r5 ! 230: jmp .L47 ! 231: .L46: ! 232: # } ! 233: # else ! 234: # { ! 235: # sw -= (sm->width << 3); /* -(w+n) == (w-n) - 2*w */ ! 236: addw3 &4,0(%ap),%r0 ! 237: LLSW3 &3,0(%r0),%r0 ! 238: subw2 %r0,%r6 ! 239: # dw -= (dm->width << 3) ; ! 240: addw3 &4,12(%ap),%r0 ! 241: LLSW3 &3,0(%r0),%r0 ! 242: subw2 %r0,%r5 ! 243: .L47: ! 244: jmp .L48 ! 245: .L45: ! 246: # } ! 247: # } ! 248: # else ! 249: # { ! 250: # if (r.origin.x < p.x) { /* swap left with right */ ! 251: cmph 4(%ap),16(%ap) ! 252: jge .L49 ! 253: # fc |= LEFTDIR; ! 254: orw2 &8,20(%ap) ! 255: # r.origin.x = r.origin.x + DX1; ! 256: movtwh %r4,%r0 ! 257: addh2 4(%ap),%r0 ! 258: movh %r0,4(%ap) ! 259: # p.x = p.x + DX1; ! 260: movtwh %r4,%r0 ! 261: addh2 16(%ap),%r0 ! 262: movh %r0,16(%ap) ! 263: # sw = (sm->width + w) << 2; ! 264: addw3 &4,0(%ap),%r0 ! 265: addw3 16(%fp),0(%r0),%r0 ! 266: LLSW3 &2,%r0,%r0 ! 267: movw %r0,%r6 ! 268: # dw = (dm->width + w) << 2; ! 269: addw3 &4,12(%ap),%r0 ! 270: addw3 16(%fp),0(%r0),%r0 ! 271: LLSW3 &2,%r0,%r0 ! 272: movw %r0,%r5 ! 273: .L49: ! 274: .L48: ! 275: .L44: ! 276: # } ! 277: # } ! 278: # } ! 279: # w--; /* subtract the 1 like we promised */ ! 280: subw2 &1,16(%fp) ! 281: # px31 = p.x & 0x1f; /* commonly used expression */ ! 282: andh3 &31,16(%ap),%r0 ! 283: movw %r0,24(%fp) ! 284: # rx31 = r.origin.x & 0x1f; /* commonly used expression */ ! 285: andh3 &31,4(%ap),%r0 ! 286: movw %r0,28(%fp) ! 287: # dest = addr(dm,p); ! 288: pushw 12(%ap) ! 289: pushw 16(%ap) ! 290: call &2,addr ! 291: movw %r0,%r7 ! 292: # source = addr(sm,r.origin); ! 293: pushw 0(%ap) ! 294: pushw 4(%ap) ! 295: call &2,addr ! 296: movw %r0,%r8 ! 297: # a = px31 - rx31; ! 298: subw3 28(%fp),24(%fp),%r0 ! 299: movw %r0,0(%fp) ! 300: # if(a == 0) ! 301: cmpw 0(%fp),&0 ! 302: jne .L50 ! 303: # fc |= NOSHIFT; ! 304: orw2 &4,20(%ap) ! 305: jmp .L51 ! 306: .L50: ! 307: # else if (a < 0) ! 308: cmpw 0(%fp),&0 ! 309: jge .L52 ! 310: # a += 32; ! 311: addw2 &32,0(%fp) ! 312: .L52: ! 313: .L51: ! 314: # /* a == 0 means no shift, remember that */ ! 315: # b = 32 - a; ! 316: subw3 0(%fp),&32,%r0 ! 317: movw %r0,4(%fp) ! 318: # switch (fc) { ! 319: movw 20(%ap),%r0 ! 320: jmp .L54 ! 321: .L55: ! 322: # ! 323: # case F_OR | NOSHIFT | LEFTDIR: ! 324: # b = w>>2; ! 325: LRSW3 &2,16(%fp),%r0 ! 326: movw %r0,4(%fp) ! 327: # w = w&3; ! 328: andw3 &3,16(%fp),%r0 ! 329: movw %r0,16(%fp) ! 330: # m = h; /* m is free => use it */ ! 331: movw 12(%fp),%r4 ! 332: .L58: ! 333: # do { ! 334: # *dest-- |= mask2 & *source--; ! 335: movw %r7,%r0 ! 336: subw2 &4,%r7 ! 337: movw %r8,%r1 ! 338: subw2 &4,%r8 ! 339: andw3 0(%r1),36(%fp),%r1 ! 340: orw2 %r1,0(%r0) ! 341: # if ((i = b) > 0) do { ! 342: movw 4(%fp),%r3 ! 343: jnpos .L59 ! 344: .L62: ! 345: # *dest |= *source; ! 346: orw2 0(%r8),0(%r7) ! 347: # *(dest-1) |= *(source-1); ! 348: orw2 -4(%r8),-4(%r7) ! 349: # *(dest-2) |= *(source-2); ! 350: orw2 -8(%r8),-8(%r7) ! 351: # *(dest-3) |= *(source-3); ! 352: orw2 -12(%r8),-12(%r7) ! 353: # dest -= 4; ! 354: subw2 &16,%r7 ! 355: # source -= 4; ! 356: subw2 &16,%r8 ! 357: .L61: ! 358: # } while (--i > 0); ! 359: subw2 &1,%r3 ! 360: jpos .L62 ! 361: .L60: ! 362: .L59: ! 363: # if ((i = w) > 0) do { ! 364: movw 16(%fp),%r3 ! 365: jnpos .L63 ! 366: .L66: ! 367: # *dest-- |= *source--; ! 368: movw %r7,%r0 ! 369: subw2 &4,%r7 ! 370: movw %r8,%r1 ! 371: subw2 &4,%r8 ! 372: orw2 0(%r1),0(%r0) ! 373: .L65: ! 374: # } while (--i > 0); ! 375: subw2 &1,%r3 ! 376: jpos .L66 ! 377: .L64: ! 378: .L63: ! 379: # *dest |= mask1 & *source; ! 380: andw3 0(%r8),32(%fp),%r0 ! 381: orw2 %r0,0(%r7) ! 382: ADDW2 %r6,%r8 ! 383: ADDW2 %r5,%r7 ! 384: .L57: ! 385: # asm(" ADDW2 %r6,%r8"); /*source += sw; */ ! 386: # asm(" ADDW2 %r5,%r7"); /*dest += dw; */ ! 387: # } while (--m != 0); ! 388: subw2 &1,%r4 ! 389: jnz .L58 ! 390: .L56: ! 391: jmp .L53 ! 392: .L67: ! 393: # break; ! 394: # case F_OR | LEFTDIR: ! 395: # if ((px31) < (rx31)) ! 396: cmpw 24(%fp),28(%fp) ! 397: jge .L68 ! 398: # source++; /* adjust for pipeline */ ! 399: addw2 &4,%r8 ! 400: .L68: ! 401: .L71: ! 402: # do { ! 403: # m = *source--; /* m is a free register */ ! 404: movw %r8,%r0 ! 405: subw2 &4,%r8 ! 406: movw 0(%r0),%r4 ! 407: # *dest-- |= (((m >> a) | (*source << b)) & mask2); ! 408: movw %r7,%r0 ! 409: subw2 &4,%r7 ! 410: LRSW3 0(%fp),%r4,%r1 ! 411: LLSW3 4(%fp),0(%r8),%r2 ! 412: orw2 %r2,%r1 ! 413: andw2 36(%fp),%r1 ! 414: orw2 %r1,0(%r0) ! 415: # if ((i=w) > 0) do { ! 416: movw 16(%fp),%r3 ! 417: jnpos .L72 ! 418: .L75: ! 419: # m = (*source--) >> a; ! 420: movw %r8,%r0 ! 421: subw2 &4,%r8 ! 422: LRSW3 0(%fp),0(%r0),%r0 ! 423: movw %r0,%r4 ! 424: # *dest-- |= m | (*source << b); ! 425: movw %r7,%r0 ! 426: subw2 &4,%r7 ! 427: LLSW3 4(%fp),0(%r8),%r1 ! 428: orw2 %r4,%r1 ! 429: orw2 %r1,0(%r0) ! 430: .L74: ! 431: # } while (--i > 0); ! 432: subw2 &1,%r3 ! 433: jpos .L75 ! 434: .L73: ! 435: .L72: ! 436: # m = *source; /* m is a free register */ ! 437: movw 0(%r8),%r4 ! 438: # *dest |= (((m >> a) | (*(source-1) << b)) & mask1); ! 439: LRSW3 0(%fp),%r4,%r0 ! 440: LLSW3 4(%fp),-4(%r8),%r1 ! 441: orw2 %r1,%r0 ! 442: andw2 32(%fp),%r0 ! 443: orw2 %r0,0(%r7) ! 444: addw2 %r6,%r8 ! 445: addw2 %r5,%r7 ! 446: .L70: ! 447: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 448: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 449: # } while (--h > 0); ! 450: subw2 &1,12(%fp) ! 451: jpos .L71 ! 452: .L69: ! 453: jmp .L53 ! 454: .L76: ! 455: # break; ! 456: # case F_OR | NOSHIFT: ! 457: # b = w>>2; ! 458: LRSW3 &2,16(%fp),%r0 ! 459: movw %r0,4(%fp) ! 460: # w = w&3; ! 461: andw3 &3,16(%fp),%r0 ! 462: movw %r0,16(%fp) ! 463: # m = h; /* m is free => use it */ ! 464: movw 12(%fp),%r4 ! 465: .L79: ! 466: # do { ! 467: # *dest++ |= (mask1 & *source++); ! 468: movw %r7,%r0 ! 469: addw2 &4,%r7 ! 470: movw %r8,%r1 ! 471: addw2 &4,%r8 ! 472: andw3 0(%r1),32(%fp),%r1 ! 473: orw2 %r1,0(%r0) ! 474: # if ((i = b) > 0) do { ! 475: movw 4(%fp),%r3 ! 476: jnpos .L80 ! 477: .L83: ! 478: # *dest |= *source; ! 479: orw2 0(%r8),0(%r7) ! 480: # *(dest+1) |= *(source+1); ! 481: orw2 4(%r8),4(%r7) ! 482: # *(dest+2) |= *(source+2); ! 483: orw2 8(%r8),8(%r7) ! 484: # *(dest+3) |= *(source+3); ! 485: orw2 12(%r8),12(%r7) ! 486: # dest += 4; ! 487: addw2 &16,%r7 ! 488: # source += 4; ! 489: addw2 &16,%r8 ! 490: .L82: ! 491: # } while (--i > 0); ! 492: subw2 &1,%r3 ! 493: jpos .L83 ! 494: .L81: ! 495: .L80: ! 496: # if ((i = w) > 0) do { ! 497: movw 16(%fp),%r3 ! 498: jnpos .L84 ! 499: .L87: ! 500: # *dest++ |= *source++; ! 501: movw %r7,%r0 ! 502: addw2 &4,%r7 ! 503: movw %r8,%r1 ! 504: addw2 &4,%r8 ! 505: orw2 0(%r1),0(%r0) ! 506: .L86: ! 507: # } while (--i > 0); ! 508: subw2 &1,%r3 ! 509: jpos .L87 ! 510: .L85: ! 511: .L84: ! 512: # *dest |= (mask2 & *source); ! 513: andw3 0(%r8),36(%fp),%r0 ! 514: orw2 %r0,0(%r7) ! 515: addw2 %r6,%r8 ! 516: addw2 %r5,%r7 ! 517: .L78: ! 518: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 519: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 520: # } while (--m != 0); ! 521: subw2 &1,%r4 ! 522: jnz .L79 ! 523: .L77: ! 524: jmp .L53 ! 525: .L88: ! 526: # break; ! 527: # case F_OR: ! 528: # if ((px31) > (rx31)) ! 529: cmpw 24(%fp),28(%fp) ! 530: jle .L89 ! 531: # source--; /* adjust for pipeline */ ! 532: subw2 &4,%r8 ! 533: .L89: ! 534: .L92: ! 535: # do { ! 536: # m = *source++; /* m is a free register */ ! 537: movw %r8,%r0 ! 538: addw2 &4,%r8 ! 539: movw 0(%r0),%r4 ! 540: # *dest++ |= (((m << b) | (*source >> a)) & mask1); ! 541: movw %r7,%r0 ! 542: addw2 &4,%r7 ! 543: LLSW3 4(%fp),%r4,%r1 ! 544: LRSW3 0(%fp),0(%r8),%r2 ! 545: orw2 %r2,%r1 ! 546: andw2 32(%fp),%r1 ! 547: orw2 %r1,0(%r0) ! 548: # if ((i=w) > 0) do { ! 549: movw 16(%fp),%r3 ! 550: jnpos .L93 ! 551: .L96: ! 552: # m = (*source++) << b; ! 553: movw %r8,%r0 ! 554: addw2 &4,%r8 ! 555: LLSW3 4(%fp),0(%r0),%r0 ! 556: movw %r0,%r4 ! 557: # *dest++ |= m | (*source >> a); ! 558: movw %r7,%r0 ! 559: addw2 &4,%r7 ! 560: LRSW3 0(%fp),0(%r8),%r1 ! 561: orw2 %r4,%r1 ! 562: orw2 %r1,0(%r0) ! 563: .L95: ! 564: # } while (--i > 0); ! 565: subw2 &1,%r3 ! 566: jpos .L96 ! 567: .L94: ! 568: .L93: ! 569: # m = *source; /* m is a free register */ ! 570: movw 0(%r8),%r4 ! 571: # *dest |= (((m << b) | (*(source+1) >> a)) & mask2); ! 572: LLSW3 4(%fp),%r4,%r0 ! 573: LRSW3 0(%fp),4(%r8),%r1 ! 574: orw2 %r1,%r0 ! 575: andw2 36(%fp),%r0 ! 576: orw2 %r0,0(%r7) ! 577: addw2 %r6,%r8 ! 578: addw2 %r5,%r7 ! 579: .L91: ! 580: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 581: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 582: # } while (--h > 0); ! 583: subw2 &1,12(%fp) ! 584: jpos .L92 ! 585: .L90: ! 586: jmp .L53 ! 587: .L97: ! 588: # break; ! 589: # case F_CLR | NOSHIFT | LEFTDIR: ! 590: # b = w>>2; ! 591: LRSW3 &2,16(%fp),%r0 ! 592: movw %r0,4(%fp) ! 593: # w = w&3; ! 594: andw3 &3,16(%fp),%r0 ! 595: movw %r0,16(%fp) ! 596: # m = h; /* m is free => use it */ ! 597: movw 12(%fp),%r4 ! 598: .L100: ! 599: # do { ! 600: # *dest-- &= ~(mask2 & *source--); ! 601: movw %r7,%r0 ! 602: subw2 &4,%r7 ! 603: movw %r8,%r1 ! 604: subw2 &4,%r8 ! 605: andw3 0(%r1),36(%fp),%r1 ! 606: mcomw %r1,%r1 ! 607: andw2 %r1,0(%r0) ! 608: # if ((i = b) > 0) do { ! 609: movw 4(%fp),%r3 ! 610: jnpos .L101 ! 611: .L104: ! 612: # *dest &= ~(*source); ! 613: mcomw 0(%r8),%r0 ! 614: andw2 %r0,0(%r7) ! 615: # *(dest-1) &= ~(*(source-1)); ! 616: mcomw -4(%r8),%r0 ! 617: andw2 %r0,-4(%r7) ! 618: # *(dest-2) &= ~(*(source-2)); ! 619: mcomw -8(%r8),%r0 ! 620: andw2 %r0,-8(%r7) ! 621: # *(dest-3) &= ~(*(source-3)); ! 622: mcomw -12(%r8),%r0 ! 623: andw2 %r0,-12(%r7) ! 624: # dest -= 4; ! 625: subw2 &16,%r7 ! 626: # source -= 4; ! 627: subw2 &16,%r8 ! 628: .L103: ! 629: # } while (--i > 0); ! 630: subw2 &1,%r3 ! 631: jpos .L104 ! 632: .L102: ! 633: .L101: ! 634: # if ((i = w) > 0) do { ! 635: movw 16(%fp),%r3 ! 636: jnpos .L105 ! 637: .L108: ! 638: # *dest-- &= ~(*source--); ! 639: movw %r7,%r0 ! 640: subw2 &4,%r7 ! 641: movw %r8,%r1 ! 642: subw2 &4,%r8 ! 643: mcomw 0(%r1),%r1 ! 644: andw2 %r1,0(%r0) ! 645: .L107: ! 646: # } while (--i > 0); ! 647: subw2 &1,%r3 ! 648: jpos .L108 ! 649: .L106: ! 650: .L105: ! 651: # *dest &= ~(mask1 & *source); ! 652: andw3 0(%r8),32(%fp),%r0 ! 653: mcomw %r0,%r0 ! 654: andw2 %r0,0(%r7) ! 655: addw2 %r6,%r8 ! 656: addw2 %r5,%r7 ! 657: .L99: ! 658: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 659: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 660: # } while (--m != 0); ! 661: subw2 &1,%r4 ! 662: jnz .L100 ! 663: .L98: ! 664: jmp .L53 ! 665: .L109: ! 666: # break; ! 667: # case F_CLR | LEFTDIR: ! 668: # if ((px31) < (rx31)) ! 669: cmpw 24(%fp),28(%fp) ! 670: jge .L110 ! 671: # source++; /* adjust for pipeline */ ! 672: addw2 &4,%r8 ! 673: .L110: ! 674: .L113: ! 675: # do { ! 676: # m = *source--; /* m is a free register */ ! 677: movw %r8,%r0 ! 678: subw2 &4,%r8 ! 679: movw 0(%r0),%r4 ! 680: # *dest-- &= ~((((m >> a) | (*source << b)) & mask2)); ! 681: movw %r7,%r0 ! 682: subw2 &4,%r7 ! 683: LRSW3 0(%fp),%r4,%r1 ! 684: LLSW3 4(%fp),0(%r8),%r2 ! 685: orw2 %r2,%r1 ! 686: andw2 36(%fp),%r1 ! 687: mcomw %r1,%r1 ! 688: andw2 %r1,0(%r0) ! 689: # if ((i=w) > 0) do { ! 690: movw 16(%fp),%r3 ! 691: jnpos .L114 ! 692: .L117: ! 693: # m = (*source--) >> a; ! 694: movw %r8,%r0 ! 695: subw2 &4,%r8 ! 696: LRSW3 0(%fp),0(%r0),%r0 ! 697: movw %r0,%r4 ! 698: # *dest-- &= ~(m | (*source << b)); ! 699: movw %r7,%r0 ! 700: subw2 &4,%r7 ! 701: LLSW3 4(%fp),0(%r8),%r1 ! 702: orw2 %r4,%r1 ! 703: mcomw %r1,%r1 ! 704: andw2 %r1,0(%r0) ! 705: .L116: ! 706: # } while (--i > 0); ! 707: subw2 &1,%r3 ! 708: jpos .L117 ! 709: .L115: ! 710: .L114: ! 711: # m = *source; /* m is a free register */ ! 712: movw 0(%r8),%r4 ! 713: # *dest &= ~((((m >> a) | (*(source-1) << b)) & mask1)); ! 714: LRSW3 0(%fp),%r4,%r0 ! 715: LLSW3 4(%fp),-4(%r8),%r1 ! 716: orw2 %r1,%r0 ! 717: andw2 32(%fp),%r0 ! 718: mcomw %r0,%r0 ! 719: andw2 %r0,0(%r7) ! 720: addw2 %r6,%r8 ! 721: addw2 %r5,%r7 ! 722: .L112: ! 723: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 724: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 725: # } while (--h > 0); ! 726: subw2 &1,12(%fp) ! 727: jpos .L113 ! 728: .L111: ! 729: jmp .L53 ! 730: .L118: ! 731: # break; ! 732: # case F_CLR | NOSHIFT: ! 733: # b = w>>2; ! 734: LRSW3 &2,16(%fp),%r0 ! 735: movw %r0,4(%fp) ! 736: # w = w&3; ! 737: andw3 &3,16(%fp),%r0 ! 738: movw %r0,16(%fp) ! 739: # m = h; /* m is free => use it */ ! 740: movw 12(%fp),%r4 ! 741: .L121: ! 742: # do { ! 743: # *dest++ &= ~((mask1 & *source++)); ! 744: movw %r7,%r0 ! 745: addw2 &4,%r7 ! 746: movw %r8,%r1 ! 747: addw2 &4,%r8 ! 748: andw3 0(%r1),32(%fp),%r1 ! 749: mcomw %r1,%r1 ! 750: andw2 %r1,0(%r0) ! 751: # if ((i = b) > 0) do { ! 752: movw 4(%fp),%r3 ! 753: jnpos .L122 ! 754: .L125: ! 755: # *dest &= ~(*source); ! 756: mcomw 0(%r8),%r0 ! 757: andw2 %r0,0(%r7) ! 758: # *(dest+1) &= ~(*(source+1)); ! 759: mcomw 4(%r8),%r0 ! 760: andw2 %r0,4(%r7) ! 761: # *(dest+2) &= ~(*(source+2)); ! 762: mcomw 8(%r8),%r0 ! 763: andw2 %r0,8(%r7) ! 764: # *(dest+3) &= ~(*(source+3)); ! 765: mcomw 12(%r8),%r0 ! 766: andw2 %r0,12(%r7) ! 767: # dest += 4; ! 768: addw2 &16,%r7 ! 769: # source += 4; ! 770: addw2 &16,%r8 ! 771: .L124: ! 772: # } while (--i > 0); ! 773: subw2 &1,%r3 ! 774: jpos .L125 ! 775: .L123: ! 776: .L122: ! 777: # if ((i = w) > 0) do { ! 778: movw 16(%fp),%r3 ! 779: jnpos .L126 ! 780: .L129: ! 781: # *dest++ &= ~(*source++); ! 782: movw %r7,%r0 ! 783: addw2 &4,%r7 ! 784: movw %r8,%r1 ! 785: addw2 &4,%r8 ! 786: mcomw 0(%r1),%r1 ! 787: andw2 %r1,0(%r0) ! 788: .L128: ! 789: # } while (--i > 0); ! 790: subw2 &1,%r3 ! 791: jpos .L129 ! 792: .L127: ! 793: .L126: ! 794: # *dest &= ~((mask2 & *source)); ! 795: andw3 0(%r8),36(%fp),%r0 ! 796: mcomw %r0,%r0 ! 797: andw2 %r0,0(%r7) ! 798: addw2 %r6,%r8 ! 799: addw2 %r5,%r7 ! 800: .L120: ! 801: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 802: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 803: # } while (--m != 0); ! 804: subw2 &1,%r4 ! 805: jnz .L121 ! 806: .L119: ! 807: jmp .L53 ! 808: .L130: ! 809: # break; ! 810: # case F_CLR: ! 811: # if ((px31) > (rx31)) ! 812: cmpw 24(%fp),28(%fp) ! 813: jle .L131 ! 814: # source--; /* adjust for pipeline */ ! 815: subw2 &4,%r8 ! 816: .L131: ! 817: .L134: ! 818: # do { ! 819: # m = *source++; /* m is a free register */ ! 820: movw %r8,%r0 ! 821: addw2 &4,%r8 ! 822: movw 0(%r0),%r4 ! 823: # *dest++ &= ~((((m << b) | (*source >> a)) & mask1)); ! 824: movw %r7,%r0 ! 825: addw2 &4,%r7 ! 826: LLSW3 4(%fp),%r4,%r1 ! 827: LRSW3 0(%fp),0(%r8),%r2 ! 828: orw2 %r2,%r1 ! 829: andw2 32(%fp),%r1 ! 830: mcomw %r1,%r1 ! 831: andw2 %r1,0(%r0) ! 832: # if ((i=w) > 0) do { ! 833: movw 16(%fp),%r3 ! 834: jnpos .L135 ! 835: .L138: ! 836: # m = (*source++) << b; ! 837: movw %r8,%r0 ! 838: addw2 &4,%r8 ! 839: LLSW3 4(%fp),0(%r0),%r0 ! 840: movw %r0,%r4 ! 841: # *dest++ &= ~(m | (*source >> a)); ! 842: movw %r7,%r0 ! 843: addw2 &4,%r7 ! 844: LRSW3 0(%fp),0(%r8),%r1 ! 845: orw2 %r4,%r1 ! 846: mcomw %r1,%r1 ! 847: andw2 %r1,0(%r0) ! 848: .L137: ! 849: # } while (--i > 0); ! 850: subw2 &1,%r3 ! 851: jpos .L138 ! 852: .L136: ! 853: .L135: ! 854: # m = *source; /* m is a free register */ ! 855: movw 0(%r8),%r4 ! 856: # *dest &= ~((((m << b) | (*(source+1) >> a)) & mask2)); ! 857: LLSW3 4(%fp),%r4,%r0 ! 858: LRSW3 0(%fp),4(%r8),%r1 ! 859: orw2 %r1,%r0 ! 860: andw2 36(%fp),%r0 ! 861: mcomw %r0,%r0 ! 862: andw2 %r0,0(%r7) ! 863: addw2 %r6,%r8 ! 864: addw2 %r5,%r7 ! 865: .L133: ! 866: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 867: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 868: # } while (--h > 0); ! 869: subw2 &1,12(%fp) ! 870: jpos .L134 ! 871: .L132: ! 872: jmp .L53 ! 873: .L139: ! 874: # break; ! 875: # case F_XOR | NOSHIFT | LEFTDIR: ! 876: # b = w>>2; ! 877: LRSW3 &2,16(%fp),%r0 ! 878: movw %r0,4(%fp) ! 879: # w = w&3; ! 880: andw3 &3,16(%fp),%r0 ! 881: movw %r0,16(%fp) ! 882: # m = h; /* m is free => use it */ ! 883: movw 12(%fp),%r4 ! 884: .L142: ! 885: # do { ! 886: # *dest-- ^= mask2 & *source--; ! 887: movw %r7,%r0 ! 888: subw2 &4,%r7 ! 889: movw %r8,%r1 ! 890: subw2 &4,%r8 ! 891: andw3 0(%r1),36(%fp),%r1 ! 892: xorw2 %r1,0(%r0) ! 893: # if ((i = b) > 0) do { ! 894: movw 4(%fp),%r3 ! 895: jnpos .L143 ! 896: .L146: ! 897: # *dest ^= *source; ! 898: xorw2 0(%r8),0(%r7) ! 899: # *(dest-1) ^= *(source-1); ! 900: xorw2 -4(%r8),-4(%r7) ! 901: # *(dest-2) ^= *(source-2); ! 902: xorw2 -8(%r8),-8(%r7) ! 903: # *(dest-3) ^= *(source-3); ! 904: xorw2 -12(%r8),-12(%r7) ! 905: # dest -= 4; ! 906: subw2 &16,%r7 ! 907: # source -= 4; ! 908: subw2 &16,%r8 ! 909: .L145: ! 910: # } while (--i > 0); ! 911: subw2 &1,%r3 ! 912: jpos .L146 ! 913: .L144: ! 914: .L143: ! 915: # if ((i = w) > 0) do { ! 916: movw 16(%fp),%r3 ! 917: jnpos .L147 ! 918: .L150: ! 919: # *dest-- ^= *source--; ! 920: movw %r7,%r0 ! 921: subw2 &4,%r7 ! 922: movw %r8,%r1 ! 923: subw2 &4,%r8 ! 924: xorw2 0(%r1),0(%r0) ! 925: .L149: ! 926: # } while (--i > 0); ! 927: subw2 &1,%r3 ! 928: jpos .L150 ! 929: .L148: ! 930: .L147: ! 931: # *dest ^= mask1 & *source; ! 932: andw3 0(%r8),32(%fp),%r0 ! 933: xorw2 %r0,0(%r7) ! 934: addw2 %r6,%r8 ! 935: addw2 %r5,%r7 ! 936: .L141: ! 937: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 938: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 939: # } while (--m != 0); ! 940: subw2 &1,%r4 ! 941: jnz .L142 ! 942: .L140: ! 943: jmp .L53 ! 944: .L151: ! 945: # break; ! 946: # case F_XOR | LEFTDIR: ! 947: # if ((px31) < (rx31)) ! 948: cmpw 24(%fp),28(%fp) ! 949: jge .L152 ! 950: # source++; /* adjust for pipeline */ ! 951: addw2 &4,%r8 ! 952: .L152: ! 953: .L155: ! 954: # do { ! 955: # m = *source--; /* m is a free register */ ! 956: movw %r8,%r0 ! 957: subw2 &4,%r8 ! 958: movw 0(%r0),%r4 ! 959: # *dest-- ^= (((m >> a) | (*source << b)) & mask2); ! 960: movw %r7,%r0 ! 961: subw2 &4,%r7 ! 962: LRSW3 0(%fp),%r4,%r1 ! 963: LLSW3 4(%fp),0(%r8),%r2 ! 964: orw2 %r2,%r1 ! 965: andw2 36(%fp),%r1 ! 966: xorw2 %r1,0(%r0) ! 967: # if ((i=w) > 0) do { ! 968: movw 16(%fp),%r3 ! 969: jnpos .L156 ! 970: .L159: ! 971: # m = (*source--) >> a; ! 972: movw %r8,%r0 ! 973: subw2 &4,%r8 ! 974: LRSW3 0(%fp),0(%r0),%r0 ! 975: movw %r0,%r4 ! 976: # *dest-- ^= m | (*source << b); ! 977: movw %r7,%r0 ! 978: subw2 &4,%r7 ! 979: LLSW3 4(%fp),0(%r8),%r1 ! 980: orw2 %r4,%r1 ! 981: xorw2 %r1,0(%r0) ! 982: .L158: ! 983: # } while (--i > 0); ! 984: subw2 &1,%r3 ! 985: jpos .L159 ! 986: .L157: ! 987: .L156: ! 988: # m = *source; /* m is a free register */ ! 989: movw 0(%r8),%r4 ! 990: # *dest ^= (((m >> a) | (*(source-1) << b)) & mask1); ! 991: LRSW3 0(%fp),%r4,%r0 ! 992: LLSW3 4(%fp),-4(%r8),%r1 ! 993: orw2 %r1,%r0 ! 994: andw2 32(%fp),%r0 ! 995: xorw2 %r0,0(%r7) ! 996: addw2 %r6,%r8 ! 997: addw2 %r5,%r7 ! 998: .L154: ! 999: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 1000: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 1001: # } while (--h > 0); ! 1002: subw2 &1,12(%fp) ! 1003: jpos .L155 ! 1004: .L153: ! 1005: jmp .L53 ! 1006: .L160: ! 1007: # break; ! 1008: # case F_XOR | NOSHIFT: ! 1009: # b = w>>2; ! 1010: LRSW3 &2,16(%fp),%r0 ! 1011: movw %r0,4(%fp) ! 1012: # w = w&3; ! 1013: andw3 &3,16(%fp),%r0 ! 1014: movw %r0,16(%fp) ! 1015: # m = h; /* m is free => use it */ ! 1016: movw 12(%fp),%r4 ! 1017: .L163: ! 1018: # do { ! 1019: # *dest++ ^= (mask1 & *source++); ! 1020: movw %r7,%r0 ! 1021: addw2 &4,%r7 ! 1022: movw %r8,%r1 ! 1023: addw2 &4,%r8 ! 1024: andw3 0(%r1),32(%fp),%r1 ! 1025: xorw2 %r1,0(%r0) ! 1026: # if ((i = b) > 0) do { ! 1027: movw 4(%fp),%r3 ! 1028: jnpos .L164 ! 1029: .L167: ! 1030: # *dest ^= *source; ! 1031: xorw2 0(%r8),0(%r7) ! 1032: # *(dest+1) ^= *(source+1); ! 1033: xorw2 4(%r8),4(%r7) ! 1034: # *(dest+2) ^= *(source+2); ! 1035: xorw2 8(%r8),8(%r7) ! 1036: # *(dest+3) ^= *(source+3); ! 1037: xorw2 12(%r8),12(%r7) ! 1038: # dest += 4; ! 1039: addw2 &16,%r7 ! 1040: # source += 4; ! 1041: addw2 &16,%r8 ! 1042: .L166: ! 1043: # } while (--i > 0); ! 1044: subw2 &1,%r3 ! 1045: jpos .L167 ! 1046: .L165: ! 1047: .L164: ! 1048: # if ((i = w) > 0) do { ! 1049: movw 16(%fp),%r3 ! 1050: jnpos .L168 ! 1051: .L171: ! 1052: # *dest++ ^= *source++; ! 1053: movw %r7,%r0 ! 1054: addw2 &4,%r7 ! 1055: movw %r8,%r1 ! 1056: addw2 &4,%r8 ! 1057: xorw2 0(%r1),0(%r0) ! 1058: .L170: ! 1059: # } while (--i > 0); ! 1060: subw2 &1,%r3 ! 1061: jpos .L171 ! 1062: .L169: ! 1063: .L168: ! 1064: # *dest ^= (mask2 & *source); ! 1065: andw3 0(%r8),36(%fp),%r0 ! 1066: xorw2 %r0,0(%r7) ! 1067: addw2 %r6,%r8 ! 1068: addw2 %r5,%r7 ! 1069: .L162: ! 1070: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 1071: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 1072: # } while (--m != 0); ! 1073: subw2 &1,%r4 ! 1074: jnz .L163 ! 1075: .L161: ! 1076: jmp .L53 ! 1077: .L172: ! 1078: # break; ! 1079: # case F_XOR: ! 1080: # if ((px31) > (rx31)) ! 1081: cmpw 24(%fp),28(%fp) ! 1082: jle .L173 ! 1083: # source--; /* adjust for pipeline */ ! 1084: subw2 &4,%r8 ! 1085: .L173: ! 1086: PUSHW %ap ! 1087: # asm(" PUSHW %ap"); ! 1088: # m = topbits[a]; ! 1089: LLSW3 &2,0(%fp),%r0 ! 1090: movw topbits(%r0),%r4 ! 1091: MCOMW %r4, %r1 ! 1092: MOVW %r4, %r2 ! 1093: MOVW 0(%fp),%ap ! 1094: PUSHW %fp ! 1095: BW_XORLOOP: ! 1096: ROTW %ap, 0(%r8), %r4 ! 1097: ANDW2 %r2,%r4 ! 1098: ADDW2 &4,%r8 ! 1099: ROTW %ap,0(%r8),%r0 ! 1100: ANDW3 %r0,%r1,%fp ! 1101: ORW2 %r4,%fp ! 1102: ANDW2 -0x28(%sp),%fp ! 1103: XORW2 %fp,0(%r7) ! 1104: ADDW2 &4,%r7 ! 1105: MOVW -0x38(%sp),%r3 ! 1106: BEB BW_XORINNER ! 1107: .L176: ! 1108: ANDW3 %r2,%r0,%r4 ! 1109: ADDW2 &4,%r8 ! 1110: ROTW %ap, 0(%r8),%r0 ! 1111: ANDW3 %r0,%r1,%fp ! 1112: ORW2 %r4,%fp ! 1113: XORW2 %fp,0(%r7) ! 1114: ADDW2 &4, %r7 ! 1115: .L175: ! 1116: # asm(" MCOMW %r4, %r1"); ! 1117: # asm(" MOVW %r4, %r2"); ! 1118: # asm(" MOVW 0(%fp),%ap"); ! 1119: # asm(" PUSHW %fp"); ! 1120: # asm("BW_XORLOOP:"); ! 1121: # asm(" ROTW %ap, 0(%r8), %r4"); ! 1122: # asm(" ANDW2 %r2,%r4"); ! 1123: # asm(" ADDW2 &4,%r8"); ! 1124: # asm(" ROTW %ap,0(%r8),%r0"); ! 1125: # asm(" ANDW3 %r0,%r1,%fp"); ! 1126: # asm(" ORW2 %r4,%fp"); ! 1127: # asm(" ANDW2 -0x28(%sp),%fp"); ! 1128: # asm(" XORW2 %fp,0(%r7)"); ! 1129: # asm(" ADDW2 &4,%r7"); ! 1130: # /* if (i = w) */ ! 1131: # asm(" MOVW -0x38(%sp),%r3"); ! 1132: # asm(" BEB BW_XORINNER"); ! 1133: # do{ ! 1134: # asm(" ANDW3 %r2,%r0,%r4"); ! 1135: # asm(" ADDW2 &4,%r8"); ! 1136: # asm(" ROTW %ap, 0(%r8),%r0"); ! 1137: # asm(" ANDW3 %r0,%r1,%fp"); ! 1138: # asm(" ORW2 %r4,%fp"); ! 1139: # asm(" XORW2 %fp,0(%r7)"); ! 1140: # asm(" ADDW2 &4, %r7"); ! 1141: # } while (--i > 0); ! 1142: subw2 &1,%r3 ! 1143: jpos .L176 ! 1144: .L174: ! 1145: BW_XORINNER: ! 1146: ROTW %ap, 0(%r8),%r4 ! 1147: ANDW2 %r2,%r4 ! 1148: LRSW3 %ap, 4(%r8),%r0 ! 1149: ORW2 %r4,%r0 ! 1150: ANDW2 -0x24(%sp),%r0 ! 1151: XORW2 %r0,0(%r7) ! 1152: ADDW2 %r6,%r8 ! 1153: ADDW2 %r5,%r7 ! 1154: DECW -0x3c(%sp) ! 1155: BGB BW_XORLOOP ! 1156: POPW %fp ! 1157: POPW %ap ! 1158: jmp .L53 ! 1159: .L177: ! 1160: # asm("BW_XORINNER:"); ! 1161: # asm(" ROTW %ap, 0(%r8),%r4"); ! 1162: # asm(" ANDW2 %r2,%r4"); ! 1163: # asm(" LRSW3 %ap, 4(%r8),%r0"); ! 1164: # asm(" ORW2 %r4,%r0"); ! 1165: # asm(" ANDW2 -0x24(%sp),%r0"); ! 1166: # asm(" XORW2 %r0,0(%r7)"); ! 1167: # asm(" ADDW2 %r6,%r8"); /*source += sw; */ ! 1168: # asm(" ADDW2 %r5,%r7"); /*dest += dw; */ ! 1169: # /* } while (--h > 0); */ ! 1170: # asm(" DECW -0x3c(%sp)"); ! 1171: # asm(" BGB BW_XORLOOP"); ! 1172: # ! 1173: # asm(" POPW %fp"); ! 1174: # asm(" POPW %ap"); ! 1175: # ! 1176: # /* above is similar to: ! 1177: # /* do { ! 1178: # /* m = *source++ << b; /* m is a free register */ ! 1179: # /* *dest++ ^= ((m & LMASK) | ((*source >> a)& RMASK) & mask1); ! 1180: # /* if ((i=w) > 0) do { ! 1181: # /* m = ((*source++) << b) & LMASK; ! 1182: # /* *dest++ ^= m | ((*source >> a)&RMASK); ! 1183: # /* } while (--i > 0); ! 1184: # /* m = *source; /* m is a free register */ ! 1185: # /* *dest ^= (((m << b) | (*(source+1) >> a)) & mask2); ! 1186: # /* asm(" addw2 %r6,%r8"); /*source += sw; */ ! 1187: # /* asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 1188: # /* } while (--h > 0); */ ! 1189: # break; ! 1190: # case F_STORE | NOSHIFT | LEFTDIR: ! 1191: # b = w>>2; ! 1192: LRSW3 &2,16(%fp),%r0 ! 1193: movw %r0,4(%fp) ! 1194: # w = w&3; ! 1195: andw3 &3,16(%fp),%r0 ! 1196: movw %r0,16(%fp) ! 1197: # m = h; /* m is free => use it */ ! 1198: movw 12(%fp),%r4 ! 1199: .L180: ! 1200: # do { ! 1201: # *dest = (ntmask2 & *dest) | (mask2 & *source--); ! 1202: andw3 0(%r7),52(%fp),%r0 ! 1203: movw %r8,%r1 ! 1204: subw2 &4,%r8 ! 1205: andw3 0(%r1),36(%fp),%r1 ! 1206: orw2 %r1,%r0 ! 1207: movw %r0,0(%r7) ! 1208: # --dest; ! 1209: subw2 &4,%r7 ! 1210: # if ((i = b) > 0) do { ! 1211: movw 4(%fp),%r3 ! 1212: jnpos .L181 ! 1213: .L184: ! 1214: # *dest = *source; ! 1215: movw 0(%r8),0(%r7) ! 1216: # *(dest-1) = *(source-1); ! 1217: movw -4(%r8),-4(%r7) ! 1218: # *(dest-2) = *(source-2); ! 1219: movw -8(%r8),-8(%r7) ! 1220: # *(dest-3) = *(source-3); ! 1221: movw -12(%r8),-12(%r7) ! 1222: # dest -= 4; ! 1223: subw2 &16,%r7 ! 1224: # source -= 4; ! 1225: subw2 &16,%r8 ! 1226: .L183: ! 1227: # } while (--i > 0); ! 1228: subw2 &1,%r3 ! 1229: jpos .L184 ! 1230: .L182: ! 1231: .L181: ! 1232: # if ((i = w) > 0) do { ! 1233: movw 16(%fp),%r3 ! 1234: jnpos .L185 ! 1235: .L188: ! 1236: # *dest-- = *source--; ! 1237: movw %r7,%r0 ! 1238: subw2 &4,%r7 ! 1239: movw %r8,%r1 ! 1240: subw2 &4,%r8 ! 1241: movw 0(%r1),0(%r0) ! 1242: .L187: ! 1243: # } while (--i > 0); ! 1244: subw2 &1,%r3 ! 1245: jpos .L188 ! 1246: .L186: ! 1247: .L185: ! 1248: # *dest = (ntmask1 & *dest) | (mask1 & *source); ! 1249: andw3 0(%r7),48(%fp),%r0 ! 1250: andw3 0(%r8),32(%fp),%r1 ! 1251: orw2 %r1,%r0 ! 1252: movw %r0,0(%r7) ! 1253: addw2 %r6,%r8 ! 1254: addw2 %r5,%r7 ! 1255: .L179: ! 1256: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 1257: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 1258: # } while (--m != 0); ! 1259: subw2 &1,%r4 ! 1260: jnz .L180 ! 1261: .L178: ! 1262: jmp .L53 ! 1263: .L189: ! 1264: # break; ! 1265: # case F_STORE | LEFTDIR: ! 1266: # if ((px31) < (rx31)) ! 1267: cmpw 24(%fp),28(%fp) ! 1268: jge .L190 ! 1269: # source++; /* adjust for pipeline */ ! 1270: addw2 &4,%r8 ! 1271: .L190: ! 1272: .L193: ! 1273: # do { ! 1274: # m = *source--; /* m is a free register */ ! 1275: movw %r8,%r0 ! 1276: subw2 &4,%r8 ! 1277: movw 0(%r0),%r4 ! 1278: # *dest = (((m >> a) | (*source << b)) & mask2) | ! 1279: # (*dest & ntmask2); ! 1280: LRSW3 0(%fp),%r4,%r0 ! 1281: LLSW3 4(%fp),0(%r8),%r1 ! 1282: orw2 %r1,%r0 ! 1283: andw2 36(%fp),%r0 ! 1284: andw3 52(%fp),0(%r7),%r1 ! 1285: orw2 %r1,%r0 ! 1286: movw %r0,0(%r7) ! 1287: # --dest; ! 1288: subw2 &4,%r7 ! 1289: # if ((i=w) > 0) do { ! 1290: movw 16(%fp),%r3 ! 1291: jnpos .L194 ! 1292: .L197: ! 1293: # m = (*source--) >> a; ! 1294: movw %r8,%r0 ! 1295: subw2 &4,%r8 ! 1296: LRSW3 0(%fp),0(%r0),%r0 ! 1297: movw %r0,%r4 ! 1298: # *dest-- = m | (*source << b); ! 1299: movw %r7,%r0 ! 1300: subw2 &4,%r7 ! 1301: LLSW3 4(%fp),0(%r8),%r1 ! 1302: orw2 %r4,%r1 ! 1303: movw %r1,0(%r0) ! 1304: .L196: ! 1305: # } while (--i > 0); ! 1306: subw2 &1,%r3 ! 1307: jpos .L197 ! 1308: .L195: ! 1309: .L194: ! 1310: # m = *source; /* m is a free register */ ! 1311: movw 0(%r8),%r4 ! 1312: # *dest = (((m >> a) | (*(source-1) << b)) & mask1) | ! 1313: # (*dest & ntmask1); ! 1314: LRSW3 0(%fp),%r4,%r0 ! 1315: LLSW3 4(%fp),-4(%r8),%r1 ! 1316: orw2 %r1,%r0 ! 1317: andw2 32(%fp),%r0 ! 1318: andw3 48(%fp),0(%r7),%r1 ! 1319: orw2 %r1,%r0 ! 1320: movw %r0,0(%r7) ! 1321: addw2 %r6,%r8 ! 1322: addw2 %r5,%r7 ! 1323: .L192: ! 1324: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 1325: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 1326: # } while (--h > 0); ! 1327: subw2 &1,12(%fp) ! 1328: jpos .L193 ! 1329: .L191: ! 1330: jmp .L53 ! 1331: .L198: ! 1332: # break; ! 1333: # case F_STORE | NOSHIFT: ! 1334: # if (w > 25) ! 1335: cmpw 16(%fp),&25 ! 1336: jle .L199 ! 1337: jmp .L200 ! 1338: .L199: ! 1339: # goto widestore; ! 1340: # i = 25 - w; ! 1341: subw3 16(%fp),&25,%r0 ! 1342: movw %r0,%r3 ! 1343: # m = (i << 2) + (i << 1); ! 1344: LLSW3 &2,%r3,%r0 ! 1345: LLSW3 &1,%r3,%r1 ! 1346: addw2 %r1,%r0 ! 1347: movw %r0,%r4 ! 1348: LLSW3 &0x2,0x10(%fp),%r0 ! 1349: ADDW2 &4,%r0 ! 1350: MOVAW B_FS_N,%r1 ! 1351: ADDW2 %r4,%r1 ! 1352: # ! 1353: # asm(" LLSW3 &0x2,0x10(%fp),%r0"); /* bytewidth in r0*/ ! 1354: # asm(" ADDW2 &4,%r0"); /* r0 +=4 for loop offsets */ ! 1355: # asm(" MOVAW B_FS_N,%r1"); ! 1356: # asm(" ADDW2 %r4,%r1"); /* r1 += &label, or jump addr*/ ! 1357: # m = h; /* m is free reg, use it as height */ ! 1358: movw 12(%fp),%r4 ! 1359: MOVW 0x20(%fp),%r2 ! 1360: PUSHW %ap ! 1361: MOVW 0x24(%fp),%ap ! 1362: PUSHW %fp ! 1363: MOVW %r1,%fp ! 1364: .L203: ! 1365: XORW3 0(%r7),0(%r8),%r1 ! 1366: ANDW2 %r2,%r1 ! 1367: XORW2 %r1,0(%r7) ! 1368: JMP 0(%fp) ! 1369: B_FS_N: ! 1370: MOVW 0x64(%r8),0x64(%r7) ! 1371: MOVW 0x60(%r8),0x60(%r7) ! 1372: MOVW 0x5c(%r8),0x5c(%r7) ! 1373: MOVW 0x58(%r8),0x58(%r7) ! 1374: MOVW 0x54(%r8),0x54(%r7) ! 1375: MOVW 0x50(%r8),0x50(%r7) ! 1376: MOVW 0x4c(%r8),0x4c(%r7) ! 1377: MOVW 0x48(%r8),0x48(%r7) ! 1378: MOVW 0x44(%r8),0x44(%r7) ! 1379: MOVW 0x40(%r8),0x40(%r7) ! 1380: MOVW 0x3c(%r8),0x3c(%r7) ! 1381: MOVW 0x38(%r8),0x38(%r7) ! 1382: MOVW 0x34(%r8),0x34(%r7) ! 1383: MOVW 0x30(%r8),0x30(%r7) ! 1384: MOVW 0x2c(%r8),0x2c(%r7) ! 1385: MOVW 0x28(%r8),0x28(%r7) ! 1386: MOVW 0x24(%r8),0x24(%r7) ! 1387: MOVW 0x20(%r8),0x20(%r7) ! 1388: MOVW 0x1c(%r8),0x1c(%r7) ! 1389: MOVW 0x18(%r8),0x18(%r7) ! 1390: MOVW 0x14(%r8),0x14(%r7) ! 1391: MOVW 0x10(%r8),0x10(%r7) ! 1392: MOVW 0xc(%r8),0xc(%r7) ! 1393: MOVW 0x8(%r8),0x8(%r7) ! 1394: MOVW 0x4(%r8),0x4(%r7) ! 1395: ADDW2 %r0,%r8 ! 1396: ADDW2 %r0,%r7 ! 1397: XORW3 0(%r7),0(%r8),%r1 ! 1398: ANDW2 %ap,%r1 ! 1399: XORW2 %r1,0(%r7) ! 1400: ADDW2 %r6,%r8 ! 1401: ADDW2 %r5,%r7 ! 1402: .L202: ! 1403: # asm(" MOVW 0x20(%fp),%r2"); /* r2 = mask1 */ ! 1404: # asm(" PUSHW %ap"); /* save fp and ap */ ! 1405: # asm(" MOVW 0x24(%fp),%ap"); /* ap = mask2 */ ! 1406: # asm(" PUSHW %fp"); ! 1407: # asm(" MOVW %r1,%fp"); /* put jump index into fp */ ! 1408: # ! 1409: # do{ ! 1410: # ! 1411: # asm(" XORW3 0(%r7),0(%r8),%r1"); ! 1412: # asm(" ANDW2 %r2,%r1"); ! 1413: # asm(" XORW2 %r1,0(%r7)"); ! 1414: # ! 1415: # asm(" JMP 0(%fp)"); ! 1416: # asm("B_FS_N: "); /* label */ ! 1417: # asm(" MOVW 0x64(%r8),0x64(%r7)"); ! 1418: # asm(" MOVW 0x60(%r8),0x60(%r7)"); asm(" MOVW 0x5c(%r8),0x5c(%r7)"); ! 1419: # asm(" MOVW 0x58(%r8),0x58(%r7)"); asm(" MOVW 0x54(%r8),0x54(%r7)"); ! 1420: # asm(" MOVW 0x50(%r8),0x50(%r7)"); asm(" MOVW 0x4c(%r8),0x4c(%r7)"); asm(" MOVW 0x48(%r8),0x48(%r7)"); asm(" MOVW 0x44(%r8),0x44(%r7)"); ! 1421: # asm(" MOVW 0x40(%r8),0x40(%r7)"); asm(" MOVW 0x3c(%r8),0x3c(%r7)"); asm(" MOVW 0x38(%r8),0x38(%r7)"); asm(" MOVW 0x34(%r8),0x34(%r7)"); ! 1422: # asm(" MOVW 0x30(%r8),0x30(%r7)"); asm(" MOVW 0x2c(%r8),0x2c(%r7)"); asm(" MOVW 0x28(%r8),0x28(%r7)"); asm(" MOVW 0x24(%r8),0x24(%r7)"); ! 1423: # asm(" MOVW 0x20(%r8),0x20(%r7)"); asm(" MOVW 0x1c(%r8),0x1c(%r7)"); asm(" MOVW 0x18(%r8),0x18(%r7)"); ! 1424: # asm(" MOVW 0x14(%r8),0x14(%r7)"); ! 1425: # asm(" MOVW 0x10(%r8),0x10(%r7)"); ! 1426: # asm(" MOVW 0xc(%r8),0xc(%r7)"); ! 1427: # asm(" MOVW 0x8(%r8),0x8(%r7)"); ! 1428: # asm(" MOVW 0x4(%r8),0x4(%r7)"); ! 1429: # asm(" ADDW2 %r0,%r8"); ! 1430: # asm(" ADDW2 %r0,%r7"); ! 1431: # asm(" XORW3 0(%r7),0(%r8),%r1"); ! 1432: # asm(" ANDW2 %ap,%r1"); /* ap has mask2 */ ! 1433: # asm(" XORW2 %r1,0(%r7)"); ! 1434: # asm(" ADDW2 %r6,%r8"); ! 1435: # asm(" ADDW2 %r5,%r7"); ! 1436: # } while (--m != 0); ! 1437: subw2 &1,%r4 ! 1438: jnz .L203 ! 1439: .L201: ! 1440: POPW %fp ! 1441: POPW %ap ! 1442: jmp .L53 ! 1443: .L200: ! 1444: # asm(" POPW %fp"); ! 1445: # asm(" POPW %ap"); ! 1446: # break; ! 1447: # /* ABOVE ALMOST EQUAL TO : */ ! 1448: # widestore: ! 1449: # b = w >> 2; ! 1450: LRSW3 &2,16(%fp),%r0 ! 1451: movw %r0,4(%fp) ! 1452: # w = w & 3; ! 1453: andw3 &3,16(%fp),%r0 ! 1454: movw %r0,16(%fp) ! 1455: # m = h; ! 1456: movw 12(%fp),%r4 ! 1457: .L206: ! 1458: # do { ! 1459: # *dest = (ntmask1 & *dest) | (mask1 & *source++); ! 1460: andw3 0(%r7),48(%fp),%r0 ! 1461: movw %r8,%r1 ! 1462: addw2 &4,%r8 ! 1463: andw3 0(%r1),32(%fp),%r1 ! 1464: orw2 %r1,%r0 ! 1465: movw %r0,0(%r7) ! 1466: # dest++; ! 1467: addw2 &4,%r7 ! 1468: # if ((i = b) > 0) do { ! 1469: movw 4(%fp),%r3 ! 1470: jnpos .L207 ! 1471: .L210: ! 1472: # *dest = *source; ! 1473: movw 0(%r8),0(%r7) ! 1474: # *(dest+1) = *(source+1); ! 1475: movw 4(%r8),4(%r7) ! 1476: # *(dest+2) = *(source+2); ! 1477: movw 8(%r8),8(%r7) ! 1478: # *(dest+3) = *(source+3); ! 1479: movw 12(%r8),12(%r7) ! 1480: # dest += 4; ! 1481: addw2 &16,%r7 ! 1482: # source += 4; ! 1483: addw2 &16,%r8 ! 1484: .L209: ! 1485: # } while (--i > 0); ! 1486: subw2 &1,%r3 ! 1487: jpos .L210 ! 1488: .L208: ! 1489: .L207: ! 1490: # if ((i = w) > 0) do { ! 1491: movw 16(%fp),%r3 ! 1492: jnpos .L211 ! 1493: .L214: ! 1494: # *dest++ = *source++; ! 1495: movw %r7,%r0 ! 1496: addw2 &4,%r7 ! 1497: movw %r8,%r1 ! 1498: addw2 &4,%r8 ! 1499: movw 0(%r1),0(%r0) ! 1500: .L213: ! 1501: # } while (--i > 0); ! 1502: subw2 &1,%r3 ! 1503: jpos .L214 ! 1504: .L212: ! 1505: .L211: ! 1506: # *dest = (ntmask2 & *dest) | (mask2 & *source); ! 1507: andw3 0(%r7),52(%fp),%r0 ! 1508: andw3 0(%r8),36(%fp),%r1 ! 1509: orw2 %r1,%r0 ! 1510: movw %r0,0(%r7) ! 1511: addw2 %r6,%r8 ! 1512: addw2 %r5,%r7 ! 1513: .L205: ! 1514: # asm(" addw2 %r6,%r8"); ! 1515: # asm(" addw2 %r5,%r7"); ! 1516: # } while (--m != 0); ! 1517: subw2 &1,%r4 ! 1518: jnz .L206 ! 1519: .L204: ! 1520: jmp .L53 ! 1521: .L215: ! 1522: # break; ! 1523: # case F_STORE: ! 1524: # if ((px31) > (rx31)) ! 1525: cmpw 24(%fp),28(%fp) ! 1526: jle .L216 ! 1527: # source--; /* adjust for pipeline */ ! 1528: subw2 &4,%r8 ! 1529: .L216: ! 1530: .L219: ! 1531: # do { ! 1532: # m = *source++; /* m is a free register */ ! 1533: movw %r8,%r0 ! 1534: addw2 &4,%r8 ! 1535: movw 0(%r0),%r4 ! 1536: # *dest = (((m << b) | (*source >> a)) & mask1) | ! 1537: # (*dest & ntmask1); ! 1538: LLSW3 4(%fp),%r4,%r0 ! 1539: LRSW3 0(%fp),0(%r8),%r1 ! 1540: orw2 %r1,%r0 ! 1541: andw2 32(%fp),%r0 ! 1542: andw3 48(%fp),0(%r7),%r1 ! 1543: orw2 %r1,%r0 ! 1544: movw %r0,0(%r7) ! 1545: # dest++; ! 1546: addw2 &4,%r7 ! 1547: # if ((i=w) > 0) do { ! 1548: movw 16(%fp),%r3 ! 1549: jnpos .L220 ! 1550: .L223: ! 1551: # m = (*source++) << b; ! 1552: movw %r8,%r0 ! 1553: addw2 &4,%r8 ! 1554: LLSW3 4(%fp),0(%r0),%r0 ! 1555: movw %r0,%r4 ! 1556: # *dest++ = m | (*source >> a); ! 1557: movw %r7,%r0 ! 1558: addw2 &4,%r7 ! 1559: LRSW3 0(%fp),0(%r8),%r1 ! 1560: orw2 %r4,%r1 ! 1561: movw %r1,0(%r0) ! 1562: .L222: ! 1563: # } while (--i > 0); ! 1564: subw2 &1,%r3 ! 1565: jpos .L223 ! 1566: .L221: ! 1567: .L220: ! 1568: # m = *source; /* m is a free register */ ! 1569: movw 0(%r8),%r4 ! 1570: # *dest = (((m << b) | (*(source+1) >> a)) & mask2) | ! 1571: # (*dest & ntmask2); ! 1572: LLSW3 4(%fp),%r4,%r0 ! 1573: LRSW3 0(%fp),4(%r8),%r1 ! 1574: orw2 %r1,%r0 ! 1575: andw2 36(%fp),%r0 ! 1576: andw3 52(%fp),0(%r7),%r1 ! 1577: orw2 %r1,%r0 ! 1578: movw %r0,0(%r7) ! 1579: addw2 %r6,%r8 ! 1580: addw2 %r5,%r7 ! 1581: .L218: ! 1582: # asm(" addw2 %r6,%r8"); /*source += sw; */ ! 1583: # asm(" addw2 %r5,%r7"); /*dest += dw; */ ! 1584: # } while (--h > 0); ! 1585: subw2 &1,12(%fp) ! 1586: jpos .L219 ! 1587: .L217: ! 1588: jmp .L53 ! 1589: .L54: ! 1590: cmpw %r0,&0 ! 1591: jl .L224 ! 1592: cmpw %r0,&15 ! 1593: jg .L224 ! 1594: ALSW3 &2,%r0,%r0 ! 1595: jmp *.L225(%r0) ! 1596: .data ! 1597: .align 4 ! 1598: #SWBEG ! 1599: .L225: ! 1600: .word .L215 ! 1601: .word .L88 ! 1602: .word .L130 ! 1603: .word .L172 ! 1604: .word .L198 ! 1605: .word .L76 ! 1606: .word .L118 ! 1607: .word .L160 ! 1608: .word .L189 ! 1609: .word .L67 ! 1610: .word .L109 ! 1611: .word .L151 ! 1612: .word .L177 ! 1613: .word .L55 ! 1614: .word .L97 ! 1615: .word .L139 ! 1616: #SWEND ! 1617: .text ! 1618: .L224: ! 1619: .L53: ! 1620: jmp .L31 ! 1621: .L43: ! 1622: # break; ! 1623: # } ! 1624: # ! 1625: # return; ! 1626: # narrow: ! 1627: # /* ! 1628: # * width is 32 bits or less. There are four basic cases ! 1629: # * (in addition to the function code), which depend on whether ! 1630: # * the source and dest straddle word boundaries or not ! 1631: # */ ! 1632: # ! 1633: # m = p.x & 31; /* commonly used expression */ ! 1634: andh3 &31,16(%ap),%r0 ! 1635: movw %r0,%r4 ! 1636: # sw = r.origin.x & 31; /* commonly used expression */ ! 1637: andh3 &31,4(%ap),%r0 ! 1638: movw %r0,%r6 ! 1639: # if (sw + dw > 31) /* if source is NOT aligned */ ! 1640: addw3 %r5,%r6,%r0 ! 1641: cmpw %r0,&31 ! 1642: jle .L226 ! 1643: # { ! 1644: # fc |= S_STRADDLE; ! 1645: orw2 &4,20(%ap) ! 1646: # mask1 = ONES >> sw; ! 1647: LRSW3 %r6,&-1,%r0 ! 1648: movw %r0,32(%fp) ! 1649: # mask2 = topbits[((sw + dw) & 31) + 1]; ! 1650: addw3 %r5,%r6,%r0 ! 1651: andw2 &31,%r0 ! 1652: addw2 &1,%r0 ! 1653: LLSW3 &2,%r0,%r0 ! 1654: movw topbits(%r0),36(%fp) ! 1655: .L226: ! 1656: # } ! 1657: # ! 1658: # if (m + dw > 31) /* if dest is NOT aligned */ ! 1659: addw3 %r5,%r4,%r0 ! 1660: cmpw %r0,&31 ! 1661: jleu .L227 ! 1662: # { ! 1663: # fc |= D_STRADDLE; ! 1664: orw2 &8,20(%ap) ! 1665: # mask3 = ONES >> m; ! 1666: LRSW3 %r4,&-1,%r0 ! 1667: movw %r0,40(%fp) ! 1668: # mask4 = topbits[((m + dw) & 31) + 1]; ! 1669: addw3 %r5,%r4,%r0 ! 1670: andw2 &31,%r0 ! 1671: addw2 &1,%r0 ! 1672: LLSW3 &2,%r0,%r0 ! 1673: movw topbits(%r0),44(%fp) ! 1674: .L227: ! 1675: # } ! 1676: # px31 = m; ! 1677: movw %r4,24(%fp) ! 1678: # m = m - sw; ! 1679: subw3 %r6,%r4,%r0 ! 1680: movw %r0,%r4 ! 1681: # a = dw; ! 1682: movw %r5,0(%fp) ! 1683: # ! 1684: # if ((sm == dm) && (r.origin.y < p.y)) ! 1685: cmpw 0(%ap),12(%ap) ! 1686: jne .L228 ! 1687: cmph 6(%ap),18(%ap) ! 1688: jge .L228 ! 1689: .L229: ! 1690: # { /* may have to mess with loop order */ ! 1691: # r.origin.y += i-1; ! 1692: movtwh %r3,%r0 ! 1693: subh2 &1,%r0 ! 1694: addh2 %r0,6(%ap) ! 1695: # p.y += i-1; ! 1696: movtwh %r3,%r0 ! 1697: subh2 &1,%r0 ! 1698: addh2 %r0,18(%ap) ! 1699: # sw = -(sm->width << 2); /* sleazy hack to avoid shift */ ! 1700: addw3 &4,0(%ap),%r0 ! 1701: LLSW3 &2,0(%r0),%r0 ! 1702: mnegw %r0,%r0 ! 1703: movw %r0,%r6 ! 1704: # dw = -(dm->width << 2); /* in outer, inner loops */ ! 1705: addw3 &4,12(%ap),%r0 ! 1706: LLSW3 &2,0(%r0),%r0 ! 1707: mnegw %r0,%r0 ! 1708: movw %r0,%r5 ! 1709: jmp .L230 ! 1710: .L228: ! 1711: # } ! 1712: # else ! 1713: # { ! 1714: # sw = sm->width << 2; ! 1715: addw3 &4,0(%ap),%r0 ! 1716: LLSW3 &2,0(%r0),%r0 ! 1717: movw %r0,%r6 ! 1718: # dw = dm->width << 2; ! 1719: addw3 &4,12(%ap),%r0 ! 1720: LLSW3 &2,0(%r0),%r0 ! 1721: movw %r0,%r5 ! 1722: .L230: ! 1723: # } ! 1724: # ! 1725: # source = addr(sm,r.origin); ! 1726: pushw 0(%ap) ! 1727: pushw 4(%ap) ! 1728: call &2,addr ! 1729: movw %r0,%r8 ! 1730: # dest = addr(dm,p); ! 1731: pushw 12(%ap) ! 1732: pushw 16(%ap) ! 1733: call &2,addr ! 1734: movw %r0,%r7 ! 1735: # ! 1736: # switch(fc) ! 1737: movw 20(%ap),%r0 ! 1738: jmp .L232 ! 1739: .L233: ! 1740: # { ! 1741: # case F_STORE: ! 1742: # mask1 = topbits[a+1] >> (px31); ! 1743: addw3 &1,0(%fp),%r0 ! 1744: LLSW3 &2,%r0,%r0 ! 1745: LRSW3 24(%fp),topbits(%r0),%r0 ! 1746: movw %r0,32(%fp) ! 1747: MOVW 0x20(%fp),%r1 ! 1748: .L236: ! 1749: ROTW %r4,0(%r8),%r2 ! 1750: XORW2 0(%r7),%r2 ! 1751: ANDW2 %r1,%r2 ! 1752: XORW2 %r2,0(%r7) ! 1753: ADDW2 %r6, %r8 ! 1754: ADDW2 %r5, %r7 ! 1755: .L235: ! 1756: # asm(" MOVW 0x20(%fp),%r1"); ! 1757: # do { ! 1758: # asm(" ROTW %r4,0(%r8),%r2"); ! 1759: # asm(" XORW2 0(%r7),%r2"); ! 1760: # asm(" ANDW2 %r1,%r2"); ! 1761: # asm(" XORW2 %r2,0(%r7)"); ! 1762: # asm(" ADDW2 %r6, %r8"); ! 1763: # asm(" ADDW2 %r5, %r7"); ! 1764: # } while (--i > 0); ! 1765: subw2 &1,%r3 ! 1766: jpos .L236 ! 1767: .L234: ! 1768: jmp .L231 ! 1769: .L237: ! 1770: # break; ! 1771: # case F_STORE | S_STRADDLE: ! 1772: # mask4 = 32 - m; /* REALLY the other shift count */ ! 1773: subw3 %r4,&32,%r0 ! 1774: movw %r0,44(%fp) ! 1775: # mask3 = topbits[a+1] >> px31; ! 1776: addw3 &1,0(%fp),%r0 ! 1777: LLSW3 &2,%r0,%r0 ! 1778: LRSW3 24(%fp),topbits(%r0),%r0 ! 1779: movw %r0,40(%fp) ! 1780: PUSHW %ap ! 1781: MOVW 0x28(%fp),%r0 ! 1782: MOVW 0x2c(%fp),%ap ! 1783: .L240: ! 1784: LLSW3 %ap,0(%r8),%r1 ! 1785: LRSW3 %r4,4(%r8),%r2 ! 1786: ORW2 %r2, %r1 ! 1787: XORW2 0(%r7),%r1 ! 1788: ANDW2 %r0,%r1 ! 1789: XORW2 %r1,0(%r7) ! 1790: ADDW2 %r6, %r8 ! 1791: ADDW2 %r5, %r7 ! 1792: .L239: ! 1793: # asm(" PUSHW %ap"); /* store ap on stack */ ! 1794: # asm(" MOVW 0x28(%fp),%r0"); /* put mask3 in r0 */ ! 1795: # asm(" MOVW 0x2c(%fp),%ap"); /* put other shift in ap */ ! 1796: # ! 1797: # do { ! 1798: # asm(" LLSW3 %ap,0(%r8),%r1"); /* 32-m,lft shft */ ! 1799: # asm(" LRSW3 %r4,4(%r8),%r2"); /* m, right shift */ ! 1800: # asm(" ORW2 %r2, %r1"); ! 1801: # asm(" XORW2 0(%r7),%r1"); ! 1802: # asm(" ANDW2 %r0,%r1"); ! 1803: # asm(" XORW2 %r1,0(%r7)"); ! 1804: # asm(" ADDW2 %r6, %r8"); ! 1805: # asm(" ADDW2 %r5, %r7"); ! 1806: # } while (--i > 0); ! 1807: subw2 &1,%r3 ! 1808: jpos .L240 ! 1809: .L238: ! 1810: POPW %ap ! 1811: jmp .L231 ! 1812: .L241: ! 1813: PUSHW %ap ! 1814: MOVW 0x28(%fp),%r0 ! 1815: MOVW 0x2c(%fp),%ap ! 1816: .L244: ! 1817: ROTW %r4,0(%r8),%r1 ! 1818: XORW3 0(%r7),%r1,%r2 ! 1819: ANDW2 %r0,%r2 ! 1820: XORW2 %r2,0(%r7) ! 1821: XORW2 4(%r7),%r1 ! 1822: ANDW2 %ap,%r1 ! 1823: XORW2 %r1,4(%r7) ! 1824: ADDW2 %r6, %r8 ! 1825: ADDW2 %r5, %r7 ! 1826: .L243: ! 1827: # asm(" POPW %ap"); /* restore ap from stack */ ! 1828: # break; ! 1829: # case F_STORE | D_STRADDLE: ! 1830: # asm(" PUSHW %ap"); /* store ap on stack */ ! 1831: # asm(" MOVW 0x28(%fp),%r0"); /* put mask3 in r0 */ ! 1832: # asm(" MOVW 0x2c(%fp),%ap"); /* put mask4 in ap */ ! 1833: # do { ! 1834: # asm(" ROTW %r4,0(%r8),%r1"); ! 1835: # asm(" XORW3 0(%r7),%r1,%r2"); ! 1836: # asm(" ANDW2 %r0,%r2"); ! 1837: # asm(" XORW2 %r2,0(%r7)"); ! 1838: # asm(" XORW2 4(%r7),%r1"); ! 1839: # asm(" ANDW2 %ap,%r1"); ! 1840: # asm(" XORW2 %r1,4(%r7)"); ! 1841: # asm(" ADDW2 %r6, %r8"); ! 1842: # asm(" ADDW2 %r5, %r7"); ! 1843: # } while (--i > 0); ! 1844: subw2 &1,%r3 ! 1845: jpos .L244 ! 1846: .L242: ! 1847: POPW %ap ! 1848: jmp .L231 ! 1849: .L245: ! 1850: PUSHW %ap ! 1851: SUBW3 %r4,&0x20,%ap ! 1852: MOVW 0x20(%fp),%r0 ! 1853: MOVW 0x24(%fp),%r2 ! 1854: PUSHW %fp ! 1855: .L248: ! 1856: ANDW3 %r0, 0(%r8), %r1 ! 1857: ANDW3 %r2, 4(%r8),%ap ! 1858: ORW2 %ap, %r1 ! 1859: ROTW %r4, %r1, %r1 ! 1860: XORW3 0(%r7), %r1, %ap ! 1861: ANDW2 0x28(%fp), %ap ! 1862: XORW2 %ap, 0(%r7) ! 1863: XORW2 4(%r7), %r1 ! 1864: ANDW2 0x2c(%fp), %r1 ! 1865: XORW2 %r1, 4(%r7) ! 1866: ADDW2 %r6, %r8 ! 1867: ADDW2 %r5, %r7 ! 1868: .L247: ! 1869: # asm(" POPW %ap"); /* restore ap from stack */ ! 1870: # break; ! 1871: # case F_STORE | S_STRADDLE | D_STRADDLE: ! 1872: # asm(" PUSHW %ap"); /* store ap on stack */ ! 1873: # asm(" SUBW3 %r4,&0x20,%ap"); /* right shift distance */ ! 1874: # asm(" MOVW 0x20(%fp),%r0"); /* r0 <- mask1 */ ! 1875: # asm(" MOVW 0x24(%fp),%r2"); /* r2 <- mask2 */ ! 1876: # asm(" PUSHW %fp"); /* store fp on stack */ ! 1877: # do { ! 1878: # asm(" ANDW3 %r0, 0(%r8), %r1"); ! 1879: # asm(" ANDW3 %r2, 4(%r8),%ap"); ! 1880: # asm(" ORW2 %ap, %r1"); ! 1881: # asm(" ROTW %r4, %r1, %r1"); ! 1882: # asm(" XORW3 0(%r7), %r1, %ap"); ! 1883: # asm(" ANDW2 0x28(%fp), %ap"); ! 1884: # asm(" XORW2 %ap, 0(%r7)"); ! 1885: # asm(" XORW2 4(%r7), %r1"); ! 1886: # asm(" ANDW2 0x2c(%fp), %r1"); ! 1887: # asm(" XORW2 %r1, 4(%r7)"); ! 1888: # asm(" ADDW2 %r6, %r8"); ! 1889: # asm(" ADDW2 %r5, %r7"); ! 1890: # } while (--i > 0); ! 1891: subw2 &1,%r3 ! 1892: jpos .L248 ! 1893: .L246: ! 1894: POPW %fp ! 1895: POPW %ap ! 1896: jmp .L231 ! 1897: .L249: ! 1898: # asm(" POPW %fp"); /* restore fp from stack */ ! 1899: # asm(" POPW %ap"); /* restore ap from stack */ ! 1900: # break; ! 1901: # case F_OR: ! 1902: # mask1 = topbits[a+1] >> px31; ! 1903: addw3 &1,0(%fp),%r0 ! 1904: LLSW3 &2,%r0,%r0 ! 1905: LRSW3 24(%fp),topbits(%r0),%r0 ! 1906: movw %r0,32(%fp) ! 1907: MOVW 0x20(%fp),%r1 ! 1908: .L252: ! 1909: ROTW %r4,0(%r8),%r2 ! 1910: ANDW2 %r1,%r2 ! 1911: ORW2 %r2,0(%r7) ! 1912: ADDW2 %r6, %r8 ! 1913: ADDW2 %r5, %r7 ! 1914: .L251: ! 1915: # asm(" MOVW 0x20(%fp),%r1"); /* mask1 */ ! 1916: # do { ! 1917: # asm(" ROTW %r4,0(%r8),%r2"); ! 1918: # asm(" ANDW2 %r1,%r2"); ! 1919: # asm(" ORW2 %r2,0(%r7)"); ! 1920: # asm(" ADDW2 %r6, %r8"); ! 1921: # asm(" ADDW2 %r5, %r7"); ! 1922: # } while (--i > 0); ! 1923: subw2 &1,%r3 ! 1924: jpos .L252 ! 1925: .L250: ! 1926: jmp .L231 ! 1927: .L253: ! 1928: MOVW 0x20(%fp),%r0 ! 1929: PUSHW %ap ! 1930: MOVW 0x24(%fp),%ap ! 1931: .L256: ! 1932: ANDW3 %r0,0(%r8),%r2 ! 1933: ANDW3 %ap,4(%r8),%r1 ! 1934: ORW2 %r2,%r1 ! 1935: ROTW %r4,%r1,%r1 ! 1936: ORW2 %r1,0(%r7) ! 1937: ADDW2 %r6, %r8 ! 1938: ADDW2 %r5, %r7 ! 1939: .L255: ! 1940: # break; ! 1941: # case F_OR | S_STRADDLE: ! 1942: # asm(" MOVW 0x20(%fp),%r0"); /* store mask1 in a reg */ ! 1943: # asm(" PUSHW %ap"); /* store ap on stack */ ! 1944: # asm(" MOVW 0x24(%fp),%ap"); /* store mask1 in a reg */ ! 1945: # ! 1946: # do { ! 1947: # asm(" ANDW3 %r0,0(%r8),%r2"); /* x20(fp)=mask1 */ ! 1948: # asm(" ANDW3 %ap,4(%r8),%r1"); /* x24(fp)=mask2 */ ! 1949: # asm(" ORW2 %r2,%r1"); ! 1950: # asm(" ROTW %r4,%r1,%r1"); ! 1951: # asm(" ORW2 %r1,0(%r7)"); ! 1952: # asm(" ADDW2 %r6, %r8"); ! 1953: # asm(" ADDW2 %r5, %r7"); ! 1954: # } while (--i > 0); ! 1955: subw2 &1,%r3 ! 1956: jpos .L256 ! 1957: .L254: ! 1958: POPW %ap ! 1959: jmp .L231 ! 1960: .L257: ! 1961: # asm(" POPW %ap"); /* restore ap from stack */ ! 1962: # break; ! 1963: # case F_OR | D_STRADDLE: ! 1964: # if (a <= 16) /* very narrow, 17 bits max */ ! 1965: cmpw 0(%fp),&16 ! 1966: jg .L258 ! 1967: MOVW &0xffff0000,%r2 ! 1968: ORW3 0x28(%fp),0x2c(%fp),%r0 ! 1969: .L261: ! 1970: ROTW %r4,0(%r8),%r1 ! 1971: ANDW2 %r0,%r1 ! 1972: ORH2 %r1,2(%r7) ! 1973: ANDW2 %r2, %r1 ! 1974: ORW2 %r1, 4(%r7) ! 1975: ADDW2 %r6, %r8 ! 1976: ADDW2 %r5, %r7 ! 1977: .L260: ! 1978: # { ! 1979: # asm(" MOVW &0xffff0000,%r2"); ! 1980: # asm(" ORW3 0x28(%fp),0x2c(%fp),%r0"); /* compute mask */ ! 1981: # do { ! 1982: # asm(" ROTW %r4,0(%r8),%r1"); ! 1983: # asm(" ANDW2 %r0,%r1"); /* mask */ ! 1984: # asm(" ORH2 %r1,2(%r7)"); ! 1985: # asm(" ANDW2 %r2, %r1"); ! 1986: # asm(" ORW2 %r1, 4(%r7)"); ! 1987: # asm(" ADDW2 %r6, %r8"); ! 1988: # asm(" ADDW2 %r5, %r7"); ! 1989: # } while (--i > 0); ! 1990: subw2 &1,%r3 ! 1991: jpos .L261 ! 1992: .L259: ! 1993: jmp .L262 ! 1994: .L258: ! 1995: MOVW 0x28(%fp),%r0 ! 1996: PUSHW %ap ! 1997: MOVW 0x2c(%fp),%ap ! 1998: .L265: ! 1999: ROTW %r4,0(%r8),%r1 ! 2000: ANDW3 %r0,%r1,%r2 ! 2001: ORW2 %r2,0(%r7) ! 2002: ANDW2 %ap,%r1 ! 2003: ORW2 %r1,4(%r7) ! 2004: ADDW2 %r6, %r8 ! 2005: ADDW2 %r5, %r7 ! 2006: .L264: ! 2007: # } ! 2008: # else ! 2009: # { ! 2010: # asm(" MOVW 0x28(%fp),%r0"); /* store mask3 in a reg */ ! 2011: # asm(" PUSHW %ap"); /* store ap on stack */ ! 2012: # asm(" MOVW 0x2c(%fp),%ap"); /* store mask4 in a reg */ ! 2013: # do { ! 2014: # asm(" ROTW %r4,0(%r8),%r1"); ! 2015: # asm(" ANDW3 %r0,%r1,%r2"); ! 2016: # asm(" ORW2 %r2,0(%r7)"); ! 2017: # asm(" ANDW2 %ap,%r1"); ! 2018: # asm(" ORW2 %r1,4(%r7)"); ! 2019: # asm(" ADDW2 %r6, %r8"); ! 2020: # asm(" ADDW2 %r5, %r7"); ! 2021: # } while (--i > 0); ! 2022: subw2 &1,%r3 ! 2023: jpos .L265 ! 2024: .L263: ! 2025: POPW %ap ! 2026: .L262: ! 2027: jmp .L231 ! 2028: .L266: ! 2029: MOVW 0x20(%fp),%r0 ! 2030: PUSHW %ap ! 2031: MOVW 0x24(%fp),%ap ! 2032: # asm(" POPW %ap"); /* restore ap from stack */ ! 2033: # } ! 2034: # break; ! 2035: # case F_OR | S_STRADDLE | D_STRADDLE: ! 2036: # asm(" MOVW 0x20(%fp),%r0"); /* store mask1 in a reg */ ! 2037: # asm(" PUSHW %ap"); /* store ap on stack */ ! 2038: # asm(" MOVW 0x24(%fp),%ap"); /* store mask2 in a reg */ ! 2039: # if (a > 16){ /* not super narrow */ ! 2040: cmpw 0(%fp),&16 ! 2041: jle .L267 ! 2042: .L270: ! 2043: ANDW3 %r0,0(%r8),%r1 ! 2044: ANDW3 %ap,4(%r8),%r2 ! 2045: ORW2 %r2,%r1 ! 2046: ROTW %r4,%r1,%r1 ! 2047: ANDW3 0x28(%fp),%r1,%r2 ! 2048: ORW2 %r2,0(%r7) ! 2049: ANDW2 0x2c(%fp),%r1 ! 2050: ORW2 %r1,4(%r7) ! 2051: ADDW2 %r6, %r8 ! 2052: ADDW2 %r5, %r7 ! 2053: .L269: ! 2054: # do { ! 2055: # asm(" ANDW3 %r0,0(%r8),%r1"); ! 2056: # asm(" ANDW3 %ap,4(%r8),%r2"); ! 2057: # asm(" ORW2 %r2,%r1"); ! 2058: # asm(" ROTW %r4,%r1,%r1"); ! 2059: # asm(" ANDW3 0x28(%fp),%r1,%r2"); ! 2060: # asm(" ORW2 %r2,0(%r7)"); ! 2061: # asm(" ANDW2 0x2c(%fp),%r1"); ! 2062: # asm(" ORW2 %r1,4(%r7)"); ! 2063: # asm(" ADDW2 %r6, %r8"); ! 2064: # asm(" ADDW2 %r5, %r7"); ! 2065: # } while (--i > 0); ! 2066: subw2 &1,%r3 ! 2067: jpos .L270 ! 2068: .L268: ! 2069: jmp .L271 ! 2070: .L267: ! 2071: .L274: ! 2072: ANDW3 %r0,0(%r8),%r1 ! 2073: ANDW3 %ap,4(%r8),%r2 ! 2074: ORW2 %r2,%r1 ! 2075: ROTW %r4,%r1,%r1 ! 2076: ORH2 %r1,2(%r7) ! 2077: ANDW2 &0xffff0000,%r1 ! 2078: ORW2 %r1,4(%r7) ! 2079: ADDW2 %r6, %r8 ! 2080: ADDW2 %r5, %r7 ! 2081: .L273: ! 2082: # } ! 2083: # else ! 2084: # { ! 2085: # do { ! 2086: # asm(" ANDW3 %r0,0(%r8),%r1"); ! 2087: # asm(" ANDW3 %ap,4(%r8),%r2"); ! 2088: # asm(" ORW2 %r2,%r1"); ! 2089: # asm(" ROTW %r4,%r1,%r1"); ! 2090: # asm(" ORH2 %r1,2(%r7)"); ! 2091: # asm(" ANDW2 &0xffff0000,%r1"); ! 2092: # asm(" ORW2 %r1,4(%r7)"); ! 2093: # asm(" ADDW2 %r6, %r8"); ! 2094: # asm(" ADDW2 %r5, %r7"); ! 2095: # } while (--i > 0); ! 2096: subw2 &1,%r3 ! 2097: jpos .L274 ! 2098: .L272: ! 2099: .L271: ! 2100: POPW %ap ! 2101: jmp .L231 ! 2102: .L275: ! 2103: # } ! 2104: # asm(" POPW %ap"); /* restore ap from stack */ ! 2105: # break; ! 2106: # case F_CLR: ! 2107: # mask1 = topbits[a+1] >> px31; ! 2108: addw3 &1,0(%fp),%r0 ! 2109: LLSW3 &2,%r0,%r0 ! 2110: LRSW3 24(%fp),topbits(%r0),%r0 ! 2111: movw %r0,32(%fp) ! 2112: MOVW 0x20(%fp),%r1 ! 2113: .L278: ! 2114: ROTW %r4,0(%r8),%r2 ! 2115: ANDW2 %r1,%r2 ! 2116: MCOMW %r2,%r2 ! 2117: ANDW2 %r2,0(%r7) ! 2118: ADDW2 %r6, %r8 ! 2119: ADDW2 %r5, %r7 ! 2120: .L277: ! 2121: # asm(" MOVW 0x20(%fp),%r1"); /* mask1 */ ! 2122: # do { ! 2123: # asm(" ROTW %r4,0(%r8),%r2"); ! 2124: # asm(" ANDW2 %r1,%r2"); ! 2125: # asm(" MCOMW %r2,%r2"); ! 2126: # asm(" ANDW2 %r2,0(%r7)"); ! 2127: # asm(" ADDW2 %r6, %r8"); ! 2128: # asm(" ADDW2 %r5, %r7"); ! 2129: # } while (--i > 0); ! 2130: subw2 &1,%r3 ! 2131: jpos .L278 ! 2132: .L276: ! 2133: jmp .L231 ! 2134: .L279: ! 2135: MOVW 0x20(%fp),%r0 ! 2136: PUSHW %ap ! 2137: MOVW 0x24(%fp),%ap ! 2138: .L282: ! 2139: ANDW3 %r0,0(%r8),%r2 ! 2140: ANDW3 %ap,4(%r8),%r1 ! 2141: ORW2 %r2,%r1 ! 2142: ROTW %r4,%r1,%r1 ! 2143: MCOMW %r1,%r1 ! 2144: ANDW2 %r1,0(%r7) ! 2145: ADDW2 %r6, %r8 ! 2146: ADDW2 %r5, %r7 ! 2147: .L281: ! 2148: # break; ! 2149: # case F_CLR | S_STRADDLE: ! 2150: # asm(" MOVW 0x20(%fp),%r0"); /* store mask1 in a reg */ ! 2151: # asm(" PUSHW %ap"); /* store ap on stack */ ! 2152: # asm(" MOVW 0x24(%fp),%ap"); /* store mask1 in a reg */ ! 2153: # ! 2154: # do { ! 2155: # asm(" ANDW3 %r0,0(%r8),%r2"); /* x20(fp)=mask1 */ ! 2156: # asm(" ANDW3 %ap,4(%r8),%r1"); /* x24(fp)=mask2 */ ! 2157: # asm(" ORW2 %r2,%r1"); ! 2158: # asm(" ROTW %r4,%r1,%r1"); ! 2159: # asm(" MCOMW %r1,%r1"); ! 2160: # asm(" ANDW2 %r1,0(%r7)"); ! 2161: # asm(" ADDW2 %r6, %r8"); ! 2162: # asm(" ADDW2 %r5, %r7"); ! 2163: # } while (--i > 0); ! 2164: subw2 &1,%r3 ! 2165: jpos .L282 ! 2166: .L280: ! 2167: POPW %ap ! 2168: jmp .L231 ! 2169: .L283: ! 2170: # asm(" POPW %ap"); /* restore ap from stack */ ! 2171: # break; ! 2172: # case F_CLR | D_STRADDLE: ! 2173: # if (a <= 16) /* very narrow, 17 bits max */ ! 2174: cmpw 0(%fp),&16 ! 2175: jg .L284 ! 2176: MOVW &0xffff,%r2 ! 2177: ORW3 0x28(%fp),0x2c(%fp),%r0 ! 2178: .L287: ! 2179: ROTW %r4,0(%r8),%r1 ! 2180: ANDW2 %r0,%r1 ! 2181: MCOMW %r1,%r1 ! 2182: ANDH2 %r1,2(%r7) ! 2183: ORW2 %r2,%r1 ! 2184: ANDW2 %r1,4(%r7) ! 2185: ADDW2 %r6, %r8 ! 2186: ADDW2 %r5, %r7 ! 2187: .L286: ! 2188: # { ! 2189: # asm(" MOVW &0xffff,%r2"); ! 2190: # asm(" ORW3 0x28(%fp),0x2c(%fp),%r0"); /* compute mask */ ! 2191: # do { ! 2192: # asm(" ROTW %r4,0(%r8),%r1"); ! 2193: # asm(" ANDW2 %r0,%r1"); /* mask */ ! 2194: # asm(" MCOMW %r1,%r1"); ! 2195: # asm(" ANDH2 %r1,2(%r7)"); ! 2196: # asm(" ORW2 %r2,%r1"); ! 2197: # asm(" ANDW2 %r1,4(%r7)"); ! 2198: # asm(" ADDW2 %r6, %r8"); ! 2199: # asm(" ADDW2 %r5, %r7"); ! 2200: # } while (--i > 0); ! 2201: subw2 &1,%r3 ! 2202: jpos .L287 ! 2203: .L285: ! 2204: jmp .L288 ! 2205: .L284: ! 2206: MOVW 0x28(%fp),%r0 ! 2207: PUSHW %ap ! 2208: MOVW 0x2c(%fp),%ap ! 2209: .L291: ! 2210: ROTW %r4,0(%r8),%r1 ! 2211: ANDW3 %r0,%r1,%r2 ! 2212: MCOMW %r2,%r2 ! 2213: ANDW2 %r2,0(%r7) ! 2214: ANDW2 %ap,%r1 ! 2215: MCOMW %r1,%r1 ! 2216: ANDW2 %r1,4(%r7) ! 2217: ADDW2 %r6, %r8 ! 2218: ADDW2 %r5, %r7 ! 2219: .L290: ! 2220: # } ! 2221: # else ! 2222: # { ! 2223: # asm(" MOVW 0x28(%fp),%r0"); /* store mask3 in a reg */ ! 2224: # asm(" PUSHW %ap"); /* store ap on stack */ ! 2225: # asm(" MOVW 0x2c(%fp),%ap"); /* store mask4 in a reg */ ! 2226: # do { ! 2227: # asm(" ROTW %r4,0(%r8),%r1"); ! 2228: # asm(" ANDW3 %r0,%r1,%r2"); ! 2229: # asm(" MCOMW %r2,%r2"); ! 2230: # asm(" ANDW2 %r2,0(%r7)"); ! 2231: # asm(" ANDW2 %ap,%r1"); ! 2232: # asm(" MCOMW %r1,%r1"); ! 2233: # asm(" ANDW2 %r1,4(%r7)"); ! 2234: # asm(" ADDW2 %r6, %r8"); ! 2235: # asm(" ADDW2 %r5, %r7"); ! 2236: # } while (--i > 0); ! 2237: subw2 &1,%r3 ! 2238: jpos .L291 ! 2239: .L289: ! 2240: POPW %ap ! 2241: .L288: ! 2242: jmp .L231 ! 2243: .L292: ! 2244: MOVW 0x20(%fp),%r0 ! 2245: PUSHW %ap ! 2246: MOVW 0x24(%fp),%ap ! 2247: # asm(" POPW %ap"); /* restore ap from stack */ ! 2248: # } ! 2249: # break; ! 2250: # case F_CLR | S_STRADDLE | D_STRADDLE: ! 2251: # asm(" MOVW 0x20(%fp),%r0"); /* store mask1 in a reg */ ! 2252: # asm(" PUSHW %ap"); /* store ap on stack */ ! 2253: # asm(" MOVW 0x24(%fp),%ap"); /* store mask2 in a reg */ ! 2254: # if (a > 16){ /* not super narrow */ ! 2255: cmpw 0(%fp),&16 ! 2256: jle .L293 ! 2257: .L296: ! 2258: ANDW3 %r0,0(%r8),%r1 ! 2259: ANDW3 %ap,4(%r8),%r2 ! 2260: ORW2 %r2,%r1 ! 2261: ROTW %r4,%r1,%r1 ! 2262: ANDW3 0x28(%fp),%r1,%r2 ! 2263: MCOMW %r2,%r2 ! 2264: ANDW2 %r2,0(%r7) ! 2265: ANDW2 0x2c(%fp),%r1 ! 2266: MCOMW %r1,%r1 ! 2267: ANDW2 %r1,4(%r7) ! 2268: ADDW2 %r6, %r8 ! 2269: ADDW2 %r5, %r7 ! 2270: .L295: ! 2271: # do { ! 2272: # asm(" ANDW3 %r0,0(%r8),%r1"); ! 2273: # asm(" ANDW3 %ap,4(%r8),%r2"); ! 2274: # asm(" ORW2 %r2,%r1"); ! 2275: # asm(" ROTW %r4,%r1,%r1"); ! 2276: # asm(" ANDW3 0x28(%fp),%r1,%r2"); ! 2277: # asm(" MCOMW %r2,%r2"); ! 2278: # asm(" ANDW2 %r2,0(%r7)"); ! 2279: # asm(" ANDW2 0x2c(%fp),%r1"); ! 2280: # asm(" MCOMW %r1,%r1"); ! 2281: # asm(" ANDW2 %r1,4(%r7)"); ! 2282: # asm(" ADDW2 %r6, %r8"); ! 2283: # asm(" ADDW2 %r5, %r7"); ! 2284: # } while (--i > 0); ! 2285: subw2 &1,%r3 ! 2286: jpos .L296 ! 2287: .L294: ! 2288: jmp .L297 ! 2289: .L293: ! 2290: .L300: ! 2291: ANDW3 %r0,0(%r8),%r1 ! 2292: ANDW3 %ap,4(%r8),%r2 ! 2293: ORW2 %r2,%r1 ! 2294: ROTW %r4,%r1,%r1 ! 2295: MCOMW %r1,%r1 ! 2296: ANDH2 %r1,2(%r7) ! 2297: ORW2 &0xffff,%r1 ! 2298: ANDW2 %r1,4(%r7) ! 2299: ADDW2 %r6, %r8 ! 2300: ADDW2 %r5, %r7 ! 2301: .L299: ! 2302: # } ! 2303: # else ! 2304: # { ! 2305: # do { ! 2306: # asm(" ANDW3 %r0,0(%r8),%r1"); ! 2307: # asm(" ANDW3 %ap,4(%r8),%r2"); ! 2308: # asm(" ORW2 %r2,%r1"); ! 2309: # asm(" ROTW %r4,%r1,%r1"); ! 2310: # asm(" MCOMW %r1,%r1"); ! 2311: # asm(" ANDH2 %r1,2(%r7)"); ! 2312: # asm(" ORW2 &0xffff,%r1"); ! 2313: # asm(" ANDW2 %r1,4(%r7)"); ! 2314: # asm(" ADDW2 %r6, %r8"); ! 2315: # asm(" ADDW2 %r5, %r7"); ! 2316: # } while (--i > 0); ! 2317: subw2 &1,%r3 ! 2318: jpos .L300 ! 2319: .L298: ! 2320: .L297: ! 2321: POPW %ap ! 2322: jmp .L231 ! 2323: .L301: ! 2324: # } ! 2325: # asm(" POPW %ap"); /* restore ap from stack */ ! 2326: # break; ! 2327: # case F_XOR: ! 2328: # mask1 = topbits[a+1] >> px31; ! 2329: addw3 &1,0(%fp),%r0 ! 2330: LLSW3 &2,%r0,%r0 ! 2331: LRSW3 24(%fp),topbits(%r0),%r0 ! 2332: movw %r0,32(%fp) ! 2333: MOVW 0x20(%fp),%r1 ! 2334: .L304: ! 2335: ROTW %r4,0(%r8),%r2 ! 2336: ANDW2 %r1,%r2 ! 2337: XORW2 %r2,0(%r7) ! 2338: ADDW2 %r6, %r8 ! 2339: ADDW2 %r5, %r7 ! 2340: .L303: ! 2341: # asm(" MOVW 0x20(%fp),%r1"); /* mask1 */ ! 2342: # do { ! 2343: # asm(" ROTW %r4,0(%r8),%r2"); ! 2344: # asm(" ANDW2 %r1,%r2"); ! 2345: # asm(" XORW2 %r2,0(%r7)"); ! 2346: # asm(" ADDW2 %r6, %r8"); ! 2347: # asm(" ADDW2 %r5, %r7"); ! 2348: # } while (--i > 0); ! 2349: subw2 &1,%r3 ! 2350: jpos .L304 ! 2351: .L302: ! 2352: jmp .L231 ! 2353: .L305: ! 2354: MOVW 0x20(%fp),%r0 ! 2355: PUSHW %ap ! 2356: MOVW 0x24(%fp),%ap ! 2357: .L308: ! 2358: ANDW3 %r0,0(%r8),%r2 ! 2359: ANDW3 %ap,4(%r8),%r1 ! 2360: ORW2 %r2,%r1 ! 2361: ROTW %r4,%r1,%r1 ! 2362: XORW2 %r1,0(%r7) ! 2363: ADDW2 %r6, %r8 ! 2364: ADDW2 %r5, %r7 ! 2365: .L307: ! 2366: # break; ! 2367: # case F_XOR | S_STRADDLE: ! 2368: # asm(" MOVW 0x20(%fp),%r0"); /* store mask1 in a reg */ ! 2369: # asm(" PUSHW %ap"); /* store ap on stack */ ! 2370: # asm(" MOVW 0x24(%fp),%ap"); /* store mask1 in a reg */ ! 2371: # ! 2372: # do { ! 2373: # asm(" ANDW3 %r0,0(%r8),%r2"); /* x20(fp)=mask1 */ ! 2374: # asm(" ANDW3 %ap,4(%r8),%r1"); /* x24(fp)=mask2 */ ! 2375: # asm(" ORW2 %r2,%r1"); ! 2376: # asm(" ROTW %r4,%r1,%r1"); ! 2377: # asm(" XORW2 %r1,0(%r7)"); ! 2378: # asm(" ADDW2 %r6, %r8"); ! 2379: # asm(" ADDW2 %r5, %r7"); ! 2380: # } while (--i > 0); ! 2381: subw2 &1,%r3 ! 2382: jpos .L308 ! 2383: .L306: ! 2384: POPW %ap ! 2385: jmp .L231 ! 2386: .L309: ! 2387: # asm(" POPW %ap"); /* restore ap from stack */ ! 2388: # break; ! 2389: # case F_XOR | D_STRADDLE: ! 2390: # if (a <= 16) /* very narrow, 17 bits max */ ! 2391: cmpw 0(%fp),&16 ! 2392: jg .L310 ! 2393: MOVW &0xffff0000,%r2 ! 2394: ORW3 0x28(%fp),0x2c(%fp),%r0 ! 2395: .L313: ! 2396: ROTW %r4,0(%r8),%r1 ! 2397: ANDW2 %r0,%r1 ! 2398: XORH2 %r1,2(%r7) ! 2399: ANDW2 %r2,%r1 ! 2400: XORW2 %r1,4(%r7) ! 2401: ADDW2 %r6, %r8 ! 2402: ADDW2 %r5, %r7 ! 2403: .L312: ! 2404: # { ! 2405: # asm(" MOVW &0xffff0000,%r2"); ! 2406: # asm(" ORW3 0x28(%fp),0x2c(%fp),%r0"); /* compute mask */ ! 2407: # do { ! 2408: # asm(" ROTW %r4,0(%r8),%r1"); ! 2409: # asm(" ANDW2 %r0,%r1"); /* mask */ ! 2410: # asm(" XORH2 %r1,2(%r7)"); ! 2411: # asm(" ANDW2 %r2,%r1"); ! 2412: # asm(" XORW2 %r1,4(%r7)"); ! 2413: # asm(" ADDW2 %r6, %r8"); ! 2414: # asm(" ADDW2 %r5, %r7"); ! 2415: # } while (--i > 0); ! 2416: subw2 &1,%r3 ! 2417: jpos .L313 ! 2418: .L311: ! 2419: jmp .L314 ! 2420: .L310: ! 2421: MOVW 0x28(%fp),%r0 ! 2422: PUSHW %ap ! 2423: MOVW 0x2c(%fp),%ap ! 2424: .L317: ! 2425: ROTW %r4,0(%r8),%r1 ! 2426: ANDW3 %r0,%r1,%r2 ! 2427: XORW2 %r2,0(%r7) ! 2428: ANDW2 %ap,%r1 ! 2429: XORW2 %r1,4(%r7) ! 2430: ADDW2 %r6, %r8 ! 2431: ADDW2 %r5, %r7 ! 2432: .L316: ! 2433: # } ! 2434: # else ! 2435: # { ! 2436: # asm(" MOVW 0x28(%fp),%r0"); /* store mask3 in a reg */ ! 2437: # asm(" PUSHW %ap"); /* store ap on stack */ ! 2438: # asm(" MOVW 0x2c(%fp),%ap"); /* store mask4 in a reg */ ! 2439: # do { ! 2440: # asm(" ROTW %r4,0(%r8),%r1"); ! 2441: # asm(" ANDW3 %r0,%r1,%r2"); ! 2442: # asm(" XORW2 %r2,0(%r7)"); ! 2443: # asm(" ANDW2 %ap,%r1"); ! 2444: # asm(" XORW2 %r1,4(%r7)"); ! 2445: # asm(" ADDW2 %r6, %r8"); ! 2446: # asm(" ADDW2 %r5, %r7"); ! 2447: # } while (--i > 0); ! 2448: subw2 &1,%r3 ! 2449: jpos .L317 ! 2450: .L315: ! 2451: POPW %ap ! 2452: .L314: ! 2453: jmp .L231 ! 2454: .L318: ! 2455: MOVW 0x20(%fp),%r0 ! 2456: PUSHW %ap ! 2457: MOVW 0x24(%fp),%ap ! 2458: # asm(" POPW %ap"); /* restore ap from stack */ ! 2459: # } ! 2460: # break; ! 2461: # case F_XOR | S_STRADDLE | D_STRADDLE: ! 2462: # asm(" MOVW 0x20(%fp),%r0"); /* store mask1 in a reg */ ! 2463: # asm(" PUSHW %ap"); /* store ap on stack */ ! 2464: # asm(" MOVW 0x24(%fp),%ap"); /* store mask2 in a reg */ ! 2465: # if (a > 16){ /* not super narrow */ ! 2466: cmpw 0(%fp),&16 ! 2467: jle .L319 ! 2468: .L322: ! 2469: ANDW3 %r0,0(%r8),%r1 ! 2470: ANDW3 %ap,4(%r8),%r2 ! 2471: ORW2 %r2,%r1 ! 2472: ROTW %r4,%r1,%r1 ! 2473: ANDW3 0x28(%fp),%r1,%r2 ! 2474: XORW2 %r2,0(%r7) ! 2475: ANDW2 0x2c(%fp),%r1 ! 2476: XORW2 %r1,4(%r7) ! 2477: ADDW2 %r6, %r8 ! 2478: ADDW2 %r5, %r7 ! 2479: .L321: ! 2480: # do { ! 2481: # asm(" ANDW3 %r0,0(%r8),%r1"); ! 2482: # asm(" ANDW3 %ap,4(%r8),%r2"); ! 2483: # asm(" ORW2 %r2,%r1"); ! 2484: # asm(" ROTW %r4,%r1,%r1"); ! 2485: # asm(" ANDW3 0x28(%fp),%r1,%r2"); ! 2486: # asm(" XORW2 %r2,0(%r7)"); ! 2487: # asm(" ANDW2 0x2c(%fp),%r1"); ! 2488: # asm(" XORW2 %r1,4(%r7)"); ! 2489: # asm(" ADDW2 %r6, %r8"); ! 2490: # asm(" ADDW2 %r5, %r7"); ! 2491: # } while (--i > 0); ! 2492: subw2 &1,%r3 ! 2493: jpos .L322 ! 2494: .L320: ! 2495: jmp .L323 ! 2496: .L319: ! 2497: .L326: ! 2498: ANDW3 %r0,0(%r8),%r1 ! 2499: ANDW3 %ap,4(%r8),%r2 ! 2500: ORW2 %r2,%r1 ! 2501: ROTW %r4,%r1,%r1 ! 2502: XORH2 %r1,2(%r7) ! 2503: ANDW2 &0xffff0000,%r1 ! 2504: XORW2 %r1,4(%r7) ! 2505: ADDW2 %r6, %r8 ! 2506: ADDW2 %r5, %r7 ! 2507: .L325: ! 2508: # } ! 2509: # else ! 2510: # { ! 2511: # do { ! 2512: # asm(" ANDW3 %r0,0(%r8),%r1"); ! 2513: # asm(" ANDW3 %ap,4(%r8),%r2"); ! 2514: # asm(" ORW2 %r2,%r1"); ! 2515: # asm(" ROTW %r4,%r1,%r1"); ! 2516: # asm(" XORH2 %r1,2(%r7)"); ! 2517: # asm(" ANDW2 &0xffff0000,%r1"); ! 2518: # asm(" XORW2 %r1,4(%r7)"); ! 2519: # asm(" ADDW2 %r6, %r8"); ! 2520: # asm(" ADDW2 %r5, %r7"); ! 2521: # } while (--i > 0); ! 2522: subw2 &1,%r3 ! 2523: jpos .L326 ! 2524: .L324: ! 2525: .L323: ! 2526: POPW %ap ! 2527: jmp .L231 ! 2528: .L232: ! 2529: cmpw %r0,&0 ! 2530: jl .L327 ! 2531: cmpw %r0,&15 ! 2532: jg .L327 ! 2533: ALSW3 &2,%r0,%r0 ! 2534: jmp *.L328(%r0) ! 2535: .data ! 2536: .align 4 ! 2537: #SWBEG ! 2538: .L328: ! 2539: .word .L233 ! 2540: .word .L249 ! 2541: .word .L275 ! 2542: .word .L301 ! 2543: .word .L237 ! 2544: .word .L253 ! 2545: .word .L279 ! 2546: .word .L305 ! 2547: .word .L241 ! 2548: .word .L257 ! 2549: .word .L283 ! 2550: .word .L309 ! 2551: .word .L245 ! 2552: .word .L266 ! 2553: .word .L292 ! 2554: .word .L318 ! 2555: #SWEND ! 2556: .text ! 2557: .L327: ! 2558: .L231: ! 2559: jmp .L31 ! 2560: .L31: ! 2561: .def .ef; .val .; .scl 101; .line 909; .endef ! 2562: .ln 909 ! 2563: .set .F1,64 ! 2564: .set .R1,6 ! 2565: ret &.R1 ! 2566: .def bitblt; .val .; .scl -1; .endef ! 2567: .data ! 2568: # } ! 2569: # asm(" POPW %ap"); /* restore ap from stack */ ! 2570: # break; ! 2571: # } ! 2572: # return; ! 2573: #}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.