xref: /titanic_52/usr/src/lib/libc/capabilities/sun4u/common/memcmp.s (revision 1e49577a7fcde812700ded04431b49d67cc57d6d)
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