1// SPDX-License-Identifier: GPL-2.0
2/*
3 *    PA-RISC assembly string functions
4 *
5 *    Copyright (C) 2019 Helge Deller <deller@gmx.de>
6 */
7
8#include <asm/assembly.h>
9#include <linux/linkage.h>
10
11	.section .text.hot
12	.level PA_ASM_LEVEL
13
14	t0 = r20
15	t1 = r21
16	t2 = r22
17
18ENTRY_CFI(strlen, frame=0,no_calls)
19	or,COND(<>) arg0,r0,ret0
20	b,l,n	.Lstrlen_null_ptr,r0
21	depwi	0,31,2,ret0
22	cmpb,COND(<>) arg0,ret0,.Lstrlen_not_aligned
23	ldw,ma	4(ret0),t0
24	cmpib,tr 0,r0,.Lstrlen_loop
25	uxor,nbz r0,t0,r0
26.Lstrlen_not_aligned:
27	uaddcm	arg0,ret0,t1
28	shladd	t1,3,r0,t1
29	mtsar	t1
30	depwi	-1,%sar,32,t0
31	uxor,nbz r0,t0,r0
32.Lstrlen_loop:
33	b,l,n	.Lstrlen_end_loop,r0
34	ldw,ma	4(ret0),t0
35	cmpib,tr 0,r0,.Lstrlen_loop
36	uxor,nbz r0,t0,r0
37.Lstrlen_end_loop:
38	extrw,u,<> t0,7,8,r0
39	addib,tr,n -3,ret0,.Lstrlen_out
40	extrw,u,<> t0,15,8,r0
41	addib,tr,n -2,ret0,.Lstrlen_out
42	extrw,u,<> t0,23,8,r0
43	addi	-1,ret0,ret0
44.Lstrlen_out:
45	bv r0(rp)
46	uaddcm ret0,arg0,ret0
47.Lstrlen_null_ptr:
48	bv,n r0(rp)
49ENDPROC_CFI(strlen)
50
51
52ENTRY_CFI(strcpy, frame=0,no_calls)
53	ldb	0(arg1),t0
54	stb	t0,0(arg0)
55	ldo	0(arg0),ret0
56	ldo	1(arg1),t1
57	cmpb,=	r0,t0,2f
58	ldo	1(arg0),t2
591:	ldb	0(t1),arg1
60	stb	arg1,0(t2)
61	ldo	1(t1),t1
62	cmpb,<> r0,arg1,1b
63	ldo	1(t2),t2
642:	bv,n	r0(rp)
65ENDPROC_CFI(strcpy)
66
67
68ENTRY_CFI(strncpy, frame=0,no_calls)
69	ldb	0(arg1),t0
70	stb	t0,0(arg0)
71	ldo	1(arg1),t1
72	ldo	0(arg0),ret0
73	cmpb,=	r0,t0,2f
74	ldo	1(arg0),arg1
751:	ldo	-1(arg2),arg2
76	cmpb,COND(=),n r0,arg2,2f
77	ldb	0(t1),arg0
78	stb	arg0,0(arg1)
79	ldo	1(t1),t1
80	cmpb,<> r0,arg0,1b
81	ldo	1(arg1),arg1
822:	bv,n	r0(rp)
83ENDPROC_CFI(strncpy)
84
85
86ENTRY_CFI(strcat, frame=0,no_calls)
87	ldb	0(arg0),t0
88	cmpb,=	t0,r0,2f
89	ldo	0(arg0),ret0
90	ldo	1(arg0),arg0
911:	ldb	0(arg0),t1
92	cmpb,<>,n r0,t1,1b
93	ldo	1(arg0),arg0
942:	ldb	0(arg1),t2
95	stb	t2,0(arg0)
96	ldo	1(arg0),arg0
97	ldb	0(arg1),t0
98	cmpb,<>	r0,t0,2b
99	ldo	1(arg1),arg1
100	bv,n	r0(rp)
101ENDPROC_CFI(strcat)
102
103
104ENTRY_CFI(memset, frame=0,no_calls)
105	copy	arg0,ret0
106	cmpb,COND(=) r0,arg0,4f
107	copy	arg0,t2
108	cmpb,COND(=) r0,arg2,4f
109	ldo	-1(arg2),arg3
110	subi	-1,arg3,t0
111	subi	0,t0,t1
112	cmpiclr,COND(>=) 0,t1,arg2
113	ldo	-1(t1),arg2
114	extru arg2,31,2,arg0
1152:	stb	arg1,0(t2)
116	ldo	1(t2),t2
117	addib,>= -1,arg0,2b
118	ldo	-1(arg3),arg3
119	cmpiclr,COND(<=) 4,arg2,r0
120	b,l,n	4f,r0
121#ifdef CONFIG_64BIT
122	depd,*	r0,63,2,arg2
123#else
124	depw	r0,31,2,arg2
125#endif
126	ldo	1(t2),t2
1273:	stb	arg1,-1(t2)
128	stb	arg1,0(t2)
129	stb	arg1,1(t2)
130	stb	arg1,2(t2)
131	addib,COND(>) -4,arg2,3b
132	ldo	4(t2),t2
1334:	bv,n	r0(rp)
134ENDPROC_CFI(memset)
135
136	.end
137