1*18ec38eaSchs/* $NetBSD: bcmp.S,v 1.6 2013/09/07 19:06:29 chs Exp $ */ 237c9f0a6Schristos 337c9f0a6Schristos/*- 437c9f0a6Schristos * Copyright (c) 1997 The NetBSD Foundation, Inc. 537c9f0a6Schristos * All rights reserved. 637c9f0a6Schristos * 737c9f0a6Schristos * This code is derived from software contributed to The NetBSD Foundation 837c9f0a6Schristos * by J.T. Conklin. 937c9f0a6Schristos * 1037c9f0a6Schristos * Redistribution and use in source and binary forms, with or without 1137c9f0a6Schristos * modification, are permitted provided that the following conditions 1237c9f0a6Schristos * are met: 1337c9f0a6Schristos * 1. Redistributions of source code must retain the above copyright 1437c9f0a6Schristos * notice, this list of conditions and the following disclaimer. 1537c9f0a6Schristos * 2. Redistributions in binary form must reproduce the above copyright 1637c9f0a6Schristos * notice, this list of conditions and the following disclaimer in the 1737c9f0a6Schristos * documentation and/or other materials provided with the distribution. 1837c9f0a6Schristos * 1937c9f0a6Schristos * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 2037c9f0a6Schristos * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 2137c9f0a6Schristos * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 2237c9f0a6Schristos * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 2337c9f0a6Schristos * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 2437c9f0a6Schristos * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 2537c9f0a6Schristos * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 2637c9f0a6Schristos * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 2737c9f0a6Schristos * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 2837c9f0a6Schristos * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 2937c9f0a6Schristos * POSSIBILITY OF SUCH DAMAGE. 3037c9f0a6Schristos */ 3137c9f0a6Schristos 3237c9f0a6Schristos/*- 3337c9f0a6Schristos * Copyright (c) 1990 The Regents of the University of California. 3437c9f0a6Schristos * All rights reserved. 3537c9f0a6Schristos * 3637c9f0a6Schristos * This code is derived from software contributed to Berkeley by 3737c9f0a6Schristos * the Systems Programming Group of the University of Utah Computer 3837c9f0a6Schristos * Science Department. 3937c9f0a6Schristos * 4037c9f0a6Schristos * Redistribution and use in source and binary forms, with or without 4137c9f0a6Schristos * modification, are permitted provided that the following conditions 4237c9f0a6Schristos * are met: 4337c9f0a6Schristos * 1. Redistributions of source code must retain the above copyright 4437c9f0a6Schristos * notice, this list of conditions and the following disclaimer. 4537c9f0a6Schristos * 2. Redistributions in binary form must reproduce the above copyright 4637c9f0a6Schristos * notice, this list of conditions and the following disclaimer in the 4737c9f0a6Schristos * documentation and/or other materials provided with the distribution. 4837c9f0a6Schristos * 3. Neither the name of the University nor the names of its contributors 4937c9f0a6Schristos * may be used to endorse or promote products derived from this software 5037c9f0a6Schristos * without specific prior written permission. 5137c9f0a6Schristos * 5237c9f0a6Schristos * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 5337c9f0a6Schristos * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 5437c9f0a6Schristos * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 5537c9f0a6Schristos * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 5637c9f0a6Schristos * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 5737c9f0a6Schristos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 5837c9f0a6Schristos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 5937c9f0a6Schristos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 6037c9f0a6Schristos * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 6137c9f0a6Schristos * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 6237c9f0a6Schristos * SUCH DAMAGE. 6337c9f0a6Schristos */ 6437c9f0a6Schristos 6537c9f0a6Schristos#include <machine/asm.h> 6637c9f0a6Schristos 6737c9f0a6Schristos#if defined(LIBC_SCCS) && !defined(lint) 6837c9f0a6Schristos#if 0 6937c9f0a6Schristos RCSID("from: @(#)bcmp.s 5.1 (Berkeley) 5/12/90") 7037c9f0a6Schristos#else 71*18ec38eaSchs RCSID("$NetBSD: bcmp.S,v 1.6 2013/09/07 19:06:29 chs Exp $") 7237c9f0a6Schristos#endif 7337c9f0a6Schristos#endif /* LIBC_SCCS and not lint */ 7437c9f0a6Schristos 751d398a17Smatt#ifdef __mcoldfire__ 761d398a17Smatt#define CMPMB(a,b) movb b,%d2; cmpb a,%d2 771d398a17Smatt#define CMPMW(a,b) movw b,%d2; cmpw a,%d2 781d398a17Smatt#define CMPML(a,b) movl b,%d2; cmpl a,%d2 791d398a17Smatt#else 801d398a17Smatt#define CMPMB(a,b) cmpmb a,b 811d398a17Smatt#define CMPMW(a,b) cmpmw a,b 821d398a17Smatt#define CMPML(a,b) cmpml a,b 831d398a17Smatt#endif 841d398a17Smatt 8537c9f0a6SchristosENTRY(bcmp) 8607a0a325Smatt movl 4(%sp),%a0 | string 1 8707a0a325Smatt movl 8(%sp),%a1 | string 2 8807a0a325Smatt movl 12(%sp),%d1 | length 891d398a17Smatt#ifdef __mcoldfire__ 901d398a17Smatt movl %d2,-(%sp) | save temp 911d398a17Smatt#endif 9237c9f0a6Schristos 9337c9f0a6Schristos /* 9437c9f0a6Schristos * It isn't worth the overhead of aligning to {long}word boundries 9537c9f0a6Schristos * if the string is too short. 9637c9f0a6Schristos */ 9737c9f0a6Schristos cmpl #8,%d1 98*18ec38eaSchs jlt .Lbcbyte 9937c9f0a6Schristos 10037c9f0a6Schristos#ifdef __mc68010__ 10137c9f0a6Schristos /* 10237c9f0a6Schristos * The 68010 cannot access a word or long on an odd boundary, 10337c9f0a6Schristos * period. If the source and the destination addresses aren't 10437c9f0a6Schristos * of the same evenness, we're forced to do a bytewise compare. 10537c9f0a6Schristos */ 10637c9f0a6Schristos movl %a0,%d0 10737c9f0a6Schristos addl %a1,%d0 10837c9f0a6Schristos btst #0,%d0 109*18ec38eaSchs jne .Lbcbyte 11037c9f0a6Schristos#endif /* __mc68010__ */ 11137c9f0a6Schristos 11237c9f0a6Schristos /* word align */ 11337c9f0a6Schristos movl %a0,%d0 11437c9f0a6Schristos btst #0,%d0 115*18ec38eaSchs jeq .Lbcalgndw 1161d398a17Smatt CMPMB((%a0)+,(%a1)+) 117*18ec38eaSchs jne .Lbcnoteq 11837c9f0a6Schristos subql #1,%d1 119*18ec38eaSchs.Lbcalgndw: 12037c9f0a6Schristos /* long word align */ 12137c9f0a6Schristos btst #1,%d0 122*18ec38eaSchs jeq .Lbcalgndl 1231d398a17Smatt CMPMW((%a0)+,(%a1)+) 124*18ec38eaSchs jne .Lbcnoteq 12537c9f0a6Schristos subql #2,%d1 126*18ec38eaSchs.Lbcalgndl: 12737c9f0a6Schristos /* compare by 8 longwords */ 12837c9f0a6Schristos movl %d1,%d0 12937c9f0a6Schristos lsrl #5,%d0 | cnt = len / 32 130*18ec38eaSchs jeq .Lbclong | if (cnt) 13137c9f0a6Schristos andl #31,%d1 | len %= 32 13237c9f0a6Schristos subql #1,%d0 | set up for dbf 133*18ec38eaSchs.Lbc32loop: 1341d398a17Smatt CMPML((%a0)+,(%a1)+) | compare 1 of 8 longwords 135*18ec38eaSchs jne .Lbcnoteq | not equal, return non-zero 1361d398a17Smatt CMPML((%a0)+,(%a1)+) | compare 2 of 8 longwords 137*18ec38eaSchs jne .Lbcnoteq 1381d398a17Smatt CMPML((%a0)+,(%a1)+) | compare 3 of 8 longwords 139*18ec38eaSchs jne .Lbcnoteq 1401d398a17Smatt CMPML((%a0)+,(%a1)+) | compare 4 of 8 longwords 141*18ec38eaSchs jne .Lbcnoteq 1421d398a17Smatt CMPML((%a0)+,(%a1)+) | compare 5 of 8 longwords 143*18ec38eaSchs jne .Lbcnoteq 1441d398a17Smatt CMPML((%a0)+,(%a1)+) | compare 6 of 8 longwords 145*18ec38eaSchs jne .Lbcnoteq 1461d398a17Smatt CMPML((%a0)+,(%a1)+) | compare 7 of 8 longwords 147*18ec38eaSchs jne .Lbcnoteq 1481d398a17Smatt CMPML((%a0)+,(%a1)+) | compare 8 of 8 longwords 149*18ec38eaSchs jne .Lbcnoteq 1501d398a17Smatt#ifndef __mcoldfire__ 151*18ec38eaSchs dbf %d0,.Lbc32loop | till done 15237c9f0a6Schristos clrw %d0 1531d398a17Smatt#endif 15437c9f0a6Schristos subql #1,%d0 155*18ec38eaSchs jcc .Lbc32loop 15637c9f0a6Schristos 157*18ec38eaSchs.Lbclong: 15837c9f0a6Schristos /* compare by longwords */ 15937c9f0a6Schristos movl %d1,%d0 16037c9f0a6Schristos lsrl #2,%d0 | cnt = len / 4 161*18ec38eaSchs jeq .Lbcbyte | if (cnt) 16237c9f0a6Schristos subql #1,%d0 | set up for dbf 163*18ec38eaSchs.Lbclloop: 1641d398a17Smatt CMPML((%a0)+,(%a1)+) | compare a longword 165*18ec38eaSchs jne .Lbcnoteq | not equal, return non-zero 1661d398a17Smatt#ifdef __mcoldfire__ 1671d398a17Smatt subql #1,%d0 | decrement 168*18ec38eaSchs jcc .Lbclloop | till done 1691d398a17Smatt#else 170*18ec38eaSchs dbf %d0,.Lbclloop | till done 1711d398a17Smatt#endif 17237c9f0a6Schristos andl #3,%d1 | len %= 4 173*18ec38eaSchs jeq .Lbcdone 17437c9f0a6Schristos 17537c9f0a6Schristos subql #1,%d1 | set up for dbf 176*18ec38eaSchs.Lbcbloop: 1771d398a17Smatt CMPMB((%a0)+,(%a1)+) | compare a byte 178*18ec38eaSchs jne .Lbcnoteq | not equal, return non-zero 179*18ec38eaSchs.Lbcbyte: 1801d398a17Smatt#ifdef __mcoldfire__ 1811d398a17Smatt subql #1,%d0 | decrement 182*18ec38eaSchs jcc .Lbcbloop | till done 1831d398a17Smatt#else 184*18ec38eaSchs dbf %d1,.Lbcbloop 1851d398a17Smatt#endif 186*18ec38eaSchs.Lbcdone: 1871d398a17Smatt#ifdef __mcoldfire__ 1881d398a17Smatt movl (%sp)+,%d2 | restore temp 1891d398a17Smatt#endif 19037c9f0a6Schristos movql #0,%d0 19137c9f0a6Schristos rts 19237c9f0a6Schristos 193*18ec38eaSchs.Lbcnoteq: 19437c9f0a6Schristos movql #1,%d0 19537c9f0a6Schristos rts 19665726debSmattEND(bcmp) 197