18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Returns 0 if exception before NUL or reaching the supplied limit (N),
48c2ecf20Sopenharmony_ci * a value greater than N if the string is longer than the limit, else
58c2ecf20Sopenharmony_ci * strlen.
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Inputs:
88c2ecf20Sopenharmony_ci *	in0:	address of buffer
98c2ecf20Sopenharmony_ci *	in1:	string length limit N
108c2ecf20Sopenharmony_ci * Outputs:
118c2ecf20Sopenharmony_ci *	r8:	0 in case of fault, strlen(buffer)+1 otherwise
128c2ecf20Sopenharmony_ci *
138c2ecf20Sopenharmony_ci * Copyright (C) 1999, 2001 David Mosberger-Tang <davidm@hpl.hp.com>
148c2ecf20Sopenharmony_ci */
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include <asm/asmmacro.h>
178c2ecf20Sopenharmony_ci#include <asm/export.h>
188c2ecf20Sopenharmony_ci
198c2ecf20Sopenharmony_ciGLOBAL_ENTRY(__strnlen_user)
208c2ecf20Sopenharmony_ci	.prologue
218c2ecf20Sopenharmony_ci	alloc r2=ar.pfs,2,0,0,0
228c2ecf20Sopenharmony_ci	.save ar.lc, r16
238c2ecf20Sopenharmony_ci	mov r16=ar.lc			// preserve ar.lc
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_ci	.body
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci	add r3=-1,in1
288c2ecf20Sopenharmony_ci	;;
298c2ecf20Sopenharmony_ci	mov ar.lc=r3
308c2ecf20Sopenharmony_ci	mov r9=0
318c2ecf20Sopenharmony_ci	;;
328c2ecf20Sopenharmony_ci	// XXX braindead strlen loop---this needs to be optimized
338c2ecf20Sopenharmony_ci.Loop1:
348c2ecf20Sopenharmony_ci	EXCLR(.Lexit, ld1 r8=[in0],1)
358c2ecf20Sopenharmony_ci	add r9=1,r9
368c2ecf20Sopenharmony_ci	;;
378c2ecf20Sopenharmony_ci	cmp.eq p6,p0=r8,r0
388c2ecf20Sopenharmony_ci(p6)	br.cond.dpnt .Lexit
398c2ecf20Sopenharmony_ci	br.cloop.dptk.few .Loop1
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci	add r9=1,in1			// NUL not found---return N+1
428c2ecf20Sopenharmony_ci	;;
438c2ecf20Sopenharmony_ci.Lexit:
448c2ecf20Sopenharmony_ci	mov r8=r9
458c2ecf20Sopenharmony_ci	mov ar.lc=r16			// restore ar.lc
468c2ecf20Sopenharmony_ci	br.ret.sptk.many rp
478c2ecf20Sopenharmony_ciEND(__strnlen_user)
488c2ecf20Sopenharmony_ciEXPORT_SYMBOL(__strnlen_user)
49