1*1e49577aSRod Evans/* 2*1e49577aSRod Evans * CDDL HEADER START 3*1e49577aSRod Evans * 4*1e49577aSRod Evans * The contents of this file are subject to the terms of the 5*1e49577aSRod Evans * Common Development and Distribution License (the "License"). 6*1e49577aSRod Evans * You may not use this file except in compliance with the License. 7*1e49577aSRod Evans * 8*1e49577aSRod Evans * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*1e49577aSRod Evans * or http://www.opensolaris.org/os/licensing. 10*1e49577aSRod Evans * See the License for the specific language governing permissions 11*1e49577aSRod Evans * and limitations under the License. 12*1e49577aSRod Evans * 13*1e49577aSRod Evans * When distributing Covered Code, include this CDDL HEADER in each 14*1e49577aSRod Evans * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*1e49577aSRod Evans * If applicable, add the following below this CDDL HEADER, with the 16*1e49577aSRod Evans * fields enclosed by brackets "[]" replaced with your own identifying 17*1e49577aSRod Evans * information: Portions Copyright [yyyy] [name of copyright owner] 18*1e49577aSRod Evans * 19*1e49577aSRod Evans * CDDL HEADER END 20*1e49577aSRod Evans */ 21*1e49577aSRod Evans 22*1e49577aSRod Evans/* 23*1e49577aSRod Evans * Copyright (c) 1995, 2010, Oracle and/or its affiliates. All rights reserved. 24*1e49577aSRod Evans */ 25*1e49577aSRod Evans 26*1e49577aSRod Evans .file "memcmp.s" 27*1e49577aSRod Evans 28*1e49577aSRod Evans/* 29*1e49577aSRod Evans * memcmp(s1, s2, len) 30*1e49577aSRod Evans * 31*1e49577aSRod Evans * Compare n bytes: s1>s2: >0 s1==s2: 0 s1<s2: <0 32*1e49577aSRod Evans * 33*1e49577aSRod Evans * Fast assembler language version of the following C-program for memcmp 34*1e49577aSRod Evans * which represents the `standard' for the C-library. 35*1e49577aSRod Evans * 36*1e49577aSRod Evans * int 37*1e49577aSRod Evans * memcmp(const void *s1, const void *s2, size_t n) 38*1e49577aSRod Evans * { 39*1e49577aSRod Evans * if (s1 != s2 && n != 0) { 40*1e49577aSRod Evans * const char *ps1 = s1; 41*1e49577aSRod Evans * const char *ps2 = s2; 42*1e49577aSRod Evans * do { 43*1e49577aSRod Evans * if (*ps1++ != *ps2++) 44*1e49577aSRod Evans * return(ps1[-1] - ps2[-1]); 45*1e49577aSRod Evans * } while (--n != 0); 46*1e49577aSRod Evans * } 47*1e49577aSRod Evans * return (0); 48*1e49577aSRod Evans * } 49*1e49577aSRod Evans */ 50*1e49577aSRod Evans 51*1e49577aSRod Evans#include <sys/asm_linkage.h> 52*1e49577aSRod Evans#include <sys/sun4asi.h> 53*1e49577aSRod Evans 54*1e49577aSRod Evans ANSI_PRAGMA_WEAK(memcmp,function) 55*1e49577aSRod Evans 56*1e49577aSRod Evans ENTRY(memcmp) 57*1e49577aSRod Evans cmp %o0, %o1 ! s1 == s2? 58*1e49577aSRod Evans be %ncc, .cmpeq 59*1e49577aSRod Evans 60*1e49577aSRod Evans ! for small counts byte compare immediately 61*1e49577aSRod Evans cmp %o2, 48 62*1e49577aSRod Evans bleu,a %ncc, .bytcmp 63*1e49577aSRod Evans mov %o2, %o3 ! o3 <= 48 64*1e49577aSRod Evans 65*1e49577aSRod Evans ! Count > 48. We will byte compare (8 + num of bytes to dbl align) 66*1e49577aSRod Evans ! bytes. We assume that most miscompares will occur in the 1st 8 bytes 67*1e49577aSRod Evans 68*1e49577aSRod Evans.chkdbl: 69*1e49577aSRod Evans and %o0, 7, %o4 ! is s1 aligned on a 8 byte bound 70*1e49577aSRod Evans mov 8, %o3 ! o2 > 48; o3 = 8 71*1e49577aSRod Evans sub %o4, 8, %o4 ! o4 = -(num of bytes to dbl align) 72*1e49577aSRod Evans ba %ncc, .bytcmp 73*1e49577aSRod Evans sub %o3, %o4, %o3 ! o3 = 8 + (num of bytes to dbl align) 74*1e49577aSRod Evans 75*1e49577aSRod Evans 76*1e49577aSRod Evans1: ldub [%o1], %o5 ! byte compare loop 77*1e49577aSRod Evans inc %o1 78*1e49577aSRod Evans inc %o0 79*1e49577aSRod Evans dec %o2 80*1e49577aSRod Evans cmp %o4, %o5 81*1e49577aSRod Evans bne %ncc, .noteq 82*1e49577aSRod Evans.bytcmp: 83*1e49577aSRod Evans deccc %o3 84*1e49577aSRod Evans bgeu,a %ncc, 1b 85*1e49577aSRod Evans ldub [%o0], %o4 86*1e49577aSRod Evans 87*1e49577aSRod Evans ! Check to see if there are more bytes to compare 88*1e49577aSRod Evans cmp %o2, 0 ! is o2 > 0 89*1e49577aSRod Evans bgu,a %ncc, .blkchk ! we should already be dbl aligned 90*1e49577aSRod Evans cmp %o2, 320 ! if cnt < 256 + 64 - no Block ld/st 91*1e49577aSRod Evans.cmpeq: 92*1e49577aSRod Evans retl ! strings compare equal 93*1e49577aSRod Evans sub %g0, %g0, %o0 94*1e49577aSRod Evans 95*1e49577aSRod Evans.noteq: 96*1e49577aSRod Evans retl ! strings aren't equal 97*1e49577aSRod Evans sub %o4, %o5, %o0 ! return(*s1 - *s2) 98*1e49577aSRod Evans 99*1e49577aSRod Evans 100*1e49577aSRod Evans ! Now src1 is Double word aligned 101*1e49577aSRod Evans.blkchk: 102*1e49577aSRod Evans bgeu,a %ncc, blkcmp ! do block cmp 103*1e49577aSRod Evans andcc %o0, 63, %o3 ! is src1 block aligned 104*1e49577aSRod Evans 105*1e49577aSRod Evans ! double word compare - using ldd and faligndata. Compares upto 106*1e49577aSRod Evans ! 8 byte multiple count and does byte compare for the residual. 107*1e49577aSRod Evans 108*1e49577aSRod Evans.dwcmp: 109*1e49577aSRod Evans 110*1e49577aSRod Evans rd %fprs, %o3 ! o3 = fprs 111*1e49577aSRod Evans 112*1e49577aSRod Evans ! if fprs.fef == 0, set it. Checking it, reqires 2 instructions. 113*1e49577aSRod Evans ! So set it anyway, without checking. 114*1e49577aSRod Evans wr %g0, 0x4, %fprs ! fprs.fef = 1 115*1e49577aSRod Evans 116*1e49577aSRod Evans andn %o2, 7, %o4 ! o4 has 8 byte aligned cnt 117*1e49577aSRod Evans sub %o4, 8, %o4 118*1e49577aSRod Evans alignaddr %o1, %g0, %g1 119*1e49577aSRod Evans ldd [%g1], %d0 120*1e49577aSRod Evans4: 121*1e49577aSRod Evans add %g1, 8, %g1 122*1e49577aSRod Evans ldd [%g1], %d2 123*1e49577aSRod Evans ldd [%o0], %d6 124*1e49577aSRod Evans faligndata %d0, %d2, %d8 125*1e49577aSRod Evans fcmpne32 %d6, %d8, %o5 126*1e49577aSRod Evans fsrc1 %d6, %d6 ! 2 fsrc1's added since o5 cannot 127*1e49577aSRod Evans fsrc1 %d8, %d8 ! be used for 3 cycles else we 128*1e49577aSRod Evans fmovd %d2, %d0 ! create 9 bubbles in the pipeline 129*1e49577aSRod Evans brnz,a,pn %o5, 6f 130*1e49577aSRod Evans sub %o1, %o0, %o1 ! o1 gets the difference 131*1e49577aSRod Evans subcc %o4, 8, %o4 132*1e49577aSRod Evans add %o0, 8, %o0 133*1e49577aSRod Evans add %o1, 8, %o1 134*1e49577aSRod Evans bgu,pt %ncc, 4b 135*1e49577aSRod Evans sub %o2, 8, %o2 136*1e49577aSRod Evans 137*1e49577aSRod Evans.residcmp: 138*1e49577aSRod Evans ba 6f 139*1e49577aSRod Evans sub %o1, %o0, %o1 ! o1 gets the difference 140*1e49577aSRod Evans 141*1e49577aSRod Evans5: ldub [%o0 + %o1], %o5 ! byte compare loop 142*1e49577aSRod Evans inc %o0 143*1e49577aSRod Evans cmp %o4, %o5 144*1e49577aSRod Evans bne %ncc, .dnoteq 145*1e49577aSRod Evans6: 146*1e49577aSRod Evans deccc %o2 147*1e49577aSRod Evans bgeu,a %ncc, 5b 148*1e49577aSRod Evans ldub [%o0], %o4 149*1e49577aSRod Evans 150*1e49577aSRod Evans and %o3, 0x4, %o3 ! fprs.du = fprs.dl = 0 151*1e49577aSRod Evans wr %o3, %g0, %fprs ! fprs = o3 - restore fprs 152*1e49577aSRod Evans retl 153*1e49577aSRod Evans sub %g0, %g0, %o0 ! strings compare equal 154*1e49577aSRod Evans 155*1e49577aSRod Evans.dnoteq: 156*1e49577aSRod Evans and %o3, 0x4, %o3 ! fprs.du = fprs.dl = 0 157*1e49577aSRod Evans wr %o3, %g0, %fprs ! fprs = o3 - restore fprs 158*1e49577aSRod Evans retl 159*1e49577aSRod Evans sub %o4, %o5, %o0 ! return(*s1 - *s2) 160*1e49577aSRod Evans 161*1e49577aSRod Evans 162*1e49577aSRod Evansblkcmp: 163*1e49577aSRod Evans save %sp, -SA(MINFRAME), %sp 164*1e49577aSRod Evans rd %fprs, %l5 ! l5 = fprs 165*1e49577aSRod Evans 166*1e49577aSRod Evans ! if fprs.fef == 0, set it. Checking it, reqires 2 instructions. 167*1e49577aSRod Evans ! So set it anyway, without checking. 168*1e49577aSRod Evans wr %g0, 0x4, %fprs ! fprs.fef = 1 169*1e49577aSRod Evans 170*1e49577aSRod Evans bz,pn %ncc, .blalign ! now block aligned 171*1e49577aSRod Evans sub %i3, 64, %i3 172*1e49577aSRod Evans neg %i3 ! bytes till block aligned 173*1e49577aSRod Evans 174*1e49577aSRod Evans ! Compare %i3 bytes till dst is block (64 byte) aligned. use 175*1e49577aSRod Evans ! double word compares. 176*1e49577aSRod Evans 177*1e49577aSRod Evans alignaddr %i1, %g0, %g1 178*1e49577aSRod Evans ldd [%g1], %d0 179*1e49577aSRod Evans7: 180*1e49577aSRod Evans add %g1, 8, %g1 181*1e49577aSRod Evans ldd [%g1], %d2 182*1e49577aSRod Evans ldd [%i0], %d6 183*1e49577aSRod Evans faligndata %d0, %d2, %d8 184*1e49577aSRod Evans fcmpne32 %d6, %d8, %i5 185*1e49577aSRod Evans fsrc1 %d6, %d6 ! 2 fsrc1's added since i5 cannot 186*1e49577aSRod Evans fsrc1 %d8, %d8 ! be used for 3 cycles else we 187*1e49577aSRod Evans fmovd %d2, %d0 ! create 9 bubbles in the pipeline 188*1e49577aSRod Evans brnz,a,pn %i5, .remcmp 189*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 190*1e49577aSRod Evans subcc %i3, 8, %i3 191*1e49577aSRod Evans add %i0, 8, %i0 192*1e49577aSRod Evans add %i1, 8, %i1 193*1e49577aSRod Evans bgu,pt %ncc, 7b 194*1e49577aSRod Evans sub %i2, 8, %i2 195*1e49577aSRod Evans 196*1e49577aSRod Evans.blalign: 197*1e49577aSRod Evans 198*1e49577aSRod Evans ! src1 is block aligned 199*1e49577aSRod Evans membar #StoreLoad 200*1e49577aSRod Evans srl %i1, 3, %l6 ! bits 3,4,5 are now least sig in %l6 201*1e49577aSRod Evans andcc %l6, 7, %l6 ! mask everything except bits 1,2 3 202*1e49577aSRod Evans andn %i2, 63, %i3 ! calc number of blocks 203*1e49577aSRod Evans alignaddr %i1, %g0, %g0 ! gen %gsr 204*1e49577aSRod Evans andn %i1, 0x3F, %l7 ! blk aligned address 205*1e49577aSRod Evans sub %i2, %i3, %l2 206*1e49577aSRod Evans andn %l2, 7, %i4 ! calc doubles left after blkcpy 207*1e49577aSRod Evans 208*1e49577aSRod Evans be,a %ncc, 1f ! branch taken if src2 is 64-byte aligned 209*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d0 210*1e49577aSRod Evans 211*1e49577aSRod Evans call .+8 ! get the address of this instruction in %o7 212*1e49577aSRod Evans sll %l6, 2, %l4 213*1e49577aSRod Evans add %o7, %l4, %o7 214*1e49577aSRod Evans jmp %o7 + 16 ! jump to the starting ldd instruction 215*1e49577aSRod Evans nop 216*1e49577aSRod Evans ldd [%l7+8], %d2 217*1e49577aSRod Evans ldd [%l7+16], %d4 218*1e49577aSRod Evans ldd [%l7+24], %d6 219*1e49577aSRod Evans ldd [%l7+32], %d8 220*1e49577aSRod Evans ldd [%l7+40], %d10 221*1e49577aSRod Evans ldd [%l7+48], %d12 222*1e49577aSRod Evans ldd [%l7+56], %d14 223*1e49577aSRod Evans1: 224*1e49577aSRod Evans add %l7, 64, %l7 225*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d16 226*1e49577aSRod Evans add %l7, 64, %l7 227*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 228*1e49577aSRod Evans sub %i3, 128, %i3 229*1e49577aSRod Evans 230*1e49577aSRod Evans ! switch statement to get us to the right 8 byte blk within a 231*1e49577aSRod Evans ! 64 byte block 232*1e49577aSRod Evans 233*1e49577aSRod Evans cmp %l6, 4 234*1e49577aSRod Evans bgeu,a hlf 235*1e49577aSRod Evans cmp %l6, 6 236*1e49577aSRod Evans cmp %l6, 2 237*1e49577aSRod Evans bgeu,a sqtr 238*1e49577aSRod Evans nop 239*1e49577aSRod Evans cmp %l6, 1 240*1e49577aSRod Evans be,a seg1 241*1e49577aSRod Evans nop 242*1e49577aSRod Evans ba seg0 243*1e49577aSRod Evans nop 244*1e49577aSRod Evanssqtr: 245*1e49577aSRod Evans be,a seg2 246*1e49577aSRod Evans nop 247*1e49577aSRod Evans 248*1e49577aSRod Evans ba,a seg3 249*1e49577aSRod Evans nop 250*1e49577aSRod Evans 251*1e49577aSRod Evanshlf: 252*1e49577aSRod Evans bgeu,a fqtr 253*1e49577aSRod Evans nop 254*1e49577aSRod Evans cmp %l6, 5 255*1e49577aSRod Evans be,a seg5 256*1e49577aSRod Evans nop 257*1e49577aSRod Evans ba seg4 258*1e49577aSRod Evans nop 259*1e49577aSRod Evansfqtr: 260*1e49577aSRod Evans be,a seg6 261*1e49577aSRod Evans nop 262*1e49577aSRod Evans ba seg7 263*1e49577aSRod Evans nop 264*1e49577aSRod Evans 265*1e49577aSRod Evans! The fsrc1 instructions are to make sure that the results of the fcmpne32 266*1e49577aSRod Evans! are used 3 cycles later - else spitfire adds 9 bubbles. 267*1e49577aSRod Evans 268*1e49577aSRod Evans#define FCMPNE32_D32_D48 \ 269*1e49577aSRod Evans fcmpne32 %d48, %d32, %l0 ;\ 270*1e49577aSRod Evans fcmpne32 %d50, %d34, %l1 ;\ 271*1e49577aSRod Evans fcmpne32 %d52, %d36, %l2 ;\ 272*1e49577aSRod Evans fcmpne32 %d54, %d38, %l3 ;\ 273*1e49577aSRod Evans brnz,a %l0, add ;\ 274*1e49577aSRod Evans mov 0, %l4 ;\ 275*1e49577aSRod Evans fcmpne32 %d56, %d40, %l0 ;\ 276*1e49577aSRod Evans brnz,a %l1, add ;\ 277*1e49577aSRod Evans mov 8, %l4 ;\ 278*1e49577aSRod Evans fcmpne32 %d58, %d42, %l1 ;\ 279*1e49577aSRod Evans brnz,a %l2, add ;\ 280*1e49577aSRod Evans mov 16, %l4 ;\ 281*1e49577aSRod Evans fcmpne32 %d60, %d44, %l2 ;\ 282*1e49577aSRod Evans brnz,a %l3, add ;\ 283*1e49577aSRod Evans mov 24, %l4 ;\ 284*1e49577aSRod Evans fcmpne32 %d62, %d46, %l3 ;\ 285*1e49577aSRod Evans brnz,a %l0, add ;\ 286*1e49577aSRod Evans mov 32, %l4 ;\ 287*1e49577aSRod Evans fsrc1 %d48, %d48 ;\ 288*1e49577aSRod Evans brnz,a %l1, add ;\ 289*1e49577aSRod Evans mov 40, %l4 ;\ 290*1e49577aSRod Evans fsrc1 %d48, %d48 ;\ 291*1e49577aSRod Evans brnz,a %l2, add ;\ 292*1e49577aSRod Evans mov 48, %l4 ;\ 293*1e49577aSRod Evans fsrc1 %d48, %d48 ;\ 294*1e49577aSRod Evans brnz,a %l3, add ;\ 295*1e49577aSRod Evans mov 56, %l4 296*1e49577aSRod Evans 297*1e49577aSRod Evansadd: 298*1e49577aSRod Evans add %l4, %i0, %i0 299*1e49577aSRod Evans add %l4, %i1, %i1 300*1e49577aSRod Evans ba .remcmp 301*1e49577aSRod Evans sub %i1, %i0, %i1 302*1e49577aSRod Evans 303*1e49577aSRod Evans#define FALIGN_D0 \ 304*1e49577aSRod Evans faligndata %d0, %d2, %d48 ;\ 305*1e49577aSRod Evans faligndata %d2, %d4, %d50 ;\ 306*1e49577aSRod Evans faligndata %d4, %d6, %d52 ;\ 307*1e49577aSRod Evans faligndata %d6, %d8, %d54 ;\ 308*1e49577aSRod Evans faligndata %d8, %d10, %d56 ;\ 309*1e49577aSRod Evans faligndata %d10, %d12, %d58 ;\ 310*1e49577aSRod Evans faligndata %d12, %d14, %d60 ;\ 311*1e49577aSRod Evans faligndata %d14, %d16, %d62 312*1e49577aSRod Evans 313*1e49577aSRod Evans#define FALIGN_D16 \ 314*1e49577aSRod Evans faligndata %d16, %d18, %d48 ;\ 315*1e49577aSRod Evans faligndata %d18, %d20, %d50 ;\ 316*1e49577aSRod Evans faligndata %d20, %d22, %d52 ;\ 317*1e49577aSRod Evans faligndata %d22, %d24, %d54 ;\ 318*1e49577aSRod Evans faligndata %d24, %d26, %d56 ;\ 319*1e49577aSRod Evans faligndata %d26, %d28, %d58 ;\ 320*1e49577aSRod Evans faligndata %d28, %d30, %d60 ;\ 321*1e49577aSRod Evans faligndata %d30, %d0, %d62 322*1e49577aSRod Evans 323*1e49577aSRod Evansseg0: 324*1e49577aSRod Evans FALIGN_D0 325*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d0 326*1e49577aSRod Evans add %l7, 64, %l7 327*1e49577aSRod Evans FCMPNE32_D32_D48 328*1e49577aSRod Evans add %i0, 64, %i0 329*1e49577aSRod Evans add %i1, 64, %i1 330*1e49577aSRod Evans subcc %i3, 64, %i3 331*1e49577aSRod Evans bz,pn %ncc, 1f 332*1e49577aSRod Evans sub %i2, 64, %i2 333*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 334*1e49577aSRod Evans 335*1e49577aSRod Evans FALIGN_D16 336*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d16 337*1e49577aSRod Evans add %l7, 64, %l7 338*1e49577aSRod Evans FCMPNE32_D32_D48 339*1e49577aSRod Evans add %i0, 64, %i0 340*1e49577aSRod Evans add %i1, 64, %i1 341*1e49577aSRod Evans subcc %i3, 64, %i3 342*1e49577aSRod Evans bz,pn %ncc, 0f 343*1e49577aSRod Evans sub %i2, 64, %i2 344*1e49577aSRod Evans 345*1e49577aSRod Evans ba %ncc, seg0 346*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 347*1e49577aSRod Evans 348*1e49577aSRod Evans0: 349*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 350*1e49577aSRod Evans membar #Sync 351*1e49577aSRod Evans FALIGN_D0 352*1e49577aSRod Evans FCMPNE32_D32_D48 353*1e49577aSRod Evans add %i0, 64, %i0 354*1e49577aSRod Evans add %i1, 64, %i1 355*1e49577aSRod Evans ba %ncc, blkd16 356*1e49577aSRod Evans sub %i2, 64, %i2 357*1e49577aSRod Evans 358*1e49577aSRod Evans1: 359*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 360*1e49577aSRod Evans membar #Sync 361*1e49577aSRod Evans FALIGN_D16 362*1e49577aSRod Evans FCMPNE32_D32_D48 363*1e49577aSRod Evans add %i0, 64, %i0 364*1e49577aSRod Evans add %i1, 64, %i1 365*1e49577aSRod Evans ba %ncc, blkd0 366*1e49577aSRod Evans sub %i2, 64, %i2 367*1e49577aSRod Evans 368*1e49577aSRod Evans#define FALIGN_D2 \ 369*1e49577aSRod Evans faligndata %d2, %d4, %d48 ;\ 370*1e49577aSRod Evans faligndata %d4, %d6, %d50 ;\ 371*1e49577aSRod Evans faligndata %d6, %d8, %d52 ;\ 372*1e49577aSRod Evans faligndata %d8, %d10, %d54 ;\ 373*1e49577aSRod Evans faligndata %d10, %d12, %d56 ;\ 374*1e49577aSRod Evans faligndata %d12, %d14, %d58 ;\ 375*1e49577aSRod Evans faligndata %d14, %d16, %d60 ;\ 376*1e49577aSRod Evans faligndata %d16, %d18, %d62 377*1e49577aSRod Evans 378*1e49577aSRod Evans#define FALIGN_D18 \ 379*1e49577aSRod Evans faligndata %d18, %d20, %d48 ;\ 380*1e49577aSRod Evans faligndata %d20, %d22, %d50 ;\ 381*1e49577aSRod Evans faligndata %d22, %d24, %d52 ;\ 382*1e49577aSRod Evans faligndata %d24, %d26, %d54 ;\ 383*1e49577aSRod Evans faligndata %d26, %d28, %d56 ;\ 384*1e49577aSRod Evans faligndata %d28, %d30, %d58 ;\ 385*1e49577aSRod Evans faligndata %d30, %d0, %d60 ;\ 386*1e49577aSRod Evans faligndata %d0, %d2, %d62 387*1e49577aSRod Evans 388*1e49577aSRod Evans 389*1e49577aSRod Evansseg1: 390*1e49577aSRod Evans FALIGN_D2 391*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d0 392*1e49577aSRod Evans add %l7, 64, %l7 393*1e49577aSRod Evans FCMPNE32_D32_D48 394*1e49577aSRod Evans add %i0, 64, %i0 395*1e49577aSRod Evans add %i1, 64, %i1 396*1e49577aSRod Evans subcc %i3, 64, %i3 397*1e49577aSRod Evans bz,pn %ncc, 1f 398*1e49577aSRod Evans sub %i2, 64, %i2 399*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 400*1e49577aSRod Evans 401*1e49577aSRod Evans FALIGN_D18 402*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d16 403*1e49577aSRod Evans add %l7, 64, %l7 404*1e49577aSRod Evans FCMPNE32_D32_D48 405*1e49577aSRod Evans add %i0, 64, %i0 406*1e49577aSRod Evans add %i1, 64, %i1 407*1e49577aSRod Evans subcc %i3, 64, %i3 408*1e49577aSRod Evans bz,pn %ncc, 0f 409*1e49577aSRod Evans sub %i2, 64, %i2 410*1e49577aSRod Evans 411*1e49577aSRod Evans ba %ncc, seg1 412*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 413*1e49577aSRod Evans 414*1e49577aSRod Evans0: 415*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 416*1e49577aSRod Evans membar #Sync 417*1e49577aSRod Evans FALIGN_D2 418*1e49577aSRod Evans FCMPNE32_D32_D48 419*1e49577aSRod Evans add %i0, 64, %i0 420*1e49577aSRod Evans add %i1, 64, %i1 421*1e49577aSRod Evans ba %ncc, blkd18 422*1e49577aSRod Evans sub %i2, 64, %i2 423*1e49577aSRod Evans 424*1e49577aSRod Evans1: 425*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 426*1e49577aSRod Evans membar #Sync 427*1e49577aSRod Evans FALIGN_D18 428*1e49577aSRod Evans FCMPNE32_D32_D48 429*1e49577aSRod Evans add %i0, 64, %i0 430*1e49577aSRod Evans add %i1, 64, %i1 431*1e49577aSRod Evans ba %ncc, blkd2 432*1e49577aSRod Evans sub %i2, 64, %i2 433*1e49577aSRod Evans 434*1e49577aSRod Evans#define FALIGN_D4 \ 435*1e49577aSRod Evans faligndata %d4, %d6, %d48 ;\ 436*1e49577aSRod Evans faligndata %d6, %d8, %d50 ;\ 437*1e49577aSRod Evans faligndata %d8, %d10, %d52 ;\ 438*1e49577aSRod Evans faligndata %d10, %d12, %d54 ;\ 439*1e49577aSRod Evans faligndata %d12, %d14, %d56 ;\ 440*1e49577aSRod Evans faligndata %d14, %d16, %d58 ;\ 441*1e49577aSRod Evans faligndata %d16, %d18, %d60 ;\ 442*1e49577aSRod Evans faligndata %d18, %d20, %d62 443*1e49577aSRod Evans 444*1e49577aSRod Evans#define FALIGN_D20 \ 445*1e49577aSRod Evans faligndata %d20, %d22, %d48 ;\ 446*1e49577aSRod Evans faligndata %d22, %d24, %d50 ;\ 447*1e49577aSRod Evans faligndata %d24, %d26, %d52 ;\ 448*1e49577aSRod Evans faligndata %d26, %d28, %d54 ;\ 449*1e49577aSRod Evans faligndata %d28, %d30, %d56 ;\ 450*1e49577aSRod Evans faligndata %d30, %d0, %d58 ;\ 451*1e49577aSRod Evans faligndata %d0, %d2, %d60 ;\ 452*1e49577aSRod Evans faligndata %d2, %d4, %d62 453*1e49577aSRod Evans 454*1e49577aSRod Evansseg2: 455*1e49577aSRod Evans FALIGN_D4 456*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d0 457*1e49577aSRod Evans add %l7, 64, %l7 458*1e49577aSRod Evans FCMPNE32_D32_D48 459*1e49577aSRod Evans add %i0, 64, %i0 460*1e49577aSRod Evans add %i1, 64, %i1 461*1e49577aSRod Evans subcc %i3, 64, %i3 462*1e49577aSRod Evans bz,pn %ncc, 1f 463*1e49577aSRod Evans sub %i2, 64, %i2 464*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 465*1e49577aSRod Evans 466*1e49577aSRod Evans FALIGN_D20 467*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d16 468*1e49577aSRod Evans add %l7, 64, %l7 469*1e49577aSRod Evans FCMPNE32_D32_D48 470*1e49577aSRod Evans add %i0, 64, %i0 471*1e49577aSRod Evans add %i1, 64, %i1 472*1e49577aSRod Evans subcc %i3, 64, %i3 473*1e49577aSRod Evans bz,pn %ncc, 0f 474*1e49577aSRod Evans sub %i2, 64, %i2 475*1e49577aSRod Evans 476*1e49577aSRod Evans ba %ncc, seg2 477*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 478*1e49577aSRod Evans 479*1e49577aSRod Evans0: 480*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 481*1e49577aSRod Evans membar #Sync 482*1e49577aSRod Evans FALIGN_D4 483*1e49577aSRod Evans FCMPNE32_D32_D48 484*1e49577aSRod Evans add %i0, 64, %i0 485*1e49577aSRod Evans add %i1, 64, %i1 486*1e49577aSRod Evans ba %ncc, blkd20 487*1e49577aSRod Evans sub %i2, 64, %i2 488*1e49577aSRod Evans 489*1e49577aSRod Evans1: 490*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 491*1e49577aSRod Evans membar #Sync 492*1e49577aSRod Evans FALIGN_D20 493*1e49577aSRod Evans FCMPNE32_D32_D48 494*1e49577aSRod Evans add %i0, 64, %i0 495*1e49577aSRod Evans add %i1, 64, %i1 496*1e49577aSRod Evans ba %ncc, blkd4 497*1e49577aSRod Evans sub %i2, 64, %i2 498*1e49577aSRod Evans 499*1e49577aSRod Evans#define FALIGN_D6 \ 500*1e49577aSRod Evans faligndata %d6, %d8, %d48 ;\ 501*1e49577aSRod Evans faligndata %d8, %d10, %d50 ;\ 502*1e49577aSRod Evans faligndata %d10, %d12, %d52 ;\ 503*1e49577aSRod Evans faligndata %d12, %d14, %d54 ;\ 504*1e49577aSRod Evans faligndata %d14, %d16, %d56 ;\ 505*1e49577aSRod Evans faligndata %d16, %d18, %d58 ;\ 506*1e49577aSRod Evans faligndata %d18, %d20, %d60 ;\ 507*1e49577aSRod Evans faligndata %d20, %d22, %d62 508*1e49577aSRod Evans 509*1e49577aSRod Evans#define FALIGN_D22 \ 510*1e49577aSRod Evans faligndata %d22, %d24, %d48 ;\ 511*1e49577aSRod Evans faligndata %d24, %d26, %d50 ;\ 512*1e49577aSRod Evans faligndata %d26, %d28, %d52 ;\ 513*1e49577aSRod Evans faligndata %d28, %d30, %d54 ;\ 514*1e49577aSRod Evans faligndata %d30, %d0, %d56 ;\ 515*1e49577aSRod Evans faligndata %d0, %d2, %d58 ;\ 516*1e49577aSRod Evans faligndata %d2, %d4, %d60 ;\ 517*1e49577aSRod Evans faligndata %d4, %d6, %d62 518*1e49577aSRod Evans 519*1e49577aSRod Evans 520*1e49577aSRod Evansseg3: 521*1e49577aSRod Evans FALIGN_D6 522*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d0 523*1e49577aSRod Evans add %l7, 64, %l7 524*1e49577aSRod Evans FCMPNE32_D32_D48 525*1e49577aSRod Evans add %i0, 64, %i0 526*1e49577aSRod Evans add %i1, 64, %i1 527*1e49577aSRod Evans subcc %i3, 64, %i3 528*1e49577aSRod Evans bz,pn %ncc, 1f 529*1e49577aSRod Evans sub %i2, 64, %i2 530*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 531*1e49577aSRod Evans 532*1e49577aSRod Evans FALIGN_D22 533*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d16 534*1e49577aSRod Evans add %l7, 64, %l7 535*1e49577aSRod Evans FCMPNE32_D32_D48 536*1e49577aSRod Evans add %i0, 64, %i0 537*1e49577aSRod Evans add %i1, 64, %i1 538*1e49577aSRod Evans subcc %i3, 64, %i3 539*1e49577aSRod Evans bz,pn %ncc, 0f 540*1e49577aSRod Evans sub %i2, 64, %i2 541*1e49577aSRod Evans 542*1e49577aSRod Evans ba %ncc, seg3 543*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 544*1e49577aSRod Evans 545*1e49577aSRod Evans 546*1e49577aSRod Evans0: 547*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 548*1e49577aSRod Evans membar #Sync 549*1e49577aSRod Evans FALIGN_D6 550*1e49577aSRod Evans FCMPNE32_D32_D48 551*1e49577aSRod Evans add %i0, 64, %i0 552*1e49577aSRod Evans add %i1, 64, %i1 553*1e49577aSRod Evans ba %ncc, blkd22 554*1e49577aSRod Evans sub %i2, 64, %i2 555*1e49577aSRod Evans 556*1e49577aSRod Evans1: 557*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 558*1e49577aSRod Evans membar #Sync 559*1e49577aSRod Evans FALIGN_D22 560*1e49577aSRod Evans FCMPNE32_D32_D48 561*1e49577aSRod Evans add %i0, 64, %i0 562*1e49577aSRod Evans add %i1, 64, %i1 563*1e49577aSRod Evans ba %ncc, blkd6 564*1e49577aSRod Evans sub %i2, 64, %i2 565*1e49577aSRod Evans 566*1e49577aSRod Evans#define FALIGN_D8 \ 567*1e49577aSRod Evans faligndata %d8, %d10, %d48 ;\ 568*1e49577aSRod Evans faligndata %d10, %d12, %d50 ;\ 569*1e49577aSRod Evans faligndata %d12, %d14, %d52 ;\ 570*1e49577aSRod Evans faligndata %d14, %d16, %d54 ;\ 571*1e49577aSRod Evans faligndata %d16, %d18, %d56 ;\ 572*1e49577aSRod Evans faligndata %d18, %d20, %d58 ;\ 573*1e49577aSRod Evans faligndata %d20, %d22, %d60 ;\ 574*1e49577aSRod Evans faligndata %d22, %d24, %d62 575*1e49577aSRod Evans 576*1e49577aSRod Evans#define FALIGN_D24 \ 577*1e49577aSRod Evans faligndata %d24, %d26, %d48 ;\ 578*1e49577aSRod Evans faligndata %d26, %d28, %d50 ;\ 579*1e49577aSRod Evans faligndata %d28, %d30, %d52 ;\ 580*1e49577aSRod Evans faligndata %d30, %d0, %d54 ;\ 581*1e49577aSRod Evans faligndata %d0, %d2, %d56 ;\ 582*1e49577aSRod Evans faligndata %d2, %d4, %d58 ;\ 583*1e49577aSRod Evans faligndata %d4, %d6, %d60 ;\ 584*1e49577aSRod Evans faligndata %d6, %d8, %d62 585*1e49577aSRod Evans 586*1e49577aSRod Evans 587*1e49577aSRod Evansseg4: 588*1e49577aSRod Evans FALIGN_D8 589*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d0 590*1e49577aSRod Evans add %l7, 64, %l7 591*1e49577aSRod Evans FCMPNE32_D32_D48 592*1e49577aSRod Evans add %i0, 64, %i0 593*1e49577aSRod Evans add %i1, 64, %i1 594*1e49577aSRod Evans subcc %i3, 64, %i3 595*1e49577aSRod Evans bz,pn %ncc, 1f 596*1e49577aSRod Evans sub %i2, 64, %i2 597*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 598*1e49577aSRod Evans 599*1e49577aSRod Evans FALIGN_D24 600*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d16 601*1e49577aSRod Evans add %l7, 64, %l7 602*1e49577aSRod Evans FCMPNE32_D32_D48 603*1e49577aSRod Evans add %i0, 64, %i0 604*1e49577aSRod Evans add %i1, 64, %i1 605*1e49577aSRod Evans subcc %i3, 64, %i3 606*1e49577aSRod Evans bz,pn %ncc, 0f 607*1e49577aSRod Evans sub %i2, 64, %i2 608*1e49577aSRod Evans 609*1e49577aSRod Evans ba %ncc, seg4 610*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 611*1e49577aSRod Evans 612*1e49577aSRod Evans 613*1e49577aSRod Evans0: 614*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 615*1e49577aSRod Evans membar #Sync 616*1e49577aSRod Evans FALIGN_D8 617*1e49577aSRod Evans FCMPNE32_D32_D48 618*1e49577aSRod Evans add %i0, 64, %i0 619*1e49577aSRod Evans add %i1, 64, %i1 620*1e49577aSRod Evans ba %ncc, blkd24 621*1e49577aSRod Evans sub %i2, 64, %i2 622*1e49577aSRod Evans 623*1e49577aSRod Evans1: 624*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 625*1e49577aSRod Evans membar #Sync 626*1e49577aSRod Evans FALIGN_D24 627*1e49577aSRod Evans FCMPNE32_D32_D48 628*1e49577aSRod Evans add %i0, 64, %i0 629*1e49577aSRod Evans add %i1, 64, %i1 630*1e49577aSRod Evans ba %ncc, blkd8 631*1e49577aSRod Evans sub %i2, 64, %i2 632*1e49577aSRod Evans 633*1e49577aSRod Evans#define FALIGN_D10 \ 634*1e49577aSRod Evans faligndata %d10, %d12, %d48 ;\ 635*1e49577aSRod Evans faligndata %d12, %d14, %d50 ;\ 636*1e49577aSRod Evans faligndata %d14, %d16, %d52 ;\ 637*1e49577aSRod Evans faligndata %d16, %d18, %d54 ;\ 638*1e49577aSRod Evans faligndata %d18, %d20, %d56 ;\ 639*1e49577aSRod Evans faligndata %d20, %d22, %d58 ;\ 640*1e49577aSRod Evans faligndata %d22, %d24, %d60 ;\ 641*1e49577aSRod Evans faligndata %d24, %d26, %d62 642*1e49577aSRod Evans 643*1e49577aSRod Evans#define FALIGN_D26 \ 644*1e49577aSRod Evans faligndata %d26, %d28, %d48 ;\ 645*1e49577aSRod Evans faligndata %d28, %d30, %d50 ;\ 646*1e49577aSRod Evans faligndata %d30, %d0, %d52 ;\ 647*1e49577aSRod Evans faligndata %d0, %d2, %d54 ;\ 648*1e49577aSRod Evans faligndata %d2, %d4, %d56 ;\ 649*1e49577aSRod Evans faligndata %d4, %d6, %d58 ;\ 650*1e49577aSRod Evans faligndata %d6, %d8, %d60 ;\ 651*1e49577aSRod Evans faligndata %d8, %d10, %d62 652*1e49577aSRod Evans 653*1e49577aSRod Evans 654*1e49577aSRod Evansseg5: 655*1e49577aSRod Evans FALIGN_D10 656*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d0 657*1e49577aSRod Evans add %l7, 64, %l7 658*1e49577aSRod Evans FCMPNE32_D32_D48 659*1e49577aSRod Evans add %i0, 64, %i0 660*1e49577aSRod Evans add %i1, 64, %i1 661*1e49577aSRod Evans subcc %i3, 64, %i3 662*1e49577aSRod Evans bz,pn %ncc, 1f 663*1e49577aSRod Evans sub %i2, 64, %i2 664*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 665*1e49577aSRod Evans 666*1e49577aSRod Evans FALIGN_D26 667*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d16 668*1e49577aSRod Evans add %l7, 64, %l7 669*1e49577aSRod Evans FCMPNE32_D32_D48 670*1e49577aSRod Evans add %i0, 64, %i0 671*1e49577aSRod Evans add %i1, 64, %i1 672*1e49577aSRod Evans subcc %i3, 64, %i3 673*1e49577aSRod Evans bz,pn %ncc, 0f 674*1e49577aSRod Evans sub %i2, 64, %i2 675*1e49577aSRod Evans 676*1e49577aSRod Evans ba %ncc, seg5 677*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 678*1e49577aSRod Evans 679*1e49577aSRod Evans 680*1e49577aSRod Evans0: 681*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 682*1e49577aSRod Evans membar #Sync 683*1e49577aSRod Evans FALIGN_D10 684*1e49577aSRod Evans FCMPNE32_D32_D48 685*1e49577aSRod Evans add %i0, 64, %i0 686*1e49577aSRod Evans add %i1, 64, %i1 687*1e49577aSRod Evans ba %ncc, blkd26 688*1e49577aSRod Evans sub %i2, 64, %i2 689*1e49577aSRod Evans 690*1e49577aSRod Evans1: 691*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 692*1e49577aSRod Evans membar #Sync 693*1e49577aSRod Evans FALIGN_D26 694*1e49577aSRod Evans FCMPNE32_D32_D48 695*1e49577aSRod Evans add %i0, 64, %i0 696*1e49577aSRod Evans add %i1, 64, %i1 697*1e49577aSRod Evans ba %ncc, blkd10 698*1e49577aSRod Evans sub %i2, 64, %i2 699*1e49577aSRod Evans 700*1e49577aSRod Evans#define FALIGN_D12 \ 701*1e49577aSRod Evans faligndata %d12, %d14, %d48 ;\ 702*1e49577aSRod Evans faligndata %d14, %d16, %d50 ;\ 703*1e49577aSRod Evans faligndata %d16, %d18, %d52 ;\ 704*1e49577aSRod Evans faligndata %d18, %d20, %d54 ;\ 705*1e49577aSRod Evans faligndata %d20, %d22, %d56 ;\ 706*1e49577aSRod Evans faligndata %d22, %d24, %d58 ;\ 707*1e49577aSRod Evans faligndata %d24, %d26, %d60 ;\ 708*1e49577aSRod Evans faligndata %d26, %d28, %d62 709*1e49577aSRod Evans 710*1e49577aSRod Evans#define FALIGN_D28 \ 711*1e49577aSRod Evans faligndata %d28, %d30, %d48 ;\ 712*1e49577aSRod Evans faligndata %d30, %d0, %d50 ;\ 713*1e49577aSRod Evans faligndata %d0, %d2, %d52 ;\ 714*1e49577aSRod Evans faligndata %d2, %d4, %d54 ;\ 715*1e49577aSRod Evans faligndata %d4, %d6, %d56 ;\ 716*1e49577aSRod Evans faligndata %d6, %d8, %d58 ;\ 717*1e49577aSRod Evans faligndata %d8, %d10, %d60 ;\ 718*1e49577aSRod Evans faligndata %d10, %d12, %d62 719*1e49577aSRod Evans 720*1e49577aSRod Evans 721*1e49577aSRod Evansseg6: 722*1e49577aSRod Evans FALIGN_D12 723*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d0 724*1e49577aSRod Evans add %l7, 64, %l7 725*1e49577aSRod Evans FCMPNE32_D32_D48 726*1e49577aSRod Evans add %i0, 64, %i0 727*1e49577aSRod Evans add %i1, 64, %i1 728*1e49577aSRod Evans subcc %i3, 64, %i3 729*1e49577aSRod Evans bz,pn %ncc, 1f 730*1e49577aSRod Evans sub %i2, 64, %i2 731*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 732*1e49577aSRod Evans 733*1e49577aSRod Evans FALIGN_D28 734*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d16 735*1e49577aSRod Evans add %l7, 64, %l7 736*1e49577aSRod Evans FCMPNE32_D32_D48 737*1e49577aSRod Evans add %i0, 64, %i0 738*1e49577aSRod Evans add %i1, 64, %i1 739*1e49577aSRod Evans subcc %i3, 64, %i3 740*1e49577aSRod Evans bz,pn %ncc, 0f 741*1e49577aSRod Evans sub %i2, 64, %i2 742*1e49577aSRod Evans 743*1e49577aSRod Evans ba %ncc, seg6 744*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 745*1e49577aSRod Evans 746*1e49577aSRod Evans 747*1e49577aSRod Evans0: 748*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 749*1e49577aSRod Evans membar #Sync 750*1e49577aSRod Evans FALIGN_D12 751*1e49577aSRod Evans FCMPNE32_D32_D48 752*1e49577aSRod Evans add %i0, 64, %i0 753*1e49577aSRod Evans add %i1, 64, %i1 754*1e49577aSRod Evans ba %ncc, blkd28 755*1e49577aSRod Evans sub %i2, 64, %i2 756*1e49577aSRod Evans 757*1e49577aSRod Evans1: 758*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 759*1e49577aSRod Evans membar #Sync 760*1e49577aSRod Evans FALIGN_D28 761*1e49577aSRod Evans FCMPNE32_D32_D48 762*1e49577aSRod Evans add %i0, 64, %i0 763*1e49577aSRod Evans add %i1, 64, %i1 764*1e49577aSRod Evans ba %ncc, blkd12 765*1e49577aSRod Evans sub %i2, 64, %i2 766*1e49577aSRod Evans 767*1e49577aSRod Evans#define FALIGN_D14 \ 768*1e49577aSRod Evans faligndata %d14, %d16, %d48 ;\ 769*1e49577aSRod Evans faligndata %d16, %d18, %d50 ;\ 770*1e49577aSRod Evans faligndata %d18, %d20, %d52 ;\ 771*1e49577aSRod Evans faligndata %d20, %d22, %d54 ;\ 772*1e49577aSRod Evans faligndata %d22, %d24, %d56 ;\ 773*1e49577aSRod Evans faligndata %d24, %d26, %d58 ;\ 774*1e49577aSRod Evans faligndata %d26, %d28, %d60 ;\ 775*1e49577aSRod Evans faligndata %d28, %d30, %d62 776*1e49577aSRod Evans 777*1e49577aSRod Evans#define FALIGN_D30 \ 778*1e49577aSRod Evans faligndata %d30, %d0, %d48 ;\ 779*1e49577aSRod Evans faligndata %d0, %d2, %d50 ;\ 780*1e49577aSRod Evans faligndata %d2, %d4, %d52 ;\ 781*1e49577aSRod Evans faligndata %d4, %d6, %d54 ;\ 782*1e49577aSRod Evans faligndata %d6, %d8, %d56 ;\ 783*1e49577aSRod Evans faligndata %d8, %d10, %d58 ;\ 784*1e49577aSRod Evans faligndata %d10, %d12, %d60 ;\ 785*1e49577aSRod Evans faligndata %d12, %d14, %d62 786*1e49577aSRod Evans 787*1e49577aSRod Evansseg7: 788*1e49577aSRod Evans FALIGN_D14 789*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d0 790*1e49577aSRod Evans add %l7, 64, %l7 791*1e49577aSRod Evans FCMPNE32_D32_D48 792*1e49577aSRod Evans add %i0, 64, %i0 793*1e49577aSRod Evans add %i1, 64, %i1 794*1e49577aSRod Evans subcc %i3, 64, %i3 795*1e49577aSRod Evans bz,pn %ncc, 1f 796*1e49577aSRod Evans sub %i2, 64, %i2 797*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 798*1e49577aSRod Evans 799*1e49577aSRod Evans FALIGN_D30 800*1e49577aSRod Evans ldda [%l7]ASI_BLK_P, %d16 801*1e49577aSRod Evans add %l7, 64, %l7 802*1e49577aSRod Evans FCMPNE32_D32_D48 803*1e49577aSRod Evans add %i0, 64, %i0 804*1e49577aSRod Evans add %i1, 64, %i1 805*1e49577aSRod Evans subcc %i3, 64, %i3 806*1e49577aSRod Evans bz,pn %ncc, 0f 807*1e49577aSRod Evans sub %i2, 64, %i2 808*1e49577aSRod Evans 809*1e49577aSRod Evans ba %ncc, seg7 810*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 811*1e49577aSRod Evans 812*1e49577aSRod Evans0: 813*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 814*1e49577aSRod Evans membar #Sync 815*1e49577aSRod Evans FALIGN_D14 816*1e49577aSRod Evans FCMPNE32_D32_D48 817*1e49577aSRod Evans add %i0, 64, %i0 818*1e49577aSRod Evans add %i1, 64, %i1 819*1e49577aSRod Evans ba %ncc, blkd30 820*1e49577aSRod Evans sub %i2, 64, %i2 821*1e49577aSRod Evans 822*1e49577aSRod Evans1: 823*1e49577aSRod Evans ldda [%i0]ASI_BLK_P, %d32 824*1e49577aSRod Evans membar #Sync 825*1e49577aSRod Evans FALIGN_D30 826*1e49577aSRod Evans FCMPNE32_D32_D48 827*1e49577aSRod Evans add %i0, 64, %i0 828*1e49577aSRod Evans add %i1, 64, %i1 829*1e49577aSRod Evans ba %ncc, blkd14 830*1e49577aSRod Evans sub %i2, 64, %i2 831*1e49577aSRod Evans 832*1e49577aSRod Evans 833*1e49577aSRod Evansblkd0: 834*1e49577aSRod Evans subcc %i4, 8, %i4 835*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 836*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 837*1e49577aSRod Evans faligndata %d0, %d2, %d48 838*1e49577aSRod Evans ldd [%i0], %d32 839*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 840*1e49577aSRod Evans fsrc1 %d32, %d32 841*1e49577aSRod Evans fsrc1 %d32, %d32 842*1e49577aSRod Evans fsrc1 %d32, %d32 843*1e49577aSRod Evans brnz,a %l1, .remcmp 844*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 845*1e49577aSRod Evans add %i0, 8, %i0 846*1e49577aSRod Evans add %i1, 8, %i1 847*1e49577aSRod Evans sub %i2, 8, %i2 848*1e49577aSRod Evans 849*1e49577aSRod Evansblkd2: 850*1e49577aSRod Evans subcc %i4, 8, %i4 851*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 852*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 853*1e49577aSRod Evans faligndata %d2, %d4, %d48 854*1e49577aSRod Evans ldd [%i0], %d32 855*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 856*1e49577aSRod Evans fsrc1 %d32, %d32 857*1e49577aSRod Evans fsrc1 %d32, %d32 858*1e49577aSRod Evans fsrc1 %d32, %d32 859*1e49577aSRod Evans brnz,a %l1, .remcmp 860*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 861*1e49577aSRod Evans add %i0, 8, %i0 862*1e49577aSRod Evans add %i1, 8, %i1 863*1e49577aSRod Evans sub %i2, 8, %i2 864*1e49577aSRod Evans 865*1e49577aSRod Evansblkd4: 866*1e49577aSRod Evans subcc %i4, 8, %i4 867*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 868*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 869*1e49577aSRod Evans faligndata %d4, %d6, %d48 870*1e49577aSRod Evans ldd [%i0], %d32 871*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 872*1e49577aSRod Evans fsrc1 %d32, %d32 873*1e49577aSRod Evans fsrc1 %d32, %d32 874*1e49577aSRod Evans fsrc1 %d32, %d32 875*1e49577aSRod Evans brnz,a %l1, .remcmp 876*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 877*1e49577aSRod Evans add %i0, 8, %i0 878*1e49577aSRod Evans add %i1, 8, %i1 879*1e49577aSRod Evans sub %i2, 8, %i2 880*1e49577aSRod Evans 881*1e49577aSRod Evansblkd6: 882*1e49577aSRod Evans subcc %i4, 8, %i4 883*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 884*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 885*1e49577aSRod Evans faligndata %d6, %d8, %d48 886*1e49577aSRod Evans ldd [%i0], %d32 887*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 888*1e49577aSRod Evans fsrc1 %d32, %d32 889*1e49577aSRod Evans fsrc1 %d32, %d32 890*1e49577aSRod Evans fsrc1 %d32, %d32 891*1e49577aSRod Evans brnz,a %l1, .remcmp 892*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 893*1e49577aSRod Evans add %i0, 8, %i0 894*1e49577aSRod Evans add %i1, 8, %i1 895*1e49577aSRod Evans sub %i2, 8, %i2 896*1e49577aSRod Evans 897*1e49577aSRod Evansblkd8: 898*1e49577aSRod Evans subcc %i4, 8, %i4 899*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 900*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 901*1e49577aSRod Evans faligndata %d8, %d10, %d48 902*1e49577aSRod Evans ldd [%i0], %d32 903*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 904*1e49577aSRod Evans fsrc1 %d32, %d32 905*1e49577aSRod Evans fsrc1 %d32, %d32 906*1e49577aSRod Evans fsrc1 %d32, %d32 907*1e49577aSRod Evans brnz,a %l1, .remcmp 908*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 909*1e49577aSRod Evans add %i0, 8, %i0 910*1e49577aSRod Evans add %i1, 8, %i1 911*1e49577aSRod Evans sub %i2, 8, %i2 912*1e49577aSRod Evans 913*1e49577aSRod Evansblkd10: 914*1e49577aSRod Evans subcc %i4, 8, %i4 915*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 916*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 917*1e49577aSRod Evans faligndata %d10, %d12, %d48 918*1e49577aSRod Evans ldd [%i0], %d32 919*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 920*1e49577aSRod Evans fsrc1 %d32, %d32 921*1e49577aSRod Evans fsrc1 %d32, %d32 922*1e49577aSRod Evans fsrc1 %d32, %d32 923*1e49577aSRod Evans brnz,a %l1, .remcmp 924*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 925*1e49577aSRod Evans add %i0, 8, %i0 926*1e49577aSRod Evans add %i1, 8, %i1 927*1e49577aSRod Evans sub %i2, 8, %i2 928*1e49577aSRod Evans 929*1e49577aSRod Evansblkd12: 930*1e49577aSRod Evans subcc %i4, 8, %i4 931*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 932*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 933*1e49577aSRod Evans faligndata %d12, %d14, %d48 934*1e49577aSRod Evans ldd [%i0], %d32 935*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 936*1e49577aSRod Evans fsrc1 %d32, %d32 937*1e49577aSRod Evans fsrc1 %d32, %d32 938*1e49577aSRod Evans fsrc1 %d32, %d32 939*1e49577aSRod Evans brnz,a %l1, .remcmp 940*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 941*1e49577aSRod Evans add %i0, 8, %i0 942*1e49577aSRod Evans add %i1, 8, %i1 943*1e49577aSRod Evans sub %i2, 8, %i2 944*1e49577aSRod Evans 945*1e49577aSRod Evansblkd14: 946*1e49577aSRod Evans subcc %i4, 8, %i4 947*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 948*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 949*1e49577aSRod Evans ba,pt %ncc, blkleft 950*1e49577aSRod Evans fmovd %d14, %d0 951*1e49577aSRod Evans 952*1e49577aSRod Evansblkd16: 953*1e49577aSRod Evans subcc %i4, 8, %i4 954*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 955*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 956*1e49577aSRod Evans faligndata %d16, %d18, %d48 957*1e49577aSRod Evans ldd [%i0], %d32 958*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 959*1e49577aSRod Evans fsrc1 %d32, %d32 960*1e49577aSRod Evans fsrc1 %d32, %d32 961*1e49577aSRod Evans fsrc1 %d32, %d32 962*1e49577aSRod Evans brnz,a %l1, .remcmp 963*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 964*1e49577aSRod Evans add %i0, 8, %i0 965*1e49577aSRod Evans add %i1, 8, %i1 966*1e49577aSRod Evans sub %i2, 8, %i2 967*1e49577aSRod Evans 968*1e49577aSRod Evansblkd18: 969*1e49577aSRod Evans subcc %i4, 8, %i4 970*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 971*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 972*1e49577aSRod Evans faligndata %d18, %d20, %d48 973*1e49577aSRod Evans ldd [%i0], %d32 974*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 975*1e49577aSRod Evans fsrc1 %d32, %d32 976*1e49577aSRod Evans fsrc1 %d32, %d32 977*1e49577aSRod Evans fsrc1 %d32, %d32 978*1e49577aSRod Evans brnz,a %l1, .remcmp 979*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 980*1e49577aSRod Evans add %i0, 8, %i0 981*1e49577aSRod Evans add %i1, 8, %i1 982*1e49577aSRod Evans sub %i2, 8, %i2 983*1e49577aSRod Evans 984*1e49577aSRod Evansblkd20: 985*1e49577aSRod Evans subcc %i4, 8, %i4 986*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 987*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 988*1e49577aSRod Evans faligndata %d20, %d22, %d48 989*1e49577aSRod Evans ldd [%i0], %d32 990*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 991*1e49577aSRod Evans fsrc1 %d32, %d32 992*1e49577aSRod Evans fsrc1 %d32, %d32 993*1e49577aSRod Evans fsrc1 %d32, %d32 994*1e49577aSRod Evans brnz,a %l1, .remcmp 995*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 996*1e49577aSRod Evans add %i0, 8, %i0 997*1e49577aSRod Evans add %i1, 8, %i1 998*1e49577aSRod Evans sub %i2, 8, %i2 999*1e49577aSRod Evans 1000*1e49577aSRod Evansblkd22: 1001*1e49577aSRod Evans subcc %i4, 8, %i4 1002*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 1003*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1004*1e49577aSRod Evans faligndata %d22, %d24, %d48 1005*1e49577aSRod Evans ldd [%i0], %d32 1006*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 1007*1e49577aSRod Evans fsrc1 %d32, %d32 1008*1e49577aSRod Evans fsrc1 %d32, %d32 1009*1e49577aSRod Evans fsrc1 %d32, %d32 1010*1e49577aSRod Evans brnz,a %l1, .remcmp 1011*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1012*1e49577aSRod Evans add %i0, 8, %i0 1013*1e49577aSRod Evans add %i1, 8, %i1 1014*1e49577aSRod Evans sub %i2, 8, %i2 1015*1e49577aSRod Evans 1016*1e49577aSRod Evansblkd24: 1017*1e49577aSRod Evans subcc %i4, 8, %i4 1018*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 1019*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1020*1e49577aSRod Evans faligndata %d24, %d26, %d48 1021*1e49577aSRod Evans ldd [%i0], %d32 1022*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 1023*1e49577aSRod Evans fsrc1 %d32, %d32 1024*1e49577aSRod Evans fsrc1 %d32, %d32 1025*1e49577aSRod Evans fsrc1 %d32, %d32 1026*1e49577aSRod Evans brnz,a %l1, .remcmp 1027*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1028*1e49577aSRod Evans add %i0, 8, %i0 1029*1e49577aSRod Evans add %i1, 8, %i1 1030*1e49577aSRod Evans sub %i2, 8, %i2 1031*1e49577aSRod Evans 1032*1e49577aSRod Evansblkd26: 1033*1e49577aSRod Evans subcc %i4, 8, %i4 1034*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 1035*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1036*1e49577aSRod Evans faligndata %d26, %d28, %d48 1037*1e49577aSRod Evans ldd [%i0], %d32 1038*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 1039*1e49577aSRod Evans fsrc1 %d32, %d32 1040*1e49577aSRod Evans fsrc1 %d32, %d32 1041*1e49577aSRod Evans fsrc1 %d32, %d32 1042*1e49577aSRod Evans brnz,a %l1, .remcmp 1043*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1044*1e49577aSRod Evans add %i0, 8, %i0 1045*1e49577aSRod Evans add %i1, 8, %i1 1046*1e49577aSRod Evans sub %i2, 8, %i2 1047*1e49577aSRod Evans 1048*1e49577aSRod Evansblkd28: 1049*1e49577aSRod Evans subcc %i4, 8, %i4 1050*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 1051*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1052*1e49577aSRod Evans faligndata %d28, %d30, %d48 1053*1e49577aSRod Evans ldd [%i0], %d32 1054*1e49577aSRod Evans fcmpne32 %d32, %d48, %l1 1055*1e49577aSRod Evans fsrc1 %d32, %d32 1056*1e49577aSRod Evans fsrc1 %d32, %d32 1057*1e49577aSRod Evans fsrc1 %d32, %d32 1058*1e49577aSRod Evans brnz,a %l1, .remcmp 1059*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1060*1e49577aSRod Evans add %i0, 8, %i0 1061*1e49577aSRod Evans add %i1, 8, %i1 1062*1e49577aSRod Evans sub %i2, 8, %i2 1063*1e49577aSRod Evans 1064*1e49577aSRod Evansblkd30: 1065*1e49577aSRod Evans subcc %i4, 8, %i4 1066*1e49577aSRod Evans blu,a,pn %ncc, .remcmp 1067*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1068*1e49577aSRod Evans fmovd %d30, %d0 1069*1e49577aSRod Evans 1070*1e49577aSRod Evans ! This loop handles doubles remaining that were not loaded(ldda`ed) 1071*1e49577aSRod Evans ! in the Block Compare loop 1072*1e49577aSRod Evansblkleft: 1073*1e49577aSRod Evans ldd [%l7], %d2 1074*1e49577aSRod Evans add %l7, 8, %l7 1075*1e49577aSRod Evans faligndata %d0, %d2, %d8 1076*1e49577aSRod Evans ldd [%i0], %d32 1077*1e49577aSRod Evans fcmpne32 %d32, %d8, %l1 1078*1e49577aSRod Evans fsrc1 %d2, %d0 1079*1e49577aSRod Evans fsrc1 %d2, %d0 1080*1e49577aSRod Evans fsrc1 %d2, %d0 1081*1e49577aSRod Evans brnz,a %l1, .remcmp 1082*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1083*1e49577aSRod Evans add %i0, 8, %i0 1084*1e49577aSRod Evans add %i1, 8, %i1 1085*1e49577aSRod Evans subcc %i4, 8, %i4 1086*1e49577aSRod Evans bgeu,pt %ncc, blkleft 1087*1e49577aSRod Evans sub %i2, 8, %i2 1088*1e49577aSRod Evans 1089*1e49577aSRod Evans ba %ncc, .remcmp 1090*1e49577aSRod Evans sub %i1, %i0, %i1 ! i1 gets the difference 1091*1e49577aSRod Evans 1092*1e49577aSRod Evans6: ldub [%i0 + %i1], %i5 ! byte compare loop 1093*1e49577aSRod Evans inc %i0 1094*1e49577aSRod Evans cmp %i4, %i5 1095*1e49577aSRod Evans bne %ncc, .bnoteq 1096*1e49577aSRod Evans.remcmp: 1097*1e49577aSRod Evans deccc %i2 1098*1e49577aSRod Evans bgeu,a %ncc, 6b 1099*1e49577aSRod Evans ldub [%i0], %i4 1100*1e49577aSRod Evans 1101*1e49577aSRod Evansexit: 1102*1e49577aSRod Evans and %l5, 0x4, %l5 ! fprs.du = fprs.dl = 0 1103*1e49577aSRod Evans wr %l5, %g0, %fprs ! fprs = l5 - restore fprs 1104*1e49577aSRod Evans membar #StoreLoad|#StoreStore 1105*1e49577aSRod Evans ret 1106*1e49577aSRod Evans restore %g0, %g0, %o0 1107*1e49577aSRod Evans 1108*1e49577aSRod Evans 1109*1e49577aSRod Evans.bnoteq: 1110*1e49577aSRod Evans and %l5, 0x4, %l5 ! fprs.du = fprs.dl = 0 1111*1e49577aSRod Evans wr %l5, %g0, %fprs ! fprs = l5 - restore fprs 1112*1e49577aSRod Evans membar #StoreLoad|#StoreStore 1113*1e49577aSRod Evans sub %i4, %i5, %i0 ! return(*s1 - *s2) 1114*1e49577aSRod Evans ret ! strings aren't equal 1115*1e49577aSRod Evans restore %i0, %g0, %o0 1116*1e49577aSRod Evans 1117*1e49577aSRod Evans 1118*1e49577aSRod Evans 1119*1e49577aSRod Evans SET_SIZE(memcmp) 1120