Home | History | Annotate | Line # | Download | only in string
memcpy.S revision 1.2.12.2
      1  1.2.12.2  yamt /*	$NetBSD: memcpy.S,v 1.2.12.2 2014/05/22 11:26:30 yamt Exp $	*/
      2  1.2.12.2  yamt 
      3  1.2.12.2  yamt /*
      4  1.2.12.2  yamt  * Copyright (c) 1996-2002 Eduardo Horvath
      5  1.2.12.2  yamt  * All rights reserved.
      6  1.2.12.2  yamt  *
      7  1.2.12.2  yamt  * Redistribution and use in source and binary forms, with or without
      8  1.2.12.2  yamt  * modification, are permitted provided that the following conditions
      9  1.2.12.2  yamt  * are met:
     10  1.2.12.2  yamt  * 1. Redistributions of source code must retain the above copyright
     11  1.2.12.2  yamt  *    notice, this list of conditions and the following disclaimer.
     12  1.2.12.2  yamt  *
     13  1.2.12.2  yamt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR  ``AS IS'' AND
     14  1.2.12.2  yamt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  1.2.12.2  yamt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     16  1.2.12.2  yamt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR  BE LIABLE
     17  1.2.12.2  yamt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     18  1.2.12.2  yamt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     19  1.2.12.2  yamt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     20  1.2.12.2  yamt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     21  1.2.12.2  yamt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     22  1.2.12.2  yamt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     23  1.2.12.2  yamt  * SUCH DAMAGE.
     24  1.2.12.2  yamt  *
     25  1.2.12.2  yamt  */
     26  1.2.12.2  yamt #include "strmacros.h"
     27  1.2.12.2  yamt #if defined(LIBC_SCCS) && !defined(lint)
     28  1.2.12.2  yamt RCSID("$NetBSD: memcpy.S,v 1.2.12.2 2014/05/22 11:26:30 yamt Exp $")
     29  1.2.12.2  yamt #endif  /* LIBC_SCCS and not lint */
     30  1.2.12.2  yamt 
     31  1.2.12.2  yamt /*
     32  1.2.12.2  yamt  * memcpy
     33  1.2.12.2  yamt  * Assumes regions do not overlap;
     34  1.2.12.2  yamt  *
     35  1.2.12.2  yamt  * Must not use %g7 (see copyin/copyout above).
     36  1.2.12.2  yamt  */
     37  1.2.12.2  yamt ENTRY(memcpy) /* dest, src, size */
     38  1.2.12.2  yamt 	/*
     39  1.2.12.2  yamt 	 * Swap args for bcopy.  Gcc generates calls to memcpy for
     40  1.2.12.2  yamt 	 * structure assignments.
     41  1.2.12.2  yamt 	 */
     42  1.2.12.2  yamt 	mov	%o0, %o3
     43  1.2.12.2  yamt 	mov	%o1, %o0
     44  1.2.12.2  yamt 	mov	%o3, %o1
     45  1.2.12.2  yamt #if !defined(_KERNEL) || defined(_RUMPKERNEL)
     46  1.2.12.2  yamt ENTRY(bcopy) /* src, dest, size */
     47  1.2.12.2  yamt #endif
     48  1.2.12.2  yamt #ifdef DEBUG
     49  1.2.12.2  yamt #if defined(_KERNEL) && !defined(_RUMPKERNEL)
     50  1.2.12.2  yamt 	set	pmapdebug, %o4
     51  1.2.12.2  yamt 	ld	[%o4], %o4
     52  1.2.12.2  yamt 	btst	0x80, %o4	! PDB_COPY
     53  1.2.12.2  yamt 	bz,pt	%icc, 3f
     54  1.2.12.2  yamt 	 nop
     55  1.2.12.2  yamt #endif
     56  1.2.12.2  yamt 	save	%sp, -CC64FSZ, %sp
     57  1.2.12.2  yamt 	mov	%i0, %o1
     58  1.2.12.2  yamt 	set	2f, %o0
     59  1.2.12.2  yamt 	mov	%i1, %o2
     60  1.2.12.2  yamt 	call	printf
     61  1.2.12.2  yamt 	 mov	%i2, %o3
     62  1.2.12.2  yamt !	ta	1; nop
     63  1.2.12.2  yamt 	restore
     64  1.2.12.2  yamt 	.data
     65  1.2.12.2  yamt 2:	.asciz	"memcpy(%p<-%p,%x)\n"
     66  1.2.12.2  yamt 	_ALIGN
     67  1.2.12.2  yamt 	.text
     68  1.2.12.2  yamt 3:
     69  1.2.12.2  yamt #endif
     70  1.2.12.2  yamt 
     71  1.2.12.2  yamt 	cmp	%o2, BCOPY_SMALL
     72  1.2.12.2  yamt 
     73  1.2.12.2  yamt Lmemcpy_start:
     74  1.2.12.2  yamt 	bge,pt	CCCR, 2f	! if >= this many, go be fancy.
     75  1.2.12.2  yamt 	 cmp	%o2, 256
     76  1.2.12.2  yamt 
     77  1.2.12.2  yamt 	mov	%o1, %o5	! Save memcpy return value
     78  1.2.12.2  yamt 	/*
     79  1.2.12.2  yamt 	 * Not much to copy, just do it a byte at a time.
     80  1.2.12.2  yamt 	 */
     81  1.2.12.2  yamt 	deccc	%o2		! while (--len >= 0)
     82  1.2.12.2  yamt 	bl	1f
     83  1.2.12.2  yamt 	 .empty
     84  1.2.12.2  yamt 0:
     85  1.2.12.2  yamt 	inc	%o0
     86  1.2.12.2  yamt 	ldsb	[%o0 - 1], %o4	!	(++dst)[-1] = *src++;
     87  1.2.12.2  yamt 	stb	%o4, [%o1]
     88  1.2.12.2  yamt 	deccc	%o2
     89  1.2.12.2  yamt 	bge	0b
     90  1.2.12.2  yamt 	 inc	%o1
     91  1.2.12.2  yamt 1:
     92  1.2.12.2  yamt 	retl
     93  1.2.12.2  yamt 	 mov	%o5, %o0
     94  1.2.12.2  yamt 	NOTREACHED
     95  1.2.12.2  yamt 
     96  1.2.12.2  yamt 	/*
     97  1.2.12.2  yamt 	 * Plenty of data to copy, so try to do it optimally.
     98  1.2.12.2  yamt 	 */
     99  1.2.12.2  yamt 2:
    100  1.2.12.2  yamt #ifdef USE_BLOCK_STORE_LOAD
    101  1.2.12.2  yamt 	! If it is big enough, use VIS instructions
    102  1.2.12.2  yamt 	bge	Lmemcpy_block
    103  1.2.12.2  yamt 	 nop
    104  1.2.12.2  yamt #endif /* USE_BLOCK_STORE_LOAD */
    105  1.2.12.2  yamt Lmemcpy_fancy:
    106  1.2.12.2  yamt 
    107  1.2.12.2  yamt 	!!
    108  1.2.12.2  yamt 	!! First align the output to a 8-byte entity
    109  1.2.12.2  yamt 	!!
    110  1.2.12.2  yamt 
    111  1.2.12.2  yamt 	save	%sp, -CC64FSZ, %sp
    112  1.2.12.2  yamt 
    113  1.2.12.2  yamt 	mov	%i0, %l0
    114  1.2.12.2  yamt 	mov	%i1, %l1
    115  1.2.12.2  yamt 
    116  1.2.12.2  yamt 	mov	%i2, %l2
    117  1.2.12.2  yamt 	btst	1, %l1
    118  1.2.12.2  yamt 
    119  1.2.12.2  yamt 	bz,pt	%icc, 4f
    120  1.2.12.2  yamt 	 btst	2, %l1
    121  1.2.12.2  yamt 	ldub	[%l0], %l4				! Load 1st byte
    122  1.2.12.2  yamt 
    123  1.2.12.2  yamt 	deccc	1, %l2
    124  1.2.12.2  yamt 	ble,pn	CCCR, Lmemcpy_finish			! XXXX
    125  1.2.12.2  yamt 	 inc	1, %l0
    126  1.2.12.2  yamt 
    127  1.2.12.2  yamt 	stb	%l4, [%l1]				! Store 1st byte
    128  1.2.12.2  yamt 	inc	1, %l1					! Update address
    129  1.2.12.2  yamt 	btst	2, %l1
    130  1.2.12.2  yamt 4:
    131  1.2.12.2  yamt 	bz,pt	%icc, 4f
    132  1.2.12.2  yamt 
    133  1.2.12.2  yamt 	 btst	1, %l0
    134  1.2.12.2  yamt 	bz,a	1f
    135  1.2.12.2  yamt 	 lduh	[%l0], %l4				! Load short
    136  1.2.12.2  yamt 
    137  1.2.12.2  yamt 	ldub	[%l0], %l4				! Load bytes
    138  1.2.12.2  yamt 
    139  1.2.12.2  yamt 	ldub	[%l0+1], %l3
    140  1.2.12.2  yamt 	sllx	%l4, 8, %l4
    141  1.2.12.2  yamt 	or	%l3, %l4, %l4
    142  1.2.12.2  yamt 
    143  1.2.12.2  yamt 1:
    144  1.2.12.2  yamt 	deccc	2, %l2
    145  1.2.12.2  yamt 	ble,pn	CCCR, Lmemcpy_finish			! XXXX
    146  1.2.12.2  yamt 	 inc	2, %l0
    147  1.2.12.2  yamt 	sth	%l4, [%l1]				! Store 1st short
    148  1.2.12.2  yamt 
    149  1.2.12.2  yamt 	inc	2, %l1
    150  1.2.12.2  yamt 4:
    151  1.2.12.2  yamt 	btst	4, %l1
    152  1.2.12.2  yamt 	bz,pt	CCCR, 4f
    153  1.2.12.2  yamt 
    154  1.2.12.2  yamt 	 btst	3, %l0
    155  1.2.12.2  yamt 	bz,a,pt	CCCR, 1f
    156  1.2.12.2  yamt 	 lduw	[%l0], %l4				! Load word -1
    157  1.2.12.2  yamt 
    158  1.2.12.2  yamt 	btst	1, %l0
    159  1.2.12.2  yamt 	bz,a,pt	%icc, 2f
    160  1.2.12.2  yamt 	 lduh	[%l0], %l4
    161  1.2.12.2  yamt 
    162  1.2.12.2  yamt 	ldub	[%l0], %l4
    163  1.2.12.2  yamt 
    164  1.2.12.2  yamt 	lduh	[%l0+1], %l3
    165  1.2.12.2  yamt 	sllx	%l4, 16, %l4
    166  1.2.12.2  yamt 	or	%l4, %l3, %l4
    167  1.2.12.2  yamt 
    168  1.2.12.2  yamt 	ldub	[%l0+3], %l3
    169  1.2.12.2  yamt 	sllx	%l4, 8, %l4
    170  1.2.12.2  yamt 	ba,pt	%icc, 1f
    171  1.2.12.2  yamt 	 or	%l4, %l3, %l4
    172  1.2.12.2  yamt 
    173  1.2.12.2  yamt 2:
    174  1.2.12.2  yamt 	lduh	[%l0+2], %l3
    175  1.2.12.2  yamt 	sllx	%l4, 16, %l4
    176  1.2.12.2  yamt 	or	%l4, %l3, %l4
    177  1.2.12.2  yamt 
    178  1.2.12.2  yamt 1:
    179  1.2.12.2  yamt 	deccc	4, %l2
    180  1.2.12.2  yamt 	ble,pn	CCCR, Lmemcpy_finish		! XXXX
    181  1.2.12.2  yamt 	 inc	4, %l0
    182  1.2.12.2  yamt 
    183  1.2.12.2  yamt 	st	%l4, [%l1]				! Store word
    184  1.2.12.2  yamt 	inc	4, %l1
    185  1.2.12.2  yamt 4:
    186  1.2.12.2  yamt 	!!
    187  1.2.12.2  yamt 	!! We are now 32-bit aligned in the dest.
    188  1.2.12.2  yamt 	!!
    189  1.2.12.2  yamt Lmemcpy_common:
    190  1.2.12.2  yamt 
    191  1.2.12.2  yamt 	and	%l0, 7, %l4				! Shift amount
    192  1.2.12.2  yamt 	andn	%l0, 7, %l0				! Source addr
    193  1.2.12.2  yamt 
    194  1.2.12.2  yamt 	brz,pt	%l4, Lmemcpy_noshift8			! No shift version...
    195  1.2.12.2  yamt 
    196  1.2.12.2  yamt 	 sllx	%l4, 3, %l4				! In bits
    197  1.2.12.2  yamt 	mov	8<<3, %l3
    198  1.2.12.2  yamt 
    199  1.2.12.2  yamt 	ldx	[%l0], %o0				! Load word -1
    200  1.2.12.2  yamt 	sub	%l3, %l4, %l3				! Reverse shift
    201  1.2.12.2  yamt 	deccc	12*8, %l2				! Have enough room?
    202  1.2.12.2  yamt 
    203  1.2.12.2  yamt 	sllx	%o0, %l4, %o0
    204  1.2.12.2  yamt 	bl,pn	CCCR, 2f
    205  1.2.12.2  yamt 	 and	%l3, 0x38, %l3
    206  1.2.12.2  yamt Lmemcpy_unrolled8:
    207  1.2.12.2  yamt 
    208  1.2.12.2  yamt 	/*
    209  1.2.12.2  yamt 	 * This is about as close to optimal as you can get, since
    210  1.2.12.2  yamt 	 * the shifts require EU0 and cannot be paired, and you have
    211  1.2.12.2  yamt 	 * 3 dependent operations on the data.
    212  1.2.12.2  yamt 	 */
    213  1.2.12.2  yamt 
    214  1.2.12.2  yamt !	ldx	[%l0+0*8], %o0				! Already done
    215  1.2.12.2  yamt !	sllx	%o0, %l4, %o0				! Already done
    216  1.2.12.2  yamt 	ldx	[%l0+1*8], %o1
    217  1.2.12.2  yamt 	ldx	[%l0+2*8], %o2
    218  1.2.12.2  yamt 	ldx	[%l0+3*8], %o3
    219  1.2.12.2  yamt 	ldx	[%l0+4*8], %o4
    220  1.2.12.2  yamt 	ba,pt	%icc, 1f
    221  1.2.12.2  yamt 	 ldx	[%l0+5*8], %o5
    222  1.2.12.2  yamt 	.align	8
    223  1.2.12.2  yamt 1:
    224  1.2.12.2  yamt 	srlx	%o1, %l3, %g1
    225  1.2.12.2  yamt 	inc	6*8, %l0
    226  1.2.12.2  yamt 
    227  1.2.12.2  yamt 	sllx	%o1, %l4, %o1
    228  1.2.12.2  yamt 	or	%g1, %o0, %g6
    229  1.2.12.2  yamt 	ldx	[%l0+0*8], %o0
    230  1.2.12.2  yamt 
    231  1.2.12.2  yamt 	stx	%g6, [%l1+0*8]
    232  1.2.12.2  yamt 	srlx	%o2, %l3, %g1
    233  1.2.12.2  yamt 
    234  1.2.12.2  yamt 	sllx	%o2, %l4, %o2
    235  1.2.12.2  yamt 	or	%g1, %o1, %g6
    236  1.2.12.2  yamt 	ldx	[%l0+1*8], %o1
    237  1.2.12.2  yamt 
    238  1.2.12.2  yamt 	stx	%g6, [%l1+1*8]
    239  1.2.12.2  yamt 	srlx	%o3, %l3, %g1
    240  1.2.12.2  yamt 
    241  1.2.12.2  yamt 	sllx	%o3, %l4, %o3
    242  1.2.12.2  yamt 	or	%g1, %o2, %g6
    243  1.2.12.2  yamt 	ldx	[%l0+2*8], %o2
    244  1.2.12.2  yamt 
    245  1.2.12.2  yamt 	stx	%g6, [%l1+2*8]
    246  1.2.12.2  yamt 	srlx	%o4, %l3, %g1
    247  1.2.12.2  yamt 
    248  1.2.12.2  yamt 	sllx	%o4, %l4, %o4
    249  1.2.12.2  yamt 	or	%g1, %o3, %g6
    250  1.2.12.2  yamt 	ldx	[%l0+3*8], %o3
    251  1.2.12.2  yamt 
    252  1.2.12.2  yamt 	stx	%g6, [%l1+3*8]
    253  1.2.12.2  yamt 	srlx	%o5, %l3, %g1
    254  1.2.12.2  yamt 
    255  1.2.12.2  yamt 	sllx	%o5, %l4, %o5
    256  1.2.12.2  yamt 	or	%g1, %o4, %g6
    257  1.2.12.2  yamt 	ldx	[%l0+4*8], %o4
    258  1.2.12.2  yamt 
    259  1.2.12.2  yamt 	stx	%g6, [%l1+4*8]
    260  1.2.12.2  yamt 	srlx	%o0, %l3, %g1
    261  1.2.12.2  yamt 	deccc	6*8, %l2				! Have enough room?
    262  1.2.12.2  yamt 
    263  1.2.12.2  yamt 	sllx	%o0, %l4, %o0				! Next loop
    264  1.2.12.2  yamt 	or	%g1, %o5, %g6
    265  1.2.12.2  yamt 	ldx	[%l0+5*8], %o5
    266  1.2.12.2  yamt 
    267  1.2.12.2  yamt 	stx	%g6, [%l1+5*8]
    268  1.2.12.2  yamt 	bge,pt	CCCR, 1b
    269  1.2.12.2  yamt 	 inc	6*8, %l1
    270  1.2.12.2  yamt 
    271  1.2.12.2  yamt Lmemcpy_unrolled8_cleanup:
    272  1.2.12.2  yamt 	!!
    273  1.2.12.2  yamt 	!! Finished 8 byte block, unload the regs.
    274  1.2.12.2  yamt 	!!
    275  1.2.12.2  yamt 	srlx	%o1, %l3, %g1
    276  1.2.12.2  yamt 	inc	5*8, %l0
    277  1.2.12.2  yamt 
    278  1.2.12.2  yamt 	sllx	%o1, %l4, %o1
    279  1.2.12.2  yamt 	or	%g1, %o0, %g6
    280  1.2.12.2  yamt 
    281  1.2.12.2  yamt 	stx	%g6, [%l1+0*8]
    282  1.2.12.2  yamt 	srlx	%o2, %l3, %g1
    283  1.2.12.2  yamt 
    284  1.2.12.2  yamt 	sllx	%o2, %l4, %o2
    285  1.2.12.2  yamt 	or	%g1, %o1, %g6
    286  1.2.12.2  yamt 
    287  1.2.12.2  yamt 	stx	%g6, [%l1+1*8]
    288  1.2.12.2  yamt 	srlx	%o3, %l3, %g1
    289  1.2.12.2  yamt 
    290  1.2.12.2  yamt 	sllx	%o3, %l4, %o3
    291  1.2.12.2  yamt 	or	%g1, %o2, %g6
    292  1.2.12.2  yamt 
    293  1.2.12.2  yamt 	stx	%g6, [%l1+2*8]
    294  1.2.12.2  yamt 	srlx	%o4, %l3, %g1
    295  1.2.12.2  yamt 
    296  1.2.12.2  yamt 	sllx	%o4, %l4, %o4
    297  1.2.12.2  yamt 	or	%g1, %o3, %g6
    298  1.2.12.2  yamt 
    299  1.2.12.2  yamt 	stx	%g6, [%l1+3*8]
    300  1.2.12.2  yamt 	srlx	%o5, %l3, %g1
    301  1.2.12.2  yamt 
    302  1.2.12.2  yamt 	sllx	%o5, %l4, %o5
    303  1.2.12.2  yamt 	or	%g1, %o4, %g6
    304  1.2.12.2  yamt 
    305  1.2.12.2  yamt 	stx	%g6, [%l1+4*8]
    306  1.2.12.2  yamt 	inc	5*8, %l1
    307  1.2.12.2  yamt 
    308  1.2.12.2  yamt 	mov	%o5, %o0				! Save our unused data
    309  1.2.12.2  yamt 	dec	5*8, %l2
    310  1.2.12.2  yamt 2:
    311  1.2.12.2  yamt 	inccc	12*8, %l2
    312  1.2.12.2  yamt 	bz,pn	%icc, Lmemcpy_complete
    313  1.2.12.2  yamt 
    314  1.2.12.2  yamt 	!! Unrolled 8 times
    315  1.2.12.2  yamt Lmemcpy_aligned8:
    316  1.2.12.2  yamt !	ldx	[%l0], %o0				! Already done
    317  1.2.12.2  yamt !	sllx	%o0, %l4, %o0				! Shift high word
    318  1.2.12.2  yamt 
    319  1.2.12.2  yamt 	 deccc	8, %l2					! Pre-decrement
    320  1.2.12.2  yamt 	bl,pn	CCCR, Lmemcpy_finish
    321  1.2.12.2  yamt 1:
    322  1.2.12.2  yamt 	ldx	[%l0+8], %o1				! Load word 0
    323  1.2.12.2  yamt 	inc	8, %l0
    324  1.2.12.2  yamt 
    325  1.2.12.2  yamt 	srlx	%o1, %l3, %g6
    326  1.2.12.2  yamt 	or	%g6, %o0, %g6				! Combine
    327  1.2.12.2  yamt 
    328  1.2.12.2  yamt 	stx	%g6, [%l1]				! Store result
    329  1.2.12.2  yamt 	 inc	8, %l1
    330  1.2.12.2  yamt 
    331  1.2.12.2  yamt 	deccc	8, %l2
    332  1.2.12.2  yamt 	bge,pn	CCCR, 1b
    333  1.2.12.2  yamt 	 sllx	%o1, %l4, %o0
    334  1.2.12.2  yamt 
    335  1.2.12.2  yamt 	btst	7, %l2					! Done?
    336  1.2.12.2  yamt 	bz,pt	CCCR, Lmemcpy_complete
    337  1.2.12.2  yamt 
    338  1.2.12.2  yamt 	!!
    339  1.2.12.2  yamt 	!! Loadup the last dregs into %o0 and shift it into place
    340  1.2.12.2  yamt 	!!
    341  1.2.12.2  yamt 	 srlx	%l3, 3, %g6				! # bytes in %o0
    342  1.2.12.2  yamt 	dec	8, %g6					!  - 8
    343  1.2.12.2  yamt 	!! n-8 - (by - 8) -> n - by
    344  1.2.12.2  yamt 	subcc	%l2, %g6, %g0				! # bytes we need
    345  1.2.12.2  yamt 	ble,pt	%icc, Lmemcpy_finish
    346  1.2.12.2  yamt 	 nop
    347  1.2.12.2  yamt 	ldx	[%l0+8], %o1				! Need another word
    348  1.2.12.2  yamt 	srlx	%o1, %l3, %o1
    349  1.2.12.2  yamt 	ba,pt	%icc, Lmemcpy_finish
    350  1.2.12.2  yamt 	 or	%o0, %o1, %o0				! All loaded up.
    351  1.2.12.2  yamt 
    352  1.2.12.2  yamt Lmemcpy_noshift8:
    353  1.2.12.2  yamt 	deccc	6*8, %l2				! Have enough room?
    354  1.2.12.2  yamt 	bl,pn	CCCR, 2f
    355  1.2.12.2  yamt 	 nop
    356  1.2.12.2  yamt 	ba,pt	%icc, 1f
    357  1.2.12.2  yamt 	 nop
    358  1.2.12.2  yamt 	.align	32
    359  1.2.12.2  yamt 1:
    360  1.2.12.2  yamt 	ldx	[%l0+0*8], %o0
    361  1.2.12.2  yamt 	ldx	[%l0+1*8], %o1
    362  1.2.12.2  yamt 	ldx	[%l0+2*8], %o2
    363  1.2.12.2  yamt 	stx	%o0, [%l1+0*8]
    364  1.2.12.2  yamt 	stx	%o1, [%l1+1*8]
    365  1.2.12.2  yamt 	stx	%o2, [%l1+2*8]
    366  1.2.12.2  yamt 
    367  1.2.12.2  yamt 
    368  1.2.12.2  yamt 	ldx	[%l0+3*8], %o3
    369  1.2.12.2  yamt 	ldx	[%l0+4*8], %o4
    370  1.2.12.2  yamt 	ldx	[%l0+5*8], %o5
    371  1.2.12.2  yamt 	inc	6*8, %l0
    372  1.2.12.2  yamt 	stx	%o3, [%l1+3*8]
    373  1.2.12.2  yamt 	deccc	6*8, %l2
    374  1.2.12.2  yamt 	stx	%o4, [%l1+4*8]
    375  1.2.12.2  yamt 	stx	%o5, [%l1+5*8]
    376  1.2.12.2  yamt 	bge,pt	CCCR, 1b
    377  1.2.12.2  yamt 	 inc	6*8, %l1
    378  1.2.12.2  yamt 2:
    379  1.2.12.2  yamt 	inc	6*8, %l2
    380  1.2.12.2  yamt 1:
    381  1.2.12.2  yamt 	deccc	8, %l2
    382  1.2.12.2  yamt 	bl,pn	%icc, 1f				! < 0 --> sub word
    383  1.2.12.2  yamt 	 nop
    384  1.2.12.2  yamt 	ldx	[%l0], %g6
    385  1.2.12.2  yamt 	inc	8, %l0
    386  1.2.12.2  yamt 	stx	%g6, [%l1]
    387  1.2.12.2  yamt 	bg,pt	%icc, 1b				! Exactly 0 --> done
    388  1.2.12.2  yamt 	 inc	8, %l1
    389  1.2.12.2  yamt 1:
    390  1.2.12.2  yamt 	btst	7, %l2					! Done?
    391  1.2.12.2  yamt 	bz,pt	CCCR, Lmemcpy_complete
    392  1.2.12.2  yamt 	 clr	%l4
    393  1.2.12.2  yamt 	ldx	[%l0], %o0
    394  1.2.12.2  yamt Lmemcpy_finish:
    395  1.2.12.2  yamt 
    396  1.2.12.2  yamt 	brz,pn	%l2, 2f					! 100% complete?
    397  1.2.12.2  yamt 	 cmp	%l2, 8					! Exactly 8 bytes?
    398  1.2.12.2  yamt 	bz,a,pn	CCCR, 2f
    399  1.2.12.2  yamt 	 stx	%o0, [%l1]
    400  1.2.12.2  yamt 
    401  1.2.12.2  yamt 	btst	4, %l2					! Word store?
    402  1.2.12.2  yamt 	bz	CCCR, 1f
    403  1.2.12.2  yamt 	 srlx	%o0, 32, %g6				! Shift high word down
    404  1.2.12.2  yamt 	stw	%g6, [%l1]
    405  1.2.12.2  yamt 	inc	4, %l1
    406  1.2.12.2  yamt 	mov	%o0, %g6				! Operate on the low bits
    407  1.2.12.2  yamt 1:
    408  1.2.12.2  yamt 	btst	2, %l2
    409  1.2.12.2  yamt 	mov	%g6, %o0
    410  1.2.12.2  yamt 	bz	1f
    411  1.2.12.2  yamt 	 srlx	%o0, 16, %g6
    412  1.2.12.2  yamt 
    413  1.2.12.2  yamt 	sth	%g6, [%l1]				! Store short
    414  1.2.12.2  yamt 	inc	2, %l1
    415  1.2.12.2  yamt 	mov	%o0, %g6				! Operate on low bytes
    416  1.2.12.2  yamt 1:
    417  1.2.12.2  yamt 	mov	%g6, %o0
    418  1.2.12.2  yamt 	btst	1, %l2					! Byte aligned?
    419  1.2.12.2  yamt 	bz	2f
    420  1.2.12.2  yamt 	 srlx	%o0, 8, %g6
    421  1.2.12.2  yamt 
    422  1.2.12.2  yamt 	stb	%g6, [%l1]				! Store last byte
    423  1.2.12.2  yamt 	inc	1, %l1					! Update address
    424  1.2.12.2  yamt 2:
    425  1.2.12.2  yamt Lmemcpy_complete:
    426  1.2.12.2  yamt #if 0
    427  1.2.12.2  yamt 	!!
    428  1.2.12.2  yamt 	!! verify copy success.
    429  1.2.12.2  yamt 	!!
    430  1.2.12.2  yamt 
    431  1.2.12.2  yamt 	mov	%i0, %o2
    432  1.2.12.2  yamt 	mov	%i1, %o4
    433  1.2.12.2  yamt 	mov	%i2, %l4
    434  1.2.12.2  yamt 0:
    435  1.2.12.2  yamt 	ldub	[%o2], %o1
    436  1.2.12.2  yamt 	inc	%o2
    437  1.2.12.2  yamt 	ldub	[%o4], %o3
    438  1.2.12.2  yamt 	inc	%o4
    439  1.2.12.2  yamt 	cmp	%o3, %o1
    440  1.2.12.2  yamt 	bnz	1f
    441  1.2.12.2  yamt 	 dec	%l4
    442  1.2.12.2  yamt 	brnz	%l4, 0b
    443  1.2.12.2  yamt 	 nop
    444  1.2.12.2  yamt 	ba	2f
    445  1.2.12.2  yamt 	 nop
    446  1.2.12.2  yamt 
    447  1.2.12.2  yamt 1:
    448  1.2.12.2  yamt 	set	0f, %o0
    449  1.2.12.2  yamt 	call	printf
    450  1.2.12.2  yamt 	 sub	%i2, %l4, %o5
    451  1.2.12.2  yamt 	set	1f, %o0
    452  1.2.12.2  yamt 	mov	%i0, %o2
    453  1.2.12.2  yamt 	mov	%i1, %o1
    454  1.2.12.2  yamt 	call	printf
    455  1.2.12.2  yamt 	 mov	%i2, %o3
    456  1.2.12.2  yamt 	ta	1
    457  1.2.12.2  yamt 	.data
    458  1.2.12.2  yamt 0:	.asciz	"memcpy failed: %x@%p != %x@%p byte %d\n"
    459  1.2.12.2  yamt 1:	.asciz	"memcpy(%p, %p, %lx)\n"
    460  1.2.12.2  yamt 	.align 8
    461  1.2.12.2  yamt 	.text
    462  1.2.12.2  yamt 2:
    463  1.2.12.2  yamt #endif
    464  1.2.12.2  yamt 	ret
    465  1.2.12.2  yamt 	 restore %i1, %g0, %o0
    466  1.2.12.2  yamt 
    467  1.2.12.2  yamt #ifdef USE_BLOCK_STORE_LOAD
    468  1.2.12.2  yamt 
    469  1.2.12.2  yamt /*
    470  1.2.12.2  yamt  * Block copy.  Useful for >256 byte copies.
    471  1.2.12.2  yamt  *
    472  1.2.12.2  yamt  * Benchmarking has shown this always seems to be slower than
    473  1.2.12.2  yamt  * the integer version, so this is disabled.  Maybe someone will
    474  1.2.12.2  yamt  * figure out why sometime.
    475  1.2.12.2  yamt  */
    476  1.2.12.2  yamt 
    477  1.2.12.2  yamt Lmemcpy_block:
    478  1.2.12.2  yamt 	sethi	%hi(block_disable), %o3
    479  1.2.12.2  yamt 	ldx	[ %o3 + %lo(block_disable) ], %o3
    480  1.2.12.2  yamt 	brnz,pn	%o3, Lmemcpy_fancy
    481  1.2.12.2  yamt 	!! Make sure our trap table is installed
    482  1.2.12.2  yamt 	set	_C_LABEL(trapbase), %o5
    483  1.2.12.2  yamt 	rdpr	%tba, %o3
    484  1.2.12.2  yamt 	sub	%o3, %o5, %o3
    485  1.2.12.2  yamt 	brnz,pn	%o3, Lmemcpy_fancy	! No, then don't use block load/store
    486  1.2.12.2  yamt 	 nop
    487  1.2.12.2  yamt #if defined(_KERNEL) && !defined(_RUMPKERNEL)
    488  1.2.12.2  yamt /*
    489  1.2.12.2  yamt  * Kernel:
    490  1.2.12.2  yamt  *
    491  1.2.12.2  yamt  * Here we use VIS instructions to do a block clear of a page.
    492  1.2.12.2  yamt  * But before we can do that we need to save and enable the FPU.
    493  1.2.12.2  yamt  * The last owner of the FPU registers is fplwp, and
    494  1.2.12.2  yamt  * fplwp->l_md.md_fpstate is the current fpstate.  If that's not
    495  1.2.12.2  yamt  * null, call savefpstate() with it to store our current fp state.
    496  1.2.12.2  yamt  *
    497  1.2.12.2  yamt  * Next, allocate an aligned fpstate on the stack.  We will properly
    498  1.2.12.2  yamt  * nest calls on a particular stack so this should not be a problem.
    499  1.2.12.2  yamt  *
    500  1.2.12.2  yamt  * Now we grab either curlwp (or if we're on the interrupt stack
    501  1.2.12.2  yamt  * lwp0).  We stash its existing fpstate in a local register and
    502  1.2.12.2  yamt  * put our new fpstate in curlwp->p_md.md_fpstate.  We point
    503  1.2.12.2  yamt  * fplwp at curlwp (or lwp0) and enable the FPU.
    504  1.2.12.2  yamt  *
    505  1.2.12.2  yamt  * If we are ever preempted, our FPU state will be saved in our
    506  1.2.12.2  yamt  * fpstate.  Then, when we're resumed and we take an FPDISABLED
    507  1.2.12.2  yamt  * trap, the trap handler will be able to fish our FPU state out
    508  1.2.12.2  yamt  * of curlwp (or lwp0).
    509  1.2.12.2  yamt  *
    510  1.2.12.2  yamt  * On exiting this routine we undo the damage: restore the original
    511  1.2.12.2  yamt  * pointer to curlwp->p_md.md_fpstate, clear our fplwp, and disable
    512  1.2.12.2  yamt  * the MMU.
    513  1.2.12.2  yamt  *
    514  1.2.12.2  yamt  *
    515  1.2.12.2  yamt  * Register usage, Kernel only (after save):
    516  1.2.12.2  yamt  *
    517  1.2.12.2  yamt  * %i0		src
    518  1.2.12.2  yamt  * %i1		dest
    519  1.2.12.2  yamt  * %i2		size
    520  1.2.12.2  yamt  *
    521  1.2.12.2  yamt  * %l0		XXXX DEBUG old fpstate
    522  1.2.12.2  yamt  * %l1		fplwp (hi bits only)
    523  1.2.12.2  yamt  * %l2		orig fplwp
    524  1.2.12.2  yamt  * %l3		orig fpstate
    525  1.2.12.2  yamt  * %l5		curlwp
    526  1.2.12.2  yamt  * %l6		old fpstate
    527  1.2.12.2  yamt  *
    528  1.2.12.2  yamt  * Register ussage, Kernel and user:
    529  1.2.12.2  yamt  *
    530  1.2.12.2  yamt  * %g1		src (retval for memcpy)
    531  1.2.12.2  yamt  *
    532  1.2.12.2  yamt  * %o0		src
    533  1.2.12.2  yamt  * %o1		dest
    534  1.2.12.2  yamt  * %o2		end dest
    535  1.2.12.2  yamt  * %o5		last safe fetchable address
    536  1.2.12.2  yamt  */
    537  1.2.12.2  yamt 
    538  1.2.12.2  yamt 	ENABLE_FPU(0)
    539  1.2.12.2  yamt 
    540  1.2.12.2  yamt 	mov	%i0, %o0				! Src addr.
    541  1.2.12.2  yamt 	mov	%i1, %o1				! Store our dest ptr here.
    542  1.2.12.2  yamt 	mov	%i2, %o2				! Len counter
    543  1.2.12.2  yamt #endif	/* _KERNEL */
    544  1.2.12.2  yamt 
    545  1.2.12.2  yamt 	!!
    546  1.2.12.2  yamt 	!! First align the output to a 64-bit entity
    547  1.2.12.2  yamt 	!!
    548  1.2.12.2  yamt 
    549  1.2.12.2  yamt 	mov	%o1, %g1				! memcpy retval
    550  1.2.12.2  yamt 	add	%o0, %o2, %o5				! End of source block
    551  1.2.12.2  yamt 
    552  1.2.12.2  yamt 	andn	%o0, 7, %o3				! Start of block
    553  1.2.12.2  yamt 	dec	%o5
    554  1.2.12.2  yamt 	fzero	%f0
    555  1.2.12.2  yamt 
    556  1.2.12.2  yamt 	andn	%o5, BLOCK_ALIGN, %o5			! Last safe addr.
    557  1.2.12.2  yamt 	ldd	[%o3], %f2				! Load 1st word
    558  1.2.12.2  yamt 
    559  1.2.12.2  yamt 	dec	8, %o3					! Move %o3 1 word back
    560  1.2.12.2  yamt 	btst	1, %o1
    561  1.2.12.2  yamt 	bz	4f
    562  1.2.12.2  yamt 
    563  1.2.12.2  yamt 	 mov	-7, %o4					! Lowest src addr possible
    564  1.2.12.2  yamt 	alignaddr %o0, %o4, %o4				! Base addr for load.
    565  1.2.12.2  yamt 
    566  1.2.12.2  yamt 	cmp	%o3, %o4
    567  1.2.12.2  yamt 	be,pt	CCCR, 1f				! Already loaded?
    568  1.2.12.2  yamt 	 mov	%o4, %o3
    569  1.2.12.2  yamt 	fmovd	%f2, %f0				! No. Shift
    570  1.2.12.2  yamt 	ldd	[%o3+8], %f2				! And load
    571  1.2.12.2  yamt 1:
    572  1.2.12.2  yamt 
    573  1.2.12.2  yamt 	faligndata	%f0, %f2, %f4			! Isolate 1st byte
    574  1.2.12.2  yamt 
    575  1.2.12.2  yamt 	stda	%f4, [%o1] ASI_FL8_P			! Store 1st byte
    576  1.2.12.2  yamt 	inc	1, %o1					! Update address
    577  1.2.12.2  yamt 	inc	1, %o0
    578  1.2.12.2  yamt 	dec	1, %o2
    579  1.2.12.2  yamt 4:
    580  1.2.12.2  yamt 	btst	2, %o1
    581  1.2.12.2  yamt 	bz	4f
    582  1.2.12.2  yamt 
    583  1.2.12.2  yamt 	 mov	-6, %o4					! Calculate src - 6
    584  1.2.12.2  yamt 	alignaddr %o0, %o4, %o4				! calculate shift mask and dest.
    585  1.2.12.2  yamt 
    586  1.2.12.2  yamt 	cmp	%o3, %o4				! Addresses same?
    587  1.2.12.2  yamt 	be,pt	CCCR, 1f
    588  1.2.12.2  yamt 	 mov	%o4, %o3
    589  1.2.12.2  yamt 	fmovd	%f2, %f0				! Shuffle data
    590  1.2.12.2  yamt 	ldd	[%o3+8], %f2				! Load word 0
    591  1.2.12.2  yamt 1:
    592  1.2.12.2  yamt 	faligndata %f0, %f2, %f4			! Move 1st short low part of f8
    593  1.2.12.2  yamt 
    594  1.2.12.2  yamt 	stda	%f4, [%o1] ASI_FL16_P			! Store 1st short
    595  1.2.12.2  yamt 	dec	2, %o2
    596  1.2.12.2  yamt 	inc	2, %o1
    597  1.2.12.2  yamt 	inc	2, %o0
    598  1.2.12.2  yamt 4:
    599  1.2.12.2  yamt 	brz,pn	%o2, Lmemcpy_blockfinish			! XXXX
    600  1.2.12.2  yamt 
    601  1.2.12.2  yamt 	 btst	4, %o1
    602  1.2.12.2  yamt 	bz	4f
    603  1.2.12.2  yamt 
    604  1.2.12.2  yamt 	mov	-4, %o4
    605  1.2.12.2  yamt 	alignaddr %o0, %o4, %o4				! calculate shift mask and dest.
    606  1.2.12.2  yamt 
    607  1.2.12.2  yamt 	cmp	%o3, %o4				! Addresses same?
    608  1.2.12.2  yamt 	beq,pt	CCCR, 1f
    609  1.2.12.2  yamt 	 mov	%o4, %o3
    610  1.2.12.2  yamt 	fmovd	%f2, %f0				! Shuffle data
    611  1.2.12.2  yamt 	ldd	[%o3+8], %f2				! Load word 0
    612  1.2.12.2  yamt 1:
    613  1.2.12.2  yamt 	faligndata %f0, %f2, %f4			! Move 1st short low part of f8
    614  1.2.12.2  yamt 
    615  1.2.12.2  yamt 	st	%f5, [%o1]				! Store word
    616  1.2.12.2  yamt 	dec	4, %o2
    617  1.2.12.2  yamt 	inc	4, %o1
    618  1.2.12.2  yamt 	inc	4, %o0
    619  1.2.12.2  yamt 4:
    620  1.2.12.2  yamt 	brz,pn	%o2, Lmemcpy_blockfinish			! XXXX
    621  1.2.12.2  yamt 	!!
    622  1.2.12.2  yamt 	!! We are now 32-bit aligned in the dest.
    623  1.2.12.2  yamt 	!!
    624  1.2.12.2  yamt Lmemcpy_block_common:
    625  1.2.12.2  yamt 
    626  1.2.12.2  yamt 	 mov	-0, %o4
    627  1.2.12.2  yamt 	alignaddr %o0, %o4, %o4				! base - shift
    628  1.2.12.2  yamt 
    629  1.2.12.2  yamt 	cmp	%o3, %o4				! Addresses same?
    630  1.2.12.2  yamt 	beq,pt	CCCR, 1f
    631  1.2.12.2  yamt 	 mov	%o4, %o3
    632  1.2.12.2  yamt 	fmovd	%f2, %f0				! Shuffle data
    633  1.2.12.2  yamt 	ldd	[%o3+8], %f2				! Load word 0
    634  1.2.12.2  yamt 1:
    635  1.2.12.2  yamt 	add	%o3, 8, %o0				! now use %o0 for src
    636  1.2.12.2  yamt 
    637  1.2.12.2  yamt 	!!
    638  1.2.12.2  yamt 	!! Continue until our dest is block aligned
    639  1.2.12.2  yamt 	!!
    640  1.2.12.2  yamt Lmemcpy_block_aligned8:
    641  1.2.12.2  yamt 1:
    642  1.2.12.2  yamt 	brz	%o2, Lmemcpy_blockfinish
    643  1.2.12.2  yamt 	 btst	BLOCK_ALIGN, %o1			! Block aligned?
    644  1.2.12.2  yamt 	bz	1f
    645  1.2.12.2  yamt 
    646  1.2.12.2  yamt 	 faligndata %f0, %f2, %f4			! Generate result
    647  1.2.12.2  yamt 	deccc	8, %o2
    648  1.2.12.2  yamt 	ble,pn	%icc, Lmemcpy_blockfinish		! Should never happen
    649  1.2.12.2  yamt 	 fmovd	%f4, %f48
    650  1.2.12.2  yamt 
    651  1.2.12.2  yamt 	std	%f4, [%o1]				! Store result
    652  1.2.12.2  yamt 	inc	8, %o1
    653  1.2.12.2  yamt 
    654  1.2.12.2  yamt 	fmovd	%f2, %f0
    655  1.2.12.2  yamt 	inc	8, %o0
    656  1.2.12.2  yamt 	ba,pt	%xcc, 1b				! Not yet.
    657  1.2.12.2  yamt 	 ldd	[%o0], %f2				! Load next part
    658  1.2.12.2  yamt Lmemcpy_block_aligned64:
    659  1.2.12.2  yamt 1:
    660  1.2.12.2  yamt 
    661  1.2.12.2  yamt /*
    662  1.2.12.2  yamt  * 64-byte aligned -- ready for block operations.
    663  1.2.12.2  yamt  *
    664  1.2.12.2  yamt  * Here we have the destination block aligned, but the
    665  1.2.12.2  yamt  * source pointer may not be.  Sub-word alignment will
    666  1.2.12.2  yamt  * be handled by faligndata instructions.  But the source
    667  1.2.12.2  yamt  * can still be potentially aligned to 8 different words
    668  1.2.12.2  yamt  * in our 64-bit block, so we have 8 different copy routines.
    669  1.2.12.2  yamt  *
    670  1.2.12.2  yamt  * Once we figure out our source alignment, we branch
    671  1.2.12.2  yamt  * to the appropriate copy routine, which sets up the
    672  1.2.12.2  yamt  * alignment for faligndata and loads (sets) the values
    673  1.2.12.2  yamt  * into the source registers and does the copy loop.
    674  1.2.12.2  yamt  *
    675  1.2.12.2  yamt  * When were down to less than 1 block to store, we
    676  1.2.12.2  yamt  * exit the copy loop and execute cleanup code.
    677  1.2.12.2  yamt  *
    678  1.2.12.2  yamt  * Block loads and stores are not properly interlocked.
    679  1.2.12.2  yamt  * Stores save one reg/cycle, so you can start overwriting
    680  1.2.12.2  yamt  * registers the cycle after the store is issued.
    681  1.2.12.2  yamt  *
    682  1.2.12.2  yamt  * Block loads require a block load to a different register
    683  1.2.12.2  yamt  * block or a membar #Sync before accessing the loaded
    684  1.2.12.2  yamt  * data.
    685  1.2.12.2  yamt  *
    686  1.2.12.2  yamt  * Since the faligndata instructions may be offset as far
    687  1.2.12.2  yamt  * as 7 registers into a block (if you are shifting source
    688  1.2.12.2  yamt  * 7 -> dest 0), you need 3 source register blocks for full
    689  1.2.12.2  yamt  * performance: one you are copying, one you are loading,
    690  1.2.12.2  yamt  * and one for interlocking.  Otherwise, we would need to
    691  1.2.12.2  yamt  * sprinkle the code with membar #Sync and lose the advantage
    692  1.2.12.2  yamt  * of running faligndata in parallel with block stores.  This
    693  1.2.12.2  yamt  * means we are fetching a full 128 bytes ahead of the stores.
    694  1.2.12.2  yamt  * We need to make sure the prefetch does not inadvertently
    695  1.2.12.2  yamt  * cross a page boundary and fault on data that we will never
    696  1.2.12.2  yamt  * store.
    697  1.2.12.2  yamt  *
    698  1.2.12.2  yamt  */
    699  1.2.12.2  yamt #if 1
    700  1.2.12.2  yamt 	and	%o0, BLOCK_ALIGN, %o3
    701  1.2.12.2  yamt 	srax	%o3, 3, %o3				! Isolate the offset
    702  1.2.12.2  yamt 
    703  1.2.12.2  yamt 	brz	%o3, L100				! 0->0
    704  1.2.12.2  yamt 	 btst	4, %o3
    705  1.2.12.2  yamt 	bnz	%xcc, 4f
    706  1.2.12.2  yamt 	 btst	2, %o3
    707  1.2.12.2  yamt 	bnz	%xcc, 2f
    708  1.2.12.2  yamt 	 btst	1, %o3
    709  1.2.12.2  yamt 	ba,pt	%xcc, L101				! 0->1
    710  1.2.12.2  yamt 	 nop	/* XXX spitfire bug */
    711  1.2.12.2  yamt 2:
    712  1.2.12.2  yamt 	bz	%xcc, L102				! 0->2
    713  1.2.12.2  yamt 	 nop
    714  1.2.12.2  yamt 	ba,pt	%xcc, L103				! 0->3
    715  1.2.12.2  yamt 	 nop	/* XXX spitfire bug */
    716  1.2.12.2  yamt 4:
    717  1.2.12.2  yamt 	bnz	%xcc, 2f
    718  1.2.12.2  yamt 	 btst	1, %o3
    719  1.2.12.2  yamt 	bz	%xcc, L104				! 0->4
    720  1.2.12.2  yamt 	 nop
    721  1.2.12.2  yamt 	ba,pt	%xcc, L105				! 0->5
    722  1.2.12.2  yamt 	 nop	/* XXX spitfire bug */
    723  1.2.12.2  yamt 2:
    724  1.2.12.2  yamt 	bz	%xcc, L106				! 0->6
    725  1.2.12.2  yamt 	 nop
    726  1.2.12.2  yamt 	ba,pt	%xcc, L107				! 0->7
    727  1.2.12.2  yamt 	 nop	/* XXX spitfire bug */
    728  1.2.12.2  yamt #else
    729  1.2.12.2  yamt 
    730  1.2.12.2  yamt 	!!
    731  1.2.12.2  yamt 	!! Isolate the word offset, which just happens to be
    732  1.2.12.2  yamt 	!! the slot in our jump table.
    733  1.2.12.2  yamt 	!!
    734  1.2.12.2  yamt 	!! This is 6 insns, most of which cannot be paired,
    735  1.2.12.2  yamt 	!! which is about the same as the above version.
    736  1.2.12.2  yamt 	!!
    737  1.2.12.2  yamt 	rd	%pc, %o4
    738  1.2.12.2  yamt 1:
    739  1.2.12.2  yamt 	and	%o0, 0x31, %o3
    740  1.2.12.2  yamt 	add	%o3, (Lmemcpy_block_jmp - 1b), %o3
    741  1.2.12.2  yamt 	jmpl	%o4 + %o3, %g0
    742  1.2.12.2  yamt 	 nop
    743  1.2.12.2  yamt 
    744  1.2.12.2  yamt 	!!
    745  1.2.12.2  yamt 	!! Jump table
    746  1.2.12.2  yamt 	!!
    747  1.2.12.2  yamt 
    748  1.2.12.2  yamt Lmemcpy_block_jmp:
    749  1.2.12.2  yamt 	ba,a,pt	%xcc, L100
    750  1.2.12.2  yamt 	 nop
    751  1.2.12.2  yamt 	ba,a,pt	%xcc, L101
    752  1.2.12.2  yamt 	 nop
    753  1.2.12.2  yamt 	ba,a,pt	%xcc, L102
    754  1.2.12.2  yamt 	 nop
    755  1.2.12.2  yamt 	ba,a,pt	%xcc, L103
    756  1.2.12.2  yamt 	 nop
    757  1.2.12.2  yamt 	ba,a,pt	%xcc, L104
    758  1.2.12.2  yamt 	 nop
    759  1.2.12.2  yamt 	ba,a,pt	%xcc, L105
    760  1.2.12.2  yamt 	 nop
    761  1.2.12.2  yamt 	ba,a,pt	%xcc, L106
    762  1.2.12.2  yamt 	 nop
    763  1.2.12.2  yamt 	ba,a,pt	%xcc, L107
    764  1.2.12.2  yamt 	 nop
    765  1.2.12.2  yamt #endif
    766  1.2.12.2  yamt 
    767  1.2.12.2  yamt 	!!
    768  1.2.12.2  yamt 	!! Source is block aligned.
    769  1.2.12.2  yamt 	!!
    770  1.2.12.2  yamt 	!! Just load a block and go.
    771  1.2.12.2  yamt 	!!
    772  1.2.12.2  yamt L100:
    773  1.2.12.2  yamt #ifdef RETURN_NAME
    774  1.2.12.2  yamt 	sethi	%hi(1f), %g1
    775  1.2.12.2  yamt 	ba,pt	%icc, 2f
    776  1.2.12.2  yamt 	 or	%g1, %lo(1f), %g1
    777  1.2.12.2  yamt 1:
    778  1.2.12.2  yamt 	.asciz	"L100"
    779  1.2.12.2  yamt 	.align	8
    780  1.2.12.2  yamt 2:
    781  1.2.12.2  yamt #endif
    782  1.2.12.2  yamt 	fmovd	%f0 , %f62
    783  1.2.12.2  yamt 	ldda	[%o0] ASI_BLK_P, %f0
    784  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
    785  1.2.12.2  yamt 	cmp	%o0, %o5
    786  1.2.12.2  yamt 	bleu,a,pn	%icc, 3f
    787  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
    788  1.2.12.2  yamt 	ba,pt	%icc, 3f
    789  1.2.12.2  yamt 	 membar #Sync
    790  1.2.12.2  yamt 
    791  1.2.12.2  yamt 	.align	32					! ICache align.
    792  1.2.12.2  yamt 3:
    793  1.2.12.2  yamt 	faligndata	%f62, %f0, %f32
    794  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
    795  1.2.12.2  yamt 	faligndata	%f0, %f2, %f34
    796  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
    797  1.2.12.2  yamt 	faligndata	%f2, %f4, %f36
    798  1.2.12.2  yamt 	cmp	%o0, %o5
    799  1.2.12.2  yamt 	faligndata	%f4, %f6, %f38
    800  1.2.12.2  yamt 	faligndata	%f6, %f8, %f40
    801  1.2.12.2  yamt 	faligndata	%f8, %f10, %f42
    802  1.2.12.2  yamt 	faligndata	%f10, %f12, %f44
    803  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
    804  1.2.12.2  yamt 	 faligndata	%f12, %f14, %f46
    805  1.2.12.2  yamt 
    806  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
    807  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f48
    808  1.2.12.2  yamt 	membar	#Sync
    809  1.2.12.2  yamt 2:
    810  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
    811  1.2.12.2  yamt 	faligndata	%f14, %f16, %f32
    812  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
    813  1.2.12.2  yamt 	faligndata	%f16, %f18, %f34
    814  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
    815  1.2.12.2  yamt 	faligndata	%f18, %f20, %f36
    816  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
    817  1.2.12.2  yamt 	faligndata	%f20, %f22, %f38
    818  1.2.12.2  yamt 	cmp	%o0, %o5
    819  1.2.12.2  yamt 	faligndata	%f22, %f24, %f40
    820  1.2.12.2  yamt 	faligndata	%f24, %f26, %f42
    821  1.2.12.2  yamt 	faligndata	%f26, %f28, %f44
    822  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
    823  1.2.12.2  yamt 	 faligndata	%f28, %f30, %f46
    824  1.2.12.2  yamt 
    825  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
    826  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f0
    827  1.2.12.2  yamt 	membar	#Sync
    828  1.2.12.2  yamt 2:
    829  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
    830  1.2.12.2  yamt 	faligndata	%f30, %f48, %f32
    831  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
    832  1.2.12.2  yamt 	faligndata	%f48, %f50, %f34
    833  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
    834  1.2.12.2  yamt 	faligndata	%f50, %f52, %f36
    835  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
    836  1.2.12.2  yamt 	faligndata	%f52, %f54, %f38
    837  1.2.12.2  yamt 	cmp	%o0, %o5
    838  1.2.12.2  yamt 	faligndata	%f54, %f56, %f40
    839  1.2.12.2  yamt 	faligndata	%f56, %f58, %f42
    840  1.2.12.2  yamt 	faligndata	%f58, %f60, %f44
    841  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
    842  1.2.12.2  yamt 	 faligndata	%f60, %f62, %f46
    843  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
    844  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16			! Increment is at top
    845  1.2.12.2  yamt 	membar	#Sync
    846  1.2.12.2  yamt 2:
    847  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
    848  1.2.12.2  yamt 	ba	3b
    849  1.2.12.2  yamt 	 inc	BLOCK_SIZE, %o1
    850  1.2.12.2  yamt 
    851  1.2.12.2  yamt 	!!
    852  1.2.12.2  yamt 	!! Source at BLOCK_ALIGN+8
    853  1.2.12.2  yamt 	!!
    854  1.2.12.2  yamt 	!! We need to load almost 1 complete block by hand.
    855  1.2.12.2  yamt 	!!
    856  1.2.12.2  yamt L101:
    857  1.2.12.2  yamt #ifdef RETURN_NAME
    858  1.2.12.2  yamt 	sethi	%hi(1f), %g1
    859  1.2.12.2  yamt 	ba,pt	%icc, 2f
    860  1.2.12.2  yamt 	 or	%g1, %lo(1f), %g1
    861  1.2.12.2  yamt 1:
    862  1.2.12.2  yamt 	.asciz	"L101"
    863  1.2.12.2  yamt 	.align	8
    864  1.2.12.2  yamt 2:
    865  1.2.12.2  yamt #endif
    866  1.2.12.2  yamt !	fmovd	%f0, %f0				! Hoist fmovd
    867  1.2.12.2  yamt 	ldd	[%o0], %f2
    868  1.2.12.2  yamt 	inc	8, %o0
    869  1.2.12.2  yamt 	ldd	[%o0], %f4
    870  1.2.12.2  yamt 	inc	8, %o0
    871  1.2.12.2  yamt 	ldd	[%o0], %f6
    872  1.2.12.2  yamt 	inc	8, %o0
    873  1.2.12.2  yamt 	ldd	[%o0], %f8
    874  1.2.12.2  yamt 	inc	8, %o0
    875  1.2.12.2  yamt 	ldd	[%o0], %f10
    876  1.2.12.2  yamt 	inc	8, %o0
    877  1.2.12.2  yamt 	ldd	[%o0], %f12
    878  1.2.12.2  yamt 	inc	8, %o0
    879  1.2.12.2  yamt 	ldd	[%o0], %f14
    880  1.2.12.2  yamt 	inc	8, %o0
    881  1.2.12.2  yamt 
    882  1.2.12.2  yamt 	cmp	%o0, %o5
    883  1.2.12.2  yamt 	bleu,a,pn	%icc, 3f
    884  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
    885  1.2.12.2  yamt 	membar #Sync
    886  1.2.12.2  yamt 3:
    887  1.2.12.2  yamt 	faligndata	%f0, %f2, %f32
    888  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
    889  1.2.12.2  yamt 	faligndata	%f2, %f4, %f34
    890  1.2.12.2  yamt 	cmp	%o0, %o5
    891  1.2.12.2  yamt 	faligndata	%f4, %f6, %f36
    892  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
    893  1.2.12.2  yamt 	faligndata	%f6, %f8, %f38
    894  1.2.12.2  yamt 	faligndata	%f8, %f10, %f40
    895  1.2.12.2  yamt 	faligndata	%f10, %f12, %f42
    896  1.2.12.2  yamt 	faligndata	%f12, %f14, %f44
    897  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
    898  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f48
    899  1.2.12.2  yamt 	membar	#Sync
    900  1.2.12.2  yamt 2:
    901  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
    902  1.2.12.2  yamt 	 faligndata	%f14, %f16, %f46
    903  1.2.12.2  yamt 
    904  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
    905  1.2.12.2  yamt 
    906  1.2.12.2  yamt 	faligndata	%f16, %f18, %f32
    907  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
    908  1.2.12.2  yamt 	faligndata	%f18, %f20, %f34
    909  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
    910  1.2.12.2  yamt 	faligndata	%f20, %f22, %f36
    911  1.2.12.2  yamt 	cmp	%o0, %o5
    912  1.2.12.2  yamt 	faligndata	%f22, %f24, %f38
    913  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
    914  1.2.12.2  yamt 	faligndata	%f24, %f26, %f40
    915  1.2.12.2  yamt 	faligndata	%f26, %f28, %f42
    916  1.2.12.2  yamt 	faligndata	%f28, %f30, %f44
    917  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
    918  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f0
    919  1.2.12.2  yamt 	membar	#Sync
    920  1.2.12.2  yamt 2:
    921  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
    922  1.2.12.2  yamt 	 faligndata	%f30, %f48, %f46
    923  1.2.12.2  yamt 
    924  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
    925  1.2.12.2  yamt 
    926  1.2.12.2  yamt 	faligndata	%f48, %f50, %f32
    927  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
    928  1.2.12.2  yamt 	faligndata	%f50, %f52, %f34
    929  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
    930  1.2.12.2  yamt 	faligndata	%f52, %f54, %f36
    931  1.2.12.2  yamt 	cmp	%o0, %o5
    932  1.2.12.2  yamt 	faligndata	%f54, %f56, %f38
    933  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
    934  1.2.12.2  yamt 	faligndata	%f56, %f58, %f40
    935  1.2.12.2  yamt 	faligndata	%f58, %f60, %f42
    936  1.2.12.2  yamt 	faligndata	%f60, %f62, %f44
    937  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
    938  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
    939  1.2.12.2  yamt 	membar	#Sync
    940  1.2.12.2  yamt 2:
    941  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
    942  1.2.12.2  yamt 	 faligndata	%f62, %f0, %f46
    943  1.2.12.2  yamt 
    944  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
    945  1.2.12.2  yamt 	ba	3b
    946  1.2.12.2  yamt 	 inc	BLOCK_SIZE, %o1
    947  1.2.12.2  yamt 
    948  1.2.12.2  yamt 	!!
    949  1.2.12.2  yamt 	!! Source at BLOCK_ALIGN+16
    950  1.2.12.2  yamt 	!!
    951  1.2.12.2  yamt 	!! We need to load 6 doubles by hand.
    952  1.2.12.2  yamt 	!!
    953  1.2.12.2  yamt L102:
    954  1.2.12.2  yamt #ifdef RETURN_NAME
    955  1.2.12.2  yamt 	sethi	%hi(1f), %g1
    956  1.2.12.2  yamt 	ba,pt	%icc, 2f
    957  1.2.12.2  yamt 	 or	%g1, %lo(1f), %g1
    958  1.2.12.2  yamt 1:
    959  1.2.12.2  yamt 	.asciz	"L102"
    960  1.2.12.2  yamt 	.align	8
    961  1.2.12.2  yamt 2:
    962  1.2.12.2  yamt #endif
    963  1.2.12.2  yamt 	ldd	[%o0], %f4
    964  1.2.12.2  yamt 	inc	8, %o0
    965  1.2.12.2  yamt 	fmovd	%f0, %f2				! Hoist fmovd
    966  1.2.12.2  yamt 	ldd	[%o0], %f6
    967  1.2.12.2  yamt 	inc	8, %o0
    968  1.2.12.2  yamt 
    969  1.2.12.2  yamt 	ldd	[%o0], %f8
    970  1.2.12.2  yamt 	inc	8, %o0
    971  1.2.12.2  yamt 	ldd	[%o0], %f10
    972  1.2.12.2  yamt 	inc	8, %o0
    973  1.2.12.2  yamt 	ldd	[%o0], %f12
    974  1.2.12.2  yamt 	inc	8, %o0
    975  1.2.12.2  yamt 	ldd	[%o0], %f14
    976  1.2.12.2  yamt 	inc	8, %o0
    977  1.2.12.2  yamt 
    978  1.2.12.2  yamt 	cmp	%o0, %o5
    979  1.2.12.2  yamt 	bleu,a,pn	%icc, 3f
    980  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
    981  1.2.12.2  yamt 	membar #Sync
    982  1.2.12.2  yamt 3:
    983  1.2.12.2  yamt 	faligndata	%f2, %f4, %f32
    984  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
    985  1.2.12.2  yamt 	faligndata	%f4, %f6, %f34
    986  1.2.12.2  yamt 	cmp	%o0, %o5
    987  1.2.12.2  yamt 	faligndata	%f6, %f8, %f36
    988  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
    989  1.2.12.2  yamt 	faligndata	%f8, %f10, %f38
    990  1.2.12.2  yamt 	faligndata	%f10, %f12, %f40
    991  1.2.12.2  yamt 	faligndata	%f12, %f14, %f42
    992  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
    993  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f48
    994  1.2.12.2  yamt 	membar	#Sync
    995  1.2.12.2  yamt 2:
    996  1.2.12.2  yamt 	faligndata	%f14, %f16, %f44
    997  1.2.12.2  yamt 
    998  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
    999  1.2.12.2  yamt 	 faligndata	%f16, %f18, %f46
   1000  1.2.12.2  yamt 
   1001  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1002  1.2.12.2  yamt 
   1003  1.2.12.2  yamt 	faligndata	%f18, %f20, %f32
   1004  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1005  1.2.12.2  yamt 	faligndata	%f20, %f22, %f34
   1006  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1007  1.2.12.2  yamt 	faligndata	%f22, %f24, %f36
   1008  1.2.12.2  yamt 	cmp	%o0, %o5
   1009  1.2.12.2  yamt 	faligndata	%f24, %f26, %f38
   1010  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1011  1.2.12.2  yamt 	faligndata	%f26, %f28, %f40
   1012  1.2.12.2  yamt 	faligndata	%f28, %f30, %f42
   1013  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1014  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f0
   1015  1.2.12.2  yamt 	membar	#Sync
   1016  1.2.12.2  yamt 2:
   1017  1.2.12.2  yamt 	faligndata	%f30, %f48, %f44
   1018  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1019  1.2.12.2  yamt 	 faligndata	%f48, %f50, %f46
   1020  1.2.12.2  yamt 
   1021  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1022  1.2.12.2  yamt 
   1023  1.2.12.2  yamt 	faligndata	%f50, %f52, %f32
   1024  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1025  1.2.12.2  yamt 	faligndata	%f52, %f54, %f34
   1026  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1027  1.2.12.2  yamt 	faligndata	%f54, %f56, %f36
   1028  1.2.12.2  yamt 	cmp	%o0, %o5
   1029  1.2.12.2  yamt 	faligndata	%f56, %f58, %f38
   1030  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1031  1.2.12.2  yamt 	faligndata	%f58, %f60, %f40
   1032  1.2.12.2  yamt 	faligndata	%f60, %f62, %f42
   1033  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1034  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1035  1.2.12.2  yamt 	membar	#Sync
   1036  1.2.12.2  yamt 2:
   1037  1.2.12.2  yamt 	faligndata	%f62, %f0, %f44
   1038  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1039  1.2.12.2  yamt 	 faligndata	%f0, %f2, %f46
   1040  1.2.12.2  yamt 
   1041  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1042  1.2.12.2  yamt 	ba	3b
   1043  1.2.12.2  yamt 	 inc	BLOCK_SIZE, %o1
   1044  1.2.12.2  yamt 
   1045  1.2.12.2  yamt 	!!
   1046  1.2.12.2  yamt 	!! Source at BLOCK_ALIGN+24
   1047  1.2.12.2  yamt 	!!
   1048  1.2.12.2  yamt 	!! We need to load 5 doubles by hand.
   1049  1.2.12.2  yamt 	!!
   1050  1.2.12.2  yamt L103:
   1051  1.2.12.2  yamt #ifdef RETURN_NAME
   1052  1.2.12.2  yamt 	sethi	%hi(1f), %g1
   1053  1.2.12.2  yamt 	ba,pt	%icc, 2f
   1054  1.2.12.2  yamt 	 or	%g1, %lo(1f), %g1
   1055  1.2.12.2  yamt 1:
   1056  1.2.12.2  yamt 	.asciz	"L103"
   1057  1.2.12.2  yamt 	.align	8
   1058  1.2.12.2  yamt 2:
   1059  1.2.12.2  yamt #endif
   1060  1.2.12.2  yamt 	fmovd	%f0, %f4
   1061  1.2.12.2  yamt 	ldd	[%o0], %f6
   1062  1.2.12.2  yamt 	inc	8, %o0
   1063  1.2.12.2  yamt 	ldd	[%o0], %f8
   1064  1.2.12.2  yamt 	inc	8, %o0
   1065  1.2.12.2  yamt 	ldd	[%o0], %f10
   1066  1.2.12.2  yamt 	inc	8, %o0
   1067  1.2.12.2  yamt 	ldd	[%o0], %f12
   1068  1.2.12.2  yamt 	inc	8, %o0
   1069  1.2.12.2  yamt 	ldd	[%o0], %f14
   1070  1.2.12.2  yamt 	inc	8, %o0
   1071  1.2.12.2  yamt 
   1072  1.2.12.2  yamt 	cmp	%o0, %o5
   1073  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1074  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1075  1.2.12.2  yamt 	membar #Sync
   1076  1.2.12.2  yamt 2:
   1077  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1078  1.2.12.2  yamt 3:
   1079  1.2.12.2  yamt 	faligndata	%f4, %f6, %f32
   1080  1.2.12.2  yamt 	cmp	%o0, %o5
   1081  1.2.12.2  yamt 	faligndata	%f6, %f8, %f34
   1082  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1083  1.2.12.2  yamt 	faligndata	%f8, %f10, %f36
   1084  1.2.12.2  yamt 	faligndata	%f10, %f12, %f38
   1085  1.2.12.2  yamt 	faligndata	%f12, %f14, %f40
   1086  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1087  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f48
   1088  1.2.12.2  yamt 	membar	#Sync
   1089  1.2.12.2  yamt 2:
   1090  1.2.12.2  yamt 	faligndata	%f14, %f16, %f42
   1091  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1092  1.2.12.2  yamt 	faligndata	%f16, %f18, %f44
   1093  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1094  1.2.12.2  yamt 	 faligndata	%f18, %f20, %f46
   1095  1.2.12.2  yamt 
   1096  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1097  1.2.12.2  yamt 
   1098  1.2.12.2  yamt 	faligndata	%f20, %f22, %f32
   1099  1.2.12.2  yamt 	cmp	%o0, %o5
   1100  1.2.12.2  yamt 	faligndata	%f22, %f24, %f34
   1101  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1102  1.2.12.2  yamt 	faligndata	%f24, %f26, %f36
   1103  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1104  1.2.12.2  yamt 	faligndata	%f26, %f28, %f38
   1105  1.2.12.2  yamt 	faligndata	%f28, %f30, %f40
   1106  1.2.12.2  yamt 	ble,a,pn	%icc, 2f
   1107  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f0
   1108  1.2.12.2  yamt 	membar	#Sync
   1109  1.2.12.2  yamt 2:
   1110  1.2.12.2  yamt 	faligndata	%f30, %f48, %f42
   1111  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1112  1.2.12.2  yamt 	faligndata	%f48, %f50, %f44
   1113  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1114  1.2.12.2  yamt 	 faligndata	%f50, %f52, %f46
   1115  1.2.12.2  yamt 
   1116  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1117  1.2.12.2  yamt 
   1118  1.2.12.2  yamt 	faligndata	%f52, %f54, %f32
   1119  1.2.12.2  yamt 	cmp	%o0, %o5
   1120  1.2.12.2  yamt 	faligndata	%f54, %f56, %f34
   1121  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1122  1.2.12.2  yamt 	faligndata	%f56, %f58, %f36
   1123  1.2.12.2  yamt 	faligndata	%f58, %f60, %f38
   1124  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1125  1.2.12.2  yamt 	faligndata	%f60, %f62, %f40
   1126  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1127  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1128  1.2.12.2  yamt 	membar	#Sync
   1129  1.2.12.2  yamt 2:
   1130  1.2.12.2  yamt 	faligndata	%f62, %f0, %f42
   1131  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1132  1.2.12.2  yamt 	faligndata	%f0, %f2, %f44
   1133  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1134  1.2.12.2  yamt 	 faligndata	%f2, %f4, %f46
   1135  1.2.12.2  yamt 
   1136  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1137  1.2.12.2  yamt 	ba	3b
   1138  1.2.12.2  yamt 	 inc	BLOCK_SIZE, %o1
   1139  1.2.12.2  yamt 
   1140  1.2.12.2  yamt 	!!
   1141  1.2.12.2  yamt 	!! Source at BLOCK_ALIGN+32
   1142  1.2.12.2  yamt 	!!
   1143  1.2.12.2  yamt 	!! We need to load 4 doubles by hand.
   1144  1.2.12.2  yamt 	!!
   1145  1.2.12.2  yamt L104:
   1146  1.2.12.2  yamt #ifdef RETURN_NAME
   1147  1.2.12.2  yamt 	sethi	%hi(1f), %g1
   1148  1.2.12.2  yamt 	ba,pt	%icc, 2f
   1149  1.2.12.2  yamt 	 or	%g1, %lo(1f), %g1
   1150  1.2.12.2  yamt 1:
   1151  1.2.12.2  yamt 	.asciz	"L104"
   1152  1.2.12.2  yamt 	.align	8
   1153  1.2.12.2  yamt 2:
   1154  1.2.12.2  yamt #endif
   1155  1.2.12.2  yamt 	fmovd	%f0, %f6
   1156  1.2.12.2  yamt 	ldd	[%o0], %f8
   1157  1.2.12.2  yamt 	inc	8, %o0
   1158  1.2.12.2  yamt 	ldd	[%o0], %f10
   1159  1.2.12.2  yamt 	inc	8, %o0
   1160  1.2.12.2  yamt 	ldd	[%o0], %f12
   1161  1.2.12.2  yamt 	inc	8, %o0
   1162  1.2.12.2  yamt 	ldd	[%o0], %f14
   1163  1.2.12.2  yamt 	inc	8, %o0
   1164  1.2.12.2  yamt 
   1165  1.2.12.2  yamt 	cmp	%o0, %o5
   1166  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1167  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1168  1.2.12.2  yamt 	membar #Sync
   1169  1.2.12.2  yamt 2:
   1170  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1171  1.2.12.2  yamt 3:
   1172  1.2.12.2  yamt 	faligndata	%f6, %f8, %f32
   1173  1.2.12.2  yamt 	cmp	%o0, %o5
   1174  1.2.12.2  yamt 	faligndata	%f8, %f10, %f34
   1175  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1176  1.2.12.2  yamt 	faligndata	%f10, %f12, %f36
   1177  1.2.12.2  yamt 	faligndata	%f12, %f14, %f38
   1178  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1179  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f48
   1180  1.2.12.2  yamt 	membar	#Sync
   1181  1.2.12.2  yamt 2:
   1182  1.2.12.2  yamt 	faligndata	%f14, %f16, %f40
   1183  1.2.12.2  yamt 	faligndata	%f16, %f18, %f42
   1184  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1185  1.2.12.2  yamt 	faligndata	%f18, %f20, %f44
   1186  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1187  1.2.12.2  yamt 	 faligndata	%f20, %f22, %f46
   1188  1.2.12.2  yamt 
   1189  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1190  1.2.12.2  yamt 
   1191  1.2.12.2  yamt 	faligndata	%f22, %f24, %f32
   1192  1.2.12.2  yamt 	cmp	%o0, %o5
   1193  1.2.12.2  yamt 	faligndata	%f24, %f26, %f34
   1194  1.2.12.2  yamt 	faligndata	%f26, %f28, %f36
   1195  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1196  1.2.12.2  yamt 	faligndata	%f28, %f30, %f38
   1197  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1198  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f0
   1199  1.2.12.2  yamt 	membar	#Sync
   1200  1.2.12.2  yamt 2:
   1201  1.2.12.2  yamt 	faligndata	%f30, %f48, %f40
   1202  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1203  1.2.12.2  yamt 	faligndata	%f48, %f50, %f42
   1204  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1205  1.2.12.2  yamt 	faligndata	%f50, %f52, %f44
   1206  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1207  1.2.12.2  yamt 	 faligndata	%f52, %f54, %f46
   1208  1.2.12.2  yamt 
   1209  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1210  1.2.12.2  yamt 
   1211  1.2.12.2  yamt 	faligndata	%f54, %f56, %f32
   1212  1.2.12.2  yamt 	cmp	%o0, %o5
   1213  1.2.12.2  yamt 	faligndata	%f56, %f58, %f34
   1214  1.2.12.2  yamt 	faligndata	%f58, %f60, %f36
   1215  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1216  1.2.12.2  yamt 	faligndata	%f60, %f62, %f38
   1217  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1218  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1219  1.2.12.2  yamt 	membar	#Sync
   1220  1.2.12.2  yamt 2:
   1221  1.2.12.2  yamt 	faligndata	%f62, %f0, %f40
   1222  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1223  1.2.12.2  yamt 	faligndata	%f0, %f2, %f42
   1224  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1225  1.2.12.2  yamt 	faligndata	%f2, %f4, %f44
   1226  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1227  1.2.12.2  yamt 	 faligndata	%f4, %f6, %f46
   1228  1.2.12.2  yamt 
   1229  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1230  1.2.12.2  yamt 	ba	3b
   1231  1.2.12.2  yamt 	 inc	BLOCK_SIZE, %o1
   1232  1.2.12.2  yamt 
   1233  1.2.12.2  yamt 	!!
   1234  1.2.12.2  yamt 	!! Source at BLOCK_ALIGN+40
   1235  1.2.12.2  yamt 	!!
   1236  1.2.12.2  yamt 	!! We need to load 3 doubles by hand.
   1237  1.2.12.2  yamt 	!!
   1238  1.2.12.2  yamt L105:
   1239  1.2.12.2  yamt #ifdef RETURN_NAME
   1240  1.2.12.2  yamt 	sethi	%hi(1f), %g1
   1241  1.2.12.2  yamt 	ba,pt	%icc, 2f
   1242  1.2.12.2  yamt 	 or	%g1, %lo(1f), %g1
   1243  1.2.12.2  yamt 1:
   1244  1.2.12.2  yamt 	.asciz	"L105"
   1245  1.2.12.2  yamt 	.align	8
   1246  1.2.12.2  yamt 2:
   1247  1.2.12.2  yamt #endif
   1248  1.2.12.2  yamt 	fmovd	%f0, %f8
   1249  1.2.12.2  yamt 	ldd	[%o0], %f10
   1250  1.2.12.2  yamt 	inc	8, %o0
   1251  1.2.12.2  yamt 	ldd	[%o0], %f12
   1252  1.2.12.2  yamt 	inc	8, %o0
   1253  1.2.12.2  yamt 	ldd	[%o0], %f14
   1254  1.2.12.2  yamt 	inc	8, %o0
   1255  1.2.12.2  yamt 
   1256  1.2.12.2  yamt 	cmp	%o0, %o5
   1257  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1258  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1259  1.2.12.2  yamt 	membar #Sync
   1260  1.2.12.2  yamt 2:
   1261  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1262  1.2.12.2  yamt 3:
   1263  1.2.12.2  yamt 	faligndata	%f8, %f10, %f32
   1264  1.2.12.2  yamt 	cmp	%o0, %o5
   1265  1.2.12.2  yamt 	faligndata	%f10, %f12, %f34
   1266  1.2.12.2  yamt 	faligndata	%f12, %f14, %f36
   1267  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1268  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f48
   1269  1.2.12.2  yamt 	membar	#Sync
   1270  1.2.12.2  yamt 2:
   1271  1.2.12.2  yamt 	faligndata	%f14, %f16, %f38
   1272  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1273  1.2.12.2  yamt 	faligndata	%f16, %f18, %f40
   1274  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1275  1.2.12.2  yamt 	faligndata	%f18, %f20, %f42
   1276  1.2.12.2  yamt 	faligndata	%f20, %f22, %f44
   1277  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1278  1.2.12.2  yamt 	 faligndata	%f22, %f24, %f46
   1279  1.2.12.2  yamt 
   1280  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1281  1.2.12.2  yamt 
   1282  1.2.12.2  yamt 	faligndata	%f24, %f26, %f32
   1283  1.2.12.2  yamt 	cmp	%o0, %o5
   1284  1.2.12.2  yamt 	faligndata	%f26, %f28, %f34
   1285  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1286  1.2.12.2  yamt 	faligndata	%f28, %f30, %f36
   1287  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1288  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f0
   1289  1.2.12.2  yamt 	membar	#Sync
   1290  1.2.12.2  yamt 2:
   1291  1.2.12.2  yamt 	faligndata	%f30, %f48, %f38
   1292  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1293  1.2.12.2  yamt 	faligndata	%f48, %f50, %f40
   1294  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1295  1.2.12.2  yamt 	faligndata	%f50, %f52, %f42
   1296  1.2.12.2  yamt 	faligndata	%f52, %f54, %f44
   1297  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1298  1.2.12.2  yamt 	 faligndata	%f54, %f56, %f46
   1299  1.2.12.2  yamt 
   1300  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1301  1.2.12.2  yamt 
   1302  1.2.12.2  yamt 	faligndata	%f56, %f58, %f32
   1303  1.2.12.2  yamt 	cmp	%o0, %o5
   1304  1.2.12.2  yamt 	faligndata	%f58, %f60, %f34
   1305  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1306  1.2.12.2  yamt 	faligndata	%f60, %f62, %f36
   1307  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1308  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1309  1.2.12.2  yamt 	membar	#Sync
   1310  1.2.12.2  yamt 2:
   1311  1.2.12.2  yamt 	faligndata	%f62, %f0, %f38
   1312  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1313  1.2.12.2  yamt 	faligndata	%f0, %f2, %f40
   1314  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1315  1.2.12.2  yamt 	faligndata	%f2, %f4, %f42
   1316  1.2.12.2  yamt 	faligndata	%f4, %f6, %f44
   1317  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1318  1.2.12.2  yamt 	 faligndata	%f6, %f8, %f46
   1319  1.2.12.2  yamt 
   1320  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1321  1.2.12.2  yamt 	ba	3b
   1322  1.2.12.2  yamt 	 inc	BLOCK_SIZE, %o1
   1323  1.2.12.2  yamt 
   1324  1.2.12.2  yamt 
   1325  1.2.12.2  yamt 	!!
   1326  1.2.12.2  yamt 	!! Source at BLOCK_ALIGN+48
   1327  1.2.12.2  yamt 	!!
   1328  1.2.12.2  yamt 	!! We need to load 2 doubles by hand.
   1329  1.2.12.2  yamt 	!!
   1330  1.2.12.2  yamt L106:
   1331  1.2.12.2  yamt #ifdef RETURN_NAME
   1332  1.2.12.2  yamt 	sethi	%hi(1f), %g1
   1333  1.2.12.2  yamt 	ba,pt	%icc, 2f
   1334  1.2.12.2  yamt 	 or	%g1, %lo(1f), %g1
   1335  1.2.12.2  yamt 1:
   1336  1.2.12.2  yamt 	.asciz	"L106"
   1337  1.2.12.2  yamt 	.align	8
   1338  1.2.12.2  yamt 2:
   1339  1.2.12.2  yamt #endif
   1340  1.2.12.2  yamt 	fmovd	%f0, %f10
   1341  1.2.12.2  yamt 	ldd	[%o0], %f12
   1342  1.2.12.2  yamt 	inc	8, %o0
   1343  1.2.12.2  yamt 	ldd	[%o0], %f14
   1344  1.2.12.2  yamt 	inc	8, %o0
   1345  1.2.12.2  yamt 
   1346  1.2.12.2  yamt 	cmp	%o0, %o5
   1347  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1348  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1349  1.2.12.2  yamt 	membar #Sync
   1350  1.2.12.2  yamt 2:
   1351  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1352  1.2.12.2  yamt 3:
   1353  1.2.12.2  yamt 	faligndata	%f10, %f12, %f32
   1354  1.2.12.2  yamt 	cmp	%o0, %o5
   1355  1.2.12.2  yamt 	faligndata	%f12, %f14, %f34
   1356  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1357  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f48
   1358  1.2.12.2  yamt 	membar	#Sync
   1359  1.2.12.2  yamt 2:
   1360  1.2.12.2  yamt 	faligndata	%f14, %f16, %f36
   1361  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1362  1.2.12.2  yamt 	faligndata	%f16, %f18, %f38
   1363  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1364  1.2.12.2  yamt 	faligndata	%f18, %f20, %f40
   1365  1.2.12.2  yamt 	faligndata	%f20, %f22, %f42
   1366  1.2.12.2  yamt 	faligndata	%f22, %f24, %f44
   1367  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1368  1.2.12.2  yamt 	 faligndata	%f24, %f26, %f46
   1369  1.2.12.2  yamt 
   1370  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1371  1.2.12.2  yamt 
   1372  1.2.12.2  yamt 	faligndata	%f26, %f28, %f32
   1373  1.2.12.2  yamt 	cmp	%o0, %o5
   1374  1.2.12.2  yamt 	faligndata	%f28, %f30, %f34
   1375  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1376  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f0
   1377  1.2.12.2  yamt 	membar	#Sync
   1378  1.2.12.2  yamt 2:
   1379  1.2.12.2  yamt 	faligndata	%f30, %f48, %f36
   1380  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1381  1.2.12.2  yamt 	faligndata	%f48, %f50, %f38
   1382  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1383  1.2.12.2  yamt 	faligndata	%f50, %f52, %f40
   1384  1.2.12.2  yamt 	faligndata	%f52, %f54, %f42
   1385  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1386  1.2.12.2  yamt 	faligndata	%f54, %f56, %f44
   1387  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1388  1.2.12.2  yamt 	 faligndata	%f56, %f58, %f46
   1389  1.2.12.2  yamt 
   1390  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1391  1.2.12.2  yamt 
   1392  1.2.12.2  yamt 	faligndata	%f58, %f60, %f32
   1393  1.2.12.2  yamt 	cmp	%o0, %o5
   1394  1.2.12.2  yamt 	faligndata	%f60, %f62, %f34
   1395  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1396  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1397  1.2.12.2  yamt 	membar	#Sync
   1398  1.2.12.2  yamt 2:
   1399  1.2.12.2  yamt 	faligndata	%f62, %f0, %f36
   1400  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1401  1.2.12.2  yamt 	faligndata	%f0, %f2, %f38
   1402  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1403  1.2.12.2  yamt 	faligndata	%f2, %f4, %f40
   1404  1.2.12.2  yamt 	faligndata	%f4, %f6, %f42
   1405  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1406  1.2.12.2  yamt 	faligndata	%f6, %f8, %f44
   1407  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1408  1.2.12.2  yamt 	 faligndata	%f8, %f10, %f46
   1409  1.2.12.2  yamt 
   1410  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1411  1.2.12.2  yamt 	ba	3b
   1412  1.2.12.2  yamt 	 inc	BLOCK_SIZE, %o1
   1413  1.2.12.2  yamt 
   1414  1.2.12.2  yamt 
   1415  1.2.12.2  yamt 	!!
   1416  1.2.12.2  yamt 	!! Source at BLOCK_ALIGN+56
   1417  1.2.12.2  yamt 	!!
   1418  1.2.12.2  yamt 	!! We need to load 1 double by hand.
   1419  1.2.12.2  yamt 	!!
   1420  1.2.12.2  yamt L107:
   1421  1.2.12.2  yamt #ifdef RETURN_NAME
   1422  1.2.12.2  yamt 	sethi	%hi(1f), %g1
   1423  1.2.12.2  yamt 	ba,pt	%icc, 2f
   1424  1.2.12.2  yamt 	 or	%g1, %lo(1f), %g1
   1425  1.2.12.2  yamt 1:
   1426  1.2.12.2  yamt 	.asciz	"L107"
   1427  1.2.12.2  yamt 	.align	8
   1428  1.2.12.2  yamt 2:
   1429  1.2.12.2  yamt #endif
   1430  1.2.12.2  yamt 	fmovd	%f0, %f12
   1431  1.2.12.2  yamt 	ldd	[%o0], %f14
   1432  1.2.12.2  yamt 	inc	8, %o0
   1433  1.2.12.2  yamt 
   1434  1.2.12.2  yamt 	cmp	%o0, %o5
   1435  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1436  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1437  1.2.12.2  yamt 	membar #Sync
   1438  1.2.12.2  yamt 2:
   1439  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1440  1.2.12.2  yamt 3:
   1441  1.2.12.2  yamt 	faligndata	%f12, %f14, %f32
   1442  1.2.12.2  yamt 	cmp	%o0, %o5
   1443  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1444  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f48
   1445  1.2.12.2  yamt 	membar	#Sync
   1446  1.2.12.2  yamt 2:
   1447  1.2.12.2  yamt 	faligndata	%f14, %f16, %f34
   1448  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1449  1.2.12.2  yamt 	faligndata	%f16, %f18, %f36
   1450  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1451  1.2.12.2  yamt 	faligndata	%f18, %f20, %f38
   1452  1.2.12.2  yamt 	faligndata	%f20, %f22, %f40
   1453  1.2.12.2  yamt 	faligndata	%f22, %f24, %f42
   1454  1.2.12.2  yamt 	faligndata	%f24, %f26, %f44
   1455  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1456  1.2.12.2  yamt 	 faligndata	%f26, %f28, %f46
   1457  1.2.12.2  yamt 
   1458  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1459  1.2.12.2  yamt 
   1460  1.2.12.2  yamt 	faligndata	%f28, %f30, %f32
   1461  1.2.12.2  yamt 	cmp	%o0, %o5
   1462  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1463  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f0
   1464  1.2.12.2  yamt 	membar	#Sync
   1465  1.2.12.2  yamt 2:
   1466  1.2.12.2  yamt 	faligndata	%f30, %f48, %f34
   1467  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1468  1.2.12.2  yamt 	faligndata	%f48, %f50, %f36
   1469  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1470  1.2.12.2  yamt 	faligndata	%f50, %f52, %f38
   1471  1.2.12.2  yamt 	faligndata	%f52, %f54, %f40
   1472  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1473  1.2.12.2  yamt 	faligndata	%f54, %f56, %f42
   1474  1.2.12.2  yamt 	faligndata	%f56, %f58, %f44
   1475  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1476  1.2.12.2  yamt 	 faligndata	%f58, %f60, %f46
   1477  1.2.12.2  yamt 
   1478  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1479  1.2.12.2  yamt 
   1480  1.2.12.2  yamt 	faligndata	%f60, %f62, %f32
   1481  1.2.12.2  yamt 	cmp	%o0, %o5
   1482  1.2.12.2  yamt 	bleu,a,pn	%icc, 2f
   1483  1.2.12.2  yamt 	 ldda	[%o0] ASI_BLK_P, %f16
   1484  1.2.12.2  yamt 	membar	#Sync
   1485  1.2.12.2  yamt 2:
   1486  1.2.12.2  yamt 	faligndata	%f62, %f0, %f34
   1487  1.2.12.2  yamt 	dec	BLOCK_SIZE, %o2
   1488  1.2.12.2  yamt 	faligndata	%f0, %f2, %f36
   1489  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o1
   1490  1.2.12.2  yamt 	faligndata	%f2, %f4, %f38
   1491  1.2.12.2  yamt 	faligndata	%f4, %f6, %f40
   1492  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o0
   1493  1.2.12.2  yamt 	faligndata	%f6, %f8, %f42
   1494  1.2.12.2  yamt 	faligndata	%f8, %f10, %f44
   1495  1.2.12.2  yamt 
   1496  1.2.12.2  yamt 	brlez,pn	%o2, Lmemcpy_blockdone
   1497  1.2.12.2  yamt 	 faligndata	%f10, %f12, %f46
   1498  1.2.12.2  yamt 
   1499  1.2.12.2  yamt 	stda	%f32, [%o1] ASI_STORE
   1500  1.2.12.2  yamt 	ba	3b
   1501  1.2.12.2  yamt 	 inc	BLOCK_SIZE, %o1
   1502  1.2.12.2  yamt 
   1503  1.2.12.2  yamt Lmemcpy_blockdone:
   1504  1.2.12.2  yamt 	inc	BLOCK_SIZE, %o2				! Fixup our overcommit
   1505  1.2.12.2  yamt 	membar	#Sync					! Finish any pending loads
   1506  1.2.12.2  yamt #define	FINISH_REG(f)				\
   1507  1.2.12.2  yamt 	deccc	8, %o2;				\
   1508  1.2.12.2  yamt 	bl,a	Lmemcpy_blockfinish;		\
   1509  1.2.12.2  yamt 	 fmovd	f, %f48;			\
   1510  1.2.12.2  yamt 	std	f, [%o1];			\
   1511  1.2.12.2  yamt 	inc	8, %o1
   1512  1.2.12.2  yamt 
   1513  1.2.12.2  yamt 	FINISH_REG(%f32)
   1514  1.2.12.2  yamt 	FINISH_REG(%f34)
   1515  1.2.12.2  yamt 	FINISH_REG(%f36)
   1516  1.2.12.2  yamt 	FINISH_REG(%f38)
   1517  1.2.12.2  yamt 	FINISH_REG(%f40)
   1518  1.2.12.2  yamt 	FINISH_REG(%f42)
   1519  1.2.12.2  yamt 	FINISH_REG(%f44)
   1520  1.2.12.2  yamt 	FINISH_REG(%f46)
   1521  1.2.12.2  yamt 	FINISH_REG(%f48)
   1522  1.2.12.2  yamt #undef FINISH_REG
   1523  1.2.12.2  yamt 	!!
   1524  1.2.12.2  yamt 	!! The low 3 bits have the sub-word bits needed to be
   1525  1.2.12.2  yamt 	!! stored [because (x-8)&0x7 == x].
   1526  1.2.12.2  yamt 	!!
   1527  1.2.12.2  yamt Lmemcpy_blockfinish:
   1528  1.2.12.2  yamt 	brz,pn	%o2, 2f					! 100% complete?
   1529  1.2.12.2  yamt 	 fmovd	%f48, %f4
   1530  1.2.12.2  yamt 	cmp	%o2, 8					! Exactly 8 bytes?
   1531  1.2.12.2  yamt 	bz,a,pn	CCCR, 2f
   1532  1.2.12.2  yamt 	 std	%f4, [%o1]
   1533  1.2.12.2  yamt 
   1534  1.2.12.2  yamt 	btst	4, %o2					! Word store?
   1535  1.2.12.2  yamt 	bz	CCCR, 1f
   1536  1.2.12.2  yamt 	 nop
   1537  1.2.12.2  yamt 	st	%f4, [%o1]
   1538  1.2.12.2  yamt 	inc	4, %o1
   1539  1.2.12.2  yamt 1:
   1540  1.2.12.2  yamt 	btst	2, %o2
   1541  1.2.12.2  yamt 	fzero	%f0
   1542  1.2.12.2  yamt 	bz	1f
   1543  1.2.12.2  yamt 
   1544  1.2.12.2  yamt 	 mov	-6, %o4
   1545  1.2.12.2  yamt 	alignaddr %o1, %o4, %g0
   1546  1.2.12.2  yamt 
   1547  1.2.12.2  yamt 	faligndata %f0, %f4, %f8
   1548  1.2.12.2  yamt 
   1549  1.2.12.2  yamt 	stda	%f8, [%o1] ASI_FL16_P			! Store short
   1550  1.2.12.2  yamt 	inc	2, %o1
   1551  1.2.12.2  yamt 1:
   1552  1.2.12.2  yamt 	btst	1, %o2					! Byte aligned?
   1553  1.2.12.2  yamt 	bz	2f
   1554  1.2.12.2  yamt 
   1555  1.2.12.2  yamt 	 mov	-7, %o0					! Calculate dest - 7
   1556  1.2.12.2  yamt 	alignaddr %o1, %o0, %g0				! Calculate shift mask and dest.
   1557  1.2.12.2  yamt 
   1558  1.2.12.2  yamt 	faligndata %f0, %f4, %f8			! Move 1st byte to low part of f8
   1559  1.2.12.2  yamt 
   1560  1.2.12.2  yamt 	stda	%f8, [%o1] ASI_FL8_P			! Store 1st byte
   1561  1.2.12.2  yamt 	inc	1, %o1					! Update address
   1562  1.2.12.2  yamt 2:
   1563  1.2.12.2  yamt 	membar	#Sync
   1564  1.2.12.2  yamt #if 0
   1565  1.2.12.2  yamt 	!!
   1566  1.2.12.2  yamt 	!! verify copy success.
   1567  1.2.12.2  yamt 	!!
   1568  1.2.12.2  yamt 
   1569  1.2.12.2  yamt 	mov	%i0, %o2
   1570  1.2.12.2  yamt 	mov	%i1, %o4
   1571  1.2.12.2  yamt 	mov	%i2, %l4
   1572  1.2.12.2  yamt 0:
   1573  1.2.12.2  yamt 	ldub	[%o2], %o1
   1574  1.2.12.2  yamt 	inc	%o2
   1575  1.2.12.2  yamt 	ldub	[%o4], %o3
   1576  1.2.12.2  yamt 	inc	%o4
   1577  1.2.12.2  yamt 	cmp	%o3, %o1
   1578  1.2.12.2  yamt 	bnz	1f
   1579  1.2.12.2  yamt 	 dec	%l4
   1580  1.2.12.2  yamt 	brnz	%l4, 0b
   1581  1.2.12.2  yamt 	 nop
   1582  1.2.12.2  yamt 	ba	2f
   1583  1.2.12.2  yamt 	 nop
   1584  1.2.12.2  yamt 
   1585  1.2.12.2  yamt 1:
   1586  1.2.12.2  yamt 	set	block_disable, %o0
   1587  1.2.12.2  yamt 	stx	%o0, [%o0]
   1588  1.2.12.2  yamt 
   1589  1.2.12.2  yamt 	set	0f, %o0
   1590  1.2.12.2  yamt 	call	prom_printf
   1591  1.2.12.2  yamt 	 sub	%i2, %l4, %o5
   1592  1.2.12.2  yamt 	set	1f, %o0
   1593  1.2.12.2  yamt 	mov	%i0, %o2
   1594  1.2.12.2  yamt 	mov	%i1, %o1
   1595  1.2.12.2  yamt 	call	prom_printf
   1596  1.2.12.2  yamt 	 mov	%i2, %o3
   1597  1.2.12.2  yamt 	ta	1
   1598  1.2.12.2  yamt 	.data
   1599  1.2.12.2  yamt 	_ALIGN
   1600  1.2.12.2  yamt 0:	.asciz	"block memcpy failed: %x@%p != %x@%p byte %d\r\n"
   1601  1.2.12.2  yamt 1:	.asciz	"memcpy(%p, %p, %lx)\r\n"
   1602  1.2.12.2  yamt 	_ALIGN
   1603  1.2.12.2  yamt 	.text
   1604  1.2.12.2  yamt 2:
   1605  1.2.12.2  yamt #endif
   1606  1.2.12.2  yamt #if defined(_KERNEL) && !defined(_RUMPKERNEL)
   1607  1.2.12.2  yamt 
   1608  1.2.12.2  yamt /*
   1609  1.2.12.2  yamt  * Weve saved our possible fpstate, now disable the fpu
   1610  1.2.12.2  yamt  * and continue with life.
   1611  1.2.12.2  yamt  */
   1612  1.2.12.2  yamt 	RESTORE_FPU
   1613  1.2.12.2  yamt 	ret
   1614  1.2.12.2  yamt 	 restore	%g1, 0, %o0			! Return DEST for memcpy
   1615  1.2.12.2  yamt #endif
   1616  1.2.12.2  yamt  	retl
   1617  1.2.12.2  yamt 	 mov	%g1, %o0
   1618  1.2.12.2  yamt /*
   1619  1.2.12.2  yamt  * Use block_disable to turn off block insns for
   1620  1.2.12.2  yamt  * memcpy/memset
   1621  1.2.12.2  yamt  */
   1622  1.2.12.2  yamt 	.data
   1623  1.2.12.2  yamt 	.align	8
   1624  1.2.12.2  yamt 	.globl	block_disable
   1625  1.2.12.2  yamt block_disable:	.xword	1
   1626  1.2.12.2  yamt 	.text
   1627  1.2.12.2  yamt #endif	/* USE_BLOCK_STORE_LOAD */
   1628