src/os_cpu/solaris_x86/vm/copy_solaris_x86.inline.hpp

Thu, 16 Feb 2012 17:12:49 -0800

author
kvn
date
Thu, 16 Feb 2012 17:12:49 -0800
changeset 3577
9b8ce46870df
parent 2314
f95d63e2154a
child 6876
710a3c8b516e
permissions
-rw-r--r--

7145346: VerifyStackAtCalls is broken
Summary: Replace call_epilog() encoding with macroassembler use. Moved duplicated code to x86.ad. Fixed return_addr() definition.
Reviewed-by: never

     1 /*
     2  * Copyright (c) 2003, 2010, Oracle and/or its affiliates. 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 it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 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 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 #ifndef OS_CPU_SOLARIS_X86_VM_COPY_SOLARIS_X86_INLINE_HPP
    26 #define OS_CPU_SOLARIS_X86_VM_COPY_SOLARIS_X86_INLINE_HPP
    28 static void pd_conjoint_words(HeapWord* from, HeapWord* to, size_t count) {
    29   (void)memmove(to, from, count * HeapWordSize);
    30 }
    32 static void pd_disjoint_words(HeapWord* from, HeapWord* to, size_t count) {
    33 #ifndef AMD64
    34   (void)memcpy(to, from, count * HeapWordSize);
    35 #else
    36   switch (count) {
    37   case 8:  to[7] = from[7];
    38   case 7:  to[6] = from[6];
    39   case 6:  to[5] = from[5];
    40   case 5:  to[4] = from[4];
    41   case 4:  to[3] = from[3];
    42   case 3:  to[2] = from[2];
    43   case 2:  to[1] = from[1];
    44   case 1:  to[0] = from[0];
    45   case 0:  break;
    46   default:
    47     (void)memcpy(to, from, count * HeapWordSize);
    48     break;
    49   }
    50 #endif // AMD64
    51 }
    53 static void pd_disjoint_words_atomic(HeapWord* from, HeapWord* to, size_t count) {
    54   switch (count) {
    55   case 8:  to[7] = from[7];
    56   case 7:  to[6] = from[6];
    57   case 6:  to[5] = from[5];
    58   case 5:  to[4] = from[4];
    59   case 4:  to[3] = from[3];
    60   case 3:  to[2] = from[2];
    61   case 2:  to[1] = from[1];
    62   case 1:  to[0] = from[0];
    63   case 0:  break;
    64   default: while (count-- > 0) {
    65              *to++ = *from++;
    66            }
    67            break;
    68   }
    69 }
    71 static void pd_aligned_conjoint_words(HeapWord* from, HeapWord* to, size_t count) {
    72   (void)memmove(to, from, count * HeapWordSize);
    73 }
    75 static void pd_aligned_disjoint_words(HeapWord* from, HeapWord* to, size_t count) {
    76   pd_disjoint_words(from, to, count);
    77 }
    79 static void pd_conjoint_bytes(void* from, void* to, size_t count) {
    80 #ifdef AMD64
    81   (void)memmove(to, from, count);
    82 #else
    83   _Copy_conjoint_bytes(from, to, count);
    84 #endif // AMD64
    85 }
    87 static void pd_conjoint_bytes_atomic(void* from, void* to, size_t count) {
    88   pd_conjoint_bytes(from, to, count);
    89 }
    91 static void pd_conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) {
    92   _Copy_conjoint_jshorts_atomic(from, to, count);
    93 }
    95 static void pd_conjoint_jints_atomic(jint* from, jint* to, size_t count) {
    96   _Copy_conjoint_jints_atomic(from, to, count);
    97 }
    99 static void pd_conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) {
   100   // Guarantee use of fild/fistp or xmm regs via some asm code, because compilers won't.
   101   _Copy_conjoint_jlongs_atomic(from, to, count);
   102 }
   104 static void pd_conjoint_oops_atomic(oop* from, oop* to, size_t count) {
   105 #ifdef AMD64
   106   assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size");
   107   _Copy_conjoint_jlongs_atomic((jlong*)from, (jlong*)to, count);
   108 #else
   109   _Copy_conjoint_jints_atomic((jint*)from, (jint*)to, count);
   110 #endif // AMD64
   111 }
   113 static void pd_arrayof_conjoint_bytes(HeapWord* from, HeapWord* to, size_t count) {
   114   _Copy_arrayof_conjoint_bytes(from, to, count);
   115 }
   117 static void pd_arrayof_conjoint_jshorts(HeapWord* from, HeapWord* to, size_t count) {
   118   _Copy_arrayof_conjoint_jshorts(from, to, count);
   119 }
   121 static void pd_arrayof_conjoint_jints(HeapWord* from, HeapWord* to, size_t count) {
   122   _Copy_arrayof_conjoint_jints(from, to, count);
   123 }
   125 static void pd_arrayof_conjoint_jlongs(HeapWord* from, HeapWord* to, size_t count) {
   126 #ifdef AMD64
   127   _Copy_arrayof_conjoint_jlongs(from, to, count);
   128 #else
   129   pd_conjoint_jlongs_atomic((jlong*)from, (jlong*)to, count);
   130 #endif // AMD64
   131 }
   133 static void pd_arrayof_conjoint_oops(HeapWord* from, HeapWord* to, size_t count) {
   134 #ifdef AMD64
   135   assert(BytesPerLong == BytesPerOop, "jlongs and oops must be the same size");
   136   _Copy_arrayof_conjoint_jlongs(from, to, count);
   137 #else
   138   assert(BytesPerInt == BytesPerOop, "jints and oops must be the same size");
   139   _Copy_arrayof_conjoint_jints(from, to, count);
   140 #endif // AMD64
   141 }
   143 #endif // OS_CPU_SOLARIS_X86_VM_COPY_SOLARIS_X86_INLINE_HPP

mercurial