2N/A/*
2N/A * CDDL HEADER START
2N/A *
2N/A * The contents of this file are subject to the terms of the
2N/A * Common Development and Distribution License (the "License").
2N/A * You may not use this file except in compliance with the License.
2N/A *
2N/A * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
2N/A * or http://www.opensolaris.org/os/licensing.
2N/A * See the License for the specific language governing permissions
2N/A * and limitations under the License.
2N/A *
2N/A * When distributing Covered Code, include this CDDL HEADER in each
2N/A * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
2N/A * If applicable, add the following below this CDDL HEADER, with the
2N/A * fields enclosed by brackets "[]" replaced with your own identifying
2N/A * information: Portions Copyright [yyyy] [name of copyright owner]
2N/A *
2N/A * CDDL HEADER END
2N/A */
2N/A
2N/A/*
2N/A * Copyright (c) 1994, 2010, Oracle and/or its affiliates. All rights reserved.
2N/A */
2N/A
2N/A .file "memcpy.s"
2N/A
2N/A/*
2N/A * memcpy(s1, s2, len)
2N/A *
2N/A * Copy s2 to s1, always copy n bytes.
2N/A * Note: this does not work for overlapped copies, bcopy() does
2N/A *
2N/A * Fast assembler language version of the following C-program for memcpy
2N/A * which represents the `standard' for the C-library.
2N/A *
2N/A * void *
2N/A * memcpy(void *s, const void *s0, size_t n)
2N/A * {
2N/A * if (n != 0) {
2N/A * char *s1 = s;
2N/A * const char *s2 = s0;
2N/A * do {
2N/A * *s1++ = *s2++;
2N/A * } while (--n != 0);
2N/A * }
2N/A * return ( s );
2N/A * }
2N/A */
2N/A
2N/A#include <sys/asm_linkage.h>
2N/A#include <sys/sun4asi.h>
2N/A#include <sys/trap.h>
2N/A
2N/A ANSI_PRAGMA_WEAK(memmove,function)
2N/A ANSI_PRAGMA_WEAK(memcpy,function)
2N/A
2N/A ENTRY(memmove)
2N/A cmp %o1, %o0 ! if from address is >= to use forward copy
2N/A bgeu %ncc, forcpy ! else use backward if ...
2N/A sub %o0, %o1, %o4 ! get difference of two addresses
2N/A cmp %o2, %o4 ! compare size and difference of addresses
2N/A bleu %ncc, forcpy ! if size is bigger, do overlapped copy
2N/A nop
2N/A
2N/A !
2N/A ! an overlapped copy that must be done "backwards"
2N/A !
2N/A.ovbc:
2N/A mov %o0, %o5 ! save des address for return val
2N/A add %o1, %o2, %o1 ! get to end of source space
2N/A add %o0, %o2, %o0 ! get to end of destination space
2N/A
2N/A.chksize:
2N/A cmp %o2, 8
2N/A bgeu,pn %ncc, .dbalign
2N/A nop
2N/A
2N/A
2N/A.byte:
2N/A1: deccc %o2 ! decrement count
2N/A blu,pn %ncc, exit ! loop until done
2N/A dec %o0 ! decrement to address
2N/A dec %o1 ! decrement from address
2N/A ldub [%o1], %o3 ! read a byte
2N/A ba 1b ! loop until done
2N/A stb %o3, [%o0] ! write byte
2N/A
2N/A.dbalign:
2N/A andcc %o0, 7, %o3
2N/A bz %ncc, .dbbck
2N/A nop
2N/A dec %o1
2N/A dec %o0
2N/A dec %o2
2N/A ldub [%o1], %o3
2N/A ba .chksize
2N/A stb %o3, [%o0]
2N/A
2N/A.dbbck:
2N/A
2N/A rd %fprs, %o3 ! o3 = fprs
2N/A
2N/A
2N/A ! if fprs.fef == 0, set it. Checking it, reqires 2 instructions.
2N/A ! So set it anyway, without checking.
2N/A wr %g0, 0x4, %fprs ! fprs.fef = 1
2N/A
2N/A alignaddr %o1, %g0, %g1 ! align src
2N/A ldd [%g1], %d0 ! get first 8 byte block
2N/A sub %g1, 8, %g1
2N/A andn %o2, 7, %o4
2N/A sub %o1, %o4, %o1
2N/A
2N/A2:
2N/A sub %o0, 8, %o0 ! since we are at the end
2N/A ! when we first enter the loop
2N/A ldd [%g1], %d2
2N/A faligndata %d2, %d0, %d8 ! extract 8 bytes out
2N/A std %d8, [%o0] ! store it
2N/A
2N/A sub %g1, 8, %g1
2N/A sub %o2, 8, %o2 ! 8 less bytes to copy
2N/A cmp %o2, 8 ! or do we have < 8 bytes
2N/A bgeu,pt %ncc, 2b
2N/A fmovd %d2, %d0
2N/A
2N/A and %o3, 0x4, %o3 ! fprs.du = fprs.dl = 0
2N/A ba .byte
2N/A wr %o3, %g0, %fprs ! fprs = o3 - restore fprs
2N/A
2N/A SET_SIZE(memmove)
2N/A
2N/A
2N/A ENTRY(memcpy)
2N/A ENTRY(__align_cpy_1)
2N/Aforcpy:
2N/A mov %o0, %o5 ! save des address for return val
2N/A
2N/A cmp %o2, 32 ! for small counts copy bytes
2N/A bgu,a %ncc, .alignsrc
2N/A andcc %o1, 7, %o3 ! is src aligned on a 8 byte bound
2N/A
2N/A.bytecp:
2N/A ! Do byte copy
2N/A tst %o2
2N/A bleu,a,pn %ncc, exit
2N/A nop
2N/A
2N/A1: ldub [%o1], %o4
2N/A inc %o1
2N/A inc %o0
2N/A deccc %o2
2N/A bgu %ncc, 1b
2N/A stb %o4, [%o0 - 1]
2N/A
2N/Aexit:
2N/A retl
2N/A mov %o5, %o0
2N/A
2N/A.alignsrc:
2N/A bz %ncc, .bigcpy ! src already double aligned
2N/A sub %o3, 8, %o3
2N/A neg %o3 ! bytes till src double aligned
2N/A
2N/A sub %o2, %o3, %o2 ! update o2 with new count
2N/A
2N/A ! Copy %o3 bytes till double aligned
2N/A
2N/A2: ldub [%o1], %o4
2N/A inc %o1
2N/A inc %o0
2N/A deccc %o3
2N/A bgu %ncc, 2b
2N/A stb %o4, [%o0 - 1]
2N/A
2N/A ! Now Source (%o1) is double word aligned
2N/A
2N/A.bigcpy: ! >= 17 bytes to copy
2N/A andcc %o0, 7, %o3 ! is dst aligned on a 8 byte bound
2N/A bz %ncc, .blkchk ! already double aligned
2N/A sub %o3, 8, %o3
2N/A neg %o3 ! bytes till double aligned
2N/A
2N/A sub %o2, %o3, %o2 ! update o2 with new count
2N/A
2N/A ! Copy %o3 bytes till double aligned
2N/A
2N/A3: ldub [%o1], %o4
2N/A inc %o1
2N/A inc %o0
2N/A deccc %o3
2N/A bgu %ncc, 3b
2N/A stb %o4, [%o0 - 1]
2N/A
2N/A ! Now Destination (%o0) is double word aligned
2N/A.blkchk:
2N/A cmp %o2, 384 ! if cnt < 256 + 128 - no Block ld/st
2N/A bgeu,a %ncc, blkcpy ! do double word copy
2N/A subcc %o0, %o1, %o4 ! %o4 = dest - src
2N/A
2N/A ! double word copy - using ldd and faligndata. Copies upto
2N/A ! 8 byte multiple count and does byte copy for the residual.
2N/A.dwcpy:
2N/A rd %fprs, %o3 ! o3 = fprs
2N/A
2N/A ! if fprs.fef == 0, set it. Checking it, reqires 2 instructions.
2N/A ! So set it anyway, without checking.
2N/A wr %g0, 0x4, %fprs ! fprs.fef = 1
2N/A andn %o2, 7, %o4 ! o4 has 8 byte aligned cnt
2N/A sub %o4, 8, %o4
2N/A alignaddr %o1, %g0, %g1
2N/A ldd [%g1], %d0
2N/A add %g1, 8, %g1
2N/A4:
2N/A ldd [%g1], %d2
2N/A add %g1, 8, %g1
2N/A sub %o2, 8, %o2
2N/A subcc %o4, 8, %o4
2N/A faligndata %d0, %d2, %d8
2N/A std %d8, [%o0]
2N/A add %o1, 8, %o1
2N/A bz,pn %ncc, .residcp
2N/A add %o0, 8, %o0
2N/A ldd [%g1], %d0
2N/A add %g1, 8, %g1
2N/A sub %o2, 8, %o2
2N/A subcc %o4, 8, %o4
2N/A faligndata %d2, %d0, %d8
2N/A std %d8, [%o0]
2N/A add %o1, 8, %o1
2N/A bgu,pn %ncc, 4b
2N/A add %o0, 8, %o0
2N/A
2N/A.residcp: ! Do byte copy
2N/A tst %o2
2N/A bz,a,pn %ncc, dwexit
2N/A nop
2N/A
2N/A5: ldub [%o1], %o4
2N/A inc %o1
2N/A inc %o0
2N/A deccc %o2
2N/A bgu %ncc, 5b
2N/A stb %o4, [%o0 - 1]
2N/A
2N/Adwexit:
2N/A and %o3, 0x4, %o3 ! fprs.du = fprs.dl = 0
2N/A wr %o3, %g0, %fprs ! fprs = o3 - restore fprs
2N/A retl
2N/A mov %o5, %o0
2N/A
2N/Ablkcpy:
2N/A ! subcc %o0, %o1, %o4 ! in delay slot of branch
2N/A bneg,a,pn %ncc, 1f ! %o4 = abs(%o4)
2N/A neg %o4
2N/A1:
2N/A /*
2N/A * Compare against 256 since we should be checking block addresses
2N/A * and (dest & ~63) - (src & ~63) can be 3 blocks even if
2N/A * src = dest + (64 * 3) + 63.
2N/A */
2N/A cmp %o4, 256 ! if smaller than 3 blocks skip
2N/A blu,pn %ncc, .dwcpy ! and do it the slower way
2N/A andcc %o0, 63, %o3
2N/A
2N/A save %sp, -SA(MINFRAME), %sp
2N/A rd %fprs, %l3 ! l3 = fprs
2N/A
2N/A ! if fprs.fef == 0, set it. Checking it, reqires 2 instructions.
2N/A ! So set it anyway, without checking.
2N/A wr %g0, 0x4, %fprs ! fprs.fef = 1
2N/A
2N/A bz,pn %ncc, blalign ! now block aligned
2N/A sub %i3, 64, %i3
2N/A neg %i3 ! bytes till block aligned
2N/A sub %i2, %i3, %i2 ! update %i2 with new count
2N/A
2N/A ! Copy %i3 bytes till dst is block (64 byte) aligned. use
2N/A ! double word copies.
2N/A
2N/A alignaddr %i1, %g0, %g1
2N/A ldd [%g1], %d0
2N/A add %g1, 8, %g1
2N/A6:
2N/A ldd [%g1], %d2
2N/A add %g1, 8, %g1
2N/A subcc %i3, 8, %i3
2N/A faligndata %d0, %d2, %d8
2N/A std %d8, [%i0]
2N/A add %i1, 8, %i1
2N/A bz,pn %ncc, blalign
2N/A add %i0, 8, %i0
2N/A ldd [%g1], %d0
2N/A add %g1, 8, %g1
2N/A subcc %i3, 8, %i3
2N/A faligndata %d2, %d0, %d8
2N/A std %d8, [%i0]
2N/A add %i1, 8, %i1
2N/A bgu,pn %ncc, 6b
2N/A add %i0, 8, %i0
2N/A
2N/Ablalign:
2N/A membar #StoreLoad
2N/A ! %i2 = total length
2N/A ! %i3 = blocks (length - 64) / 64
2N/A ! %i4 = doubles remaining (length - blocks)
2N/A sub %i2, 64, %i3
2N/A andn %i3, 63, %i3
2N/A sub %i2, %i3, %i4
2N/A andn %i4, 7, %i4
2N/A sub %i4, 16, %i4
2N/A sub %i2, %i4, %i2
2N/A sub %i2, %i3, %i2
2N/A
2N/A andn %i1, 0x3F, %l7 ! blk aligned address
2N/A alignaddr %i1, %g0, %g0 ! gen %gsr
2N/A
2N/A srl %i1, 3, %l5 ! bits 3,4,5 are now least sig in %l5
2N/A andcc %l5, 7, %l6 ! mask everything except bits 1,2 3
2N/A add %i1, %i4, %i1
2N/A add %i1, %i3, %i1
2N/A
2N/A be,a %ncc, 1f ! branch taken if src is 64-byte aligned
2N/A ldda [%l7]ASI_BLK_P, %d0
2N/A
2N/A call .+8 ! get the address of this instruction in %o7
2N/A sll %l6, 2, %l4
2N/A add %o7, %l4, %o7
2N/A jmp %o7 + 16 ! jump to the starting ldd instruction
2N/A nop
2N/A ldd [%l7+8], %d2
2N/A ldd [%l7+16], %d4
2N/A ldd [%l7+24], %d6
2N/A ldd [%l7+32], %d8
2N/A ldd [%l7+40], %d10
2N/A ldd [%l7+48], %d12
2N/A ldd [%l7+56], %d14
2N/A1:
2N/A add %l7, 64, %l7
2N/A ldda [%l7]ASI_BLK_P, %d16
2N/A add %l7, 64, %l7
2N/A ldda [%l7]ASI_BLK_P, %d32
2N/A add %l7, 64, %l7
2N/A sub %i3, 128, %i3
2N/A
2N/A
2N/A ! switch statement to get us to the right 8 byte blk within a
2N/A ! 64 byte block
2N/A
2N/A cmp %l6, 4
2N/A bgeu,a hlf
2N/A cmp %l6, 6
2N/A cmp %l6, 2
2N/A bgeu,a sqtr
2N/A nop
2N/A cmp %l6, 1
2N/A be,a seg1
2N/A nop
2N/A ba seg0
2N/A nop
2N/Asqtr:
2N/A be,a seg2
2N/A nop
2N/A ba,a seg3
2N/A nop
2N/A
2N/Ahlf:
2N/A bgeu,a fqtr
2N/A nop
2N/A cmp %l6, 5
2N/A be,a seg5
2N/A nop
2N/A ba seg4
2N/A nop
2N/Afqtr:
2N/A be,a seg6
2N/A nop
2N/A ba seg7
2N/A nop
2N/A
2N/A#define FALIGN_D0 \
2N/A faligndata %d0, %d2, %d48 ;\
2N/A faligndata %d2, %d4, %d50 ;\
2N/A faligndata %d4, %d6, %d52 ;\
2N/A faligndata %d6, %d8, %d54 ;\
2N/A faligndata %d8, %d10, %d56 ;\
2N/A faligndata %d10, %d12, %d58 ;\
2N/A faligndata %d12, %d14, %d60 ;\
2N/A faligndata %d14, %d16, %d62
2N/A
2N/A#define FALIGN_D16 \
2N/A faligndata %d16, %d18, %d48 ;\
2N/A faligndata %d18, %d20, %d50 ;\
2N/A faligndata %d20, %d22, %d52 ;\
2N/A faligndata %d22, %d24, %d54 ;\
2N/A faligndata %d24, %d26, %d56 ;\
2N/A faligndata %d26, %d28, %d58 ;\
2N/A faligndata %d28, %d30, %d60 ;\
2N/A faligndata %d30, %d32, %d62
2N/A
2N/A#define FALIGN_D32 \
2N/A faligndata %d32, %d34, %d48 ;\
2N/A faligndata %d34, %d36, %d50 ;\
2N/A faligndata %d36, %d38, %d52 ;\
2N/A faligndata %d38, %d40, %d54 ;\
2N/A faligndata %d40, %d42, %d56 ;\
2N/A faligndata %d42, %d44, %d58 ;\
2N/A faligndata %d44, %d46, %d60 ;\
2N/A faligndata %d46, %d0, %d62
2N/A
2N/Aseg0:
2N/A ! 1st chunk - %d0 low, %d16 high, %d32 pre, %d48 dst
2N/A FALIGN_D0
2N/A ldda [%l7]ASI_BLK_P, %d0
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 0f
2N/A add %i0, 64, %i0
2N/A ! 2nd chunk - %d0 pre, %d16 low, %d32 high, %d48 dst
2N/A FALIGN_D16
2N/A ldda [%l7]ASI_BLK_P, %d16
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 1f
2N/A add %i0, 64, %i0
2N/A ! 3rd chunk - %d0 high, %d16 pre, %d32 low, %d48 dst
2N/A FALIGN_D32
2N/A ldda [%l7]ASI_BLK_P, %d32
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 2f
2N/A add %i0, 64, %i0
2N/A ba,a,pt %ncc, seg0
2N/A
2N/A0:
2N/A FALIGN_D16
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D32
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd0
2N/A add %i0, 64, %i0
2N/A
2N/A1:
2N/A FALIGN_D32
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D0
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd16
2N/A add %i0, 64, %i0
2N/A
2N/A2:
2N/A FALIGN_D0
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D16
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd32
2N/A add %i0, 64, %i0
2N/A
2N/A
2N/A#define FALIGN_D2 \
2N/A faligndata %d2, %d4, %d48 ;\
2N/A faligndata %d4, %d6, %d50 ;\
2N/A faligndata %d6, %d8, %d52 ;\
2N/A faligndata %d8, %d10, %d54 ;\
2N/A faligndata %d10, %d12, %d56 ;\
2N/A faligndata %d12, %d14, %d58 ;\
2N/A faligndata %d14, %d16, %d60 ;\
2N/A faligndata %d16, %d18, %d62
2N/A
2N/A#define FALIGN_D18 \
2N/A faligndata %d18, %d20, %d48 ;\
2N/A faligndata %d20, %d22, %d50 ;\
2N/A faligndata %d22, %d24, %d52 ;\
2N/A faligndata %d24, %d26, %d54 ;\
2N/A faligndata %d26, %d28, %d56 ;\
2N/A faligndata %d28, %d30, %d58 ;\
2N/A faligndata %d30, %d32, %d60 ;\
2N/A faligndata %d32, %d34, %d62
2N/A
2N/A#define FALIGN_D34 \
2N/A faligndata %d34, %d36, %d48 ;\
2N/A faligndata %d36, %d38, %d50 ;\
2N/A faligndata %d38, %d40, %d52 ;\
2N/A faligndata %d40, %d42, %d54 ;\
2N/A faligndata %d42, %d44, %d56 ;\
2N/A faligndata %d44, %d46, %d58 ;\
2N/A faligndata %d46, %d0, %d60 ;\
2N/A faligndata %d0, %d2, %d62
2N/A
2N/Aseg1:
2N/A ! 1st chunk - %d0 low, %d16 high, %d32 pre, %d48 dst
2N/A FALIGN_D2
2N/A ldda [%l7]ASI_BLK_P, %d0
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 0f
2N/A add %i0, 64, %i0
2N/A ! 2nd chunk - %d0 pre, %d16 low, %d32 high, %d48 dst
2N/A FALIGN_D18
2N/A ldda [%l7]ASI_BLK_P, %d16
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 1f
2N/A add %i0, 64, %i0
2N/A ! 3rd chunk - %d0 high, %d16 pre, %d32 low, %d48 dst
2N/A FALIGN_D34
2N/A ldda [%l7]ASI_BLK_P, %d32
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 2f
2N/A add %i0, 64, %i0
2N/A ba,a,pt %ncc, seg1
2N/A0:
2N/A FALIGN_D18
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D34
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd2
2N/A add %i0, 64, %i0
2N/A
2N/A1:
2N/A FALIGN_D34
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D2
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd18
2N/A add %i0, 64, %i0
2N/A
2N/A2:
2N/A FALIGN_D2
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D18
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd34
2N/A add %i0, 64, %i0
2N/A
2N/A#define FALIGN_D4 \
2N/A faligndata %d4, %d6, %d48 ;\
2N/A faligndata %d6, %d8, %d50 ;\
2N/A faligndata %d8, %d10, %d52 ;\
2N/A faligndata %d10, %d12, %d54 ;\
2N/A faligndata %d12, %d14, %d56 ;\
2N/A faligndata %d14, %d16, %d58 ;\
2N/A faligndata %d16, %d18, %d60 ;\
2N/A faligndata %d18, %d20, %d62
2N/A
2N/A#define FALIGN_D20 \
2N/A faligndata %d20, %d22, %d48 ;\
2N/A faligndata %d22, %d24, %d50 ;\
2N/A faligndata %d24, %d26, %d52 ;\
2N/A faligndata %d26, %d28, %d54 ;\
2N/A faligndata %d28, %d30, %d56 ;\
2N/A faligndata %d30, %d32, %d58 ;\
2N/A faligndata %d32, %d34, %d60 ;\
2N/A faligndata %d34, %d36, %d62
2N/A
2N/A#define FALIGN_D36 \
2N/A faligndata %d36, %d38, %d48 ;\
2N/A faligndata %d38, %d40, %d50 ;\
2N/A faligndata %d40, %d42, %d52 ;\
2N/A faligndata %d42, %d44, %d54 ;\
2N/A faligndata %d44, %d46, %d56 ;\
2N/A faligndata %d46, %d0, %d58 ;\
2N/A faligndata %d0, %d2, %d60 ;\
2N/A faligndata %d2, %d4, %d62
2N/A
2N/Aseg2:
2N/A ! 1st chunk - %d0 low, %d16 high, %d32 pre, %d48 dst
2N/A FALIGN_D4
2N/A ldda [%l7]ASI_BLK_P, %d0
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 0f
2N/A add %i0, 64, %i0
2N/A ! 2nd chunk - %d0 pre, %d16 low, %d32 high, %d48 dst
2N/A FALIGN_D20
2N/A ldda [%l7]ASI_BLK_P, %d16
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 1f
2N/A add %i0, 64, %i0
2N/A ! 3rd chunk - %d0 high, %d16 pre, %d32 low, %d48 dst
2N/A FALIGN_D36
2N/A ldda [%l7]ASI_BLK_P, %d32
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 2f
2N/A add %i0, 64, %i0
2N/A ba,a,pt %ncc, seg2
2N/A
2N/A0:
2N/A FALIGN_D20
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D36
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd4
2N/A add %i0, 64, %i0
2N/A
2N/A1:
2N/A FALIGN_D36
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D4
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd20
2N/A add %i0, 64, %i0
2N/A
2N/A2:
2N/A FALIGN_D4
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D20
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd36
2N/A add %i0, 64, %i0
2N/A
2N/A
2N/A#define FALIGN_D6 \
2N/A faligndata %d6, %d8, %d48 ;\
2N/A faligndata %d8, %d10, %d50 ;\
2N/A faligndata %d10, %d12, %d52 ;\
2N/A faligndata %d12, %d14, %d54 ;\
2N/A faligndata %d14, %d16, %d56 ;\
2N/A faligndata %d16, %d18, %d58 ;\
2N/A faligndata %d18, %d20, %d60 ;\
2N/A faligndata %d20, %d22, %d62
2N/A
2N/A#define FALIGN_D22 \
2N/A faligndata %d22, %d24, %d48 ;\
2N/A faligndata %d24, %d26, %d50 ;\
2N/A faligndata %d26, %d28, %d52 ;\
2N/A faligndata %d28, %d30, %d54 ;\
2N/A faligndata %d30, %d32, %d56 ;\
2N/A faligndata %d32, %d34, %d58 ;\
2N/A faligndata %d34, %d36, %d60 ;\
2N/A faligndata %d36, %d38, %d62
2N/A
2N/A#define FALIGN_D38 \
2N/A faligndata %d38, %d40, %d48 ;\
2N/A faligndata %d40, %d42, %d50 ;\
2N/A faligndata %d42, %d44, %d52 ;\
2N/A faligndata %d44, %d46, %d54 ;\
2N/A faligndata %d46, %d0, %d56 ;\
2N/A faligndata %d0, %d2, %d58 ;\
2N/A faligndata %d2, %d4, %d60 ;\
2N/A faligndata %d4, %d6, %d62
2N/A
2N/Aseg3:
2N/A ! 1st chunk - %d0 low, %d16 high, %d32 pre, %d48 dst
2N/A FALIGN_D6
2N/A ldda [%l7]ASI_BLK_P, %d0
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 0f
2N/A add %i0, 64, %i0
2N/A ! 2nd chunk - %d0 pre, %d16 low, %d32 high, %d48 dst
2N/A FALIGN_D22
2N/A ldda [%l7]ASI_BLK_P, %d16
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 1f
2N/A add %i0, 64, %i0
2N/A ! 3rd chunk - %d0 high, %d16 pre, %d32 low, %d48 dst
2N/A FALIGN_D38
2N/A ldda [%l7]ASI_BLK_P, %d32
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 2f
2N/A add %i0, 64, %i0
2N/A ba,a,pt %ncc, seg3
2N/A
2N/A0:
2N/A FALIGN_D22
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D38
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd6
2N/A add %i0, 64, %i0
2N/A
2N/A1:
2N/A FALIGN_D38
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D6
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd22
2N/A add %i0, 64, %i0
2N/A
2N/A2:
2N/A FALIGN_D6
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D22
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd38
2N/A add %i0, 64, %i0
2N/A
2N/A
2N/A#define FALIGN_D8 \
2N/A faligndata %d8, %d10, %d48 ;\
2N/A faligndata %d10, %d12, %d50 ;\
2N/A faligndata %d12, %d14, %d52 ;\
2N/A faligndata %d14, %d16, %d54 ;\
2N/A faligndata %d16, %d18, %d56 ;\
2N/A faligndata %d18, %d20, %d58 ;\
2N/A faligndata %d20, %d22, %d60 ;\
2N/A faligndata %d22, %d24, %d62
2N/A
2N/A#define FALIGN_D24 \
2N/A faligndata %d24, %d26, %d48 ;\
2N/A faligndata %d26, %d28, %d50 ;\
2N/A faligndata %d28, %d30, %d52 ;\
2N/A faligndata %d30, %d32, %d54 ;\
2N/A faligndata %d32, %d34, %d56 ;\
2N/A faligndata %d34, %d36, %d58 ;\
2N/A faligndata %d36, %d38, %d60 ;\
2N/A faligndata %d38, %d40, %d62
2N/A
2N/A#define FALIGN_D40 \
2N/A faligndata %d40, %d42, %d48 ;\
2N/A faligndata %d42, %d44, %d50 ;\
2N/A faligndata %d44, %d46, %d52 ;\
2N/A faligndata %d46, %d0, %d54 ;\
2N/A faligndata %d0, %d2, %d56 ;\
2N/A faligndata %d2, %d4, %d58 ;\
2N/A faligndata %d4, %d6, %d60 ;\
2N/A faligndata %d6, %d8, %d62
2N/A
2N/Aseg4:
2N/A ! 1st chunk - %d0 low, %d16 high, %d32 pre, %d48 dst
2N/A FALIGN_D8
2N/A ldda [%l7]ASI_BLK_P, %d0
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 0f
2N/A add %i0, 64, %i0
2N/A ! 2nd chunk - %d0 pre, %d16 low, %d32 high, %d48 dst
2N/A FALIGN_D24
2N/A ldda [%l7]ASI_BLK_P, %d16
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 1f
2N/A add %i0, 64, %i0
2N/A ! 3rd chunk - %d0 high, %d16 pre, %d32 low, %d48 dst
2N/A FALIGN_D40
2N/A ldda [%l7]ASI_BLK_P, %d32
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 2f
2N/A add %i0, 64, %i0
2N/A ba,a,pt %ncc, seg4
2N/A
2N/A0:
2N/A FALIGN_D24
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D40
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd8
2N/A add %i0, 64, %i0
2N/A
2N/A1:
2N/A FALIGN_D40
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D8
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd24
2N/A add %i0, 64, %i0
2N/A
2N/A2:
2N/A FALIGN_D8
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D24
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd40
2N/A add %i0, 64, %i0
2N/A
2N/A
2N/A#define FALIGN_D10 \
2N/A faligndata %d10, %d12, %d48 ;\
2N/A faligndata %d12, %d14, %d50 ;\
2N/A faligndata %d14, %d16, %d52 ;\
2N/A faligndata %d16, %d18, %d54 ;\
2N/A faligndata %d18, %d20, %d56 ;\
2N/A faligndata %d20, %d22, %d58 ;\
2N/A faligndata %d22, %d24, %d60 ;\
2N/A faligndata %d24, %d26, %d62
2N/A
2N/A#define FALIGN_D26 \
2N/A faligndata %d26, %d28, %d48 ;\
2N/A faligndata %d28, %d30, %d50 ;\
2N/A faligndata %d30, %d32, %d52 ;\
2N/A faligndata %d32, %d34, %d54 ;\
2N/A faligndata %d34, %d36, %d56 ;\
2N/A faligndata %d36, %d38, %d58 ;\
2N/A faligndata %d38, %d40, %d60 ;\
2N/A faligndata %d40, %d42, %d62
2N/A
2N/A#define FALIGN_D42 \
2N/A faligndata %d42, %d44, %d48 ;\
2N/A faligndata %d44, %d46, %d50 ;\
2N/A faligndata %d46, %d0, %d52 ;\
2N/A faligndata %d0, %d2, %d54 ;\
2N/A faligndata %d2, %d4, %d56 ;\
2N/A faligndata %d4, %d6, %d58 ;\
2N/A faligndata %d6, %d8, %d60 ;\
2N/A faligndata %d8, %d10, %d62
2N/A
2N/Aseg5:
2N/A ! 1st chunk - %d0 low, %d16 high, %d32 pre, %d48 dst
2N/A FALIGN_D10
2N/A ldda [%l7]ASI_BLK_P, %d0
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 0f
2N/A add %i0, 64, %i0
2N/A ! 2nd chunk - %d0 pre, %d16 low, %d32 high, %d48 dst
2N/A FALIGN_D26
2N/A ldda [%l7]ASI_BLK_P, %d16
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 1f
2N/A add %i0, 64, %i0
2N/A ! 3rd chunk - %d0 high, %d16 pre, %d32 low, %d48 dst
2N/A FALIGN_D42
2N/A ldda [%l7]ASI_BLK_P, %d32
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 2f
2N/A add %i0, 64, %i0
2N/A ba,a,pt %ncc, seg5
2N/A
2N/A0:
2N/A FALIGN_D26
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D42
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd10
2N/A add %i0, 64, %i0
2N/A
2N/A1:
2N/A FALIGN_D42
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D10
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd26
2N/A add %i0, 64, %i0
2N/A
2N/A2:
2N/A FALIGN_D10
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D26
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd42
2N/A add %i0, 64, %i0
2N/A
2N/A
2N/A#define FALIGN_D12 \
2N/A faligndata %d12, %d14, %d48 ;\
2N/A faligndata %d14, %d16, %d50 ;\
2N/A faligndata %d16, %d18, %d52 ;\
2N/A faligndata %d18, %d20, %d54 ;\
2N/A faligndata %d20, %d22, %d56 ;\
2N/A faligndata %d22, %d24, %d58 ;\
2N/A faligndata %d24, %d26, %d60 ;\
2N/A faligndata %d26, %d28, %d62
2N/A
2N/A#define FALIGN_D28 \
2N/A faligndata %d28, %d30, %d48 ;\
2N/A faligndata %d30, %d32, %d50 ;\
2N/A faligndata %d32, %d34, %d52 ;\
2N/A faligndata %d34, %d36, %d54 ;\
2N/A faligndata %d36, %d38, %d56 ;\
2N/A faligndata %d38, %d40, %d58 ;\
2N/A faligndata %d40, %d42, %d60 ;\
2N/A faligndata %d42, %d44, %d62
2N/A
2N/A#define FALIGN_D44 \
2N/A faligndata %d44, %d46, %d48 ;\
2N/A faligndata %d46, %d0, %d50 ;\
2N/A faligndata %d0, %d2, %d52 ;\
2N/A faligndata %d2, %d4, %d54 ;\
2N/A faligndata %d4, %d6, %d56 ;\
2N/A faligndata %d6, %d8, %d58 ;\
2N/A faligndata %d8, %d10, %d60 ;\
2N/A faligndata %d10, %d12, %d62
2N/A
2N/Aseg6:
2N/A ! 1st chunk - %d0 low, %d16 high, %d32 pre, %d48 dst
2N/A FALIGN_D12
2N/A ldda [%l7]ASI_BLK_P, %d0
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 0f
2N/A add %i0, 64, %i0
2N/A ! 2nd chunk - %d0 pre, %d16 low, %d32 high, %d48 dst
2N/A FALIGN_D28
2N/A ldda [%l7]ASI_BLK_P, %d16
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 1f
2N/A add %i0, 64, %i0
2N/A ! 3rd chunk - %d0 high, %d16 pre, %d32 low, %d48 dst
2N/A FALIGN_D44
2N/A ldda [%l7]ASI_BLK_P, %d32
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 2f
2N/A add %i0, 64, %i0
2N/A ba,a,pt %ncc, seg6
2N/A
2N/A0:
2N/A FALIGN_D28
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D44
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd12
2N/A add %i0, 64, %i0
2N/A
2N/A1:
2N/A FALIGN_D44
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D12
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd28
2N/A add %i0, 64, %i0
2N/A
2N/A2:
2N/A FALIGN_D12
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D28
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd44
2N/A add %i0, 64, %i0
2N/A
2N/A
2N/A#define FALIGN_D14 \
2N/A faligndata %d14, %d16, %d48 ;\
2N/A faligndata %d16, %d18, %d50 ;\
2N/A faligndata %d18, %d20, %d52 ;\
2N/A faligndata %d20, %d22, %d54 ;\
2N/A faligndata %d22, %d24, %d56 ;\
2N/A faligndata %d24, %d26, %d58 ;\
2N/A faligndata %d26, %d28, %d60 ;\
2N/A faligndata %d28, %d30, %d62
2N/A
2N/A#define FALIGN_D30 \
2N/A faligndata %d30, %d32, %d48 ;\
2N/A faligndata %d32, %d34, %d50 ;\
2N/A faligndata %d34, %d36, %d52 ;\
2N/A faligndata %d36, %d38, %d54 ;\
2N/A faligndata %d38, %d40, %d56 ;\
2N/A faligndata %d40, %d42, %d58 ;\
2N/A faligndata %d42, %d44, %d60 ;\
2N/A faligndata %d44, %d46, %d62
2N/A
2N/A#define FALIGN_D46 \
2N/A faligndata %d46, %d0, %d48 ;\
2N/A faligndata %d0, %d2, %d50 ;\
2N/A faligndata %d2, %d4, %d52 ;\
2N/A faligndata %d4, %d6, %d54 ;\
2N/A faligndata %d6, %d8, %d56 ;\
2N/A faligndata %d8, %d10, %d58 ;\
2N/A faligndata %d10, %d12, %d60 ;\
2N/A faligndata %d12, %d14, %d62
2N/A
2N/Aseg7:
2N/A ! 1st chunk - %d0 low, %d16 high, %d32 pre, %d48 dst
2N/A FALIGN_D14
2N/A ldda [%l7]ASI_BLK_P, %d0
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 0f
2N/A add %i0, 64, %i0
2N/A ! 2nd chunk - %d0 pre, %d16 low, %d32 high, %d48 dst
2N/A FALIGN_D30
2N/A ldda [%l7]ASI_BLK_P, %d16
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 1f
2N/A add %i0, 64, %i0
2N/A ! 3rd chunk - %d0 high, %d16 pre, %d32 low, %d48 dst
2N/A FALIGN_D46
2N/A ldda [%l7]ASI_BLK_P, %d32
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %l7, 64, %l7
2N/A subcc %i3, 64, %i3
2N/A bz,pn %ncc, 2f
2N/A add %i0, 64, %i0
2N/A ba,a,pt %ncc, seg7
2N/A
2N/A0:
2N/A FALIGN_D30
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D46
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd14
2N/A add %i0, 64, %i0
2N/A
2N/A1:
2N/A FALIGN_D46
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D14
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd30
2N/A add %i0, 64, %i0
2N/A
2N/A2:
2N/A FALIGN_D14
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A add %i0, 64, %i0
2N/A membar #Sync
2N/A FALIGN_D30
2N/A stda %d48, [%i0]ASI_BLK_P
2N/A ba,pt %ncc, blkd46
2N/A add %i0, 64, %i0
2N/A
2N/A
2N/A !
2N/A ! dribble out the last partial block
2N/A !
2N/Ablkd0:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d0, %d2, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd2:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d2, %d4, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd4:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d4, %d6, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd6:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d6, %d8, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd8:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d8, %d10, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd10:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d10, %d12, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd12:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d12, %d14, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd14:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A fsrc1 %d14, %d0
2N/A ba,a,pt %ncc, blkleft
2N/A
2N/Ablkd16:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d16, %d18, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd18:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d18, %d20, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd20:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d20, %d22, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd22:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d22, %d24, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd24:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d24, %d26, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd26:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d26, %d28, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd28:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d28, %d30, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd30:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A fsrc1 %d30, %d0
2N/A ba,a,pt %ncc, blkleft
2N/Ablkd32:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d32, %d34, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd34:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d34, %d36, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd36:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d36, %d38, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd38:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d38, %d40, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd40:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d40, %d42, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd42:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d42, %d44, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd44:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A faligndata %d44, %d46, %d48
2N/A std %d48, [%i0]
2N/A add %i0, 8, %i0
2N/Ablkd46:
2N/A subcc %i4, 8, %i4
2N/A blu,pn %ncc, blkdone
2N/A fsrc1 %d46, %d0
2N/A
2N/Ablkleft:
2N/A ldd [%l7], %d2
2N/A add %l7, 8, %l7
2N/A subcc %i4, 8, %i4
2N/A faligndata %d0, %d2, %d8
2N/A std %d8, [%i0]
2N/A blu,pn %ncc, blkdone
2N/A add %i0, 8, %i0
2N/A ldd [%l7], %d0
2N/A add %l7, 8, %l7
2N/A subcc %i4, 8, %i4
2N/A faligndata %d2, %d0, %d8
2N/A std %d8, [%i0]
2N/A bgeu,pt %ncc, blkleft
2N/A add %i0, 8, %i0
2N/A
2N/Ablkdone:
2N/A tst %i2
2N/A bz,pt %ncc, blkexit
2N/A and %l3, 0x4, %l3 ! fprs.du = fprs.dl = 0
2N/A
2N/A7: ldub [%i1], %i4
2N/A inc %i1
2N/A inc %i0
2N/A deccc %i2
2N/A bgu %ncc, 7b
2N/A stb %i4, [%i0 - 1]
2N/A
2N/Ablkexit:
2N/A and %l3, 0x4, %l3 ! fprs.du = fprs.dl = 0
2N/A wr %l3, %g0, %fprs ! fprs = l3 - restore fprs.fef
2N/A membar #StoreLoad|#StoreStore
2N/A ret
2N/A restore %i5, %g0, %o0
2N/A
2N/A SET_SIZE(memcpy)
2N/A SET_SIZE(__align_cpy_1)