diff options
Diffstat (limited to 'arch/powerpc/lib')
-rw-r--r-- | arch/powerpc/lib/Makefile | 6 | ||||
-rw-r--r-- | arch/powerpc/lib/checksum_32.S (renamed from arch/powerpc/lib/checksum.S) | 0 | ||||
-rw-r--r-- | arch/powerpc/lib/checksum_64.S (renamed from arch/powerpc/lib/checksum64.S) | 0 | ||||
-rw-r--r-- | arch/powerpc/lib/copy_32.S (renamed from arch/powerpc/lib/copy32.S) | 0 | ||||
-rw-r--r-- | arch/powerpc/lib/copypage_64.S (renamed from arch/powerpc/lib/copypage.S) | 0 | ||||
-rw-r--r-- | arch/powerpc/lib/copyuser_64.S (renamed from arch/powerpc/lib/copyuser.S) | 0 | ||||
-rw-r--r-- | arch/powerpc/lib/mem_64.S | 119 | ||||
-rw-r--r-- | arch/powerpc/lib/memcpy_64.S (renamed from arch/powerpc/lib/memcpy.S) | 0 | ||||
-rw-r--r-- | arch/powerpc/lib/usercopy_64.c (renamed from arch/powerpc/lib/usercopy.c) | 0 |
9 files changed, 122 insertions, 3 deletions
diff --git a/arch/powerpc/lib/Makefile b/arch/powerpc/lib/Makefile index 347f9798e43..a8cedb96de5 100644 --- a/arch/powerpc/lib/Makefile +++ b/arch/powerpc/lib/Makefile @@ -3,7 +3,7 @@ # obj-y := strcase.o string.o -obj-$(CONFIG_PPC32) += div64.o copy32.o checksum.o -obj-$(CONFIG_PPC64) += copypage.o copyuser.o memcpy.o usercopy.o \ - sstep.o checksum64.o +obj-$(CONFIG_PPC32) += div64.o copy_32.o checksum_32.o +obj-$(CONFIG_PPC64) += copypage_64.o copyuser_64.o memcpy_64.o \ + usercopy_64.o sstep.o checksum_64.o mem_64.o obj-$(CONFIG_PPC_ISERIES) += e2a.o diff --git a/arch/powerpc/lib/checksum.S b/arch/powerpc/lib/checksum_32.S index 7874e8a8045..7874e8a8045 100644 --- a/arch/powerpc/lib/checksum.S +++ b/arch/powerpc/lib/checksum_32.S diff --git a/arch/powerpc/lib/checksum64.S b/arch/powerpc/lib/checksum_64.S index ef96c6c58ef..ef96c6c58ef 100644 --- a/arch/powerpc/lib/checksum64.S +++ b/arch/powerpc/lib/checksum_64.S diff --git a/arch/powerpc/lib/copy32.S b/arch/powerpc/lib/copy_32.S index 420a912198a..420a912198a 100644 --- a/arch/powerpc/lib/copy32.S +++ b/arch/powerpc/lib/copy_32.S diff --git a/arch/powerpc/lib/copypage.S b/arch/powerpc/lib/copypage_64.S index 733d61618bb..733d61618bb 100644 --- a/arch/powerpc/lib/copypage.S +++ b/arch/powerpc/lib/copypage_64.S diff --git a/arch/powerpc/lib/copyuser.S b/arch/powerpc/lib/copyuser_64.S index a0b3fbbd6fb..a0b3fbbd6fb 100644 --- a/arch/powerpc/lib/copyuser.S +++ b/arch/powerpc/lib/copyuser_64.S diff --git a/arch/powerpc/lib/mem_64.S b/arch/powerpc/lib/mem_64.S new file mode 100644 index 00000000000..68df20283ff --- /dev/null +++ b/arch/powerpc/lib/mem_64.S @@ -0,0 +1,119 @@ +/* + * String handling functions for PowerPC. + * + * Copyright (C) 1996 Paul Mackerras. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version + * 2 of the License, or (at your option) any later version. + */ +#include <asm/processor.h> +#include <asm/errno.h> +#include <asm/ppc_asm.h> + +_GLOBAL(memset) + neg r0,r3 + rlwimi r4,r4,8,16,23 + andi. r0,r0,7 /* # bytes to be 8-byte aligned */ + rlwimi r4,r4,16,0,15 + cmplw cr1,r5,r0 /* do we get that far? */ + rldimi r4,r4,32,0 + mtcrf 1,r0 + mr r6,r3 + blt cr1,8f + beq+ 3f /* if already 8-byte aligned */ + subf r5,r0,r5 + bf 31,1f + stb r4,0(r6) + addi r6,r6,1 +1: bf 30,2f + sth r4,0(r6) + addi r6,r6,2 +2: bf 29,3f + stw r4,0(r6) + addi r6,r6,4 +3: srdi. r0,r5,6 + clrldi r5,r5,58 + mtctr r0 + beq 5f +4: std r4,0(r6) + std r4,8(r6) + std r4,16(r6) + std r4,24(r6) + std r4,32(r6) + std r4,40(r6) + std r4,48(r6) + std r4,56(r6) + addi r6,r6,64 + bdnz 4b +5: srwi. r0,r5,3 + clrlwi r5,r5,29 + mtcrf 1,r0 + beq 8f + bf 29,6f + std r4,0(r6) + std r4,8(r6) + std r4,16(r6) + std r4,24(r6) + addi r6,r6,32 +6: bf 30,7f + std r4,0(r6) + std r4,8(r6) + addi r6,r6,16 +7: bf 31,8f + std r4,0(r6) + addi r6,r6,8 +8: cmpwi r5,0 + mtcrf 1,r5 + beqlr+ + bf 29,9f + stw r4,0(r6) + addi r6,r6,4 +9: bf 30,10f + sth r4,0(r6) + addi r6,r6,2 +10: bflr 31 + stb r4,0(r6) + blr + +_GLOBAL(memmove) + cmplw 0,r3,r4 + bgt .backwards_memcpy + b .memcpy + +_GLOBAL(backwards_memcpy) + rlwinm. r7,r5,32-3,3,31 /* r0 = r5 >> 3 */ + add r6,r3,r5 + add r4,r4,r5 + beq 2f + andi. r0,r6,3 + mtctr r7 + bne 5f +1: lwz r7,-4(r4) + lwzu r8,-8(r4) + stw r7,-4(r6) + stwu r8,-8(r6) + bdnz 1b + andi. r5,r5,7 +2: cmplwi 0,r5,4 + blt 3f + lwzu r0,-4(r4) + subi r5,r5,4 + stwu r0,-4(r6) +3: cmpwi 0,r5,0 + beqlr + mtctr r5 +4: lbzu r0,-1(r4) + stbu r0,-1(r6) + bdnz 4b + blr +5: mtctr r0 +6: lbzu r7,-1(r4) + stbu r7,-1(r6) + bdnz 6b + subf r5,r0,r5 + rlwinm. r7,r5,32-3,3,31 + beq 2b + mtctr r7 + b 1b diff --git a/arch/powerpc/lib/memcpy.S b/arch/powerpc/lib/memcpy_64.S index 9ccacdf5bcb..9ccacdf5bcb 100644 --- a/arch/powerpc/lib/memcpy.S +++ b/arch/powerpc/lib/memcpy_64.S diff --git a/arch/powerpc/lib/usercopy.c b/arch/powerpc/lib/usercopy_64.c index 5eea6f3c1e0..5eea6f3c1e0 100644 --- a/arch/powerpc/lib/usercopy.c +++ b/arch/powerpc/lib/usercopy_64.c |