unsigned long raw_copy_to_user()

in lib/usercopy.c [78:142]


unsigned long raw_copy_to_user(void *to, const void *from,
			unsigned long n)
{
	int w0, w1, w2, w3;

	__asm__ __volatile__(
	"0:     cmpnei  %1, 0           \n"
	"       bf      8f              \n"
	"       mov     %3, %1          \n"
	"       or      %3, %2          \n"
	"       andi    %3, 3           \n"
	"       cmpnei  %3, 0           \n"
	"       bf      1f              \n"
	"       br      5f              \n"
	"1:     cmplti  %0, 16          \n" /* 4W */
	"       bt      3f              \n"
	"       ldw     %3, (%2, 0)     \n"
	"       ldw     %4, (%2, 4)     \n"
	"       ldw     %5, (%2, 8)     \n"
	"       ldw     %6, (%2, 12)    \n"
	"2:     stw     %3, (%1, 0)     \n"
	"9:     stw     %4, (%1, 4)     \n"
	"10:    stw     %5, (%1, 8)     \n"
	"11:    stw     %6, (%1, 12)    \n"
	"       addi    %2, 16          \n"
	"       addi    %1, 16          \n"
	"       subi    %0, 16          \n"
	"       br      1b              \n"
	"3:     cmplti  %0, 4           \n" /* 1W */
	"       bt      5f              \n"
	"       ldw     %3, (%2, 0)     \n"
	"4:     stw     %3, (%1, 0)     \n"
	"       addi    %2, 4           \n"
	"       addi    %1, 4           \n"
	"       subi    %0, 4           \n"
	"       br      3b              \n"
	"5:     cmpnei  %0, 0           \n"  /* 1B */
	"       bf      13f             \n"
	"       ldb     %3, (%2, 0)     \n"
	"6:     stb     %3, (%1, 0)     \n"
	"       addi    %2,  1          \n"
	"       addi    %1,  1          \n"
	"       subi    %0,  1          \n"
	"       br      5b              \n"
	"7:     subi	%0,  4          \n"
	"8:     subi	%0,  4          \n"
	"12:    subi	%0,  4          \n"
	"       br      13f             \n"
	".section __ex_table, \"a\"     \n"
	".align   2                     \n"
	".long    2b, 13f               \n"
	".long    4b, 13f               \n"
	".long    6b, 13f               \n"
	".long    9b, 12b               \n"
	".long   10b, 8b                \n"
	".long   11b, 7b                \n"
	".previous                      \n"
	"13:                            \n"
	: "=r"(n), "=r"(to), "=r"(from), "=r"(w0),
	  "=r"(w1), "=r"(w2), "=r"(w3)
	: "0"(n), "1"(to), "2"(from)
	: "memory");

	return n;
}