Path: blob/master/src/hotspot/os_cpu/windows_aarch64/copy_windows_aarch64.hpp
40930 views
/*1* Copyright (c) 2020, Microsoft Corporation. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#ifndef OS_CPU_WINDOWS_AARCH64_COPY_WINDOWS_AARCH64_HPP25#define OS_CPU_WINDOWS_AARCH64_COPY_WINDOWS_AARCH64_HPP2627#include <string.h>2829static void pd_conjoint_words(const HeapWord* from, HeapWord* to, size_t count) {30(void)memmove(to, from, count * HeapWordSize);31}3233static void pd_disjoint_words(const HeapWord* from, HeapWord* to, size_t count) {34switch (count) {35case 8: to[7] = from[7];36case 7: to[6] = from[6];37case 6: to[5] = from[5];38case 5: to[4] = from[4];39case 4: to[3] = from[3];40case 3: to[2] = from[2];41case 2: to[1] = from[1];42case 1: to[0] = from[0];43case 0: break;44default:45(void)memcpy(to, from, count * HeapWordSize);46break;47}48}4950static void pd_disjoint_words_atomic(const HeapWord* from, HeapWord* to, size_t count) {51switch (count) {52case 8: to[7] = from[7];53case 7: to[6] = from[6];54case 6: to[5] = from[5];55case 5: to[4] = from[4];56case 4: to[3] = from[3];57case 3: to[2] = from[2];58case 2: to[1] = from[1];59case 1: to[0] = from[0];60case 0: break;61default: while (count-- > 0) {62*to++ = *from++;63}64break;65}66}6768static void pd_aligned_conjoint_words(const HeapWord* from, HeapWord* to, size_t count) {69// pd_conjoint_words(from, to, count);70(void)memmove(to, from, count * HeapWordSize);71}7273static void pd_aligned_disjoint_words(const HeapWord* from, HeapWord* to, size_t count) {74pd_disjoint_words(from, to, count);75}7677static void pd_conjoint_bytes(const void* from, void* to, size_t count) {78(void)memmove(to, from, count);79}8081static void pd_conjoint_bytes_atomic(const void* from, void* to, size_t count) {82pd_conjoint_bytes(from, to, count);83}8485static void pd_conjoint_jshorts_atomic(const jshort* from, jshort* to, size_t count) {86if (from > to) {87while (count-- > 0) {88// Copy forwards89*to++ = *from++;90}91} else {92from += count - 1;93to += count - 1;94while (count-- > 0) {95// Copy backwards96*to-- = *from--;97}98}99}100101static void pd_conjoint_jints_atomic(const jint* from, jint* to, size_t count) {102if (from > to) {103while (count-- > 0) {104// Copy forwards105*to++ = *from++;106}107} else {108from += count - 1;109to += count - 1;110while (count-- > 0) {111// Copy backwards112*to-- = *from--;113}114}115}116117static void pd_conjoint_jlongs_atomic(const jlong* from, jlong* to, size_t count) {118pd_conjoint_oops_atomic((const oop*)from, (oop*)to, count);119}120121static void pd_conjoint_oops_atomic(const oop* from, oop* to, size_t count) {122if (from > to) {123while (count-- > 0) {124// Copy forwards125*to++ = *from++;126}127} else {128from += count - 1;129to += count - 1;130while (count-- > 0) {131// Copy backwards132*to-- = *from--;133}134}135}136137static void pd_arrayof_conjoint_bytes(const HeapWord* from, HeapWord* to, size_t count) {138pd_conjoint_bytes_atomic(from, to, count);139}140141static void pd_arrayof_conjoint_jshorts(const HeapWord* from, HeapWord* to, size_t count) {142pd_conjoint_jshorts_atomic((const jshort*)from, (jshort*)to, count);143}144145static void pd_arrayof_conjoint_jints(const HeapWord* from, HeapWord* to, size_t count) {146pd_conjoint_jints_atomic((const jint*)from, (jint*)to, count);147}148149static void pd_arrayof_conjoint_jlongs(const HeapWord* from, HeapWord* to, size_t count) {150pd_conjoint_jlongs_atomic((const jlong*)from, (jlong*)to, count);151}152153static void pd_arrayof_conjoint_oops(const HeapWord* from, HeapWord* to, size_t count) {154pd_conjoint_oops_atomic((const oop*)from, (oop*)to, count);155}156157#endif // OS_CPU_WINDOWS_AARCH64_COPY_WINDOWS_AARCH64_HPP158159160