/*
 * arch/xtensa/lib/hal/memcopy.S -- Core HAL library functions
 * xthal_memcpy and xthal_bcopy
 *
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 2002 - 2012 Tensilica Inc.
 */

#include <variant/core.h>

	.macro	src_b	r, w0, w1
#ifdef __XTENSA_EB__
	src	\r, \w0, \w1
#else
	src	\r, \w1, \w0
#endif
	.endm

	.macro	ssa8	r
#ifdef __XTENSA_EB__
	ssa8b	\r
#else
	ssa8l	\r
#endif
	.endm

/*
 * void *memcpy(void *dst, const void *src, size_t len);
 *
 * This function is intended to do the same thing as the standard
 * library function memcpy() for most cases.
 * However, where the source and/or destination references
 * an instruction RAM or ROM or a data RAM or ROM, that
 * source and/or destination will always be accessed with
 * 32-bit load and store instructions (as required for these
 * types of devices).
 *
 * !!!!!!!  XTFIXME:
 * !!!!!!!  Handling of IRAM/IROM has not yet
 * !!!!!!!  been implemented.
 *
 * The (general case) algorithm is as follows:
 *   If destination is unaligned, align it by conditionally
 *     copying 1 and 2 bytes.
 *   If source is aligned,
 *     do 16 bytes with a loop, and then finish up with
 *     8, 4, 2, and 1 byte copies conditional on the length;
 *   else (if source is unaligned),
 *     do the same, but use SRC to align the source data.
 *   This code tries to use fall-through branches for the common
 *     case of aligned source and destination and multiple
 *     of 4 (or 8) length.
 *
 * Register use:
 *	a0/ return address
 *	a1/ stack pointer
 *	a2/ return value
 *	a3/ src
 *	a4/ length
 *	a5/ dst
 *	a6/ tmp
 *	a7/ tmp
 *	a8/ tmp
 *	a9/ tmp
 *	a10/ tmp
 *	a11/ tmp
 */

	.text

/*
 * Byte by byte copy
 */
	.align	4
	.byte	0		# 1 mod 4 alignment for LOOPNEZ
				# (0 mod 4 alignment for LBEG)
.Lbytecopy:
#if XCHAL_HAVE_LOOPS
	loopnez	a4, .Lbytecopydone
#else /* !XCHAL_HAVE_LOOPS */
	beqz	a4, .Lbytecopydone
	add	a7, a3, a4	# a7 = end address for source
#endif /* !XCHAL_HAVE_LOOPS */
.Lnextbyte:
	l8ui	a6, a3, 0
	addi	a3, a3, 1
	s8i	a6, a5, 0
	addi	a5, a5, 1
#if !XCHAL_HAVE_LOOPS
	bne	a3, a7, .Lnextbyte # continue loop if $a3:src != $a7:src_end
#endif /* !XCHAL_HAVE_LOOPS */
.Lbytecopydone:
	retw

/*
 * Destination is unaligned
 */

	.align	4
.Ldst1mod2:	# dst is only byte aligned
	_bltui	a4, 7, .Lbytecopy	# do short copies byte by byte

	# copy 1 byte
	l8ui	a6, a3,  0
	addi	a3, a3,  1
	addi	a4, a4, -1
	s8i	a6, a5,  0
	addi	a5, a5,  1
	_bbci.l	a5, 1, .Ldstaligned	# if dst is now aligned, then
					# return to main algorithm
.Ldst2mod4:	# dst 16-bit aligned
	# copy 2 bytes
	_bltui	a4, 6, .Lbytecopy	# do short copies byte by byte
	l8ui	a6, a3,  0
	l8ui	a7, a3,  1
	addi	a3, a3,  2
	addi	a4, a4, -2
	s8i	a6, a5,  0
	s8i	a7, a5,  1
	addi	a5, a5,  2
	j	.Ldstaligned	# dst is now aligned, return to main algorithm

	.align	4
	.global	memcpy
	.type   memcpy,@function
memcpy:

	entry	sp, 16		# minimal stack frame
	# a2/ dst, a3/ src, a4/ len
	mov	a5, a2		# copy dst so that a2 is return value
.Lcommon:
	_bbsi.l	a2, 0, .Ldst1mod2	# if dst is 1 mod 2
	_bbsi.l	a2, 1, .Ldst2mod4	# if dst is 2 mod 4
.Ldstaligned:	# return here from .Ldst?mod? once dst is aligned
	srli	a7, a4, 4	# number of loop iterations with 16B
				# per iteration
	movi	a8, 3		# if source is not aligned,
	_bany	a3, a8, .Lsrcunaligned	# then use shifting copy
	/*
	 * Destination and source are word-aligned, use word copy.
	 */
	# copy 16 bytes per iteration for word-aligned dst and word-aligned src
#if XCHAL_HAVE_LOOPS
	loopnez	a7, .Loop1done
#else /* !XCHAL_HAVE_LOOPS */
	beqz	a7, .Loop1done
	slli	a8, a7, 4
	add	a8, a8, a3	# a8 = end of last 16B source chunk
#endif /* !XCHAL_HAVE_LOOPS */
.Loop1:
	l32i	a6, a3,  0
	l32i	a7, a3,  4
	s32i	a6, a5,  0
	l32i	a6, a3,  8
	s32i	a7, a5,  4
	l32i	a7, a3, 12
	s32i	a6, a5,  8
	addi	a3, a3, 16
	s32i	a7, a5, 12
	addi	a5, a5, 16
#if !XCHAL_HAVE_LOOPS
	bne	a3, a8, .Loop1  # continue loop if a3:src != a8:src_end
#endif /* !XCHAL_HAVE_LOOPS */
.Loop1done:
	bbci.l	a4, 3, .L2
	# copy 8 bytes
	l32i	a6, a3,  0
	l32i	a7, a3,  4
	addi	a3, a3,  8
	s32i	a6, a5,  0
	s32i	a7, a5,  4
	addi	a5, a5,  8
.L2:
	bbsi.l	a4, 2, .L3
	bbsi.l	a4, 1, .L4
	bbsi.l	a4, 0, .L5
	retw
.L3:
	# copy 4 bytes
	l32i	a6, a3,  0
	addi	a3, a3,  4
	s32i	a6, a5,  0
	addi	a5, a5,  4
	bbsi.l	a4, 1, .L4
	bbsi.l	a4, 0, .L5
	retw
.L4:
	# copy 2 bytes
	l16ui	a6, a3,  0
	addi	a3, a3,  2
	s16i	a6, a5,  0
	addi	a5, a5,  2
	bbsi.l	a4, 0, .L5
	retw
.L5:
	# copy 1 byte
	l8ui	a6, a3,  0
	s8i	a6, a5,  0
	retw

/*
 * Destination is aligned, Source is unaligned
 */

	.align	4
.Lsrcunaligned:
	_beqz	a4, .Ldone	# avoid loading anything for zero-length copies
	# copy 16 bytes per iteration for word-aligned dst and unaligned src
	ssa8	a3		# set shift amount from byte offset

/* set to 1 when running on ISS (simulator) with the
   lint or ferret client, or 0 to save a few cycles */
#define SIM_CHECKS_ALIGNMENT	1
#if XCHAL_UNALIGNED_LOAD_EXCEPTION || SIM_CHECKS_ALIGNMENT
	and	a11, a3, a8	# save unalignment offset for below
	sub	a3, a3, a11	# align a3
#endif
	l32i	a6, a3, 0	# load first word
#if XCHAL_HAVE_LOOPS
	loopnez	a7, .Loop2done
#else /* !XCHAL_HAVE_LOOPS */
	beqz	a7, .Loop2done
	slli	a10, a7, 4
	add	a10, a10, a3	# a10 = end of last 16B source chunk
#endif /* !XCHAL_HAVE_LOOPS */
.Loop2:
	l32i	a7, a3,  4
	l32i	a8, a3,  8
	src_b	a6, a6, a7
	s32i	a6, a5,  0
	l32i	a9, a3, 12
	src_b	a7, a7, a8
	s32i	a7, a5,  4
	l32i	a6, a3, 16
	src_b	a8, a8, a9
	s32i	a8, a5,  8
	addi	a3, a3, 16
	src_b	a9, a9, a6
	s32i	a9, a5, 12
	addi	a5, a5, 16
#if !XCHAL_HAVE_LOOPS
	bne	a3, a10, .Loop2 # continue loop if a3:src != a10:src_end
#endif /* !XCHAL_HAVE_LOOPS */
.Loop2done:
	bbci.l	a4, 3, .L12
	# copy 8 bytes
	l32i	a7, a3,  4
	l32i	a8, a3,  8
	src_b	a6, a6, a7
	s32i	a6, a5,  0
	addi	a3, a3,  8
	src_b	a7, a7, a8
	s32i	a7, a5,  4
	addi	a5, a5,  8
	mov	a6, a8
.L12:
	bbci.l	a4, 2, .L13
	# copy 4 bytes
	l32i	a7, a3,  4
	addi	a3, a3,  4
	src_b	a6, a6, a7
	s32i	a6, a5,  0
	addi	a5, a5,  4
	mov	a6, a7
.L13:
#if XCHAL_UNALIGNED_LOAD_EXCEPTION || SIM_CHECKS_ALIGNMENT
	add	a3, a3, a11	# readjust a3 with correct misalignment
#endif
	bbsi.l	a4, 1, .L14
	bbsi.l	a4, 0, .L15
.Ldone:	retw
.L14:
	# copy 2 bytes
	l8ui	a6, a3,  0
	l8ui	a7, a3,  1
	addi	a3, a3,  2
	s8i	a6, a5,  0
	s8i	a7, a5,  1
	addi	a5, a5,  2
	bbsi.l	a4, 0, .L15
	retw
.L15:
	# copy 1 byte
	l8ui	a6, a3,  0
	s8i	a6, a5,  0
	retw


/*
 * void bcopy(const void *src, void *dest, size_t n);
 */
	.align	4
	.global	bcopy
	.type   bcopy,@function
bcopy:
	entry	sp, 16		# minimal stack frame
	# a2=src, a3=dst, a4=len
	mov	a5, a3
	mov	a3, a2
	mov	a2, a5
	j	.Lmovecommon	# go to common code for memmove+bcopy

/*
 * void *memmove(void *dst, const void *src, size_t len);
 *
 * This function is intended to do the same thing as the standard
 * library function memmove() for most cases.
 * However, where the source and/or destination references
 * an instruction RAM or ROM or a data RAM or ROM, that
 * source and/or destination will always be accessed with
 * 32-bit load and store instructions (as required for these
 * types of devices).
 *
 * !!!!!!!  XTFIXME:
 * !!!!!!!  Handling of IRAM/IROM has not yet
 * !!!!!!!  been implemented.
 *
 * The (general case) algorithm is as follows:
 *   If end of source doesn't overlap destination then use memcpy.
 *   Otherwise do memcpy backwards.
 *
 * Register use:
 *	a0/ return address
 *	a1/ stack pointer
 *	a2/ return value
 *	a3/ src
 *	a4/ length
 *	a5/ dst
 *	a6/ tmp
 *	a7/ tmp
 *	a8/ tmp
 *	a9/ tmp
 *	a10/ tmp
 *	a11/ tmp
 */

/*
 * Byte by byte copy
 */
	.align	4
	.byte	0		# 1 mod 4 alignment for LOOPNEZ
				# (0 mod 4 alignment for LBEG)
.Lbackbytecopy:
#if XCHAL_HAVE_LOOPS
	loopnez	a4, .Lbackbytecopydone
#else /* !XCHAL_HAVE_LOOPS */
	beqz	a4, .Lbackbytecopydone
	sub	a7, a3, a4	# a7 = start address for source
#endif /* !XCHAL_HAVE_LOOPS */
.Lbacknextbyte:
	addi	a3, a3, -1
	l8ui	a6, a3, 0
	addi	a5, a5, -1
	s8i	a6, a5, 0
#if !XCHAL_HAVE_LOOPS
	bne	a3, a7, .Lbacknextbyte # continue loop if
				       # $a3:src != $a7:src_start
#endif /* !XCHAL_HAVE_LOOPS */
.Lbackbytecopydone:
	retw

/*
 * Destination is unaligned
 */

	.align	4
.Lbackdst1mod2:	# dst is only byte aligned
	_bltui	a4, 7, .Lbackbytecopy	# do short copies byte by byte

	# copy 1 byte
	addi	a3, a3, -1
	l8ui	a6, a3,  0
	addi	a5, a5, -1
	s8i	a6, a5,  0
	addi	a4, a4, -1
	_bbci.l	a5, 1, .Lbackdstaligned	# if dst is now aligned, then
					# return to main algorithm
.Lbackdst2mod4:	# dst 16-bit aligned
	# copy 2 bytes
	_bltui	a4, 6, .Lbackbytecopy	# do short copies byte by byte
	addi	a3, a3, -2
	l8ui	a6, a3,  0
	l8ui	a7, a3,  1
	addi	a5, a5, -2
	s8i	a6, a5,  0
	s8i	a7, a5,  1
	addi	a4, a4, -2
	j	.Lbackdstaligned	# dst is now aligned,
					# return to main algorithm

	.align	4
	.global	memmove
	.type   memmove,@function
memmove:

	entry	sp, 16		# minimal stack frame
	# a2/ dst, a3/ src, a4/ len
	mov	a5, a2		# copy dst so that a2 is return value
.Lmovecommon:
	sub	a6, a5, a3
	bgeu	a6, a4, .Lcommon

	add	a5, a5, a4
	add	a3, a3, a4

	_bbsi.l	a5, 0, .Lbackdst1mod2	# if dst is 1 mod 2
	_bbsi.l	a5, 1, .Lbackdst2mod4	# if dst is 2 mod 4
.Lbackdstaligned:	# return here from .Lbackdst?mod? once dst is aligned
	srli	a7, a4, 4	# number of loop iterations with 16B
				# per iteration
	movi	a8, 3		# if source is not aligned,
	_bany	a3, a8, .Lbacksrcunaligned	# then use shifting copy
	/*
	 * Destination and source are word-aligned, use word copy.
	 */
	# copy 16 bytes per iteration for word-aligned dst and word-aligned src
#if XCHAL_HAVE_LOOPS
	loopnez	a7, .backLoop1done
#else /* !XCHAL_HAVE_LOOPS */
	beqz	a7, .backLoop1done
	slli	a8, a7, 4
	sub	a8, a3, a8	# a8 = start of first 16B source chunk
#endif /* !XCHAL_HAVE_LOOPS */
.backLoop1:
	addi	a3, a3, -16
	l32i	a7, a3, 12
	l32i	a6, a3,  8
	addi	a5, a5, -16
	s32i	a7, a5, 12
	l32i	a7, a3,  4
	s32i	a6, a5,  8
	l32i	a6, a3,  0
	s32i	a7, a5,  4
	s32i	a6, a5,  0
#if !XCHAL_HAVE_LOOPS
	bne	a3, a8, .backLoop1  # continue loop if a3:src != a8:src_start
#endif /* !XCHAL_HAVE_LOOPS */
.backLoop1done:
	bbci.l	a4, 3, .Lback2
	# copy 8 bytes
	addi	a3, a3, -8
	l32i	a6, a3,  0
	l32i	a7, a3,  4
	addi	a5, a5, -8
	s32i	a6, a5,  0
	s32i	a7, a5,  4
.Lback2:
	bbsi.l	a4, 2, .Lback3
	bbsi.l	a4, 1, .Lback4
	bbsi.l	a4, 0, .Lback5
	retw
.Lback3:
	# copy 4 bytes
	addi	a3, a3, -4
	l32i	a6, a3,  0
	addi	a5, a5, -4
	s32i	a6, a5,  0
	bbsi.l	a4, 1, .Lback4
	bbsi.l	a4, 0, .Lback5
	retw
.Lback4:
	# copy 2 bytes
	addi	a3, a3, -2
	l16ui	a6, a3,  0
	addi	a5, a5, -2
	s16i	a6, a5,  0
	bbsi.l	a4, 0, .Lback5
	retw
.Lback5:
	# copy 1 byte
	addi	a3, a3, -1
	l8ui	a6, a3,  0
	addi	a5, a5, -1
	s8i	a6, a5,  0
	retw

/*
 * Destination is aligned, Source is unaligned
 */

	.align	4
.Lbacksrcunaligned:
	_beqz	a4, .Lbackdone	# avoid loading anything for zero-length copies
	# copy 16 bytes per iteration for word-aligned dst and unaligned src
	ssa8	a3		# set shift amount from byte offset
#define SIM_CHECKS_ALIGNMENT	1	/* set to 1 when running on ISS with
					 * the lint or ferret client, or 0
					 * to save a few cycles */
#if XCHAL_UNALIGNED_LOAD_EXCEPTION || SIM_CHECKS_ALIGNMENT
	and	a11, a3, a8	# save unalignment offset for below
	sub	a3, a3, a11	# align a3
#endif
	l32i	a6, a3, 0	# load first word
#if XCHAL_HAVE_LOOPS
	loopnez	a7, .backLoop2done
#else /* !XCHAL_HAVE_LOOPS */
	beqz	a7, .backLoop2done
	slli	a10, a7, 4
	sub	a10, a3, a10	# a10 = start of first 16B source chunk
#endif /* !XCHAL_HAVE_LOOPS */
.backLoop2:
	addi	a3, a3, -16
	l32i	a7, a3, 12
	l32i	a8, a3,  8
	addi	a5, a5, -16
	src_b	a6, a7, a6
	s32i	a6, a5, 12
	l32i	a9, a3,  4
	src_b	a7, a8, a7
	s32i	a7, a5,  8
	l32i	a6, a3,  0
	src_b	a8, a9, a8
	s32i	a8, a5,  4
	src_b	a9, a6, a9
	s32i	a9, a5,  0
#if !XCHAL_HAVE_LOOPS
	bne	a3, a10, .backLoop2 # continue loop if a3:src != a10:src_start
#endif /* !XCHAL_HAVE_LOOPS */
.backLoop2done:
	bbci.l	a4, 3, .Lback12
	# copy 8 bytes
	addi	a3, a3, -8
	l32i	a7, a3,  4
	l32i	a8, a3,  0
	addi	a5, a5, -8
	src_b	a6, a7, a6
	s32i	a6, a5,  4
	src_b	a7, a8, a7
	s32i	a7, a5,  0
	mov	a6, a8
.Lback12:
	bbci.l	a4, 2, .Lback13
	# copy 4 bytes
	addi	a3, a3, -4
	l32i	a7, a3,  0
	addi	a5, a5, -4
	src_b	a6, a7, a6
	s32i	a6, a5,  0
	mov	a6, a7
.Lback13:
#if XCHAL_UNALIGNED_LOAD_EXCEPTION || SIM_CHECKS_ALIGNMENT
	add	a3, a3, a11	# readjust a3 with correct misalignment
#endif
	bbsi.l	a4, 1, .Lback14
	bbsi.l	a4, 0, .Lback15
.Lbackdone:
	retw
.Lback14:
	# copy 2 bytes
	addi	a3, a3, -2
	l8ui	a6, a3,  0
	l8ui	a7, a3,  1
	addi	a5, a5, -2
	s8i	a6, a5,  0
	s8i	a7, a5,  1
	bbsi.l	a4, 0, .Lback15
	retw
.Lback15:
	# copy 1 byte
	addi	a3, a3, -1
	addi	a5, a5, -1
	l8ui	a6, a3,  0
	s8i	a6, a5,  0
	retw


/*
 * Local Variables:
 * mode:fundamental
 * comment-start: "# "
 * comment-start-skip: "# *"
 * End:
 */
