136 lines · 2.4 KB · Assembly
RawDownload
// 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),t21:	ldb	0(t1),arg1	stb	arg1,0(t2)	ldo	1(t1),t1	cmpb,<> r0,arg1,1b	ldo	1(t2),t22:	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),arg11:	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),arg12:	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),arg01:	ldb	0(arg0),t1	cmpb,<>,n r0,t1,1b	ldo	1(arg0),arg02:	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,arg02:	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),t23:	stb	arg1,-1(t2)	stb	arg1,0(t2)	stb	arg1,1(t2)	stb	arg1,2(t2)	addib,COND(>) -4,arg2,3b	ldo	4(t2),t24:	bv,n	r0(rp)ENDPROC_CFI(memset) 	.end