197 }
198 }
199
200
201 /**
202 * Copy and byte swap elements
203 *
204 * <D> - copy direction
205 *
206 * @param src address of source
207 * @param dst address of destination
208 * @param byte_count number of bytes to copy
209 * @param elem_size size of the elements to copy-swap
210 */
211 template <CopyDirection D>
212 static void do_conjoint_swap(address src, address dst, size_t byte_count, size_t elem_size) {
213 switch (elem_size) {
214 case 2: do_conjoint_swap<uint16_t,D>(src, dst, byte_count); break;
215 case 4: do_conjoint_swap<uint32_t,D>(src, dst, byte_count); break;
216 case 8: do_conjoint_swap<uint64_t,D>(src, dst, byte_count); break;
217 default: guarantee(false, "do_conjoint_swap: Invalid elem_size %zd\n", elem_size);
218 }
219 }
220 };
221
222 void Copy::conjoint_swap(address src, address dst, size_t byte_count, size_t elem_size) {
223 CopySwap::conjoint_swap(src, dst, byte_count, elem_size);
224 }
225
226 // Fill bytes; larger units are filled atomically if everything is aligned.
227 void Copy::fill_to_memory_atomic(void* to, size_t size, jubyte value) {
228 address dst = (address) to;
229 uintptr_t bits = (uintptr_t) to | (uintptr_t) size;
230 if (bits % sizeof(jlong) == 0) {
231 jlong fill = (julong)( (jubyte)value ); // zero-extend
232 if (fill != 0) {
233 fill += fill << 8;
234 fill += fill << 16;
235 fill += fill << 32;
236 }
237 //Copy::fill_to_jlongs_atomic((jlong*) dst, size / sizeof(jlong));
|
197 }
198 }
199
200
201 /**
202 * Copy and byte swap elements
203 *
204 * <D> - copy direction
205 *
206 * @param src address of source
207 * @param dst address of destination
208 * @param byte_count number of bytes to copy
209 * @param elem_size size of the elements to copy-swap
210 */
211 template <CopyDirection D>
212 static void do_conjoint_swap(address src, address dst, size_t byte_count, size_t elem_size) {
213 switch (elem_size) {
214 case 2: do_conjoint_swap<uint16_t,D>(src, dst, byte_count); break;
215 case 4: do_conjoint_swap<uint32_t,D>(src, dst, byte_count); break;
216 case 8: do_conjoint_swap<uint64_t,D>(src, dst, byte_count); break;
217 default: guarantee(false, "do_conjoint_swap: Invalid elem_size " SIZE_FORMAT "\n", elem_size);
218 }
219 }
220 };
221
222 void Copy::conjoint_swap(address src, address dst, size_t byte_count, size_t elem_size) {
223 CopySwap::conjoint_swap(src, dst, byte_count, elem_size);
224 }
225
226 // Fill bytes; larger units are filled atomically if everything is aligned.
227 void Copy::fill_to_memory_atomic(void* to, size_t size, jubyte value) {
228 address dst = (address) to;
229 uintptr_t bits = (uintptr_t) to | (uintptr_t) size;
230 if (bits % sizeof(jlong) == 0) {
231 jlong fill = (julong)( (jubyte)value ); // zero-extend
232 if (fill != 0) {
233 fill += fill << 8;
234 fill += fill << 16;
235 fill += fill << 32;
236 }
237 //Copy::fill_to_jlongs_atomic((jlong*) dst, size / sizeof(jlong));
|