mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
2.4 KiB
136 lines
2.4 KiB
// SPDX-License-Identifier: GPL-2.0 |
|
/* |
|
* PA-RISC assembly string functions |
|
* |
|
* Copyright (C) 2019 Helge Deller <deller@gmx.de> |
|
*/ |
|
|
|
#include <asm/assembly.h> |
|
#include <linux/linkage.h> |
|
|
|
.section .text.hot |
|
.level PA_ASM_LEVEL |
|
|
|
t0 = r20 |
|
t1 = r21 |
|
t2 = r22 |
|
|
|
ENTRY_CFI(strlen, frame=0,no_calls) |
|
or,COND(<>) arg0,r0,ret0 |
|
b,l,n .Lstrlen_null_ptr,r0 |
|
depwi 0,31,2,ret0 |
|
cmpb,COND(<>) arg0,ret0,.Lstrlen_not_aligned |
|
ldw,ma 4(ret0),t0 |
|
cmpib,tr 0,r0,.Lstrlen_loop |
|
uxor,nbz r0,t0,r0 |
|
.Lstrlen_not_aligned: |
|
uaddcm arg0,ret0,t1 |
|
shladd t1,3,r0,t1 |
|
mtsar t1 |
|
depwi -1,%sar,32,t0 |
|
uxor,nbz r0,t0,r0 |
|
.Lstrlen_loop: |
|
b,l,n .Lstrlen_end_loop,r0 |
|
ldw,ma 4(ret0),t0 |
|
cmpib,tr 0,r0,.Lstrlen_loop |
|
uxor,nbz r0,t0,r0 |
|
.Lstrlen_end_loop: |
|
extrw,u,<> t0,7,8,r0 |
|
addib,tr,n -3,ret0,.Lstrlen_out |
|
extrw,u,<> t0,15,8,r0 |
|
addib,tr,n -2,ret0,.Lstrlen_out |
|
extrw,u,<> t0,23,8,r0 |
|
addi -1,ret0,ret0 |
|
.Lstrlen_out: |
|
bv r0(rp) |
|
uaddcm ret0,arg0,ret0 |
|
.Lstrlen_null_ptr: |
|
bv,n r0(rp) |
|
ENDPROC_CFI(strlen) |
|
|
|
|
|
ENTRY_CFI(strcpy, frame=0,no_calls) |
|
ldb 0(arg1),t0 |
|
stb t0,0(arg0) |
|
ldo 0(arg0),ret0 |
|
ldo 1(arg1),t1 |
|
cmpb,= r0,t0,2f |
|
ldo 1(arg0),t2 |
|
1: ldb 0(t1),arg1 |
|
stb arg1,0(t2) |
|
ldo 1(t1),t1 |
|
cmpb,<> r0,arg1,1b |
|
ldo 1(t2),t2 |
|
2: bv,n r0(rp) |
|
ENDPROC_CFI(strcpy) |
|
|
|
|
|
ENTRY_CFI(strncpy, frame=0,no_calls) |
|
ldb 0(arg1),t0 |
|
stb t0,0(arg0) |
|
ldo 1(arg1),t1 |
|
ldo 0(arg0),ret0 |
|
cmpb,= r0,t0,2f |
|
ldo 1(arg0),arg1 |
|
1: ldo -1(arg2),arg2 |
|
cmpb,COND(=),n r0,arg2,2f |
|
ldb 0(t1),arg0 |
|
stb arg0,0(arg1) |
|
ldo 1(t1),t1 |
|
cmpb,<> r0,arg0,1b |
|
ldo 1(arg1),arg1 |
|
2: bv,n r0(rp) |
|
ENDPROC_CFI(strncpy) |
|
|
|
|
|
ENTRY_CFI(strcat, frame=0,no_calls) |
|
ldb 0(arg0),t0 |
|
cmpb,= t0,r0,2f |
|
ldo 0(arg0),ret0 |
|
ldo 1(arg0),arg0 |
|
1: ldb 0(arg0),t1 |
|
cmpb,<>,n r0,t1,1b |
|
ldo 1(arg0),arg0 |
|
2: ldb 0(arg1),t2 |
|
stb t2,0(arg0) |
|
ldo 1(arg0),arg0 |
|
ldb 0(arg1),t0 |
|
cmpb,<> r0,t0,2b |
|
ldo 1(arg1),arg1 |
|
bv,n r0(rp) |
|
ENDPROC_CFI(strcat) |
|
|
|
|
|
ENTRY_CFI(memset, frame=0,no_calls) |
|
copy arg0,ret0 |
|
cmpb,COND(=) r0,arg0,4f |
|
copy arg0,t2 |
|
cmpb,COND(=) r0,arg2,4f |
|
ldo -1(arg2),arg3 |
|
subi -1,arg3,t0 |
|
subi 0,t0,t1 |
|
cmpiclr,COND(>=) 0,t1,arg2 |
|
ldo -1(t1),arg2 |
|
extru arg2,31,2,arg0 |
|
2: stb arg1,0(t2) |
|
ldo 1(t2),t2 |
|
addib,>= -1,arg0,2b |
|
ldo -1(arg3),arg3 |
|
cmpiclr,COND(<=) 4,arg2,r0 |
|
b,l,n 4f,r0 |
|
#ifdef CONFIG_64BIT |
|
depd,* r0,63,2,arg2 |
|
#else |
|
depw r0,31,2,arg2 |
|
#endif |
|
ldo 1(t2),t2 |
|
3: stb arg1,-1(t2) |
|
stb arg1,0(t2) |
|
stb arg1,1(t2) |
|
stb arg1,2(t2) |
|
addib,COND(>) -4,arg2,3b |
|
ldo 4(t2),t2 |
|
4: bv,n r0(rp) |
|
ENDPROC_CFI(memset) |
|
|
|
.end
|
|
|