-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
yaml --- r: 21512 b: refs/heads/master c: 8ca2557 h: refs/heads/master v: v3
- Loading branch information
David S. Miller
committed
Mar 20, 2006
1 parent
5d322ed
commit 7e9ce38
Showing
4 changed files
with
166 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,2 @@ | ||
--- | ||
refs/heads/master: d371c0c17466b7e7bb4d395f96aa885a23df1073 | ||
refs/heads/master: 8ca2557c48000daa8183b07d83f582a597705ebe |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,162 @@ | ||
/* NGbzero.S: Niagara optimized memset/clear_user. | ||
* | ||
* Copyright (C) 2006 David S. Miller (davem@davemloft.net) | ||
*/ | ||
#include <asm/asi.h> | ||
|
||
#define EX_ST(x,y) \ | ||
98: x,y; \ | ||
.section .fixup; \ | ||
.align 4; \ | ||
99: retl; \ | ||
mov %o1, %o0; \ | ||
.section __ex_table; \ | ||
.align 4; \ | ||
.word 98b, 99b; \ | ||
.text; \ | ||
.align 4; | ||
|
||
.text | ||
|
||
.globl NGmemset | ||
.type NGmemset, #function | ||
NGmemset: /* %o0=buf, %o1=pat, %o2=len */ | ||
and %o1, 0xff, %o3 | ||
mov %o2, %o1 | ||
sllx %o3, 8, %g1 | ||
or %g1, %o3, %o2 | ||
sllx %o2, 16, %g1 | ||
or %g1, %o2, %o2 | ||
sllx %o2, 32, %g1 | ||
ba,pt %xcc, 1f | ||
or %g1, %o2, %o2 | ||
|
||
.globl NGbzero | ||
.type NGbzero, #function | ||
NGbzero: | ||
clr %o2 | ||
1: brz,pn %o1, NGbzero_return | ||
mov %o0, %o3 | ||
|
||
/* %o5: saved %asi, restored at NGbzero_done | ||
* %g7: store-init %asi to use | ||
* %o4: non-store-init %asi to use | ||
*/ | ||
rd %asi, %o5 | ||
mov ASI_BLK_INIT_QUAD_LDD_P, %g7 | ||
mov ASI_P, %o4 | ||
wr %o4, 0x0, %asi | ||
|
||
NGbzero_from_clear_user: | ||
cmp %o1, 15 | ||
bl,pn %icc, NGbzero_tiny | ||
andcc %o0, 0x7, %g1 | ||
be,pt %xcc, 2f | ||
mov 8, %g2 | ||
sub %g2, %g1, %g1 | ||
sub %o1, %g1, %o1 | ||
1: EX_ST(stba %o2, [%o0 + 0x00] %asi) | ||
subcc %g1, 1, %g1 | ||
bne,pt %xcc, 1b | ||
add %o0, 1, %o0 | ||
2: cmp %o1, 128 | ||
bl,pn %icc, NGbzero_medium | ||
andcc %o0, (64 - 1), %g1 | ||
be,pt %xcc, NGbzero_pre_loop | ||
mov 64, %g2 | ||
sub %g2, %g1, %g1 | ||
sub %o1, %g1, %o1 | ||
1: EX_ST(stxa %o2, [%o0 + 0x00] %asi) | ||
subcc %g1, 8, %g1 | ||
bne,pt %xcc, 1b | ||
add %o0, 8, %o0 | ||
|
||
NGbzero_pre_loop: | ||
wr %g7, 0x0, %asi | ||
andn %o1, (64 - 1), %g1 | ||
sub %o1, %g1, %o1 | ||
NGbzero_loop: | ||
EX_ST(stxa %o2, [%o0 + 0x00] %asi) | ||
EX_ST(stxa %o2, [%o0 + 0x08] %asi) | ||
EX_ST(stxa %o2, [%o0 + 0x10] %asi) | ||
EX_ST(stxa %o2, [%o0 + 0x18] %asi) | ||
EX_ST(stxa %o2, [%o0 + 0x20] %asi) | ||
EX_ST(stxa %o2, [%o0 + 0x28] %asi) | ||
EX_ST(stxa %o2, [%o0 + 0x30] %asi) | ||
EX_ST(stxa %o2, [%o0 + 0x38] %asi) | ||
subcc %g1, 64, %g1 | ||
bne,pt %xcc, NGbzero_loop | ||
add %o0, 64, %o0 | ||
|
||
wr %o4, 0x0, %asi | ||
brz,pn %o1, NGbzero_done | ||
NGbzero_medium: | ||
andncc %o1, 0x7, %g1 | ||
be,pn %xcc, 2f | ||
sub %o1, %g1, %o1 | ||
1: EX_ST(stxa %o2, [%o0 + 0x00] %asi) | ||
subcc %g1, 8, %g1 | ||
bne,pt %xcc, 1b | ||
add %o0, 8, %o0 | ||
2: brz,pt %o1, NGbzero_done | ||
nop | ||
|
||
NGbzero_tiny: | ||
1: EX_ST(stba %o2, [%o0 + 0x00] %asi) | ||
subcc %o1, 1, %o1 | ||
bne,pt %icc, 1b | ||
add %o0, 1, %o0 | ||
|
||
/* fallthrough */ | ||
|
||
NGbzero_done: | ||
wr %o5, 0x0, %asi | ||
|
||
NGbzero_return: | ||
retl | ||
mov %o3, %o0 | ||
.size NGbzero, .-NGbzero | ||
.size NGmemset, .-NGmemset | ||
|
||
.globl NGclear_user | ||
.type NGclear_user, #function | ||
NGclear_user: /* %o0=buf, %o1=len */ | ||
rd %asi, %o5 | ||
brz,pn %o1, NGbzero_done | ||
clr %o3 | ||
cmp %o5, ASI_AIUS | ||
bne,pn %icc, NGbzero | ||
clr %o2 | ||
mov ASI_BLK_INIT_QUAD_LDD_AIUS, %g7 | ||
ba,pt %xcc, NGbzero_from_clear_user | ||
mov ASI_AIUS, %o4 | ||
.size NGclear_user, .-NGclear_user | ||
|
||
#define BRANCH_ALWAYS 0x10680000 | ||
#define NOP 0x01000000 | ||
#define NG_DO_PATCH(OLD, NEW) \ | ||
sethi %hi(NEW), %g1; \ | ||
or %g1, %lo(NEW), %g1; \ | ||
sethi %hi(OLD), %g2; \ | ||
or %g2, %lo(OLD), %g2; \ | ||
sub %g1, %g2, %g1; \ | ||
sethi %hi(BRANCH_ALWAYS), %g3; \ | ||
sll %g1, 11, %g1; \ | ||
srl %g1, 11 + 2, %g1; \ | ||
or %g3, %lo(BRANCH_ALWAYS), %g3; \ | ||
or %g3, %g1, %g3; \ | ||
stw %g3, [%g2]; \ | ||
sethi %hi(NOP), %g3; \ | ||
or %g3, %lo(NOP), %g3; \ | ||
stw %g3, [%g2 + 0x4]; \ | ||
flush %g2; | ||
|
||
.globl niagara_patch_bzero | ||
.type niagara_patch_bzero,#function | ||
niagara_patch_bzero: | ||
NG_DO_PATCH(memset, NGmemset) | ||
NG_DO_PATCH(__bzero, NGbzero) | ||
NG_DO_PATCH(__clear_user, NGclear_user) | ||
retl | ||
nop | ||
.size niagara_patch_bzero,.-niagara_patch_bzero |