src/os_cpu/solaris_x86/vm/bytes_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) 1998, 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_BYTES_SOLARIS_X86_INLINE_HPP
    26 #define OS_CPU_SOLARIS_X86_VM_BYTES_SOLARIS_X86_INLINE_HPP
    28 // For Sun Studio - implementation is in solaris_i486.il.
    29 // For gcc - implementation is just below.
    30 extern "C" u2 _raw_swap_u2(u2 x);
    31 extern "C" u4 _raw_swap_u4(u4 x);
    32 #ifdef AMD64
    33 extern "C" u8 _raw_swap_u8(u8 x);
    34 #else
    35 extern "C" u8 _raw_swap_u8(u4 x, u4 y);
    36 #endif // AMD64
    38 // Efficient swapping of data bytes from Java byte
    39 // ordering to native byte ordering and vice versa.
    40 inline u2   Bytes::swap_u2(u2 x) {
    41   return _raw_swap_u2(x);
    42 }
    44 inline u4   Bytes::swap_u4(u4 x) {
    45   return _raw_swap_u4(x);
    46 }
    48 inline u8   Bytes::swap_u8(u8 x) {
    49 #ifdef AMD64
    50   return _raw_swap_u8(x);
    51 #else
    52   return swap_u8_base(*(u4*)&x, *(((u4*)&x)+1));
    53 #endif // AMD64
    55 }
    57 #ifndef AMD64
    58 // Helper function for swap_u8
    59 inline u8   Bytes::swap_u8_base(u4 x, u4 y) {
    60   return _raw_swap_u8(x, y);
    61 }
    62 #endif // !AMD64
    65 #ifdef _GNU_SOURCE
    67 extern "C" {
    68 #ifdef AMD64
    69   inline u2 _raw_swap_u2(u2 x) {
    70     register unsigned short int __dest;
    71     __asm__ ("rorw $8, %w0": "=r" (__dest): "0" (x): "cc");
    72     return __dest;
    73   }
    74   inline u4 _raw_swap_u4(u4 x) {
    75     register unsigned int __dest;
    76     __asm__ ("bswap %0" : "=r" (__dest) : "0" (x));
    77     return __dest;
    78   }
    79   inline u8 _raw_swap_u8(u8 x) {
    80     register unsigned long  __dest;
    81     __asm__ ("bswap %q0" : "=r" (__dest) : "0" (x));
    82     return __dest;
    83   }
    84 #else
    85   inline u2 _raw_swap_u2(u2 x) {
    86     u2 ret;
    87     __asm__ __volatile__ (
    88       "movw %0, %%ax;"
    89       "xchg %%al, %%ah;"
    90       "movw %%ax, %0"
    91       :"=r" (ret)      // output : register 0 => ret
    92       :"0"  (x)        // input  : x => register 0
    93       :"ax", "0"       // clobbered registers
    94     );
    95     return ret;
    96   }
    98   inline u4 _raw_swap_u4(u4 x) {
    99     u4 ret;
   100     __asm__ __volatile__ (
   101       "bswap %0"
   102       :"=r" (ret)      // output : register 0 => ret
   103       :"0"  (x)        // input  : x => register 0
   104       :"0"             // clobbered register
   105     );
   106     return ret;
   107   }
   109   inline u8 _raw_swap_u8(u4 x, u4 y) {
   110     return (((u8)_raw_swap_u4(x))<<32) | _raw_swap_u4(y);
   111   }
   112 #endif // AMD64
   113 }
   114 #endif  //_GNU_SOURCE
   116 #endif // OS_CPU_SOLARIS_X86_VM_BYTES_SOLARIS_X86_INLINE_HPP

mercurial