Path: blob/master/src/hotspot/os_cpu/windows_x86/copy_windows_x86.hpp
40930 views
/*1* Copyright (c) 2003, 2019, Oracle and/or its affiliates. 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_X86_COPY_WINDOWS_X86_HPP25#define OS_CPU_WINDOWS_X86_COPY_WINDOWS_X86_HPP2627static void pd_conjoint_words(const HeapWord* from, HeapWord* to, size_t count) {28(void)memmove(to, from, count * HeapWordSize);29}3031static void pd_disjoint_words(const HeapWord* from, HeapWord* to, size_t count) {32#ifdef AMD6433switch (count) {34case 8: to[7] = from[7];35case 7: to[6] = from[6];36case 6: to[5] = from[5];37case 5: to[4] = from[4];38case 4: to[3] = from[3];39case 3: to[2] = from[2];40case 2: to[1] = from[1];41case 1: to[0] = from[0];42case 0: break;43default:44(void)memcpy(to, from, count * HeapWordSize);45break;46}47#else48(void)memcpy(to, from, count * HeapWordSize);49#endif // AMD6450}5152static void pd_disjoint_words_atomic(const HeapWord* from, HeapWord* to, size_t count) {53switch (count) {54case 8: to[7] = from[7];55case 7: to[6] = from[6];56case 6: to[5] = from[5];57case 5: to[4] = from[4];58case 4: to[3] = from[3];59case 3: to[2] = from[2];60case 2: to[1] = from[1];61case 1: to[0] = from[0];62case 0: break;63default: while (count-- > 0) {64*to++ = *from++;65}66break;67}68}6970static void pd_aligned_conjoint_words(const HeapWord* from, HeapWord* to, size_t count) {71(void)memmove(to, from, count * HeapWordSize);72}7374static void pd_aligned_disjoint_words(const HeapWord* from, HeapWord* to, size_t count) {75pd_disjoint_words(from, to, count);76}7778static void pd_conjoint_bytes(const void* from, void* to, size_t count) {79(void)memmove(to, from, count);80}8182static void pd_conjoint_bytes_atomic(const void* from, void* to, size_t count) {83pd_conjoint_bytes(from, to, count);84}8586static void pd_conjoint_jshorts_atomic(const jshort* from, jshort* to, size_t count) {87if (from > to) {88while (count-- > 0) {89// Copy forwards90*to++ = *from++;91}92} else {93from += count - 1;94to += count - 1;95while (count-- > 0) {96// Copy backwards97*to-- = *from--;98}99}100}101102static void pd_conjoint_jints_atomic(const jint* from, jint* to, size_t count) {103if (from > to) {104while (count-- > 0) {105// Copy forwards106*to++ = *from++;107}108} else {109from += count - 1;110to += count - 1;111while (count-- > 0) {112// Copy backwards113*to-- = *from--;114}115}116}117118static void pd_conjoint_jlongs_atomic(const jlong* from, jlong* to, size_t count) {119#ifdef AMD64120assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size");121pd_conjoint_oops_atomic((const oop*)from, (oop*)to, count);122#else123// Guarantee use of fild/fistp or xmm regs via some asm code, because compilers won't.124__asm {125mov eax, from;126mov edx, to;127mov ecx, count;128cmp eax, edx;129jbe downtest;130jmp uptest;131up:132fild qword ptr [eax];133fistp qword ptr [edx];134add eax, 8;135add edx, 8;136uptest:137sub ecx, 1;138jge up;139jmp done;140down:141fild qword ptr [eax][ecx*8];142fistp qword ptr [edx][ecx*8];143downtest:144sub ecx, 1;145jge down;146done:;147}148#endif // AMD64149}150151static void pd_conjoint_oops_atomic(const oop* from, oop* to, size_t count) {152// Do better than this: inline memmove body NEEDS CLEANUP153if (from > to) {154while (count-- > 0) {155// Copy forwards156*to++ = *from++;157}158} else {159from += count - 1;160to += count - 1;161while (count-- > 0) {162// Copy backwards163*to-- = *from--;164}165}166}167168static void pd_arrayof_conjoint_bytes(const HeapWord* from, HeapWord* to, size_t count) {169#ifdef AMD64170pd_conjoint_bytes_atomic(from, to, count);171#else172pd_conjoint_bytes(from, to, count);173#endif // AMD64174}175176static void pd_arrayof_conjoint_jshorts(const HeapWord* from, HeapWord* to, size_t count) {177pd_conjoint_jshorts_atomic((const jshort*)from, (jshort*)to, count);178}179180static void pd_arrayof_conjoint_jints(const HeapWord* from, HeapWord* to, size_t count) {181pd_conjoint_jints_atomic((const jint*)from, (jint*)to, count);182}183184static void pd_arrayof_conjoint_jlongs(const HeapWord* from, HeapWord* to, size_t count) {185pd_conjoint_jlongs_atomic((const jlong*)from, (jlong*)to, count);186}187188static void pd_arrayof_conjoint_oops(const HeapWord* from, HeapWord* to, size_t count) {189pd_conjoint_oops_atomic((const oop*)from, (oop*)to, count);190}191192#endif // OS_CPU_WINDOWS_X86_COPY_WINDOWS_X86_HPP193194195