src/cpu/zero/vm/bytes_zero.hpp

Fri, 12 Feb 2010 10:34:11 -0800

author
kvn
date
Fri, 12 Feb 2010 10:34:11 -0800
changeset 1691
c09ee209b65c
parent 1445
354d3184f6b2
child 1907
c18cbe5936b8
permissions
-rw-r--r--

6926048: Improve Zero performance
Summary: Make Zero figure out result types in a similar way to C++ interpreter implementation.
Reviewed-by: kvn
Contributed-by: gbenson@redhat.com

never@1445 1 /*
never@1445 2 * Copyright 1997-2002 Sun Microsystems, Inc. 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 *
never@1445 20 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
never@1445 21 * CA 95054 USA or visit www.sun.com if you need additional information or
never@1445 22 * have any questions.
never@1445 23 *
never@1445 24 */
never@1445 25
never@1445 26 typedef union unaligned {
never@1445 27 u4 u;
never@1445 28 u2 us;
never@1445 29 u8 ul;
never@1445 30 } __attribute__((packed)) unaligned;
never@1445 31
never@1445 32 class Bytes: AllStatic {
never@1445 33 public:
never@1445 34 // Returns true if the byte ordering used by Java is different
never@1445 35 // from the native byte ordering of the underlying machine.
never@1445 36 static inline bool is_Java_byte_ordering_different() {
never@1445 37 #ifdef VM_LITTLE_ENDIAN
never@1445 38 return true;
never@1445 39 #else
never@1445 40 return false;
never@1445 41 #endif
never@1445 42 }
never@1445 43
never@1445 44 // Efficient reading and writing of unaligned unsigned data in
never@1445 45 // platform-specific byte ordering.
never@1445 46 static inline u2 get_native_u2(address p){
never@1445 47 unaligned *up = (unaligned *) p;
never@1445 48 return up->us;
never@1445 49 }
never@1445 50
never@1445 51 static inline u4 get_native_u4(address p) {
never@1445 52 unaligned *up = (unaligned *) p;
never@1445 53 return up->u;
never@1445 54 }
never@1445 55
never@1445 56 static inline u8 get_native_u8(address p) {
never@1445 57 unaligned *up = (unaligned *) p;
never@1445 58 return up->ul;
never@1445 59 }
never@1445 60
never@1445 61 static inline void put_native_u2(address p, u2 x) {
never@1445 62 unaligned *up = (unaligned *) p;
never@1445 63 up->us = x;
never@1445 64 }
never@1445 65
never@1445 66 static inline void put_native_u4(address p, u4 x) {
never@1445 67 unaligned *up = (unaligned *) p;
never@1445 68 up->u = x;
never@1445 69 }
never@1445 70
never@1445 71 static inline void put_native_u8(address p, u8 x) {
never@1445 72 unaligned *up = (unaligned *) p;
never@1445 73 up->ul = x;
never@1445 74 }
never@1445 75
never@1445 76 // Efficient reading and writing of unaligned unsigned data in Java
never@1445 77 // byte ordering (i.e. big-endian ordering).
never@1445 78 #ifdef VM_LITTLE_ENDIAN
never@1445 79 // Byte-order reversal is needed
never@1445 80 static inline u2 get_Java_u2(address p) {
never@1445 81 return (u2(p[0]) << 8) |
never@1445 82 (u2(p[1]) );
never@1445 83 }
never@1445 84 static inline u4 get_Java_u4(address p) {
never@1445 85 return (u4(p[0]) << 24) |
never@1445 86 (u4(p[1]) << 16) |
never@1445 87 (u4(p[2]) << 8) |
never@1445 88 (u4(p[3]) );
never@1445 89 }
never@1445 90 static inline u8 get_Java_u8(address p) {
never@1445 91 u4 hi, lo;
never@1445 92 hi = (u4(p[0]) << 24) |
never@1445 93 (u4(p[1]) << 16) |
never@1445 94 (u4(p[2]) << 8) |
never@1445 95 (u4(p[3]) );
never@1445 96 lo = (u4(p[4]) << 24) |
never@1445 97 (u4(p[5]) << 16) |
never@1445 98 (u4(p[6]) << 8) |
never@1445 99 (u4(p[7]) );
never@1445 100 return u8(lo) | (u8(hi) << 32);
never@1445 101 }
never@1445 102
never@1445 103 static inline void put_Java_u2(address p, u2 x) {
never@1445 104 p[0] = x >> 8;
never@1445 105 p[1] = x;
never@1445 106 }
never@1445 107 static inline void put_Java_u4(address p, u4 x) {
never@1445 108 p[0] = x >> 24;
never@1445 109 p[1] = x >> 16;
never@1445 110 p[2] = x >> 8;
never@1445 111 p[3] = x;
never@1445 112 }
never@1445 113 static inline void put_Java_u8(address p, u8 x) {
never@1445 114 u4 hi, lo;
never@1445 115 lo = x;
never@1445 116 hi = x >> 32;
never@1445 117 p[0] = hi >> 24;
never@1445 118 p[1] = hi >> 16;
never@1445 119 p[2] = hi >> 8;
never@1445 120 p[3] = hi;
never@1445 121 p[4] = lo >> 24;
never@1445 122 p[5] = lo >> 16;
never@1445 123 p[6] = lo >> 8;
never@1445 124 p[7] = lo;
never@1445 125 }
never@1445 126
never@1445 127 // Efficient swapping of byte ordering
never@1445 128 static inline u2 swap_u2(u2 x);
never@1445 129 static inline u4 swap_u4(u4 x);
never@1445 130 static inline u8 swap_u8(u8 x);
never@1445 131 #else
never@1445 132 // No byte-order reversal is needed
never@1445 133 static inline u2 get_Java_u2(address p) {
never@1445 134 return get_native_u2(p);
never@1445 135 }
never@1445 136 static inline u4 get_Java_u4(address p) {
never@1445 137 return get_native_u4(p);
never@1445 138 }
never@1445 139 static inline u8 get_Java_u8(address p) {
never@1445 140 return get_native_u8(p);
never@1445 141 }
never@1445 142
never@1445 143 static inline void put_Java_u2(address p, u2 x) {
never@1445 144 put_native_u2(p, x);
never@1445 145 }
never@1445 146 static inline void put_Java_u4(address p, u4 x) {
never@1445 147 put_native_u4(p, x);
never@1445 148 }
never@1445 149 static inline void put_Java_u8(address p, u8 x) {
never@1445 150 put_native_u8(p, x);
never@1445 151 }
never@1445 152
never@1445 153 // No byte-order reversal is needed
never@1445 154 static inline u2 swap_u2(u2 x) { return x; }
never@1445 155 static inline u4 swap_u4(u4 x) { return x; }
never@1445 156 static inline u8 swap_u8(u8 x) { return x; }
never@1445 157 #endif // VM_LITTLE_ENDIAN
never@1445 158 };
never@1445 159
never@1445 160 #ifdef VM_LITTLE_ENDIAN
never@1445 161 // The following header contains the implementations of swap_u2,
never@1445 162 // swap_u4, and swap_u8
never@1445 163 #include "incls/_bytes_pd.inline.hpp.incl"
never@1445 164 #endif // VM_LITTLE_ENDIAN

mercurial