Path: blob/master/src/hotspot/cpu/ppc/copy_ppc.hpp
40930 views
/*1* Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.2* Copyright (c) 2012, 2013 SAP SE. All rights reserved.3* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.4*5* This code is free software; you can redistribute it and/or modify it6* under the terms of the GNU General Public License version 2 only, as7* published by the Free Software Foundation.8*9* This code is distributed in the hope that it will be useful, but WITHOUT10* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or11* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License12* version 2 for more details (a copy is included in the LICENSE file that13* accompanied this code).14*15* You should have received a copy of the GNU General Public License version16* 2 along with this work; if not, write to the Free Software Foundation,17* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.18*19* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA20* or visit www.oracle.com if you need additional information or have any21* questions.22*23*/2425#ifndef CPU_PPC_COPY_PPC_HPP26#define CPU_PPC_COPY_PPC_HPP2728#ifndef PPC6429#error "copy currently only implemented for PPC64"30#endif3132// Inline functions for memory copy and fill.3334static void pd_conjoint_words(const HeapWord* from, HeapWord* to, size_t count) {35(void)memmove(to, from, count * HeapWordSize);36}3738static void pd_disjoint_words(const HeapWord* from, HeapWord* to, size_t count) {39switch (count) {40case 8: to[7] = from[7];41case 7: to[6] = from[6];42case 6: to[5] = from[5];43case 5: to[4] = from[4];44case 4: to[3] = from[3];45case 3: to[2] = from[2];46case 2: to[1] = from[1];47case 1: to[0] = from[0];48case 0: break;49default: (void)memcpy(to, from, count * HeapWordSize);50break;51}52}5354static void pd_disjoint_words_atomic(const HeapWord* from, HeapWord* to, size_t count) {55switch (count) {56case 8: to[7] = from[7];57case 7: to[6] = from[6];58case 6: to[5] = from[5];59case 5: to[4] = from[4];60case 4: to[3] = from[3];61case 3: to[2] = from[2];62case 2: to[1] = from[1];63case 1: to[0] = from[0];64case 0: break;65default: while (count-- > 0) {66*to++ = *from++;67}68break;69}70}7172static void pd_aligned_conjoint_words(const HeapWord* from, HeapWord* to, size_t count) {73(void)memmove(to, from, count * HeapWordSize);74}7576static void pd_aligned_disjoint_words(const HeapWord* from, HeapWord* to, size_t count) {77pd_disjoint_words(from, to, count);78}7980static void pd_conjoint_bytes(const void* from, void* to, size_t count) {81(void)memmove(to, from, count);82}8384static void pd_conjoint_bytes_atomic(const void* from, void* to, size_t count) {85(void)memmove(to, from, count);86}8788// Template for atomic, element-wise copy.89template <class T>90static void copy_conjoint_atomic(const T* from, T* to, size_t count) {91if (from > to) {92while (count-- > 0) {93// Copy forwards94*to++ = *from++;95}96} else {97from += count - 1;98to += count - 1;99while (count-- > 0) {100// Copy backwards101*to-- = *from--;102}103}104}105106static void pd_conjoint_jshorts_atomic(const jshort* from, jshort* to, size_t count) {107// TODO: contribute optimized version.108copy_conjoint_atomic<jshort>(from, to, count);109}110111static void pd_conjoint_jints_atomic(const jint* from, jint* to, size_t count) {112// TODO: contribute optimized version.113copy_conjoint_atomic<jint>(from, to, count);114}115116static void pd_conjoint_jlongs_atomic(const jlong* from, jlong* to, size_t count) {117copy_conjoint_atomic<jlong>(from, to, count);118}119120static void pd_conjoint_oops_atomic(const oop* from, oop* to, size_t count) {121copy_conjoint_atomic<oop>(from, to, count);122}123124static void pd_arrayof_conjoint_bytes(const HeapWord* from, HeapWord* to, size_t count) {125pd_conjoint_bytes_atomic(from, to, count);126}127128static void pd_arrayof_conjoint_jshorts(const HeapWord* from, HeapWord* to, size_t count) {129// TODO: contribute optimized version.130pd_conjoint_jshorts_atomic((const jshort*)from, (jshort*)to, count);131}132133static void pd_arrayof_conjoint_jints(const HeapWord* from, HeapWord* to, size_t count) {134// TODO: contribute optimized version.135pd_conjoint_jints_atomic((const jint*)from, (jint*)to, count);136}137138static void pd_arrayof_conjoint_jlongs(const HeapWord* from, HeapWord* to, size_t count) {139pd_conjoint_jlongs_atomic((const jlong*)from, (jlong*)to, count);140}141142static void pd_arrayof_conjoint_oops(const HeapWord* from, HeapWord* to, size_t count) {143pd_conjoint_oops_atomic((const oop*)from, (oop*)to, count);144}145146static void pd_fill_to_words(HeapWord* tohw, size_t count, juint value) {147julong* to = (julong*)tohw;148julong v = ((julong)value << 32) | value;149while (count-- > 0) {150*to++ = v;151}152}153154static void pd_fill_to_aligned_words(HeapWord* tohw, size_t count, juint value) {155pd_fill_to_words(tohw, count, value);156}157158static void pd_fill_to_bytes(void* to, size_t count, jubyte value) {159(void)memset(to, value, count);160}161162static void pd_zero_to_words(HeapWord* tohw, size_t count) {163pd_fill_to_words(tohw, count, 0);164}165166static void pd_zero_to_bytes(void* to, size_t count) {167(void)memset(to, 0, count);168}169170#endif // CPU_PPC_COPY_PPC_HPP171172173