FreeBSD/Linux Kernel Cross Reference
sys/alphapc/memmove.s
1 #define QUAD 8
2 #define ALIGN 64
3 #define BLOCK 64
4
5 TEXT memmove(SB), $0
6 MOVL from+4(FP), R7
7 MOVL n+8(FP), R10
8 MOVQ R0, R6
9
10 CMPUGE R7, R0, R5
11 BNE R5, _forward
12
13 MOVQ R6, R8 /* end to address */
14 ADDL R10, R6, R6 /* to+n */
15 ADDL R10, R7, R7 /* from+n */
16
17 CMPUGE $ALIGN, R10, R1 /* need at least ALIGN bytes */
18 BNE R1, _b1tail
19
20 _balign:
21 AND $(ALIGN-1), R6, R1
22 BEQ R1, _baligned
23
24 MOVBU -1(R7), R2
25 ADDL $-1, R6, R6
26 MOVB R2, (R6)
27 ADDL $-1, R7, R7
28 JMP _balign
29
30 _baligned:
31 AND $(QUAD-1), R7, R1 /* is the source quad-aligned */
32 BNE R1, _bunaligned
33
34 ADDL $(BLOCK-1), R8, R9
35 _bblock:
36 CMPUGE R9, R6, R1
37 BNE R1, _b8tail
38
39 MOVQ -64(R7), R22
40 MOVQ -56(R7), R23
41 MOVQ -48(R7), R24
42 MOVQ -40(R7), R25
43 MOVQ -32(R7), R2
44 MOVQ -24(R7), R3
45 MOVQ -16(R7), R4
46 MOVQ -8(R7), R5
47
48 SUBL $64, R6, R6
49 SUBL $64, R7, R7
50
51 MOVQ R22, (R6)
52 MOVQ R23, 8(R6)
53 MOVQ R24, 16(R6)
54 MOVQ R25, 24(R6)
55 MOVQ R2, 32(R6)
56 MOVQ R3, 40(R6)
57 MOVQ R4, 48(R6)
58 MOVQ R5, 56(R6)
59 JMP _bblock
60
61 _b8tail:
62 ADDL $(QUAD-1), R8, R9
63 _b8block:
64 CMPUGE R9, R6, R1
65 BNE R1, _b1tail
66
67 MOVQ -8(R7), R2
68 SUBL $8, R6
69 MOVQ R2, (R6)
70 SUBL $8, R7
71 JMP _b8block
72
73 _b1tail:
74 CMPUGE R8, R6, R1
75 BNE R1, _ret
76
77 MOVBU -1(R7), R2
78 SUBL $1, R6, R6
79 MOVB R2, (R6)
80 SUBL $1, R7, R7
81 JMP _b1tail
82 _ret:
83 RET
84
85 _bunaligned:
86 ADDL $(16-1), R8, R9
87
88 _bu8block:
89 CMPUGE R9, R6, R1
90 BNE R1, _b1tail
91
92 MOVQU -16(R7), R4
93 MOVQU -8(R7), R3
94 MOVQU (R7), R2
95 SUBL $16, R6
96 EXTQH R7, R2, R2
97 EXTQL R7, R3, R5
98 OR R5, R2, R11
99 EXTQH R7, R3, R3
100 EXTQL R7, R4, R4
101 OR R3, R4, R13
102 MOVQ R11, 8(R6)
103 MOVQ R13, (R6)
104 SUBL $16, R7
105 JMP _bu8block
106
107 _forward:
108 ADDL R10, R6, R8 /* end to address */
109
110 CMPUGE $ALIGN, R10, R1 /* need at least ALIGN bytes */
111 BNE R1, _f1tail
112
113 _falign:
114 AND $(ALIGN-1), R6, R1
115 BEQ R1, _faligned
116
117 MOVBU (R7), R2
118 ADDL $1, R6, R6
119 ADDL $1, R7, R7
120 MOVB R2, -1(R6)
121 JMP _falign
122
123 _faligned:
124 AND $(QUAD-1), R7, R1 /* is the source quad-aligned */
125 BNE R1, _funaligned
126
127 SUBL $(BLOCK-1), R8, R9
128 _fblock:
129 CMPUGT R9, R6, R1
130 BEQ R1, _f8tail
131
132 MOVQ (R7), R2
133 MOVQ 8(R7), R3
134 MOVQ 16(R7), R4
135 MOVQ 24(R7), R5
136 MOVQ 32(R7), R22
137 MOVQ 40(R7), R23
138 MOVQ 48(R7), R24
139 MOVQ 56(R7), R25
140
141 ADDL $64, R6, R6
142 ADDL $64, R7, R7
143
144 MOVQ R2, -64(R6)
145 MOVQ R3, -56(R6)
146 MOVQ R4, -48(R6)
147 MOVQ R5, -40(R6)
148 MOVQ R22, -32(R6)
149 MOVQ R23, -24(R6)
150 MOVQ R24, -16(R6)
151 MOVQ R25, -8(R6)
152 JMP _fblock
153
154 _f8tail:
155 SUBL $(QUAD-1), R8, R9
156 _f8block:
157 CMPUGT R9, R6, R1
158 BEQ R1, _f1tail
159
160 MOVQ (R7), R2
161 ADDL $8, R6
162 ADDL $8, R7
163 MOVQ R2, -8(R6)
164 JMP _f8block
165
166 _f1tail:
167 CMPUGT R8, R6, R1
168 BEQ R1, _fret
169 MOVBU (R7), R2
170 ADDL $1, R6, R6
171 ADDL $1, R7, R7
172 MOVB R2, -1(R6)
173 JMP _f1tail
174
175 _fret:
176 RET
177
178 _funaligned:
179 SUBL $(16-1), R8, R9
180 _fu8block:
181 CMPUGT R9, R6, R1
182 BEQ R1, _f1tail
183
184 MOVQU (R7), R2
185 MOVQU 8(R7), R3
186 MOVQU 16(R7), R4
187 EXTQL R7, R2, R2
188 EXTQH R7, R3, R5
189 OR R5, R2, R11
190 EXTQL R7, R3, R3
191 MOVQ R11, (R6)
192 EXTQH R7, R4, R4
193 OR R3, R4, R11
194 MOVQ R11, 8(R6)
195 ADDL $16, R6
196 ADDL $16, R7
197 JMP _fu8block
Cache object: 2493b3f3d7c770090e82177a5a5e0dd6
|