ashrdi3.S revision 1.1
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