47 Copy::conjoint_jints_atomic((jint*) src, (jint*) dst, size / sizeof(jint)); 48 } else if (bits % sizeof(jshort) == 0) { 49 Copy::conjoint_jshorts_atomic((jshort*) src, (jshort*) dst, size / sizeof(jshort)); 50 } else { 51 // Not aligned, so no need to be atomic. 52 Copy::conjoint_jbytes((void*) src, (void*) dst, size); 53 } 54 } 55 56 class CopySwap : AllStatic { 57 public: 58 /** 59 * Copy and byte swap elements 60 * 61 * @param src address of source 62 * @param dst address of destination 63 * @param byte_count number of bytes to copy 64 * @param elem_size size of the elements to copy-swap 65 */ 66 static void conjoint_swap(address src, address dst, size_t byte_count, size_t elem_size) { 67 address src_end = src + byte_count; 68 69 if (dst <= src || dst >= src_end) { 70 do_conjoint_swap<RIGHT>(src, dst, byte_count, elem_size); 71 } else { 72 do_conjoint_swap<LEFT>(src, dst, byte_count, elem_size); 73 } 74 } 75 76 private: 77 /** 78 * Byte swap a 16-bit value 79 */ 80 static uint16_t byte_swap(uint16_t x) { 81 return (x << 8) | (x >> 8); 82 } 83 84 /** 85 * Byte swap a 32-bit value 86 */ | 47 Copy::conjoint_jints_atomic((jint*) src, (jint*) dst, size / sizeof(jint)); 48 } else if (bits % sizeof(jshort) == 0) { 49 Copy::conjoint_jshorts_atomic((jshort*) src, (jshort*) dst, size / sizeof(jshort)); 50 } else { 51 // Not aligned, so no need to be atomic. 52 Copy::conjoint_jbytes((void*) src, (void*) dst, size); 53 } 54 } 55 56 class CopySwap : AllStatic { 57 public: 58 /** 59 * Copy and byte swap elements 60 * 61 * @param src address of source 62 * @param dst address of destination 63 * @param byte_count number of bytes to copy 64 * @param elem_size size of the elements to copy-swap 65 */ 66 static void conjoint_swap(address src, address dst, size_t byte_count, size_t elem_size) { 67 assert(src != NULL, "address must not be NULL"); 68 assert(dst != NULL, "address must not be NULL"); 69 assert(elem_size == 2 || elem_size == 4 || elem_size == 8, 70 "incorrect element size: " SIZE_FORMAT, elem_size); 71 assert(is_size_aligned(byte_count, elem_size), 72 "byte_count " SIZE_FORMAT " must be multiple of element size " SIZE_FORMAT, byte_count, elem_size); 73 74 address src_end = src + byte_count; 75 76 if (dst <= src || dst >= src_end) { 77 do_conjoint_swap<RIGHT>(src, dst, byte_count, elem_size); 78 } else { 79 do_conjoint_swap<LEFT>(src, dst, byte_count, elem_size); 80 } 81 } 82 83 private: 84 /** 85 * Byte swap a 16-bit value 86 */ 87 static uint16_t byte_swap(uint16_t x) { 88 return (x << 8) | (x >> 8); 89 } 90 91 /** 92 * Byte swap a 32-bit value 93 */ |