unsigned long raw_copy_from_user()

in lib/usercopy.c [7:75]


unsigned long raw_copy_from_user(void *to, const void *from,
			unsigned long n)
{
	int tmp, nsave;

	__asm__ __volatile__(
	"0:     cmpnei  %1, 0           \n"
	"       bf      7f              \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"
	"       bt      3f              \n"
	"2:     ldw     %3, (%2, 0)     \n"
	"10:    ldw     %4, (%2, 4)     \n"
	"       stw     %3, (%1, 0)     \n"
	"       stw     %4, (%1, 4)     \n"
	"11:    ldw     %3, (%2, 8)     \n"
	"12:    ldw     %4, (%2, 12)    \n"
	"       stw     %3, (%1, 8)     \n"
	"       stw     %4, (%1, 12)    \n"
	"       addi    %2, 16          \n"
	"       addi    %1, 16          \n"
	"       subi    %0, 16          \n"
	"       br      1b              \n"
	"3:     cmplti  %0, 4           \n"
	"       bt      5f              \n"
	"4:     ldw     %3, (%2, 0)     \n"
	"       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"
	"       bf      7f              \n"
	"6:     ldb     %3, (%2, 0)     \n"
	"       stb     %3, (%1, 0)     \n"
	"       addi    %2,  1          \n"
	"       addi    %1,  1          \n"
	"       subi    %0,  1          \n"
	"       br      5b              \n"
	"8:     stw     %3, (%1, 0)     \n"
	"       subi    %0, 4           \n"
	"       bf      7f              \n"
	"9:     subi    %0, 8           \n"
	"       bf      7f              \n"
	"13:    stw     %3, (%1, 8)     \n"
	"       subi    %0, 12          \n"
	"       bf      7f              \n"
	".section __ex_table, \"a\"     \n"
	".align   2                     \n"
	".long    2b, 7f                \n"
	".long    4b, 7f                \n"
	".long    6b, 7f                \n"
	".long   10b, 8b                \n"
	".long   11b, 9b                \n"
	".long   12b,13b                \n"
	".previous                      \n"
	"7:                             \n"
	: "=r"(n), "=r"(to), "=r"(from), "=r"(nsave),
	  "=r"(tmp)
	: "0"(n), "1"(to), "2"(from)
	: "memory");

	return n;
}