Home | History | Annotate | Line # | Download | only in xxboot
      1  1.2  isaki /*	$NetBSD: memcmp.S,v 1.2 2024/01/07 07:58:34 isaki Exp $	*/
      2  1.1  isaki 
      3  1.1  isaki /*
      4  1.1  isaki  * Copyright (C) 2020 Tetsuya Isaki. All rights reserved.
      5  1.1  isaki  * Copyright (C) 2020 Y.Sugahara (moveccr). All rights reserved.
      6  1.1  isaki  *
      7  1.1  isaki  * Redistribution and use in source and binary forms, with or without
      8  1.1  isaki  * modification, are permitted provided that the following conditions
      9  1.1  isaki  * are met:
     10  1.1  isaki  * 1. Redistributions of source code must retain the above copyright
     11  1.1  isaki  *    notice, this list of conditions and the following disclaimer.
     12  1.1  isaki  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  isaki  *    notice, this list of conditions and the following disclaimer in the
     14  1.1  isaki  *    documentation and/or other materials provided with the distribution.
     15  1.1  isaki  *
     16  1.1  isaki  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     17  1.1  isaki  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     18  1.1  isaki  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     19  1.1  isaki  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     20  1.1  isaki  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     21  1.1  isaki  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     22  1.1  isaki  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     23  1.1  isaki  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     24  1.1  isaki  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  1.1  isaki  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  1.1  isaki  * SUCH DAMAGE.
     27  1.1  isaki  */
     28  1.1  isaki 
     29  1.1  isaki /*
     30  1.1  isaki  * Size optimized (but slow) version for primary bootloader.
     31  1.1  isaki  */
     32  1.1  isaki 
     33  1.1  isaki #include <machine/asm.h>
     34  1.1  isaki 
     35  1.1  isaki |
     36  1.1  isaki | int memcmp(const void *b1, const void *b2, size_t len)
     37  1.1  isaki |
     38  1.1  isaki ASENTRY_NOPROFILE(memcmp)
     39  1.1  isaki 		moveml	%sp@,%d0-%d1/%a0-%a1	| %d0: (return address)
     40  1.1  isaki 						| %d1: b1
     41  1.1  isaki 						| %a0: b2
     42  1.1  isaki 						| %a1: len
     43  1.1  isaki 
     44  1.1  isaki 		exg	%d1,%a1			| %d1: len
     45  1.1  isaki 						| %a0: b2
     46  1.1  isaki 						| %a1: b1
     47  1.1  isaki 		moveql	#0,%d0
     48  1.1  isaki loop:
     49  1.1  isaki 		subql	#1,%d1			| if (--len < 0)
     50  1.1  isaki 		jcs	exit			|  goto exit
     51  1.1  isaki compare:
     52  1.1  isaki 		cmpmb	%a0@+,%a1@+
     53  1.1  isaki 		jeq	loop
     54  1.1  isaki 		| To comply with standards, recalc exact return value.
     55  1.1  isaki 		| Although everyone expects only 0 or not...
     56  1.1  isaki 		moveq	#0,%d1
     57  1.1  isaki 		moveb	%a1@-,%d0
     58  1.1  isaki 		moveb	%a0@-,%d1
     59  1.1  isaki 		subl	%d1,%d0			| (uint)*b1 - (uint)*b2
     60  1.1  isaki exit:
     61  1.1  isaki 		rts
     62  1.1  isaki 
     63  1.1  isaki 
     64  1.1  isaki #if defined(SELFTEST)
     65  1.1  isaki #include "iocscall.h"
     66  1.1  isaki 		.macro	PRINT	msg
     67  1.1  isaki 		leal	\msg,%a1
     68  1.1  isaki 		IOCS(__B_PRINT)
     69  1.1  isaki 		.endm
     70  1.1  isaki 
     71  1.1  isaki 		.macro	TEST	name
     72  1.1  isaki 		leal	\name,%a2
     73  1.1  isaki 		jbsr	test
     74  1.1  isaki 		.endm
     75  1.1  isaki 
     76  1.1  isaki ASENTRY_NOPROFILE(selftest_memcmp)
     77  1.1  isaki 		moveml	%d2-%d7/%a2-%a6,%sp@-
     78  1.1  isaki 		PRINT	%pc@(msg_testname)
     79  1.1  isaki 
     80  1.1  isaki 		TEST	test1
     81  1.1  isaki 		TEST	test2
     82  1.1  isaki 		TEST	test3
     83  1.1  isaki 		TEST	test4
     84  1.1  isaki 		TEST	test5
     85  1.1  isaki 
     86  1.1  isaki 		PRINT	%pc@(msg_crlf)
     87  1.1  isaki 		moveml	%sp@+,%d2-%d7/%a2-%a6
     88  1.1  isaki 		rts
     89  1.1  isaki 
     90  1.1  isaki test:
     91  1.1  isaki 		movel	%a2@+,buf:W		| contents of b1
     92  1.1  isaki 		movel	%a2@+,(buf+4):W		| contents of b2
     93  1.1  isaki 		movel	%a2@+,%sp@-		| push len
     94  1.1  isaki 		peal	(buf+4):W		| push b2
     95  1.1  isaki 		peal	(buf):W			| push b1
     96  1.1  isaki 		jbsr	memcmp
     97  1.1  isaki 		leal	%sp@(12),%sp
     98  1.1  isaki 
     99  1.1  isaki 		cmpl	%a2@,%d0		| compare return value
    100  1.1  isaki 		jne	fail
    101  1.1  isaki 		PRINT	%pc@(msg_ok)
    102  1.1  isaki 		rts
    103  1.1  isaki fail:
    104  1.1  isaki 		PRINT	%pc@(msg_fail)
    105  1.1  isaki 		rts
    106  1.1  isaki 
    107  1.1  isaki test1:
    108  1.1  isaki 		| b1 == b2 within length
    109  1.2  isaki 		.long	0x11223344		| b1
    110  1.1  isaki 		.long	0x11223355		| b2
    111  1.1  isaki 		.long	3			| len
    112  1.1  isaki 		.long	0			| expected
    113  1.1  isaki 
    114  1.1  isaki test2:
    115  1.1  isaki 		| b1 > b2 before the last
    116  1.1  isaki 		.long	0x11813344		| b1
    117  1.1  isaki 		.long	0x11013344		| b2
    118  1.1  isaki 		.long	3			| len
    119  1.1  isaki 		.long	0x00000080		| expected
    120  1.1  isaki 
    121  1.1  isaki test3:
    122  1.1  isaki 		| b1 < b2 in the last byte
    123  1.1  isaki 		.long	0x11220044		| b1
    124  1.1  isaki 		.long	0x11220144		| b2
    125  1.1  isaki 		.long	3			| len
    126  1.1  isaki 		.long	-1			| expected
    127  1.1  isaki 
    128  1.1  isaki test4:		| len == 0
    129  1.1  isaki 		.long	0x11223344		| b1
    130  1.1  isaki 		.long	0x11223344		| b2
    131  1.1  isaki 		.long	0			| len
    132  1.1  isaki 		.long	0			| expected
    133  1.1  isaki 
    134  1.1  isaki test5:		| *b1 - *b2 = 0 - 255 = -255
    135  1.1  isaki 		.long	0x00000000		| b1
    136  1.1  isaki 		.long	0xff000000		| b2
    137  1.1  isaki 		.long	1			| len
    138  1.1  isaki 		.long	-255			| expected
    139  1.1  isaki 
    140  1.1  isaki msg_testname:
    141  1.1  isaki 		.asciz	"memcmp"
    142  1.1  isaki msg_ok:
    143  1.1  isaki 		.asciz	" ok"
    144  1.1  isaki msg_fail:
    145  1.1  isaki 		.asciz	" fail"
    146  1.1  isaki msg_crlf:
    147  1.1  isaki 		.asciz	"\r\n"
    148  1.1  isaki 
    149  1.1  isaki 		BSS(buf, 8)
    150  1.1  isaki #endif
    151