11.1Sisaki/*	$NetBSD: ashrdi3.S,v 1.1 2020/08/16 06:43:43 isaki Exp $	*/
21.1Sisaki
31.1Sisaki/*
41.1Sisaki * Copyright (C) 2020 Tetsuya Isaki. All rights reserved.
51.1Sisaki * Copyright (C) 2020 Y.Sugahara (moveccr). All rights reserved.
61.1Sisaki *
71.1Sisaki * Redistribution and use in source and binary forms, with or without
81.1Sisaki * modification, are permitted provided that the following conditions
91.1Sisaki * are met:
101.1Sisaki * 1. Redistributions of source code must retain the above copyright
111.1Sisaki *    notice, this list of conditions and the following disclaimer.
121.1Sisaki * 2. Redistributions in binary form must reproduce the above copyright
131.1Sisaki *    notice, this list of conditions and the following disclaimer in the
141.1Sisaki *    documentation and/or other materials provided with the distribution.
151.1Sisaki *
161.1Sisaki * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
171.1Sisaki * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
181.1Sisaki * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
191.1Sisaki * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
201.1Sisaki * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
211.1Sisaki * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
221.1Sisaki * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
231.1Sisaki * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
241.1Sisaki * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
251.1Sisaki * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
261.1Sisaki * SUCH DAMAGE.
271.1Sisaki */
281.1Sisaki
291.1Sisaki/*
301.1Sisaki * Size optimized version for primary bootloader.
311.1Sisaki */
321.1Sisaki
331.1Sisaki#include <machine/asm.h>
341.1Sisaki
351.1SisakiASENTRY_NOPROFILE(__ashrdi3)
361.1Sisaki		moveml	%sp@(4),%d0-%d1/%a0	| %d0:%d1 = quad value
371.1Sisaki						| %a0     = shift count
381.1Sisaki		jbra	start
391.1Sisakiloop:
401.1Sisaki		asrl	#1,%d0			| %d0:X >>>= 1
411.1Sisaki		roxrl	#1,%d1			| X:%d1 >>= 1
421.1Sisakistart:
431.1Sisaki		subql	#1,%a0			| sub %a0 doesn't affect ccr,
441.1Sisaki		tstl	%a0			|  but this extra TST op is
451.1Sisaki						|  smaller than push/pop %d2.
461.1Sisaki		jpl	loop
471.1Sisaki		rts
481.1Sisaki
491.1Sisaki
501.1Sisaki#if defined(SELFTEST)
511.1Sisaki#include "iocscall.h"
521.1Sisaki		.macro	PRINT	msg
531.1Sisaki		leal	\msg,%a1
541.1Sisaki		IOCS(__B_PRINT)
551.1Sisaki		.endm
561.1Sisaki
571.1Sisaki		.macro	TEST	name
581.1Sisaki		leal	\name,%a2
591.1Sisaki		jbsr	test
601.1Sisaki		.endm
611.1Sisaki
621.1SisakiASENTRY_NOPROFILE(selftest_ashrdi3)
631.1Sisaki		moveml	%d2-%d7/%a2-%a6,%sp@-
641.1Sisaki		PRINT	%pc@(msg_testname)
651.1Sisaki
661.1Sisaki		TEST	test0
671.1Sisaki		TEST	test1p
681.1Sisaki		TEST	test1m
691.1Sisaki		TEST	test4p
701.1Sisaki		TEST	test4m
711.1Sisaki		TEST	test63p
721.1Sisaki		TEST	test63m
731.1Sisaki
741.1Sisaki		PRINT	%pc@(msg_crlf)
751.1Sisaki		moveml	%sp@+,%d2-%d7/%a2-%a6
761.1Sisaki		rts
771.1Sisaki
781.1Sisakitest:
791.1Sisaki		moveml	%a2@+,%d0-%d2		| %d0:%d1 = value
801.1Sisaki						| %d2     = count
811.1Sisaki		moveml	%d0-%d2,%sp@-
821.1Sisaki		jbsr	__ashrdi3
831.1Sisaki		leal	%sp@(12),%sp
841.1Sisaki
851.1Sisaki		cmpl	%a2@+,%d0		| compare high word
861.1Sisaki		jne	fail
871.1Sisaki		cmpl	%a2@+,%d1		| compare low word
881.1Sisaki		jne	fail
891.1Sisaki		PRINT	%pc@(msg_ok)
901.1Sisaki		rts
911.1Sisakifail:
921.1Sisaki		PRINT	%pc@(msg_fail)
931.1Sisaki		rts
941.1Sisaki
951.1Sisakitest0:		| count = 0
961.1Sisaki		.long	0x11223344, 0x55667788
971.1Sisaki		.long	0
981.1Sisaki		.long	0x11223344, 0x55667788
991.1Sisaki
1001.1Sisakitest1p:		| count = 1
1011.1Sisaki		.long	0x11223344, 0x55667788
1021.1Sisaki		.long	1
1031.1Sisaki		.long	0x089119a2, 0x2ab33bc4
1041.1Sisaki
1051.1Sisakitest1m:		| count = 1 (negative value)
1061.1Sisaki		.long	0x91223344, 0x55667788
1071.1Sisaki		.long	1
1081.1Sisaki		.long	0xc89119a2, 0x2ab33bc4
1091.1Sisaki
1101.1Sisakitest4p:		| count = 4
1111.1Sisaki		.long	0x11223344, 0x55667788
1121.1Sisaki		.long	4
1131.1Sisaki		.long	0x01122334, 0x45566778
1141.1Sisaki
1151.1Sisakitest4m:		| count = 4 (negative value)
1161.1Sisaki		.long	0x91223344, 0x55667788
1171.1Sisaki		.long	4
1181.1Sisaki		.long	0xf9122334, 0x45566778
1191.1Sisaki
1201.1Sisakitest63p:	| count = 63
1211.1Sisaki		.long	0x41223344, 0x55667788
1221.1Sisaki		.long	63
1231.1Sisaki		.long	0x00000000, 0x00000000
1241.1Sisaki
1251.1Sisakitest63m:	| count = 63 (negative value)
1261.1Sisaki		.long	0x91223344, 0x55667788
1271.1Sisaki		.long	63
1281.1Sisaki		.long	0xffffffff, 0xffffffff
1291.1Sisaki
1301.1Sisakimsg_testname:
1311.1Sisaki		.asciz	"__ashrdi3"
1321.1Sisakimsg_ok:
1331.1Sisaki		.asciz	" ok"
1341.1Sisakimsg_fail:
1351.1Sisaki		.asciz	" fail"
1361.1Sisakimsg_crlf:
1371.1Sisaki		.asciz	"\r\n"
1381.1Sisaki
1391.1Sisaki#endif
140