xref: /netbsd-src/common/lib/libc/arch/ia64/string/bcopy.S (revision b83ebeba7f767758d2778bb0f9d7a76534253621)
1/*	$NetBSD: bcopy.S,v 1.1 2016/08/05 15:06:02 scole Exp $	*/
2
3/*-
4 * Copyright (c) 2000 Doug Rabson
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 *
28 * __FBSDID("$FreeBSD: releng/10.1/lib/libc/ia64/string/bcopy.S 125669 2004-02-10 20:45:28Z cperciva $");
29 */
30
31#include <machine/asm.h>
32
33/*
34 * void
35 * bcopy(const void *src, void *dst, size_t len);
36 */
37
38/*
39 * Not the fastest bcopy in the world.
40 */
41ENTRY(bcopy, 3)
42
43	cmp.le	p6,p0=in2,r0			// bail if len <= 0
44(p6)	br.ret.spnt.few rp
45
46	sub	r14=in1,in0 ;;			// check for overlap
47	cmp.ltu	p6,p0=r14,in2			// dst-src < len
48(p6)	br.cond.spnt.few 5f
49
50	extr.u	r14=in0,0,3			// src & 7
51	extr.u	r15=in1,0,3 ;;			// dst & 7
52	cmp.eq	p6,p0=r14,r15			// different alignment?
53(p6)	br.cond.spnt.few 2f			// branch if same alignment
54
551:	ld1	r14=[in0],1 ;;			// copy bytewise
56	st1	[in1]=r14,1
57	add	in2=-1,in2 ;;			// len--
58	cmp.ne	p6,p0=r0,in2
59(p6)	br.cond.dptk.few 1b			// loop
60	br.ret.sptk.few rp			// done
61
622:	cmp.eq	p6,p0=r14,r0			// aligned?
63(p6)	br.cond.sptk.few 4f
64
653:	ld1	r14=[in0],1 ;;			// copy bytewise
66	st1	[in1]=r14,1
67	extr.u	r15=in0,0,3			// src & 7
68	add	in2=-1,in2 ;;			// len--
69	cmp.eq	p6,p0=r0,in2			// done?
70	cmp.eq	p7,p0=r0,r15 ;;			// aligned now?
71(p6)	br.ret.spnt.few rp			// return if done
72(p7)	br.cond.spnt.few 4f			// go to main copy
73	br.cond.sptk.few 3b			// more bytes to copy
74
75	// At this point, in2 is non-zero
76
774:	mov	r14=8 ;;
78	cmp.ltu	p6,p0=in2,r14 ;;		// len < 8?
79(p6)	br.cond.spnt.few 1b			// byte copy the end
80	ld8	r15=[in0],8 ;;			// copy word
81	st8	[in1]=r15,8
82	add	in2=-8,in2 ;;			// len -= 8
83	cmp.ne	p6,p0=r0,in2			// done?
84(p6)	br.cond.spnt.few 4b			// again
85
86	br.ret.sptk.few rp			// return
87
88	// Don't bother optimising overlap case
89
905:	add	in0=in0,in2
91	add	in1=in1,in2 ;;
92	add	in0=-1,in0
93	add	in1=-1,in1 ;;
94
956:	ld1	r14=[in0],-1 ;;
96	st1	[in1]=r14,-1
97	add	in2=-1,in2 ;;
98	cmp.ne	p6,p0=r0,in2
99(p6)	br.cond.spnt.few 6b
100
101	br.ret.sptk.few rp
102END(bcopy)
103