never@1445: /* stefank@2314: * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved. never@1445: * Copyright 2007, 2008, 2009 Red Hat, Inc. never@1445: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. never@1445: * never@1445: * This code is free software; you can redistribute it and/or modify it never@1445: * under the terms of the GNU General Public License version 2 only, as never@1445: * published by the Free Software Foundation. never@1445: * never@1445: * This code is distributed in the hope that it will be useful, but WITHOUT never@1445: * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or never@1445: * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License never@1445: * version 2 for more details (a copy is included in the LICENSE file that never@1445: * accompanied this code). never@1445: * never@1445: * You should have received a copy of the GNU General Public License version never@1445: * 2 along with this work; if not, write to the Free Software Foundation, never@1445: * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. never@1445: * trims@1907: * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA trims@1907: * or visit www.oracle.com if you need additional information or have any trims@1907: * questions. never@1445: * never@1445: */ never@1445: stefank@2314: #ifndef CPU_ZERO_VM_BYTES_ZERO_HPP stefank@2314: #define CPU_ZERO_VM_BYTES_ZERO_HPP stefank@2314: stefank@2314: #include "memory/allocation.hpp" stefank@2314: never@1445: typedef union unaligned { never@1445: u4 u; never@1445: u2 us; never@1445: u8 ul; never@1445: } __attribute__((packed)) unaligned; never@1445: never@1445: class Bytes: AllStatic { never@1445: public: never@1445: // Returns true if the byte ordering used by Java is different never@1445: // from the native byte ordering of the underlying machine. never@1445: static inline bool is_Java_byte_ordering_different() { never@1445: #ifdef VM_LITTLE_ENDIAN never@1445: return true; never@1445: #else never@1445: return false; never@1445: #endif never@1445: } never@1445: never@1445: // Efficient reading and writing of unaligned unsigned data in never@1445: // platform-specific byte ordering. never@1445: static inline u2 get_native_u2(address p){ never@1445: unaligned *up = (unaligned *) p; never@1445: return up->us; never@1445: } never@1445: never@1445: static inline u4 get_native_u4(address p) { never@1445: unaligned *up = (unaligned *) p; never@1445: return up->u; never@1445: } never@1445: never@1445: static inline u8 get_native_u8(address p) { never@1445: unaligned *up = (unaligned *) p; never@1445: return up->ul; never@1445: } never@1445: never@1445: static inline void put_native_u2(address p, u2 x) { never@1445: unaligned *up = (unaligned *) p; never@1445: up->us = x; never@1445: } never@1445: never@1445: static inline void put_native_u4(address p, u4 x) { never@1445: unaligned *up = (unaligned *) p; never@1445: up->u = x; never@1445: } never@1445: never@1445: static inline void put_native_u8(address p, u8 x) { never@1445: unaligned *up = (unaligned *) p; never@1445: up->ul = x; never@1445: } never@1445: never@1445: // Efficient reading and writing of unaligned unsigned data in Java never@1445: // byte ordering (i.e. big-endian ordering). never@1445: #ifdef VM_LITTLE_ENDIAN never@1445: // Byte-order reversal is needed never@1445: static inline u2 get_Java_u2(address p) { never@1445: return (u2(p[0]) << 8) | never@1445: (u2(p[1]) ); never@1445: } never@1445: static inline u4 get_Java_u4(address p) { never@1445: return (u4(p[0]) << 24) | never@1445: (u4(p[1]) << 16) | never@1445: (u4(p[2]) << 8) | never@1445: (u4(p[3]) ); never@1445: } never@1445: static inline u8 get_Java_u8(address p) { never@1445: u4 hi, lo; never@1445: hi = (u4(p[0]) << 24) | never@1445: (u4(p[1]) << 16) | never@1445: (u4(p[2]) << 8) | never@1445: (u4(p[3]) ); never@1445: lo = (u4(p[4]) << 24) | never@1445: (u4(p[5]) << 16) | never@1445: (u4(p[6]) << 8) | never@1445: (u4(p[7]) ); never@1445: return u8(lo) | (u8(hi) << 32); never@1445: } never@1445: never@1445: static inline void put_Java_u2(address p, u2 x) { never@1445: p[0] = x >> 8; never@1445: p[1] = x; never@1445: } never@1445: static inline void put_Java_u4(address p, u4 x) { never@1445: p[0] = x >> 24; never@1445: p[1] = x >> 16; never@1445: p[2] = x >> 8; never@1445: p[3] = x; never@1445: } never@1445: static inline void put_Java_u8(address p, u8 x) { never@1445: u4 hi, lo; never@1445: lo = x; never@1445: hi = x >> 32; never@1445: p[0] = hi >> 24; never@1445: p[1] = hi >> 16; never@1445: p[2] = hi >> 8; never@1445: p[3] = hi; never@1445: p[4] = lo >> 24; never@1445: p[5] = lo >> 16; never@1445: p[6] = lo >> 8; never@1445: p[7] = lo; never@1445: } never@1445: never@1445: // Efficient swapping of byte ordering never@1445: static inline u2 swap_u2(u2 x); never@1445: static inline u4 swap_u4(u4 x); never@1445: static inline u8 swap_u8(u8 x); never@1445: #else never@1445: // No byte-order reversal is needed never@1445: static inline u2 get_Java_u2(address p) { never@1445: return get_native_u2(p); never@1445: } never@1445: static inline u4 get_Java_u4(address p) { never@1445: return get_native_u4(p); never@1445: } never@1445: static inline u8 get_Java_u8(address p) { never@1445: return get_native_u8(p); never@1445: } never@1445: never@1445: static inline void put_Java_u2(address p, u2 x) { never@1445: put_native_u2(p, x); never@1445: } never@1445: static inline void put_Java_u4(address p, u4 x) { never@1445: put_native_u4(p, x); never@1445: } never@1445: static inline void put_Java_u8(address p, u8 x) { never@1445: put_native_u8(p, x); never@1445: } never@1445: never@1445: // No byte-order reversal is needed never@1445: static inline u2 swap_u2(u2 x) { return x; } never@1445: static inline u4 swap_u4(u4 x) { return x; } never@1445: static inline u8 swap_u8(u8 x) { return x; } never@1445: #endif // VM_LITTLE_ENDIAN never@1445: }; never@1445: never@1445: #ifdef VM_LITTLE_ENDIAN never@1445: // The following header contains the implementations of swap_u2, never@1445: // swap_u4, and swap_u8 stefank@2314: #ifdef TARGET_OS_ARCH_linux_zero stefank@2314: # include "bytes_linux_zero.inline.hpp" stefank@2314: #endif never@3156: #ifdef TARGET_OS_ARCH_bsd_zero never@3156: # include "bytes_bsd_zero.inline.hpp" never@3156: #endif stefank@2314: never@1445: #endif // VM_LITTLE_ENDIAN stefank@2314: stefank@2314: #endif // CPU_ZERO_VM_BYTES_ZERO_HPP