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