Mercurial > hg > graal-jvmci-8
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 ;" |