// SPDX-License-Identifier: GPL-2.0 /* * PA-RISC assembly string functions * * Copyright (C) 2019 Helge Deller */ #include #include .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