/* Optimized version of the memccpy() function.
   This file is part of the GNU C Library.
   Copyright (C) 2000-2014 Free Software Foundation, Inc.
   Contributed by Dan Pop <Dan.Pop@cern.ch>.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

/* Return: a pointer to the next byte after char in dest or NULL

   Inputs:
        in0:    dest
        in1:    src
  	in2:	char
        in3:    byte count

   This implementation assumes little endian mode (UM.be = 0).

   This implementation assumes that it is safe to do read ahead
   in the src block, without getting beyond its limit.  */

#include <sysdep.h>
#undef ret

#define OP_T_THRES 	16
#define OPSIZ 		8

#define saved_pr	r17
#define saved_lc	r18
#define dest		r19
#define src		r20
#define len		r21
#define asrc		r22
#define tmp		r23
#define char		r24
#define charx8		r25
#define saved_ec	r26
#define sh2		r28
#define	sh1		r29
#define loopcnt		r30
#define	value		r31

#ifdef GAS_ALIGN_BREAKS_UNWIND_INFO
/* Manually force proper loop-alignment.  Note: be sure to
   double-check the code-layout after making any changes to
   this routine! */
# define ALIGN(n)	{ nop 0 }
#else
# define ALIGN(n)	.align n
#endif

ENTRY(memccpy)
	.prologue
	alloc 	r2 = ar.pfs, 4, 40 - 4, 0, 40

#include "softpipe.h"
	.rotr	r[MEMLAT + 7], tmp1[4], tmp2[4], val[4], tmp3[2], pos0[2]
	.rotp	p[MEMLAT + 6 + 1]

	mov	ret0 = r0		// return NULL if no match
	.save pr, saved_pr
	mov	saved_pr = pr		// save the predicate registers
	mov 	dest = in0		// dest
	.save ar.lc, saved_lc
        mov 	saved_lc = ar.lc	// save the loop counter
        mov 	saved_ec = ar.ec	// save the loop counter
	.body
	mov 	src = in1		// src
	extr.u	char = in2, 0, 8	// char
	mov	len = in3		// len
	sub	tmp = r0, in0		// tmp = -dest
	cmp.ne	p7, p0 = r0, r0		// clear p7
	;;
	and	loopcnt = 7, tmp	// loopcnt = -dest % 8
	cmp.ge	p6, p0 = OP_T_THRES, len	// is len <= OP_T_THRES
	mov	ar.ec = 0		// ec not guaranteed zero on entry
(p6)	br.cond.spnt	.cpyfew		// copy byte by byte
	;;
	cmp.eq	p6, p0 = loopcnt, r0
	mux1	charx8 = char, @brcst
(p6)	br.cond.sptk .dest_aligned
	sub	len = len, loopcnt	// len -= -dest % 8
	adds	loopcnt = -1, loopcnt	// --loopcnt
	;;
	mov	ar.lc = loopcnt
.l1:					// copy -dest % 8 bytes
	ld1	value = [src], 1	// value = *src++
	;;
	st1	[dest] = value, 1	// *dest++ = value
	cmp.eq	p6, p0 = value, char
(p6)	br.cond.spnt .foundit
	br.cloop.dptk .l1
.dest_aligned:
	and	sh1 = 7, src 		// sh1 = src % 8
	and	tmp = -8, len   	// tmp = len & -OPSIZ
	and	asrc = -8, src		// asrc = src & -OPSIZ  -- align src
	shr.u	loopcnt = len, 3	// loopcnt = len / 8
	and	len = 7, len ;;		// len = len % 8
	shl	sh1 = sh1, 3		// sh1 = 8 * (src % 8)
	adds	loopcnt = -1, loopcnt	// --loopcnt
	mov     pr.rot = 1 << 16 ;;	// set rotating predicates
	sub	sh2 = 64, sh1		// sh2 = 64 - sh1
	mov	ar.lc = loopcnt		// set LC
	cmp.eq  p6, p0 = sh1, r0 	// is the src aligned?
(p6)    br.cond.sptk .src_aligned ;;
	add	src = src, tmp		// src += len & -OPSIZ
	mov	ar.ec = MEMLAT + 6 + 1 	// six more passes needed
	ld8	r[1] = [asrc], 8 	// r[1] = w0
	cmp.ne	p6, p0 = r0, r0	;;	// clear p6
	ALIGN(32)
.l2:
(p[0])		ld8.s	r[0] = [asrc], 8		// r[0] = w1
(p[MEMLAT])	shr.u	tmp1[0] = r[1 + MEMLAT], sh1	// tmp1 = w0 >> sh1
(p[MEMLAT])	shl	tmp2[0] = r[0 + MEMLAT], sh2  	// tmp2 = w1 << sh2
(p[MEMLAT+4])	xor	tmp3[0] = val[1], charx8
(p[MEMLAT+5])	czx1.r	pos0[0] = tmp3[1]
(p[MEMLAT+6])	chk.s	r[6 + MEMLAT], .recovery1	// our data isn't
							// valid - rollback!
(p[MEMLAT+6])	cmp.ne	p6, p0 = 8, pos0[1]
(p6)		br.cond.spnt	.gotit
(p[MEMLAT+6])	st8	[dest] = val[3], 8		// store val to dest
(p[MEMLAT+3])	or	val[0] = tmp1[3], tmp2[3] 	// val = tmp1 | tmp2
		br.ctop.sptk    .l2
		br.cond.sptk .cpyfew

.src_aligned:
		cmp.ne  p6, p0 = r0, r0			// clear p6
		mov     ar.ec = MEMLAT + 2 + 1 ;;	// set EC
.l3:
(p[0])		ld8.s	r[0] = [src], 8
(p[MEMLAT])	xor	tmp3[0] = r[MEMLAT], charx8
(p[MEMLAT+1])	czx1.r	pos0[0] = tmp3[1]
(p[MEMLAT+2])	cmp.ne	p7, p0 = 8, pos0[1]
(p[MEMLAT+2])	chk.s	r[MEMLAT+2], .recovery2
(p7)		br.cond.spnt	.gotit
.back2:
(p[MEMLAT+2])	st8	[dest] = r[MEMLAT+2], 8
		br.ctop.dptk .l3
.cpyfew:
	cmp.eq	p6, p0 = len, r0	// is len == 0 ?
	adds	len = -1, len		// --len;
(p6)	br.cond.spnt	.restore_and_exit ;;
	mov	ar.lc = len
.l4:
	ld1	value = [src], 1
	;;
	st1	[dest] = value, 1
	cmp.eq	p6, p0 = value, char
(p6)	br.cond.spnt .foundit
	br.cloop.dptk	.l4 ;;
.foundit:
(p6)	mov	ret0 = dest
.restore_and_exit:
	mov     pr = saved_pr, -1    	// restore the predicate registers
	mov 	ar.lc = saved_lc	// restore the loop counter
	mov 	ar.ec = saved_ec ;;	// restore the epilog counter
	br.ret.sptk.many b0
.gotit:
	.pred.rel "mutex" p6, p7
(p6)	mov	value = val[3]		// if coming from l2
(p7)	mov	value = r[MEMLAT+2]	// if coming from l3
	mov	ar.lc = pos0[1] ;;
.l5:
	extr.u	tmp = value, 0, 8 ;;
	st1	[dest] = tmp, 1
	shr.u	value = value, 8
	br.cloop.sptk .l5 ;;
	mov 	ret0 = dest
	mov	pr = saved_pr, -1
	mov	ar.lc = saved_lc
	br.ret.sptk.many b0

.recovery1:
#if MEMLAT != 6
# error "MEMLAT must be 6!"
#endif
	adds	src = -8, asrc
	mov	loopcnt = ar.lc
	mov	tmp = ar.ec
	;;
(p[0])	adds	src = -8, src
	;;
(p[1])	adds	src = -8, src
	sub	sh1 = (MEMLAT + 6 + 1), tmp
	;;
(p[2])	adds	src = -8, src
	;;
(p[3])	adds	src = -8, src
	shl	loopcnt = loopcnt, 3
	;;
(p[4])	adds	src = -8, src
	;;
(p[5])	adds	src = -8, src
	shl	sh1 = sh1, 3
	;;
(p[6])	adds	src = -8, src
	;;
(p[7])	adds	src = -8, src
	shl	tmp = tmp, 3
	;;
(p[8])	adds	src = -8, src
	;;
(p[9])	adds	src = -8, src
	shr.u	sh2 = sh2, 3
	;;
(p[10])	adds	src = -8, src
	;;
(p[11])	adds	src = -8, src
	add	len = len, loopcnt
	;;
	sub	src = src, sh2
	;;
	add	len = tmp, len
	add	src = sh1, src
	br.cond.sptk .cpyfew

.recovery2:
#if MEMLAT != 6
# error "MEMLAT must be 6!"
#endif
	add	tmp = -8, src
(p7)	br.cond.spnt .gotit
	;;
(p[0])	add	tmp = -8, tmp ;;
(p[1])	add	tmp = -8, tmp ;;
(p[2])	add	tmp = -8, tmp ;;
(p[3])	add	tmp = -8, tmp ;;
(p[4])	add	tmp = -8, tmp ;;
(p[5])	add	tmp = -8, tmp ;;
(p[6])	add	tmp = -8, tmp ;;
(p[7])	add	tmp = -8, tmp ;;
	ld8	r[MEMLAT+2] = [tmp] ;;
	xor	pos0[1] = r[MEMLAT+2], charx8 ;;
	czx1.r	pos0[1] = pos0[1] ;;
	cmp.ne	p7, p6 = 8, pos0[1]
(p7)	br.cond.spnt .gotit
	br.cond.sptk .back2
END(memccpy)
