Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /* copy_user.S: Sparc optimized copy_from_user and copy_to_user code.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *  Copyright(C) 1995 Linus Torvalds
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  *  Copyright(C) 1996 David S. Miller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *  Copyright(C) 1996 Eddie C. Dost
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  *  Copyright(C) 1996,1998 Jakub Jelinek
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * derived from:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *	e-mail between David and Eddie.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  * Returns 0 if successful, otherwise count of bytes not copied yet
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #include <asm/ptrace.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #include <asm/asmmacro.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #include <asm/page.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) #include <asm/thread_info.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) /* Work around cpp -rob */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define ALLOC #alloc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define EXECINSTR #execinstr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define EX(x,y,a,b) 				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 98: 	x,y;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	.section .fixup,ALLOC,EXECINSTR;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 	.align	4;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 99:	ba fixupretl;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 	 a, b, %g3;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	.section __ex_table,ALLOC;		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	.align	4;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	.word	98b, 99b;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	.text;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 	.align	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #define EX2(x,y,c,d,e,a,b) 			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) 98: 	x,y;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 	.section .fixup,ALLOC,EXECINSTR;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 	.align	4;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) 99:	c, d, e;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	ba fixupretl;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 	 a, b, %g3;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	.section __ex_table,ALLOC;		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	.align	4;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) 	.word	98b, 99b;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 	.text;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	.align	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) #define EXO2(x,y) 				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 98: 	x, y;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	.section __ex_table,ALLOC;		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	.align	4;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	.word	98b, 97f;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 	.text;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	.align	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) #define EXT(start,end,handler)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	.section __ex_table,ALLOC;		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	.align	4;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	.word	start, 0, end, handler;		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	.text;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	.align	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) /* Please do not change following macros unless you change logic used
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65)  * in .fixup at the end of this file as well
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) /* Both these macros have to start with exactly the same insn */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) #define MOVE_BIGCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	ldd	[%src + (offset) + 0x00], %t0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	ldd	[%src + (offset) + 0x08], %t2; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	ldd	[%src + (offset) + 0x10], %t4; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 	ldd	[%src + (offset) + 0x18], %t6; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	st	%t0, [%dst + (offset) + 0x00]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	st	%t1, [%dst + (offset) + 0x04]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	st	%t2, [%dst + (offset) + 0x08]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	st	%t3, [%dst + (offset) + 0x0c]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	st	%t4, [%dst + (offset) + 0x10]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	st	%t5, [%dst + (offset) + 0x14]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 	st	%t6, [%dst + (offset) + 0x18]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 	st	%t7, [%dst + (offset) + 0x1c];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) #define MOVE_BIGALIGNCHUNK(src, dst, offset, t0, t1, t2, t3, t4, t5, t6, t7) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 	ldd	[%src + (offset) + 0x00], %t0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 	ldd	[%src + (offset) + 0x08], %t2; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	ldd	[%src + (offset) + 0x10], %t4; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	ldd	[%src + (offset) + 0x18], %t6; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 	std	%t0, [%dst + (offset) + 0x00]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 	std	%t2, [%dst + (offset) + 0x08]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	std	%t4, [%dst + (offset) + 0x10]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 	std	%t6, [%dst + (offset) + 0x18];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) #define MOVE_LASTCHUNK(src, dst, offset, t0, t1, t2, t3) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	ldd	[%src - (offset) - 0x10], %t0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	ldd	[%src - (offset) - 0x08], %t2; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 	st	%t0, [%dst - (offset) - 0x10]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 	st	%t1, [%dst - (offset) - 0x0c]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 	st	%t2, [%dst - (offset) - 0x08]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 	st	%t3, [%dst - (offset) - 0x04];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define MOVE_HALFCHUNK(src, dst, offset, t0, t1, t2, t3) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	lduh	[%src + (offset) + 0x00], %t0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 	lduh	[%src + (offset) + 0x02], %t1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	lduh	[%src + (offset) + 0x04], %t2; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	lduh	[%src + (offset) + 0x06], %t3; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	sth	%t0, [%dst + (offset) + 0x00]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	sth	%t1, [%dst + (offset) + 0x02]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	sth	%t2, [%dst + (offset) + 0x04]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 	sth	%t3, [%dst + (offset) + 0x06];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #define MOVE_SHORTCHUNK(src, dst, offset, t0, t1) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	ldub	[%src - (offset) - 0x02], %t0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 	ldub	[%src - (offset) - 0x01], %t1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	stb	%t0, [%dst - (offset) - 0x02]; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	stb	%t1, [%dst - (offset) - 0x01];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	.text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	.align	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 	.globl  __copy_user_begin
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) __copy_user_begin:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	.globl	__copy_user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 	EXPORT_SYMBOL(__copy_user)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) dword_align:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	andcc	%o1, 1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 	be	4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	 andcc	%o1, 2, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	EXO2(ldub [%o1], %g2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	add	%o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	EXO2(stb %g2, [%o0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	sub	%o2, 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	bne	3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 	 add	%o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	EXO2(lduh [%o1], %g2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 	add	%o1, 2, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	EXO2(sth %g2, [%o0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	sub	%o2, 2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	b	3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	 add	%o0, 2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 4:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	EXO2(lduh [%o1], %g2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	add	%o1, 2, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	EXO2(sth %g2, [%o0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	sub	%o2, 2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	b	3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	 add	%o0, 2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) __copy_user:	/* %o0=dst %o1=src %o2=len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	xor	%o0, %o1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	andcc	%o4, 3, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	bne	cannot_optimize
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	 cmp	%o2, 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	bleu	short_aligned_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	 andcc	%o1, 3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	bne	dword_align
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	 andcc	%o1, 4, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	be	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 	 mov	%o2, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	EXO2(ld [%o1], %o4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	sub	%g1, 4, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	EXO2(st %o4, [%o0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	add	%o1, 4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	add	%o0, 4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	andcc	%g1, 0xffffff80, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	be	3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	 andcc	%o0, 4, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	be	ldd_std + 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 5:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	MOVE_BIGCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	MOVE_BIGCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	MOVE_BIGCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	MOVE_BIGCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 80:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	EXT(5b, 80b, 50f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	subcc	%g7, 128, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	add	%o1, 128, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 	bne	5b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 	 add	%o0, 128, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	andcc	%g1, 0x70, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	be	copy_user_table_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	 andcc	%g1, 8, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	sethi	%hi(copy_user_table_end), %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	srl	%g7, 1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	add	%g7, %o4, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	add	%o1, %g7, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	sub	%o5, %o4, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 	jmpl	%o5 + %lo(copy_user_table_end), %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 	 add	%o0, %g7, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) copy_user_table:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 	MOVE_LASTCHUNK(o1, o0, 0x60, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	MOVE_LASTCHUNK(o1, o0, 0x50, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	MOVE_LASTCHUNK(o1, o0, 0x40, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	MOVE_LASTCHUNK(o1, o0, 0x30, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	MOVE_LASTCHUNK(o1, o0, 0x20, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 	MOVE_LASTCHUNK(o1, o0, 0x10, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 	MOVE_LASTCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) copy_user_table_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	EXT(copy_user_table, copy_user_table_end, 51f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	be	copy_user_last7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	 andcc	%g1, 4, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 	EX(ldd	[%o1], %g2, and %g1, 0xf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 	add	%o0, 8, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	add	%o1, 8, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	EX(st	%g2, [%o0 - 0x08], and %g1, 0xf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	EX2(st	%g3, [%o0 - 0x04], and %g1, 0xf, %g1, sub %g1, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) copy_user_last7:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 	be	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 	 andcc	%g1, 2, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	EX(ld	[%o1], %g2, and %g1, 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	add	%o1, 4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	EX(st	%g2, [%o0], and %g1, 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 	add	%o0, 4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 	be	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 	 andcc	%g1, 1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 	EX(lduh	[%o1], %g2, and %g1, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	add	%o1, 2, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 	EX(sth	%g2, [%o0], and %g1, 3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	add	%o0, 2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	be	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	 nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 	EX(ldub	[%o1], %g2, add %g0, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 	EX(stb	%g2, [%o0], add %g0, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 	retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)  	 clr	%o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) ldd_std:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	MOVE_BIGALIGNCHUNK(o1, o0, 0x00, o2, o3, o4, o5, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	MOVE_BIGALIGNCHUNK(o1, o0, 0x20, o2, o3, o4, o5, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	MOVE_BIGALIGNCHUNK(o1, o0, 0x40, o2, o3, o4, o5, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	MOVE_BIGALIGNCHUNK(o1, o0, 0x60, o2, o3, o4, o5, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 81:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	EXT(ldd_std, 81b, 52f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	subcc	%g7, 128, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 	add	%o1, 128, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	bne	ldd_std
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	 add	%o0, 128, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 	andcc	%g1, 0x70, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	be	copy_user_table_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	 andcc	%g1, 8, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	sethi	%hi(copy_user_table_end), %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	srl	%g7, 1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 	add	%g7, %o4, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 	add	%o1, %g7, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	sub	%o5, %o4, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	jmpl	%o5 + %lo(copy_user_table_end), %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	 add	%o0, %g7, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) cannot_optimize:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	bleu	short_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 	 cmp	%o5, 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	bne	byte_chunk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	 and	%o2, 0xfffffff0, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 	 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	andcc	%o1, 1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 	be	10f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	 nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 	EXO2(ldub [%o1], %g2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 	add	%o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	EXO2(stb %g2, [%o0])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	sub	%o2, 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	andcc	%o2, 0xfffffff0, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 	be	short_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 	 add	%o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 10:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	MOVE_HALFCHUNK(o1, o0, 0x00, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	MOVE_HALFCHUNK(o1, o0, 0x08, g2, g3, g4, g5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 82:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	EXT(10b, 82b, 53f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	subcc	%o3, 0x10, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	add	%o1, 0x10, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	bne	10b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 	 add	%o0, 0x10, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 	b	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 	 and	%o2, 0xe, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 	
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) byte_chunk:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 	MOVE_SHORTCHUNK(o1, o0, -0x02, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 	MOVE_SHORTCHUNK(o1, o0, -0x04, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 	MOVE_SHORTCHUNK(o1, o0, -0x06, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 	MOVE_SHORTCHUNK(o1, o0, -0x08, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 	MOVE_SHORTCHUNK(o1, o0, -0x0a, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 	MOVE_SHORTCHUNK(o1, o0, -0x0c, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 	MOVE_SHORTCHUNK(o1, o0, -0x0e, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) 	MOVE_SHORTCHUNK(o1, o0, -0x10, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 83:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 	EXT(byte_chunk, 83b, 54f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 	subcc	%o3, 0x10, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 	add	%o1, 0x10, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 	bne	byte_chunk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 	 add	%o0, 0x10, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) short_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 	and	%o2, 0xe, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) 	sethi	%hi(short_table_end), %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 	sll	%o3, 3, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 	add	%o0, %o3, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 	sub	%o5, %o4, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	add	%o1, %o3, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 	jmpl	%o5 + %lo(short_table_end), %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 	 andcc	%o2, 1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 84:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 	MOVE_SHORTCHUNK(o1, o0, 0x0c, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	MOVE_SHORTCHUNK(o1, o0, 0x0a, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 	MOVE_SHORTCHUNK(o1, o0, 0x08, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 	MOVE_SHORTCHUNK(o1, o0, 0x06, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 	MOVE_SHORTCHUNK(o1, o0, 0x04, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 	MOVE_SHORTCHUNK(o1, o0, 0x02, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 	MOVE_SHORTCHUNK(o1, o0, 0x00, g2, g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) short_table_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 	EXT(84b, short_table_end, 55f)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	be	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	 nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 	EX(ldub	[%o1], %g2, add %g0, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	EX(stb	%g2, [%o0], add %g0, 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 	retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)  	 clr	%o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) short_aligned_end:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 	bne	short_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	 andcc	%o2, 8, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 	be	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 	 andcc	%o2, 4, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 	EXO2(ld	[%o1 + 0x00], %g2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	EXO2(ld	[%o1 + 0x04], %g3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	add	%o1, 8, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	EXO2(st	%g2, [%o0 + 0x00])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 	EX(st	%g3, [%o0 + 0x04], sub %o2, 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 	add	%o0, 8, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	b	copy_user_last7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	 mov	%o2, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) 	.section .fixup,#alloc,#execinstr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 	.align	4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 97:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	mov	%o2, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) fixupretl:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 	retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 	 mov	%g3, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) /* exception routine sets %g2 to (broken_insn - first_insn)>>2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 50:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) /* This magic counts how many bytes are left when crash in MOVE_BIGCHUNK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374)  * happens. This is derived from the amount ldd reads, st stores, etc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)  * x = g2 % 12;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376)  * g3 = g1 + g7 - ((g2 / 12) * 32 + (x < 4) ? 0 : (x - 4) * 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)  * o0 += (g2 / 12) * 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 	cmp	%g2, 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	add	%o0, %g7, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	bcs	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 	 cmp	%g2, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 	bcs	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	 cmp	%g2, 36
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	bcs	3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 	 nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	sub	%g2, 12, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 	sub	%g7, 32, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 3:	sub	%g2, 12, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 	sub	%g7, 32, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 2:	sub	%g2, 12, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 	sub	%g7, 32, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 1:	cmp	%g2, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 	bcs,a	60f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 	 clr	%g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 	sub	%g2, 4, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 	sll	%g2, 2, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 60:	and	%g1, 0x7f, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 	sub	%o0, %g7, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 	add	%g3, %g7, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 	ba	fixupretl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 	 sub	%g3, %g2, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 51:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) /* i = 41 - g2; j = i % 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)  * g3 = (g1 & 15) + (i / 6) * 16 + (j < 4) ? (j + 1) * 4 : 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)  * o0 -= (i / 6) * 16 + 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 	neg	%g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	and	%g1, 0xf, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 	add	%g2, 41, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	add	%o0, %g1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 1:	cmp	%g2, 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 	bcs,a	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 	 cmp	%g2, 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 	add	%g1, 16, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 	b	1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 	 sub	%g2, 6, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 2:	bcc,a	2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 	 mov	16, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 	inc	%g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 	sll	%g2, 2, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 2:	add	%g1, %g2, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 	ba	fixupretl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 	 sub	%o0, %g3, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 52:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) /* g3 = g1 + g7 - (g2 / 8) * 32 + (g2 & 4) ? (g2 & 3) * 8 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)    o0 += (g2 / 8) * 32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 	andn	%g2, 7, %g4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 	add	%o0, %g7, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 	andcc	%g2, 4, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	and	%g2, 3, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 	sll	%g4, 2, %g4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 	sll	%g2, 3, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 	bne	60b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 	 sub	%g7, %g4, %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 	ba	60b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 	 clr	%g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 53:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) /* g3 = o3 + (o2 & 15) - (g2 & 8) - (g2 & 4) ? (g2 & 3) * 2 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)    o0 += (g2 & 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 	and	%g2, 3, %g4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 	andcc	%g2, 4, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 	and	%g2, 8, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	sll	%g4, 1, %g4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	be	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 	 add	%o0, %g2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	add	%g2, %g4, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 1:	and	%o2, 0xf, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 	add	%g3, %o3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 	ba	fixupretl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	 sub	%g3, %g2, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 54:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) /* g3 = o3 + (o2 & 15) - (g2 / 4) * 2 - (g2 & 2) ? (g2 & 1) : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454)    o0 += (g2 / 4) * 2 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 	srl	%g2, 2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	and	%g2, 1, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 	srl	%g2, 1, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	add	%o4, %o4, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 	and	%o5, %g2, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	and	%o2, 0xf, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	add	%o0, %o4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	sub	%o3, %o5, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 	sub	%o2, %o4, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	ba	fixupretl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 	 add	%o2, %o3, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 55:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) /* i = 27 - g2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468)    g3 = (o2 & 1) + i / 4 * 2 + !(i & 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)    o0 -= i / 4 * 2 + 1 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 	neg	%g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 	and	%o2, 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 	add	%g2, 27, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 	srl	%g2, 2, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 	andcc	%g2, 3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 	mov	1, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 	add	%o5, %o5, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 	be,a	1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 	 clr	%g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 1:	add	%g2, %o5, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 	sub	%o0, %g3, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 	ba	fixupretl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 	 add	%g3, %o2, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) 	.globl  __copy_user_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) __copy_user_end: