src/cpu/zero/vm/bytes_zero.hpp

Wed, 22 Jan 2014 17:42:23 -0800

author
kvn
date
Wed, 22 Jan 2014 17:42:23 -0800
changeset 6503
a9becfeecd1b
parent 3156
f08d439fab8c
child 6876
710a3c8b516e
permissions
-rw-r--r--

Merge

never@1445 1 /*
stefank@2314 2 * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
never@1445 3 * Copyright 2007, 2008, 2009 Red Hat, Inc.
never@1445 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
never@1445 5 *
never@1445 6 * This code is free software; you can redistribute it and/or modify it
never@1445 7 * under the terms of the GNU General Public License version 2 only, as
never@1445 8 * published by the Free Software Foundation.
never@1445 9 *
never@1445 10 * This code is distributed in the hope that it will be useful, but WITHOUT
never@1445 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
never@1445 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
never@1445 13 * version 2 for more details (a copy is included in the LICENSE file that
never@1445 14 * accompanied this code).
never@1445 15 *
never@1445 16 * You should have received a copy of the GNU General Public License version
never@1445 17 * 2 along with this work; if not, write to the Free Software Foundation,
never@1445 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
never@1445 19 *
trims@1907 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 21 * or visit www.oracle.com if you need additional information or have any
trims@1907 22 * questions.
never@1445 23 *
never@1445 24 */
never@1445 25
stefank@2314 26 #ifndef CPU_ZERO_VM_BYTES_ZERO_HPP
stefank@2314 27 #define CPU_ZERO_VM_BYTES_ZERO_HPP
stefank@2314 28
stefank@2314 29 #include "memory/allocation.hpp"
stefank@2314 30
never@1445 31 typedef union unaligned {
never@1445 32 u4 u;
never@1445 33 u2 us;
never@1445 34 u8 ul;
never@1445 35 } __attribute__((packed)) unaligned;
never@1445 36
never@1445 37 class Bytes: AllStatic {
never@1445 38 public:
never@1445 39 // Returns true if the byte ordering used by Java is different
never@1445 40 // from the native byte ordering of the underlying machine.
never@1445 41 static inline bool is_Java_byte_ordering_different() {
never@1445 42 #ifdef VM_LITTLE_ENDIAN
never@1445 43 return true;
never@1445 44 #else
never@1445 45 return false;
never@1445 46 #endif
never@1445 47 }
never@1445 48
never@1445 49 // Efficient reading and writing of unaligned unsigned data in
never@1445 50 // platform-specific byte ordering.
never@1445 51 static inline u2 get_native_u2(address p){
never@1445 52 unaligned *up = (unaligned *) p;
never@1445 53 return up->us;
never@1445 54 }
never@1445 55
never@1445 56 static inline u4 get_native_u4(address p) {
never@1445 57 unaligned *up = (unaligned *) p;
never@1445 58 return up->u;
never@1445 59 }
never@1445 60
never@1445 61 static inline u8 get_native_u8(address p) {
never@1445 62 unaligned *up = (unaligned *) p;
never@1445 63 return up->ul;
never@1445 64 }
never@1445 65
never@1445 66 static inline void put_native_u2(address p, u2 x) {
never@1445 67 unaligned *up = (unaligned *) p;
never@1445 68 up->us = x;
never@1445 69 }
never@1445 70
never@1445 71 static inline void put_native_u4(address p, u4 x) {
never@1445 72 unaligned *up = (unaligned *) p;
never@1445 73 up->u = x;
never@1445 74 }
never@1445 75
never@1445 76 static inline void put_native_u8(address p, u8 x) {
never@1445 77 unaligned *up = (unaligned *) p;
never@1445 78 up->ul = x;
never@1445 79 }
never@1445 80
never@1445 81 // Efficient reading and writing of unaligned unsigned data in Java
never@1445 82 // byte ordering (i.e. big-endian ordering).
never@1445 83 #ifdef VM_LITTLE_ENDIAN
never@1445 84 // Byte-order reversal is needed
never@1445 85 static inline u2 get_Java_u2(address p) {
never@1445 86 return (u2(p[0]) << 8) |
never@1445 87 (u2(p[1]) );
never@1445 88 }
never@1445 89 static inline u4 get_Java_u4(address p) {
never@1445 90 return (u4(p[0]) << 24) |
never@1445 91 (u4(p[1]) << 16) |
never@1445 92 (u4(p[2]) << 8) |
never@1445 93 (u4(p[3]) );
never@1445 94 }
never@1445 95 static inline u8 get_Java_u8(address p) {
never@1445 96 u4 hi, lo;
never@1445 97 hi = (u4(p[0]) << 24) |
never@1445 98 (u4(p[1]) << 16) |
never@1445 99 (u4(p[2]) << 8) |
never@1445 100 (u4(p[3]) );
never@1445 101 lo = (u4(p[4]) << 24) |
never@1445 102 (u4(p[5]) << 16) |
never@1445 103 (u4(p[6]) << 8) |
never@1445 104 (u4(p[7]) );
never@1445 105 return u8(lo) | (u8(hi) << 32);
never@1445 106 }
never@1445 107
never@1445 108 static inline void put_Java_u2(address p, u2 x) {
never@1445 109 p[0] = x >> 8;
never@1445 110 p[1] = x;
never@1445 111 }
never@1445 112 static inline void put_Java_u4(address p, u4 x) {
never@1445 113 p[0] = x >> 24;
never@1445 114 p[1] = x >> 16;
never@1445 115 p[2] = x >> 8;
never@1445 116 p[3] = x;
never@1445 117 }
never@1445 118 static inline void put_Java_u8(address p, u8 x) {
never@1445 119 u4 hi, lo;
never@1445 120 lo = x;
never@1445 121 hi = x >> 32;
never@1445 122 p[0] = hi >> 24;
never@1445 123 p[1] = hi >> 16;
never@1445 124 p[2] = hi >> 8;
never@1445 125 p[3] = hi;
never@1445 126 p[4] = lo >> 24;
never@1445 127 p[5] = lo >> 16;
never@1445 128 p[6] = lo >> 8;
never@1445 129 p[7] = lo;
never@1445 130 }
never@1445 131
never@1445 132 // Efficient swapping of byte ordering
never@1445 133 static inline u2 swap_u2(u2 x);
never@1445 134 static inline u4 swap_u4(u4 x);
never@1445 135 static inline u8 swap_u8(u8 x);
never@1445 136 #else
never@1445 137 // No byte-order reversal is needed
never@1445 138 static inline u2 get_Java_u2(address p) {
never@1445 139 return get_native_u2(p);
never@1445 140 }
never@1445 141 static inline u4 get_Java_u4(address p) {
never@1445 142 return get_native_u4(p);
never@1445 143 }
never@1445 144 static inline u8 get_Java_u8(address p) {
never@1445 145 return get_native_u8(p);
never@1445 146 }
never@1445 147
never@1445 148 static inline void put_Java_u2(address p, u2 x) {
never@1445 149 put_native_u2(p, x);
never@1445 150 }
never@1445 151 static inline void put_Java_u4(address p, u4 x) {
never@1445 152 put_native_u4(p, x);
never@1445 153 }
never@1445 154 static inline void put_Java_u8(address p, u8 x) {
never@1445 155 put_native_u8(p, x);
never@1445 156 }
never@1445 157
never@1445 158 // No byte-order reversal is needed
never@1445 159 static inline u2 swap_u2(u2 x) { return x; }
never@1445 160 static inline u4 swap_u4(u4 x) { return x; }
never@1445 161 static inline u8 swap_u8(u8 x) { return x; }
never@1445 162 #endif // VM_LITTLE_ENDIAN
never@1445 163 };
never@1445 164
never@1445 165 #ifdef VM_LITTLE_ENDIAN
never@1445 166 // The following header contains the implementations of swap_u2,
never@1445 167 // swap_u4, and swap_u8
stefank@2314 168 #ifdef TARGET_OS_ARCH_linux_zero
stefank@2314 169 # include "bytes_linux_zero.inline.hpp"
stefank@2314 170 #endif
never@3156 171 #ifdef TARGET_OS_ARCH_bsd_zero
never@3156 172 # include "bytes_bsd_zero.inline.hpp"
never@3156 173 #endif
stefank@2314 174
never@1445 175 #endif // VM_LITTLE_ENDIAN
stefank@2314 176
stefank@2314 177 #endif // CPU_ZERO_VM_BYTES_ZERO_HPP

mercurial