1*6a602769Sragge/* $NetBSD: str.S,v 1.6 2017/05/22 17:00:19 ragge Exp $ */ 228b1aa2bSmatt/* 328b1aa2bSmatt * Copyright (c) 1996 Ludd, University of Lule}, Sweden. 428b1aa2bSmatt * All rights reserved. 528b1aa2bSmatt * 628b1aa2bSmatt * Redistribution and use in source and binary forms, with or without 728b1aa2bSmatt * modification, are permitted provided that the following conditions 828b1aa2bSmatt * are met: 928b1aa2bSmatt * 1. Redistributions of source code must retain the above copyright 1028b1aa2bSmatt * notice, this list of conditions and the following disclaimer. 1128b1aa2bSmatt * 2. Redistributions in binary form must reproduce the above copyright 1228b1aa2bSmatt * notice, this list of conditions and the following disclaimer in the 1328b1aa2bSmatt * documentation and/or other materials provided with the distribution. 1428b1aa2bSmatt * 1528b1aa2bSmatt * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1628b1aa2bSmatt * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1728b1aa2bSmatt * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1828b1aa2bSmatt * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 1928b1aa2bSmatt * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2028b1aa2bSmatt * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2128b1aa2bSmatt * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2228b1aa2bSmatt * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2328b1aa2bSmatt * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2428b1aa2bSmatt * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2528b1aa2bSmatt */ 2628b1aa2bSmatt 2728b1aa2bSmatt/* 2828b1aa2bSmatt * Small versions of the most common functions not using any 2928b1aa2bSmatt * emulated instructions. 3028b1aa2bSmatt */ 3128b1aa2bSmatt 3228b1aa2bSmatt#include "asm.h" 3328b1aa2bSmatt 3428b1aa2bSmatt/* 3528b1aa2bSmatt * atoi() used in devopen. 3628b1aa2bSmatt */ 3728b1aa2bSmattENTRY(atoi, 0) 3828b1aa2bSmatt movl 4(%ap),%r1 3928b1aa2bSmatt clrl %r0 4028b1aa2bSmatt 4128b1aa2bSmatt2: movzbl (%r1)+,%r2 4228b1aa2bSmatt cmpb %r2,$48 4328b1aa2bSmatt blss 1f 4428b1aa2bSmatt cmpb %r2,$57 4528b1aa2bSmatt bgtr 1f 4628b1aa2bSmatt subl2 $48,%r2 4728b1aa2bSmatt mull2 $10,%r0 4828b1aa2bSmatt addl2 %r2,%r0 4928b1aa2bSmatt brb 2b 5028b1aa2bSmatt1: ret 5128b1aa2bSmatt 5228b1aa2bSmatt/* 53d944bca9Sjdolecek * strchr() small and easy. 5428b1aa2bSmatt */ 55d944bca9SjdolecekENTRY(strchr, 0) 5628b1aa2bSmatt movq 4(%ap),%r0 574728b048Sragge1: cmpb (%r0), 8(%ap) 5828b1aa2bSmatt beql 2f 5928b1aa2bSmatt tstb (%r0)+ 6028b1aa2bSmatt bneq 1b 6128b1aa2bSmatt clrl %r0 6228b1aa2bSmatt2: ret 6328b1aa2bSmatt 6428b1aa2bSmatt/* 6528b1aa2bSmatt * cmpc3 is emulated on MVII. 6628b1aa2bSmatt */ 67fe89b1dbSdslENTRY(memcmp, 0) 68fe89b1dbSdsl brb 10f 6928b1aa2bSmattENTRY(bcmp, 0) 70fe89b1dbSdsl10: movl 4(%ap), %r2 7128b1aa2bSmatt movl 8(%ap), %r1 7228b1aa2bSmatt movl 12(%ap), %r0 7328b1aa2bSmatt2: cmpb (%r2)+, (%r1)+ 7428b1aa2bSmatt bneq 1f 754728b048Sragge sobgtr %r0, 2b 76fe89b1dbSdsl3: ret 77fe89b1dbSdsl1: bgtru 5f 78fe89b1dbSdsl movl $-1, %r0 79fe89b1dbSdsl brb 3b 80fe89b1dbSdsl5: movl $1, %r0 81fe89b1dbSdsl ret 8228b1aa2bSmatt 8328b1aa2bSmatt/* 844728b048Sragge * movc can't do length in excess of 64K, so we shall not use them. 8528b1aa2bSmatt */ 8628b1aa2bSmattENTRY(bzero,0) 874728b048Sragge movl 4(%ap),%r0 884728b048Sragge movl 8(%ap),%r1 894728b048Sragge1: clrb (%r0)+ 904728b048Sragge sobgtr %r1,1b 9128b1aa2bSmatt ret 9228b1aa2bSmatt 934728b048Sragge/* 944728b048Sragge * memcpy and bcopy are the same, except for argument order. Silly stuff. 954728b048Sragge */ 964728b048SraggeENTRY(memcpy,0) 974728b048Sragge movl 8(%ap),%r0 984728b048Sragge movl 4(%ap),%r1 994728b048Sragge brb 1f 10028b1aa2bSmattENTRY(bcopy,0) 1014728b048Sragge movl 4(%ap),%r0 1024728b048Sragge movl 8(%ap),%r1 1034728b048Sragge1: movl 12(%ap),%r2 1044728b048Sragge cmpl %r0,%r1 1054728b048Sragge bgtru 3f 1064728b048Sragge addl2 %r2,%r0 1074728b048Sragge addl2 %r2,%r1 1084728b048Sragge2: movb -(%r0),-(%r1) 1094728b048Sragge sobgtr %r2,2b 1104728b048Sragge ret 1114728b048Sragge3: movb (%r0)+,(%r1)+ 1124728b048Sragge sobgtr %r2,3b 11328b1aa2bSmatt ret 11428b1aa2bSmatt 115fe89b1dbSdslENTRY(memset,0) 116fe89b1dbSdsl movl 4(%ap),%r0 1174728b048Sragge movl 12(%ap),%r1 1184728b048Sragge1: movb 8(%ap),(%r0)+ 1194728b048Sragge sobgtr %r1,1b 120fe89b1dbSdsl ret 121fe89b1dbSdsl 12228b1aa2bSmattENTRY(strlen, 0) 12328b1aa2bSmatt movl 4(%ap), %r0 12428b1aa2bSmatt1: tstb (%r0)+ 12528b1aa2bSmatt bneq 1b 12628b1aa2bSmatt decl %r0 12728b1aa2bSmatt subl2 4(%ap), %r0 12828b1aa2bSmatt ret 12928b1aa2bSmatt 13028b1aa2bSmattENTRY(strncmp, 0) 13128b1aa2bSmatt movl 12(%ap), %r3 132fe89b1dbSdsl bneq 5f 133fe89b1dbSdsl brb 4f 13428b1aa2bSmatt 13528b1aa2bSmattENTRY(strcmp, 0) 13628b1aa2bSmatt movl $250, %r3 # max string len to compare 13728b1aa2bSmatt5: movl 4(%ap), %r2 13828b1aa2bSmatt movl 8(%ap), %r1 13928b1aa2bSmatt movl $1, %r0 14028b1aa2bSmatt 14128b1aa2bSmatt2: cmpb (%r2),(%r1)+ 14228b1aa2bSmatt bneq 1f # something differ 14328b1aa2bSmatt tstb (%r2)+ 14428b1aa2bSmatt beql 4f # continue, strings unequal 14528b1aa2bSmatt decl %r3 # max string len encountered? 14628b1aa2bSmatt bneq 2b 14728b1aa2bSmatt 14828b1aa2bSmatt4: clrl %r0 # We are done, strings equal. 14928b1aa2bSmatt ret 15028b1aa2bSmatt 151fe89b1dbSdsl1: bgtru 3f 15228b1aa2bSmatt mnegl %r0, %r0 15328b1aa2bSmatt3: ret 15428b1aa2bSmatt 15528b1aa2bSmattENTRY(strncpy, 0) 15628b1aa2bSmatt movl 4(%ap), %r1 15728b1aa2bSmatt movl 8(%ap), %r2 15828b1aa2bSmatt movl 12(%ap), %r3 15928b1aa2bSmatt bleq 2f 16028b1aa2bSmatt 16128b1aa2bSmatt1: movb (%r2)+, (%r1)+ 16228b1aa2bSmatt beql 2f 1634728b048Sragge sobgtr %r3,1b 1644728b048Sragge ret 1654728b048Sragge2: decl %r1 1664728b048Sragge3: clrb (%r1)+ 1674728b048Sragge sobgtr %r3,3b 1684728b048Sragge ret 16928b1aa2bSmatt 17028b1aa2bSmattENTRY(strcat, 0) 17128b1aa2bSmatt pushl 4(%ap) 17228b1aa2bSmatt calls $1,_C_LABEL(strlen) 17328b1aa2bSmatt addl2 4(%ap),%r0 17428b1aa2bSmatt movl 8(%ap),%r1 17528b1aa2bSmatt1: movb (%r1)+,(%r0)+ 17628b1aa2bSmatt bneq 1b 17728b1aa2bSmatt ret 17828b1aa2bSmatt 17928b1aa2bSmattENTRY(setjmp, 0) 18028b1aa2bSmatt movl 4(%ap), %r0 18128b1aa2bSmatt movl 8(%fp), (%r0) 18228b1aa2bSmatt movl 12(%fp), 4(%r0) 18328b1aa2bSmatt movl 16(%fp), 8(%r0) 18428b1aa2bSmatt addl3 %fp,$28,12(%r0) 18528b1aa2bSmatt clrl %r0 18628b1aa2bSmatt ret 18728b1aa2bSmatt 18828b1aa2bSmattENTRY(longjmp, 0) 18928b1aa2bSmatt movl 4(%ap), %r1 19028b1aa2bSmatt movl 8(%ap), %r0 19128b1aa2bSmatt movl (%r1), %ap 19228b1aa2bSmatt movl 4(%r1), %fp 19328b1aa2bSmatt movl 12(%r1), %sp 19428b1aa2bSmatt jmp *8(%r1) 19528b1aa2bSmatt 196