comparison src/os_cpu/linux_x86/vm/copy_linux_x86.inline.hpp @ 1603:d93949c5bdcc

6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86 Summary: Modify assembler code to check for 0 count for all copy routines. Reviewed-by: never, ysr, jcoomes
author kvn
date Thu, 10 Jun 2010 13:04:20 -0700
parents c18cbe5936b8
children f95d63e2154a
comparison
equal deleted inserted replaced
1602:136b78722a08 1603:d93949c5bdcc
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;"
82 default: 82 default:
83 (void)memcpy(to, from, count * HeapWordSize); 83 (void)memcpy(to, from, count * HeapWordSize);
84 break; 84 break;
85 } 85 }
86 #else 86 #else
87 // Same as pd_aligned_disjoint_words, except includes a zero-count check. 87 // Includes a zero-count check.
88 intx temp; 88 intx temp;
89 __asm__ volatile(" testl %6,%6 ;" 89 __asm__ volatile(" testl %6,%6 ;"
90 " jz 3f ;" 90 " jz 3f ;"
91 " cmpl $32,%6 ;" 91 " cmpl $32,%6 ;"
92 " ja 2f ;" 92 " ja 2f ;"
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 ;"