2005-09-26 10:04:21 +04:00
/ *
* Copyright ( C ) 2 0 0 2 P a u l M a c k e r r a s , I B M C o r p .
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or
* modify i t u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e
* as p u b l i s h e d b y t h e F r e e S o f t w a r e F o u n d a t i o n ; either version
* 2 of t h e L i c e n s e , o r ( a t y o u r o p t i o n ) a n y l a t e r v e r s i o n .
* /
# include < a s m / p r o c e s s o r . h >
# include < a s m / p p c _ a s m . h >
.align 7
_ GLOBAL( _ _ c o p y _ t o f r o m _ u s e r )
/* first check for a whole page copy on a page boundary */
cmpldi c r1 ,r5 ,1 6
cmpdi c r6 ,r5 ,4 0 9 6
or r0 ,r3 ,r4
neg r6 ,r3 / * L S 3 b i t s = # b y t e s t o 8 - b y t e d e s t b d r y * /
andi. r0 ,r0 ,4 0 9 5
std r3 ,- 2 4 ( r1 )
crand c r0 * 4 + 2 ,c r0 * 4 + 2 ,c r6 * 4 + 2
std r4 ,- 1 6 ( r1 )
std r5 ,- 8 ( r1 )
dcbt 0 ,r4
2005-11-07 03:06:55 +03:00
beq . L c o p y _ p a g e _ 4 K
2005-09-26 10:04:21 +04:00
andi. r6 ,r6 ,7
mtcrf 0 x01 ,r5
blt c r1 ,. L s h o r t _ c o p y
bne . L d s t _ u n a l i g n e d
.Ldst_aligned :
andi. r0 ,r4 ,7
addi r3 ,r3 ,- 1 6
bne . L s r c _ u n a l i g n e d
srdi r7 ,r5 ,4
20 : ld r9 ,0 ( r4 )
addi r4 ,r4 ,- 8
mtctr r7
andi. r5 ,r5 ,7
bf c r7 * 4 + 0 ,2 2 f
addi r3 ,r3 ,8
addi r4 ,r4 ,8
mr r8 ,r9
blt c r1 ,7 2 f
21 : ld r9 ,8 ( r4 )
70 : std r8 ,8 ( r3 )
22 : ldu r8 ,1 6 ( r4 )
71 : stdu r9 ,1 6 ( r3 )
bdnz 2 1 b
72 : std r8 ,8 ( r3 )
beq+ 3 f
addi r3 ,r3 ,1 6
23 : ld r9 ,8 ( r4 )
.Ldo_tail :
bf c r7 * 4 + 1 ,1 f
rotldi r9 ,r9 ,3 2
73 : stw r9 ,0 ( r3 )
addi r3 ,r3 ,4
1 : bf c r7 * 4 + 2 ,2 f
rotldi r9 ,r9 ,1 6
74 : sth r9 ,0 ( r3 )
addi r3 ,r3 ,2
2 : bf c r7 * 4 + 3 ,3 f
rotldi r9 ,r9 ,8
75 : stb r9 ,0 ( r3 )
3 : li r3 ,0
blr
.Lsrc_unaligned :
srdi r6 ,r5 ,3
addi r5 ,r5 ,- 1 6
subf r4 ,r0 ,r4
srdi r7 ,r5 ,4
sldi r10 ,r0 ,3
cmpldi c r6 ,r6 ,3
andi. r5 ,r5 ,7
mtctr r7
subfic r11 ,r10 ,6 4
add r5 ,r5 ,r0
bt c r7 * 4 + 0 ,2 8 f
24 : ld r9 ,0 ( r4 ) / * 3 + 2 n l o a d s , 2 + 2 n s t o r e s * /
25 : ld r0 ,8 ( r4 )
sld r6 ,r9 ,r10
26 : ldu r9 ,1 6 ( r4 )
srd r7 ,r0 ,r11
sld r8 ,r0 ,r10
or r7 ,r7 ,r6
blt c r6 ,7 9 f
27 : ld r0 ,8 ( r4 )
b 2 f
28 : ld r0 ,0 ( r4 ) / * 4 + 2 n l o a d s , 3 + 2 n s t o r e s * /
29 : ldu r9 ,8 ( r4 )
sld r8 ,r0 ,r10
addi r3 ,r3 ,- 8
blt c r6 ,5 f
30 : ld r0 ,8 ( r4 )
srd r12 ,r9 ,r11
sld r6 ,r9 ,r10
31 : ldu r9 ,1 6 ( r4 )
or r12 ,r8 ,r12
srd r7 ,r0 ,r11
sld r8 ,r0 ,r10
addi r3 ,r3 ,1 6
beq c r6 ,7 8 f
1 : or r7 ,r7 ,r6
32 : ld r0 ,8 ( r4 )
76 : std r12 ,8 ( r3 )
2 : srd r12 ,r9 ,r11
sld r6 ,r9 ,r10
33 : ldu r9 ,1 6 ( r4 )
or r12 ,r8 ,r12
77 : stdu r7 ,1 6 ( r3 )
srd r7 ,r0 ,r11
sld r8 ,r0 ,r10
bdnz 1 b
78 : std r12 ,8 ( r3 )
or r7 ,r7 ,r6
79 : std r7 ,1 6 ( r3 )
5 : srd r12 ,r9 ,r11
or r12 ,r8 ,r12
80 : std r12 ,2 4 ( r3 )
bne 6 f
li r3 ,0
blr
6 : cmpwi c r1 ,r5 ,8
addi r3 ,r3 ,3 2
sld r9 ,r9 ,r10
ble c r1 ,. L d o _ t a i l
34 : ld r0 ,8 ( r4 )
srd r7 ,r0 ,r11
or r9 ,r7 ,r9
b . L d o _ t a i l
.Ldst_unaligned :
mtcrf 0 x01 ,r6 / * p u t #b y t e s t o 8 B b d r y i n t o c r7 * /
subf r5 ,r6 ,r5
li r7 ,0
cmpldi r1 ,r5 ,1 6
bf c r7 * 4 + 3 ,1 f
35 : lbz r0 ,0 ( r4 )
81 : stb r0 ,0 ( r3 )
addi r7 ,r7 ,1
1 : bf c r7 * 4 + 2 ,2 f
36 : lhzx r0 ,r7 ,r4
82 : sthx r0 ,r7 ,r3
addi r7 ,r7 ,2
2 : bf c r7 * 4 + 1 ,3 f
37 : lwzx r0 ,r7 ,r4
83 : stwx r0 ,r7 ,r3
3 : mtcrf 0 x01 ,r5
add r4 ,r6 ,r4
add r3 ,r6 ,r3
b . L d s t _ a l i g n e d
.Lshort_copy :
bf c r7 * 4 + 0 ,1 f
38 : lwz r0 ,0 ( r4 )
39 : lwz r9 ,4 ( r4 )
addi r4 ,r4 ,8
84 : stw r0 ,0 ( r3 )
85 : stw r9 ,4 ( r3 )
addi r3 ,r3 ,8
1 : bf c r7 * 4 + 1 ,2 f
40 : lwz r0 ,0 ( r4 )
addi r4 ,r4 ,4
86 : stw r0 ,0 ( r3 )
addi r3 ,r3 ,4
2 : bf c r7 * 4 + 2 ,3 f
41 : lhz r0 ,0 ( r4 )
addi r4 ,r4 ,2
87 : sth r0 ,0 ( r3 )
addi r3 ,r3 ,2
3 : bf c r7 * 4 + 3 ,4 f
42 : lbz r0 ,0 ( r4 )
88 : stb r0 ,0 ( r3 )
4 : li r3 ,0
blr
/ *
* exception h a n d l e r s f o l l o w
* we h a v e t o r e t u r n t h e n u m b e r o f b y t e s n o t c o p i e d
* for a n e x c e p t i o n o n a l o a d , w e s e t t h e r e s t o f t h e d e s t i n a t i o n t o 0
* /
136 :
137 :
add r3 ,r3 ,r7
b 1 f
130 :
131 :
addi r3 ,r3 ,8
120 :
122 :
124 :
125 :
126 :
127 :
128 :
129 :
133 :
addi r3 ,r3 ,8
121 :
132 :
addi r3 ,r3 ,8
123 :
134 :
135 :
138 :
139 :
140 :
141 :
142 :
/ *
* here w e h a v e h a d a f a u l t o n a l o a d a n d r3 p o i n t s t o t h e f i r s t
* unmodified b y t e o f t h e d e s t i n a t i o n
* /
1 : ld r6 ,- 2 4 ( r1 )
ld r4 ,- 1 6 ( r1 )
ld r5 ,- 8 ( r1 )
subf r6 ,r6 ,r3
add r4 ,r4 ,r6
subf r5 ,r6 ,r5 / * #b y t e s l e f t t o g o * /
/ *
* first s e e i f w e c a n c o p y a n y m o r e b y t e s b e f o r e h i t t i n g a n o t h e r e x c e p t i o n
* /
mtctr r5
43 : lbz r0 ,0 ( r4 )
addi r4 ,r4 ,1
89 : stb r0 ,0 ( r3 )
addi r3 ,r3 ,1
bdnz 4 3 b
li r3 ,0 / * h u h ? a l l c o p i e d s u c c e s s f u l l y t h i s t i m e ? * /
blr
/ *
* here w e h a v e t r a p p e d a g a i n , n e e d t o c l e a r c t r b y t e s s t a r t i n g a t r3
* /
143 : mfctr r5
li r0 ,0
mr r4 ,r3
mr r3 ,r5 / * r e t u r n t h e n u m b e r o f b y t e s n o t c o p i e d * /
1 : andi. r9 ,r4 ,7
beq 3 f
90 : stb r0 ,0 ( r4 )
addic. r5 ,r5 ,- 1
addi r4 ,r4 ,1
bne 1 b
blr
3 : cmpldi c r1 ,r5 ,8
srdi r9 ,r5 ,3
andi. r5 ,r5 ,7
blt c r1 ,9 3 f
mtctr r9
91 : std r0 ,0 ( r4 )
addi r4 ,r4 ,8
bdnz 9 1 b
93 : beqlr
mtctr r5
92 : stb r0 ,0 ( r4 )
addi r4 ,r4 ,1
bdnz 9 2 b
blr
/ *
* exception h a n d l e r s f o r s t o r e s : w e j u s t n e e d t o w o r k
* out h o w m a n y b y t e s w e r e n ' t c o p i e d
* /
182 :
183 :
add r3 ,r3 ,r7
b 1 f
180 :
addi r3 ,r3 ,8
171 :
177 :
addi r3 ,r3 ,8
170 :
172 :
176 :
178 :
addi r3 ,r3 ,4
185 :
addi r3 ,r3 ,4
173 :
174 :
175 :
179 :
181 :
184 :
186 :
187 :
188 :
189 :
1 :
ld r6 ,- 2 4 ( r1 )
ld r5 ,- 8 ( r1 )
add r6 ,r6 ,r5
subf r3 ,r3 ,r6 / * #b y t e s n o t c o p i e d * /
190 :
191 :
192 :
blr / * #b y t e s n o t c o p i e d i n r 3 * /
.section _ _ ex_ t a b l e ," a "
.align 3
.llong 2 0 b,1 2 0 b
.llong 2 1 b,1 2 1 b
.llong 7 0 b,1 7 0 b
.llong 2 2 b,1 2 2 b
.llong 7 1 b,1 7 1 b
.llong 7 2 b,1 7 2 b
.llong 2 3 b,1 2 3 b
.llong 7 3 b,1 7 3 b
.llong 7 4 b,1 7 4 b
.llong 7 5 b,1 7 5 b
.llong 2 4 b,1 2 4 b
.llong 2 5 b,1 2 5 b
.llong 2 6 b,1 2 6 b
.llong 2 7 b,1 2 7 b
.llong 2 8 b,1 2 8 b
.llong 2 9 b,1 2 9 b
.llong 3 0 b,1 3 0 b
.llong 3 1 b,1 3 1 b
.llong 3 2 b,1 3 2 b
.llong 7 6 b,1 7 6 b
.llong 3 3 b,1 3 3 b
.llong 7 7 b,1 7 7 b
.llong 7 8 b,1 7 8 b
.llong 7 9 b,1 7 9 b
.llong 8 0 b,1 8 0 b
.llong 3 4 b,1 3 4 b
.llong 3 5 b,1 3 5 b
.llong 8 1 b,1 8 1 b
.llong 3 6 b,1 3 6 b
.llong 8 2 b,1 8 2 b
.llong 3 7 b,1 3 7 b
.llong 8 3 b,1 8 3 b
.llong 3 8 b,1 3 8 b
.llong 3 9 b,1 3 9 b
.llong 8 4 b,1 8 4 b
.llong 8 5 b,1 8 5 b
.llong 4 0 b,1 4 0 b
.llong 8 6 b,1 8 6 b
.llong 4 1 b,1 4 1 b
.llong 8 7 b,1 8 7 b
.llong 4 2 b,1 4 2 b
.llong 8 8 b,1 8 8 b
.llong 4 3 b,1 4 3 b
.llong 8 9 b,1 8 9 b
.llong 9 0 b,1 9 0 b
.llong 9 1 b,1 9 1 b
.llong 9 2 b,1 9 2 b
.text
/ *
* Routine t o c o p y a w h o l e p a g e o f d a t a , o p t i m i z e d f o r P O W E R 4 .
* On P O W E R 4 i t i s m o r e t h a n 5 0 % f a s t e r t h a n t h e s i m p l e l o o p
* above ( f o l l o w i n g t h e . L d s t _ a l i g n e d l a b e l ) b u t i t r u n s s l i g h t l y
* slower o n P O W E R 3 .
* /
2005-11-07 03:06:55 +03:00
.Lcopy_page_4K :
2005-09-26 10:04:21 +04:00
std r31 ,- 3 2 ( 1 )
std r30 ,- 4 0 ( 1 )
std r29 ,- 4 8 ( 1 )
std r28 ,- 5 6 ( 1 )
std r27 ,- 6 4 ( 1 )
std r26 ,- 7 2 ( 1 )
std r25 ,- 8 0 ( 1 )
std r24 ,- 8 8 ( 1 )
std r23 ,- 9 6 ( 1 )
std r22 ,- 1 0 4 ( 1 )
std r21 ,- 1 1 2 ( 1 )
std r20 ,- 1 2 0 ( 1 )
li r5 ,4 0 9 6 / 3 2 - 1
addi r3 ,r3 ,- 8
li r0 ,5
0 : addi r5 ,r5 ,- 2 4
mtctr r0
20 : ld r22 ,6 4 0 ( 4 )
21 : ld r21 ,5 1 2 ( 4 )
22 : ld r20 ,3 8 4 ( 4 )
23 : ld r11 ,2 5 6 ( 4 )
24 : ld r9 ,1 2 8 ( 4 )
25 : ld r7 ,0 ( 4 )
26 : ld r25 ,6 4 8 ( 4 )
27 : ld r24 ,5 2 0 ( 4 )
28 : ld r23 ,3 9 2 ( 4 )
29 : ld r10 ,2 6 4 ( 4 )
30 : ld r8 ,1 3 6 ( 4 )
31 : ldu r6 ,8 ( 4 )
cmpwi r5 ,2 4
1 :
32 : std r22 ,6 4 8 ( 3 )
33 : std r21 ,5 2 0 ( 3 )
34 : std r20 ,3 9 2 ( 3 )
35 : std r11 ,2 6 4 ( 3 )
36 : std r9 ,1 3 6 ( 3 )
37 : std r7 ,8 ( 3 )
38 : ld r28 ,6 4 8 ( 4 )
39 : ld r27 ,5 2 0 ( 4 )
40 : ld r26 ,3 9 2 ( 4 )
41 : ld r31 ,2 6 4 ( 4 )
42 : ld r30 ,1 3 6 ( 4 )
43 : ld r29 ,8 ( 4 )
44 : std r25 ,6 5 6 ( 3 )
45 : std r24 ,5 2 8 ( 3 )
46 : std r23 ,4 0 0 ( 3 )
47 : std r10 ,2 7 2 ( 3 )
48 : std r8 ,1 4 4 ( 3 )
49 : std r6 ,1 6 ( 3 )
50 : ld r22 ,6 5 6 ( 4 )
51 : ld r21 ,5 2 8 ( 4 )
52 : ld r20 ,4 0 0 ( 4 )
53 : ld r11 ,2 7 2 ( 4 )
54 : ld r9 ,1 4 4 ( 4 )
55 : ld r7 ,1 6 ( 4 )
56 : std r28 ,6 6 4 ( 3 )
57 : std r27 ,5 3 6 ( 3 )
58 : std r26 ,4 0 8 ( 3 )
59 : std r31 ,2 8 0 ( 3 )
60 : std r30 ,1 5 2 ( 3 )
61 : stdu r29 ,2 4 ( 3 )
62 : ld r25 ,6 6 4 ( 4 )
63 : ld r24 ,5 3 6 ( 4 )
64 : ld r23 ,4 0 8 ( 4 )
65 : ld r10 ,2 8 0 ( 4 )
66 : ld r8 ,1 5 2 ( 4 )
67 : ldu r6 ,2 4 ( 4 )
bdnz 1 b
68 : std r22 ,6 4 8 ( 3 )
69 : std r21 ,5 2 0 ( 3 )
70 : std r20 ,3 9 2 ( 3 )
71 : std r11 ,2 6 4 ( 3 )
72 : std r9 ,1 3 6 ( 3 )
73 : std r7 ,8 ( 3 )
74 : addi r4 ,r4 ,6 4 0
75 : addi r3 ,r3 ,6 4 8
bge 0 b
mtctr r5
76 : ld r7 ,0 ( 4 )
77 : ld r8 ,8 ( 4 )
78 : ldu r9 ,1 6 ( 4 )
3 :
79 : ld r10 ,8 ( 4 )
80 : std r7 ,8 ( 3 )
81 : ld r7 ,1 6 ( 4 )
82 : std r8 ,1 6 ( 3 )
83 : ld r8 ,2 4 ( 4 )
84 : std r9 ,2 4 ( 3 )
85 : ldu r9 ,3 2 ( 4 )
86 : stdu r10 ,3 2 ( 3 )
bdnz 3 b
4 :
87 : ld r10 ,8 ( 4 )
88 : std r7 ,8 ( 3 )
89 : std r8 ,1 6 ( 3 )
90 : std r9 ,2 4 ( 3 )
91 : std r10 ,3 2 ( 3 )
9 : ld r20 ,- 1 2 0 ( 1 )
ld r21 ,- 1 1 2 ( 1 )
ld r22 ,- 1 0 4 ( 1 )
ld r23 ,- 9 6 ( 1 )
ld r24 ,- 8 8 ( 1 )
ld r25 ,- 8 0 ( 1 )
ld r26 ,- 7 2 ( 1 )
ld r27 ,- 6 4 ( 1 )
ld r28 ,- 5 6 ( 1 )
ld r29 ,- 4 8 ( 1 )
ld r30 ,- 4 0 ( 1 )
ld r31 ,- 3 2 ( 1 )
li r3 ,0
blr
/ *
* on a n e x c e p t i o n , r e s e t t o t h e b e g i n n i n g a n d j u m p b a c k i n t o t h e
* standard _ _ c o p y _ t o f r o m _ u s e r
* /
100 : ld r20 ,- 1 2 0 ( 1 )
ld r21 ,- 1 1 2 ( 1 )
ld r22 ,- 1 0 4 ( 1 )
ld r23 ,- 9 6 ( 1 )
ld r24 ,- 8 8 ( 1 )
ld r25 ,- 8 0 ( 1 )
ld r26 ,- 7 2 ( 1 )
ld r27 ,- 6 4 ( 1 )
ld r28 ,- 5 6 ( 1 )
ld r29 ,- 4 8 ( 1 )
ld r30 ,- 4 0 ( 1 )
ld r31 ,- 3 2 ( 1 )
ld r3 ,- 2 4 ( r1 )
ld r4 ,- 1 6 ( r1 )
li r5 ,4 0 9 6
b . L d s t _ a l i g n e d
.section _ _ ex_ t a b l e ," a "
.align 3
.llong 2 0 b,1 0 0 b
.llong 2 1 b,1 0 0 b
.llong 2 2 b,1 0 0 b
.llong 2 3 b,1 0 0 b
.llong 2 4 b,1 0 0 b
.llong 2 5 b,1 0 0 b
.llong 2 6 b,1 0 0 b
.llong 2 7 b,1 0 0 b
.llong 2 8 b,1 0 0 b
.llong 2 9 b,1 0 0 b
.llong 3 0 b,1 0 0 b
.llong 3 1 b,1 0 0 b
.llong 3 2 b,1 0 0 b
.llong 3 3 b,1 0 0 b
.llong 3 4 b,1 0 0 b
.llong 3 5 b,1 0 0 b
.llong 3 6 b,1 0 0 b
.llong 3 7 b,1 0 0 b
.llong 3 8 b,1 0 0 b
.llong 3 9 b,1 0 0 b
.llong 4 0 b,1 0 0 b
.llong 4 1 b,1 0 0 b
.llong 4 2 b,1 0 0 b
.llong 4 3 b,1 0 0 b
.llong 4 4 b,1 0 0 b
.llong 4 5 b,1 0 0 b
.llong 4 6 b,1 0 0 b
.llong 4 7 b,1 0 0 b
.llong 4 8 b,1 0 0 b
.llong 4 9 b,1 0 0 b
.llong 5 0 b,1 0 0 b
.llong 5 1 b,1 0 0 b
.llong 5 2 b,1 0 0 b
.llong 5 3 b,1 0 0 b
.llong 5 4 b,1 0 0 b
.llong 5 5 b,1 0 0 b
.llong 5 6 b,1 0 0 b
.llong 5 7 b,1 0 0 b
.llong 5 8 b,1 0 0 b
.llong 5 9 b,1 0 0 b
.llong 6 0 b,1 0 0 b
.llong 6 1 b,1 0 0 b
.llong 6 2 b,1 0 0 b
.llong 6 3 b,1 0 0 b
.llong 6 4 b,1 0 0 b
.llong 6 5 b,1 0 0 b
.llong 6 6 b,1 0 0 b
.llong 6 7 b,1 0 0 b
.llong 6 8 b,1 0 0 b
.llong 6 9 b,1 0 0 b
.llong 7 0 b,1 0 0 b
.llong 7 1 b,1 0 0 b
.llong 7 2 b,1 0 0 b
.llong 7 3 b,1 0 0 b
.llong 7 4 b,1 0 0 b
.llong 7 5 b,1 0 0 b
.llong 7 6 b,1 0 0 b
.llong 7 7 b,1 0 0 b
.llong 7 8 b,1 0 0 b
.llong 7 9 b,1 0 0 b
.llong 8 0 b,1 0 0 b
.llong 8 1 b,1 0 0 b
.llong 8 2 b,1 0 0 b
.llong 8 3 b,1 0 0 b
.llong 8 4 b,1 0 0 b
.llong 8 5 b,1 0 0 b
.llong 8 6 b,1 0 0 b
.llong 8 7 b,1 0 0 b
.llong 8 8 b,1 0 0 b
.llong 8 9 b,1 0 0 b
.llong 9 0 b,1 0 0 b
.llong 9 1 b,1 0 0 b