src/share/vm/asm/register.hpp

Fri, 30 Nov 2012 15:23:16 -0800

author
twisti
date
Fri, 30 Nov 2012 15:23:16 -0800
changeset 4318
cd3d6a6b95d9
parent 4153
b9a9ed0f8eeb
child 4323
f0c2369fda5a
permissions
-rw-r--r--

8003240: x86: move MacroAssembler into separate file
Reviewed-by: kvn

duke@435 1 /*
mikael@4153 2 * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
duke@435 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
duke@435 4 *
duke@435 5 * This code is free software; you can redistribute it and/or modify it
duke@435 6 * under the terms of the GNU General Public License version 2 only, as
duke@435 7 * published by the Free Software Foundation.
duke@435 8 *
duke@435 9 * This code is distributed in the hope that it will be useful, but WITHOUT
duke@435 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
duke@435 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
duke@435 12 * version 2 for more details (a copy is included in the LICENSE file that
duke@435 13 * accompanied this code).
duke@435 14 *
duke@435 15 * You should have received a copy of the GNU General Public License version
duke@435 16 * 2 along with this work; if not, write to the Free Software Foundation,
duke@435 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
duke@435 18 *
trims@1907 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
trims@1907 20 * or visit www.oracle.com if you need additional information or have any
trims@1907 21 * questions.
duke@435 22 *
duke@435 23 */
duke@435 24
stefank@2314 25 #ifndef SHARE_VM_ASM_REGISTER_HPP
stefank@2314 26 #define SHARE_VM_ASM_REGISTER_HPP
stefank@2314 27
stefank@2314 28 #include "utilities/top.hpp"
stefank@2314 29
duke@435 30 // Use AbstractRegister as shortcut
duke@435 31 class AbstractRegisterImpl;
duke@435 32 typedef AbstractRegisterImpl* AbstractRegister;
duke@435 33
duke@435 34
duke@435 35 // The super class for platform specific registers. Instead of using value objects,
duke@435 36 // registers are implemented as pointers. Subclassing is used so all registers can
duke@435 37 // use the debugging suport below. No virtual functions are used for efficiency.
duke@435 38 // They are canonicalized; i.e., registers are equal if their pointers are equal,
duke@435 39 // and vice versa. A concrete implementation may just map the register onto 'this'.
duke@435 40
duke@435 41 class AbstractRegisterImpl {
duke@435 42 protected:
duke@435 43 int value() const { return (int)(intx)this; }
duke@435 44 };
duke@435 45
duke@435 46
duke@435 47 //
duke@435 48 // Macros for use in defining Register instances. We'd like to be
duke@435 49 // able to simply define const instances of the RegisterImpl* for each
duke@435 50 // of the registers needed on a system in a header file. However many
duke@435 51 // compilers don't handle this very well and end up producing a
duke@435 52 // private definition in every file which includes the header file.
duke@435 53 // Along with the static constructors necessary for initialization it
duke@435 54 // can consume a significant amount of space in the result library.
duke@435 55 //
duke@435 56 // The following macros allow us to declare the instance in a .hpp and
duke@435 57 // produce an enumeration value which has the same number. Then in a
duke@435 58 // .cpp the the register instance can be defined using the enumeration
duke@435 59 // value. This avoids the use of static constructors and multiple
duke@435 60 // definitions per .cpp. In addition #defines for the register can be
duke@435 61 // produced so that the constant registers can be inlined. These
duke@435 62 // macros should not be used inside other macros, because you may get
duke@435 63 // multiple evaluations of the macros which can give bad results.
duke@435 64 //
duke@435 65 // Here are some example uses and expansions. Note that the macro
duke@435 66 // invocation is terminated with a ;.
duke@435 67 //
duke@435 68 // CONSTANT_REGISTER_DECLARATION(Register, G0, 0);
duke@435 69 //
duke@435 70 // extern const Register G0 ;
duke@435 71 // enum { G0_RegisterEnumValue = 0 } ;
duke@435 72 //
duke@435 73 // REGISTER_DECLARATION(Register, Gmethod, G5);
duke@435 74 //
duke@435 75 // extern const Register Gmethod ;
duke@435 76 // enum { Gmethod_RegisterEnumValue = G5_RegisterEnumValue } ;
duke@435 77 //
duke@435 78 // REGISTER_DEFINITION(Register, G0);
duke@435 79 //
duke@435 80 // const Register G0 = ( ( Register ) G0_RegisterEnumValue ) ;
duke@435 81 //
duke@435 82
duke@435 83 #define AS_REGISTER(type,name) ((type)name##_##type##EnumValue)
duke@435 84
duke@435 85 #define CONSTANT_REGISTER_DECLARATION(type, name, value) \
duke@435 86 extern const type name; \
duke@435 87 enum { name##_##type##EnumValue = (value) }
duke@435 88
duke@435 89 #define REGISTER_DECLARATION(type, name, value) \
duke@435 90 extern const type name; \
duke@435 91 enum { name##_##type##EnumValue = value##_##type##EnumValue }
duke@435 92
duke@435 93 #define REGISTER_DEFINITION(type, name) \
duke@435 94 const type name = ((type)name##_##type##EnumValue)
duke@435 95
duke@435 96
duke@435 97
duke@435 98 // Debugging support
duke@435 99
duke@435 100 inline void assert_different_registers(
duke@435 101 AbstractRegister a,
duke@435 102 AbstractRegister b
duke@435 103 ) {
duke@435 104 assert(
duke@435 105 a != b,
twisti@4101 106 err_msg_res("registers must be different: a=%d, b=%d",
twisti@4101 107 a, b)
duke@435 108 );
duke@435 109 }
duke@435 110
duke@435 111
duke@435 112 inline void assert_different_registers(
duke@435 113 AbstractRegister a,
duke@435 114 AbstractRegister b,
duke@435 115 AbstractRegister c
duke@435 116 ) {
duke@435 117 assert(
duke@435 118 a != b && a != c
duke@435 119 && b != c,
twisti@4101 120 err_msg_res("registers must be different: a=%d, b=%d, c=%d",
twisti@4101 121 a, b, c)
duke@435 122 );
duke@435 123 }
duke@435 124
duke@435 125
duke@435 126 inline void assert_different_registers(
duke@435 127 AbstractRegister a,
duke@435 128 AbstractRegister b,
duke@435 129 AbstractRegister c,
duke@435 130 AbstractRegister d
duke@435 131 ) {
duke@435 132 assert(
duke@435 133 a != b && a != c && a != d
duke@435 134 && b != c && b != d
duke@435 135 && c != d,
twisti@4101 136 err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d",
twisti@4101 137 a, b, c, d)
duke@435 138 );
duke@435 139 }
duke@435 140
duke@435 141
duke@435 142 inline void assert_different_registers(
duke@435 143 AbstractRegister a,
duke@435 144 AbstractRegister b,
duke@435 145 AbstractRegister c,
duke@435 146 AbstractRegister d,
duke@435 147 AbstractRegister e
duke@435 148 ) {
duke@435 149 assert(
duke@435 150 a != b && a != c && a != d && a != e
duke@435 151 && b != c && b != d && b != e
duke@435 152 && c != d && c != e
duke@435 153 && d != e,
twisti@4101 154 err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d, e=%d",
twisti@4101 155 a, b, c, d, e)
duke@435 156 );
duke@435 157 }
duke@435 158
duke@435 159
duke@435 160 inline void assert_different_registers(
duke@435 161 AbstractRegister a,
duke@435 162 AbstractRegister b,
duke@435 163 AbstractRegister c,
duke@435 164 AbstractRegister d,
duke@435 165 AbstractRegister e,
duke@435 166 AbstractRegister f
duke@435 167 ) {
duke@435 168 assert(
duke@435 169 a != b && a != c && a != d && a != e && a != f
duke@435 170 && b != c && b != d && b != e && b != f
duke@435 171 && c != d && c != e && c != f
duke@435 172 && d != e && d != f
duke@435 173 && e != f,
twisti@4101 174 err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d, e=%d, f=%d",
twisti@4101 175 a, b, c, d, e, f)
duke@435 176 );
duke@435 177 }
duke@435 178
duke@435 179
duke@435 180 inline void assert_different_registers(
duke@435 181 AbstractRegister a,
duke@435 182 AbstractRegister b,
duke@435 183 AbstractRegister c,
duke@435 184 AbstractRegister d,
duke@435 185 AbstractRegister e,
duke@435 186 AbstractRegister f,
duke@435 187 AbstractRegister g
duke@435 188 ) {
duke@435 189 assert(
duke@435 190 a != b && a != c && a != d && a != e && a != f && a != g
duke@435 191 && b != c && b != d && b != e && b != f && b != g
duke@435 192 && c != d && c != e && c != f && c != g
duke@435 193 && d != e && d != f && d != g
duke@435 194 && e != f && e != g
duke@435 195 && f != g,
twisti@4101 196 err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d",
twisti@4101 197 a, b, c, d, e, f, g)
duke@435 198 );
duke@435 199 }
duke@435 200
duke@435 201
duke@435 202 inline void assert_different_registers(
duke@435 203 AbstractRegister a,
duke@435 204 AbstractRegister b,
duke@435 205 AbstractRegister c,
duke@435 206 AbstractRegister d,
duke@435 207 AbstractRegister e,
duke@435 208 AbstractRegister f,
duke@435 209 AbstractRegister g,
duke@435 210 AbstractRegister h
duke@435 211 ) {
duke@435 212 assert(
duke@435 213 a != b && a != c && a != d && a != e && a != f && a != g && a != h
duke@435 214 && b != c && b != d && b != e && b != f && b != g && b != h
duke@435 215 && c != d && c != e && c != f && c != g && c != h
duke@435 216 && d != e && d != f && d != g && d != h
duke@435 217 && e != f && e != g && e != h
duke@435 218 && f != g && f != h
duke@435 219 && g != h,
twisti@4101 220 err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d, h=%d",
twisti@4101 221 a, b, c, d, e, f, g, h)
twisti@3969 222 );
twisti@3969 223 }
twisti@3969 224
twisti@3969 225
twisti@3969 226 inline void assert_different_registers(
twisti@3969 227 AbstractRegister a,
twisti@3969 228 AbstractRegister b,
twisti@3969 229 AbstractRegister c,
twisti@3969 230 AbstractRegister d,
twisti@3969 231 AbstractRegister e,
twisti@3969 232 AbstractRegister f,
twisti@3969 233 AbstractRegister g,
twisti@3969 234 AbstractRegister h,
twisti@3969 235 AbstractRegister i
twisti@3969 236 ) {
twisti@3969 237 assert(
twisti@3969 238 a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i
twisti@3969 239 && b != c && b != d && b != e && b != f && b != g && b != h && b != i
twisti@3969 240 && c != d && c != e && c != f && c != g && c != h && c != i
twisti@3969 241 && d != e && d != f && d != g && d != h && d != i
twisti@3969 242 && e != f && e != g && e != h && e != i
twisti@3969 243 && f != g && f != h && f != i
twisti@3969 244 && g != h && g != i
twisti@3969 245 && h != i,
twisti@4101 246 err_msg_res("registers must be different: a=%d, b=%d, c=%d, d=%d, e=%d, f=%d, g=%d, h=%d, i=%d",
twisti@4101 247 a, b, c, d, e, f, g, h, i)
duke@435 248 );
duke@435 249 }
stefank@2314 250
stefank@2314 251 #endif // SHARE_VM_ASM_REGISTER_HPP

mercurial