1/* $OpenBSD: bcmp.S,v 1.5 2015/08/31 02:53:56 guenther Exp $ */ 2/*- 3 * Copyright (c) 1991, 1993 4 * The Regents of the University of California. All rights reserved. 5 * 6 * This code is derived from software contributed to Berkeley by 7 * Ralph Campbell. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#include "SYS.h" 35 36/* bcmp(s1, s2, n) */ 37 38LEAF(bcmp, 0) 39 .set noreorder 40 blt a2, 16, small # is it worth any trouble? 41 xor v0, a0, a1 # compare low two bits of addresses 42 and v0, v0, 3 43 dsubu a3, zero, a1 # compute # bytes to word align address 44 bne v0, zero, unaligned # not possible to align addresses 45 and a3, a3, 3 46 47 beq a3, zero, 1f 48 dsubu a2, a2, a3 # subtract from remaining count 49 move v0, v1 # init v0,v1 so unmodified bytes match 50 LWHI v0, 0(a0) # read 1, 2, or 3 bytes 51 LWHI v1, 0(a1) 52 daddu a1, a1, a3 53 bne v0, v1, nomatch 54 daddu a0, a0, a3 551: 56 and a3, a2, ~3 # compute number of whole words left 57 dsubu a2, a2, a3 # which has to be >= (16-3) & ~3 58 daddu a3, a3, a0 # compute ending address 592: 60 lw v0, 0(a0) # compare words 61 lw v1, 0(a1) 62 daddu a0, a0, 4 63 bne v0, v1, nomatch 64 daddu a1, a1, 4 65 bne a0, a3, 2b 66 nop 67 b small # finish remainder 68 nop 69unaligned: 70 beq a3, zero, 2f 71 dsubu a2, a2, a3 # subtract from remaining count 72 daddu a3, a3, a0 # compute ending address 731: 74 lbu v0, 0(a0) # compare bytes until a1 word aligned 75 lbu v1, 0(a1) 76 daddu a0, a0, 1 77 bne v0, v1, nomatch 78 daddu a1, a1, 1 79 bne a0, a3, 1b 80 nop 812: 82 and a3, a2, ~3 # compute number of whole words left 83 dsubu a2, a2, a3 # which has to be >= (16-3) & ~3 84 daddu a3, a3, a0 # compute ending address 853: 86 LWHI v0, 0(a0) # compare words a0 unaligned, a1 aligned 87 LWLO v0, 3(a0) 88 lw v1, 0(a1) 89 daddu a0, a0, 4 90 bne v0, v1, nomatch 91 daddu a1, a1, 4 92 bne a0, a3, 3b 93 nop 94small: 95 ble a2, zero, match 96 daddu a3, a2, a0 # compute ending address 971: 98 lbu v0, 0(a0) 99 lbu v1, 0(a1) 100 daddu a0, a0, 1 101 bne v0, v1, nomatch 102 daddu a1, a1, 1 103 bne a0, a3, 1b 104 nop 105match: 106 j ra 107 move v0, zero 108nomatch: 109 j ra 110 li v0, 1 111 .set reorder 112END_WEAK(bcmp) 113