summaryrefslogtreecommitdiffstats
path: root/arch/sparc64/lib
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-04-19 04:00:00 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-04-19 04:00:00 +0000
commit46e045034336a2cc90c1798cd7cc07af744ddfd6 (patch)
tree3b9b51fc482e729f663d25333e77fbed9aaa939a /arch/sparc64/lib
parent31dc59d503a02e84c4de98826452acaeb56dc15a (diff)
Merge with Linux 2.3.99-pre4.
Diffstat (limited to 'arch/sparc64/lib')
-rw-r--r--arch/sparc64/lib/Makefile8
-rw-r--r--arch/sparc64/lib/VIScopy.S6
-rw-r--r--arch/sparc64/lib/bitops.S110
-rw-r--r--arch/sparc64/lib/blockops.S60
4 files changed, 166 insertions, 18 deletions
diff --git a/arch/sparc64/lib/Makefile b/arch/sparc64/lib/Makefile
index f3067cad6..e70e28e52 100644
--- a/arch/sparc64/lib/Makefile
+++ b/arch/sparc64/lib/Makefile
@@ -1,4 +1,4 @@
-# $Id: Makefile,v 1.20 2000/01/19 04:06:03 davem Exp $
+# $Id: Makefile,v 1.21 2000/03/27 10:38:41 davem Exp $
# Makefile for Sparc library files..
#
@@ -7,7 +7,7 @@ CFLAGS := $(CFLAGS)
OBJS = PeeCeeI.o blockops.o debuglocks.o strlen.o strncmp.o \
memscan.o strncpy_from_user.o strlen_user.o memcmp.o checksum.o \
VIScopy.o VISbzero.o VISmemset.o VIScsum.o VIScsumcopy.o \
- VIScsumcopyusr.o VISsave.o atomic.o rwlock.o
+ VIScsumcopyusr.o VISsave.o atomic.o rwlock.o bitops.o
lib.a: $(OBJS)
$(AR) rcs lib.a $(OBJS)
@@ -17,10 +17,10 @@ VIScopy.o: VIScopy.S VIS.h
VISbzero.o: VISbzero.S VIS.h
.S.s:
- $(CPP) -D__ASSEMBLY__ $(AFLAGS) -ansi $< -o $*.s
+ $(CPP) $(AFLAGS) -ansi $< -o $*.s
.S.o:
- $(CC) -D__ASSEMBLY__ $(AFLAGS) -ansi -c $< -o $*.o
+ $(CC) $(AFLAGS) -ansi -c $< -o $*.o
dep:
diff --git a/arch/sparc64/lib/VIScopy.S b/arch/sparc64/lib/VIScopy.S
index e20118648..56634f83f 100644
--- a/arch/sparc64/lib/VIScopy.S
+++ b/arch/sparc64/lib/VIScopy.S
@@ -1,4 +1,4 @@
-/* $Id: VIScopy.S,v 1.22 2000/03/16 16:44:38 davem Exp $
+/* $Id: VIScopy.S,v 1.23 2000/03/26 09:13:49 davem Exp $
* VIScopy.S: High speed copy operations utilizing the UltraSparc
* Visual Instruction Set.
*
@@ -135,11 +135,11 @@
#define MAIN_LOOP_CHUNK(src, dest, fdest, fsrc, len, jmptgt) \
EXVIS(LDBLK [%src] ASIBLK, %fdest); \
ASI_SETDST_BLK \
+ EXVIS2(STBLK %fsrc, [%dest] ASIBLK); \
add %src, 0x40, %src; \
- add %dest, 0x40, %dest; \
subcc %len, 0x40, %len; \
be,pn %xcc, jmptgt; \
- EXVIS2(STBLK %fsrc, [%dest - 0x40] ASIBLK); \
+ add %dest, 0x40, %dest; \
ASI_SETSRC_BLK
#define LOOP_CHUNK1(src, dest, len, branch_dest) \
diff --git a/arch/sparc64/lib/bitops.S b/arch/sparc64/lib/bitops.S
new file mode 100644
index 000000000..f964e4550
--- /dev/null
+++ b/arch/sparc64/lib/bitops.S
@@ -0,0 +1,110 @@
+/* $Id: bitops.S,v 1.1 2000/03/27 10:38:41 davem Exp $
+ * bitops.S: Sparc64 atomic bit operations.
+ *
+ * Copyright (C) 2000 David S. Miller (davem@redhat.com)
+ */
+
+#include <asm/asi.h>
+
+ .text
+ .align 64
+ .globl __bitops_begin
+__bitops_begin:
+
+ .globl __test_and_set_bit
+__test_and_set_bit: /* %o0=nr, %o1=addr */
+ srlx %o0, 6, %g1
+ mov 1, %g5
+ sllx %g1, 3, %g3
+ and %o0, 63, %g2
+ sllx %g5, %g2, %g5
+ add %o1, %g3, %o1
+ ldx [%o1], %g7
+1: andcc %g7, %g5, %o0
+ bne,pn %xcc, 2f
+ xor %g7, %g5, %g1
+ casx [%o1], %g7, %g1
+ cmp %g7, %g1
+ bne,a,pn %xcc, 1b
+ ldx [%o1], %g7
+2: retl
+ nop
+
+ .globl __test_and_clear_bit
+__test_and_clear_bit: /* %o0=nr, %o1=addr */
+ srlx %o0, 6, %g1
+ mov 1, %g5
+ sllx %g1, 3, %g3
+ and %o0, 63, %g2
+ sllx %g5, %g2, %g5
+ add %o1, %g3, %o1
+ ldx [%o1], %g7
+1: andcc %g7, %g5, %o0
+ be,pn %xcc, 2f
+ xor %g7, %g5, %g1
+ casx [%o1], %g7, %g1
+ cmp %g7, %g1
+ bne,a,pn %xcc, 1b
+ ldx [%o1], %g7
+2: retl
+ nop
+
+ .globl __test_and_change_bit
+__test_and_change_bit: /* %o0=nr, %o1=addr */
+ srlx %o0, 6, %g1
+ mov 1, %g5
+ sllx %g1, 3, %g3
+ and %o0, 63, %g2
+ sllx %g5, %g2, %g5
+ add %o1, %g3, %o1
+ ldx [%o1], %g7
+1: and %g7, %g5, %o0
+ xor %g7, %g5, %g1
+ casx [%o1], %g7, %g1
+ cmp %g7, %g1
+ bne,a,pn %xcc, 1b
+ ldx [%o1], %g7
+2: retl
+ nop
+ nop
+
+ .globl __test_and_set_le_bit
+__test_and_set_le_bit: /* %o0=nr, %o1=addr */
+ srlx %o0, 5, %g1
+ mov 1, %g5
+ sllx %g1, 2, %g3
+ and %o0, 31, %g2
+ sllx %g5, %g2, %g5
+ add %o1, %g3, %o1
+ lduwa [%o1] ASI_PL, %g7
+1: andcc %g7, %g5, %o0
+ bne,pn %icc, 2f
+ xor %g7, %g5, %g1
+ casa [%o1] ASI_PL, %g7, %g1
+ cmp %g7, %g1
+ bne,a,pn %icc, 1b
+ lduwa [%o1] ASI_PL, %g7
+2: retl
+ nop
+
+ .globl __test_and_clear_le_bit
+__test_and_clear_le_bit: /* %o0=nr, %o1=addr */
+ srlx %o0, 5, %g1
+ mov 1, %g5
+ sllx %g1, 2, %g3
+ and %o0, 31, %g2
+ sllx %g5, %g2, %g5
+ add %o1, %g3, %o1
+ lduwa [%o1] ASI_PL, %g7
+1: andcc %g7, %g5, %o0
+ be,pn %icc, 2f
+ xor %g7, %g5, %g1
+ casa [%o1] ASI_PL, %g7, %g1
+ cmp %g7, %g1
+ bne,a,pn %icc, 1b
+ lduwa [%o1] ASI_PL, %g7
+2: retl
+ nop
+
+ .globl __bitops_end
+__bitops_end:
diff --git a/arch/sparc64/lib/blockops.S b/arch/sparc64/lib/blockops.S
index b4a91b97c..9c6a8beba 100644
--- a/arch/sparc64/lib/blockops.S
+++ b/arch/sparc64/lib/blockops.S
@@ -1,4 +1,4 @@
-/* $Id: blockops.S,v 1.22 2000/03/15 07:18:55 davem Exp $
+/* $Id: blockops.S,v 1.24 2000/03/27 10:38:41 davem Exp $
* blockops.S: UltraSparc block zero optimized routines.
*
* Copyright (C) 1996, 1998, 1999, 2000 David S. Miller (davem@redhat.com)
@@ -38,21 +38,21 @@ copy_page: /* %o0=dest, %o1=src */
sethi %hi(8192), %o2
1: TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
ldda [%o1] ASI_BLK_P, %f32
+ stda %f48, [%o0] ASI_BLK_P
add %o1, 0x40, %o1
sub %o2, 0x40, %o2
- stda %f48, [%o0] ASI_BLK_P
add %o0, 0x40, %o0
TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
ldda [%o1] ASI_BLK_P, %f0
+ stda %f48, [%o0] ASI_BLK_P
add %o1, 0x40, %o1
sub %o2, 0x40, %o2
- stda %f48, [%o0] ASI_BLK_P
add %o0, 0x40, %o0
TOUCH(f32, f34, f36, f38, f40, f42, f44, f46)
ldda [%o1] ASI_BLK_P, %f16
- add %o1, 0x40, %o1
- sub %o2, 0x40, %o2
stda %f48, [%o0] ASI_BLK_P
+ sub %o2, 0x40, %o2
+ add %o1, 0x40, %o1
cmp %o2, 0x80
bne,pt %xcc, 1b
add %o0, 0x40, %o0
@@ -122,7 +122,11 @@ copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
stxa %g2, [%o3] ASI_DTLB_DATA_ACCESS
membar #Sync
- membar #LoadStore | #StoreStore | #StoreLoad
+ ldub [%g6 + AOFF_task_thread + AOFF_thread_use_blkcommit], %g2
+ cmp %g2, 0
+ bne,pn %xcc, copy_page_using_blkcommit
+ nop
+
ldda [%o1] ASI_BLK_P, %f0
add %o1, 0x40, %o1
ldda [%o1] ASI_BLK_P, %f16
@@ -130,21 +134,21 @@ copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
sethi %hi(8192), %o2
1: TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
ldda [%o1] ASI_BLK_P, %f32
+ stda %f48, [%o0] ASI_BLK_P
add %o1, 0x40, %o1
sub %o2, 0x40, %o2
- stda %f48, [%o0] ASI_BLK_P
add %o0, 0x40, %o0
TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
ldda [%o1] ASI_BLK_P, %f0
+ stda %f48, [%o0] ASI_BLK_P
add %o1, 0x40, %o1
sub %o2, 0x40, %o2
- stda %f48, [%o0] ASI_BLK_P
add %o0, 0x40, %o0
TOUCH(f32, f34, f36, f38, f40, f42, f44, f46)
ldda [%o1] ASI_BLK_P, %f16
- add %o1, 0x40, %o1
- sub %o2, 0x40, %o2
stda %f48, [%o0] ASI_BLK_P
+ sub %o2, 0x40, %o2
+ add %o1, 0x40, %o1
cmp %o2, 0x80
bne,pt %xcc, 1b
add %o0, 0x40, %o0
@@ -152,6 +156,7 @@ copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
stda %f0, [%o0] ASI_BLK_P
add %o0, 0x40, %o0
stda %f16, [%o0] ASI_BLK_P
+copy_user_page_continue:
membar #Sync
VISExit
@@ -166,6 +171,39 @@ copy_user_page: /* %o0=dest, %o1=src, %o2=vaddr */
jmpl %o7 + 0x8, %g0
wrpr %g3, 0x0, %pstate
+copy_page_using_blkcommit:
+ membar #LoadStore | #StoreStore | #StoreLoad
+ ldda [%o1] ASI_BLK_P, %f0
+ add %o1, 0x40, %o1
+ ldda [%o1] ASI_BLK_P, %f16
+ add %o1, 0x40, %o1
+ sethi %hi(8192), %o2
+1: TOUCH(f0, f2, f4, f6, f8, f10, f12, f14)
+ ldda [%o1] ASI_BLK_P, %f32
+ stda %f48, [%o0] ASI_BLK_COMMIT_P
+ add %o1, 0x40, %o1
+ sub %o2, 0x40, %o2
+ add %o0, 0x40, %o0
+ TOUCH(f16, f18, f20, f22, f24, f26, f28, f30)
+ ldda [%o1] ASI_BLK_P, %f0
+ stda %f48, [%o0] ASI_BLK_COMMIT_P
+ add %o1, 0x40, %o1
+ sub %o2, 0x40, %o2
+ add %o0, 0x40, %o0
+ TOUCH(f32, f34, f36, f38, f40, f42, f44, f46)
+ ldda [%o1] ASI_BLK_P, %f16
+ stda %f48, [%o0] ASI_BLK_COMMIT_P
+ sub %o2, 0x40, %o2
+ add %o1, 0x40, %o1
+ cmp %o2, 0x80
+ bne,pt %xcc, 1b
+ add %o0, 0x40, %o0
+ membar #Sync
+ stda %f0, [%o0] ASI_BLK_COMMIT_P
+ add %o0, 0x40, %o0
+ ba,pt %xcc, copy_user_page_continue
+ stda %f16, [%o0] ASI_BLK_COMMIT_P
+
.align 32
.globl clear_page
.type clear_page,@function
@@ -213,6 +251,7 @@ clear_user_page: /* %o0=dest, %o1=vaddr */
mov 1, %o4
clear_page_common:
+ membar #StoreLoad | #StoreStore | #LoadStore ! LSU Group
fzero %f0 ! FPA Group
mov 32, %o1 ! IEU0
fzero %f2 ! FPA Group
@@ -223,7 +262,6 @@ clear_page_common:
faddd %f0, %f2, %f12 ! FPA Group
fmuld %f0, %f2, %f14 ! FPM
- membar #StoreLoad | #StoreStore | #LoadStore ! LSU Group
1: stda %f0, [%o0 + %g0] ASI_BLK_P ! Store Group
add %o0, 0x40, %o0 ! IEU0
stda %f0, [%o0 + %g0] ASI_BLK_P ! Store Group