24 |
24 |
25 static void pd_conjoint_words(HeapWord* from, HeapWord* to, size_t count) { |
25 static void pd_conjoint_words(HeapWord* from, HeapWord* to, size_t count) { |
26 #ifdef AMD64 |
26 #ifdef AMD64 |
27 (void)memmove(to, from, count * HeapWordSize); |
27 (void)memmove(to, from, count * HeapWordSize); |
28 #else |
28 #else |
29 // Same as pd_aligned_conjoint_words, except includes a zero-count check. |
29 // Includes a zero-count check. |
30 intx temp; |
30 intx temp; |
31 __asm__ volatile(" testl %6,%6 ;" |
31 __asm__ volatile(" testl %6,%6 ;" |
32 " jz 7f ;" |
32 " jz 7f ;" |
33 " cmpl %4,%5 ;" |
33 " cmpl %4,%5 ;" |
34 " leal -4(%4,%6,4),%3;" |
34 " leal -4(%4,%6,4),%3;" |
128 pd_disjoint_words(from, to, count); |
128 pd_disjoint_words(from, to, count); |
129 #endif // AMD64 |
129 #endif // AMD64 |
130 } |
130 } |
131 |
131 |
132 static void pd_aligned_conjoint_words(HeapWord* from, HeapWord* to, size_t count) { |
132 static void pd_aligned_conjoint_words(HeapWord* from, HeapWord* to, size_t count) { |
133 #ifdef AMD64 |
133 pd_conjoint_words(from, to, count); |
134 (void)memmove(to, from, count * HeapWordSize); |
|
135 #else |
|
136 // Same as pd_conjoint_words, except no zero-count check. |
|
137 intx temp; |
|
138 __asm__ volatile(" cmpl %4,%5 ;" |
|
139 " leal -4(%4,%6,4),%3;" |
|
140 " jbe 1f ;" |
|
141 " cmpl %7,%5 ;" |
|
142 " jbe 4f ;" |
|
143 "1: cmpl $32,%6 ;" |
|
144 " ja 3f ;" |
|
145 " subl %4,%1 ;" |
|
146 "2: movl (%4),%3 ;" |
|
147 " movl %7,(%5,%4,1) ;" |
|
148 " addl $4,%0 ;" |
|
149 " subl $1,%2 ;" |
|
150 " jnz 2b ;" |
|
151 " jmp 7f ;" |
|
152 "3: rep; smovl ;" |
|
153 " jmp 7f ;" |
|
154 "4: cmpl $32,%2 ;" |
|
155 " movl %7,%0 ;" |
|
156 " leal -4(%5,%6,4),%1;" |
|
157 " ja 6f ;" |
|
158 " subl %4,%1 ;" |
|
159 "5: movl (%4),%3 ;" |
|
160 " movl %7,(%5,%4,1) ;" |
|
161 " subl $4,%0 ;" |
|
162 " subl $1,%2 ;" |
|
163 " jnz 5b ;" |
|
164 " jmp 7f ;" |
|
165 "6: std ;" |
|
166 " rep; smovl ;" |
|
167 " cld ;" |
|
168 "7: nop " |
|
169 : "=S" (from), "=D" (to), "=c" (count), "=r" (temp) |
|
170 : "0" (from), "1" (to), "2" (count), "3" (temp) |
|
171 : "memory", "flags"); |
|
172 #endif // AMD64 |
|
173 } |
134 } |
174 |
135 |
175 static void pd_aligned_disjoint_words(HeapWord* from, HeapWord* to, size_t count) { |
136 static void pd_aligned_disjoint_words(HeapWord* from, HeapWord* to, size_t count) { |
176 #ifdef AMD64 |
|
177 pd_disjoint_words(from, to, count); |
137 pd_disjoint_words(from, to, count); |
178 #else |
|
179 // Same as pd_disjoint_words, except no zero-count check. |
|
180 intx temp; |
|
181 __asm__ volatile(" cmpl $32,%6 ;" |
|
182 " ja 2f ;" |
|
183 " subl %4,%1 ;" |
|
184 "1: movl (%4),%3 ;" |
|
185 " movl %7,(%5,%4,1);" |
|
186 " addl $4,%0 ;" |
|
187 " subl $1,%2 ;" |
|
188 " jnz 1b ;" |
|
189 " jmp 3f ;" |
|
190 "2: rep; smovl ;" |
|
191 "3: nop " |
|
192 : "=S" (from), "=D" (to), "=c" (count), "=r" (temp) |
|
193 : "0" (from), "1" (to), "2" (count), "3" (temp) |
|
194 : "memory", "cc"); |
|
195 #endif // AMD64 |
|
196 } |
138 } |
197 |
139 |
198 static void pd_conjoint_bytes(void* from, void* to, size_t count) { |
140 static void pd_conjoint_bytes(void* from, void* to, size_t count) { |
199 #ifdef AMD64 |
141 #ifdef AMD64 |
200 (void)memmove(to, from, count); |
142 (void)memmove(to, from, count); |
201 #else |
143 #else |
|
144 // Includes a zero-count check. |
202 intx temp; |
145 intx temp; |
203 __asm__ volatile(" testl %6,%6 ;" |
146 __asm__ volatile(" testl %6,%6 ;" |
204 " jz 13f ;" |
147 " jz 13f ;" |
205 " cmpl %4,%5 ;" |
148 " cmpl %4,%5 ;" |
206 " leal -1(%4,%6),%3 ;" |
149 " leal -1(%4,%6),%3 ;" |