Fri, 29 Apr 2016 00:06:10 +0800
Added MIPS 64-bit port.
aoqi@1 | 1 | /* |
aoqi@1 | 2 | * Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved. |
aoqi@1 | 3 | * Copyright (c) 2015, 2016, Loongson Technology. All rights reserved. |
aoqi@1 | 4 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
aoqi@1 | 5 | * |
aoqi@1 | 6 | * This code is free software; you can redistribute it and/or modify it |
aoqi@1 | 7 | * under the terms of the GNU General Public License version 2 only, as |
aoqi@1 | 8 | * published by the Free Software Foundation. |
aoqi@1 | 9 | * |
aoqi@1 | 10 | * This code is distributed in the hope that it will be useful, but WITHOUT |
aoqi@1 | 11 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
aoqi@1 | 12 | * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
aoqi@1 | 13 | * version 2 for more details (a copy is included in the LICENSE file that |
aoqi@1 | 14 | * accompanied this code). |
aoqi@1 | 15 | * |
aoqi@1 | 16 | * You should have received a copy of the GNU General Public License version |
aoqi@1 | 17 | * 2 along with this work; if not, write to the Free Software Foundation, |
aoqi@1 | 18 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
aoqi@1 | 19 | * |
aoqi@1 | 20 | * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
aoqi@1 | 21 | * or visit www.oracle.com if you need additional information or have any |
aoqi@1 | 22 | * questions. |
aoqi@1 | 23 | * |
aoqi@1 | 24 | */ |
aoqi@1 | 25 | |
aoqi@1 | 26 | #ifndef CPU_MIPS_VM_REGISTER_MIPS_HPP |
aoqi@1 | 27 | #define CPU_MIPS_VM_REGISTER_MIPS_HPP |
aoqi@1 | 28 | |
aoqi@1 | 29 | #include "asm/register.hpp" |
aoqi@1 | 30 | #include "vm_version_mips.hpp" |
aoqi@1 | 31 | |
aoqi@1 | 32 | class VMRegImpl; |
aoqi@1 | 33 | typedef VMRegImpl* VMReg; |
aoqi@1 | 34 | |
aoqi@1 | 35 | // Use Register as shortcut |
aoqi@1 | 36 | class RegisterImpl; |
aoqi@1 | 37 | typedef RegisterImpl* Register; |
aoqi@1 | 38 | |
aoqi@1 | 39 | |
aoqi@1 | 40 | // The implementation of integer registers for the ia32 architecture |
aoqi@1 | 41 | inline Register as_Register(int encoding) { |
aoqi@1 | 42 | return (Register)(intptr_t) encoding; |
aoqi@1 | 43 | } |
aoqi@1 | 44 | |
aoqi@1 | 45 | class RegisterImpl: public AbstractRegisterImpl { |
aoqi@1 | 46 | public: |
aoqi@1 | 47 | enum { |
aoqi@1 | 48 | number_of_registers = 32 |
aoqi@1 | 49 | }; |
aoqi@1 | 50 | |
aoqi@1 | 51 | // derived registers, offsets, and addresses |
aoqi@1 | 52 | Register successor() const { return as_Register(encoding() + 1); } |
aoqi@1 | 53 | |
aoqi@1 | 54 | // construction |
aoqi@1 | 55 | inline friend Register as_Register(int encoding); |
aoqi@1 | 56 | |
aoqi@1 | 57 | VMReg as_VMReg(); |
aoqi@1 | 58 | |
aoqi@1 | 59 | // accessors |
aoqi@1 | 60 | int encoding() const { assert(is_valid(),err_msg( "invalid register (%d)", (int)(intptr_t)this)); return (intptr_t)this; } |
aoqi@1 | 61 | bool is_valid() const { return 0 <= (intptr_t)this && (intptr_t)this < number_of_registers; } |
aoqi@1 | 62 | const char* name() const; |
aoqi@1 | 63 | }; |
aoqi@1 | 64 | |
aoqi@1 | 65 | |
aoqi@1 | 66 | // The integer registers of the MIPS32 architecture |
aoqi@1 | 67 | CONSTANT_REGISTER_DECLARATION(Register, noreg, (-1)); |
aoqi@1 | 68 | |
aoqi@1 | 69 | |
aoqi@1 | 70 | CONSTANT_REGISTER_DECLARATION(Register, i0, (0)); |
aoqi@1 | 71 | CONSTANT_REGISTER_DECLARATION(Register, i1, (1)); |
aoqi@1 | 72 | CONSTANT_REGISTER_DECLARATION(Register, i2, (2)); |
aoqi@1 | 73 | CONSTANT_REGISTER_DECLARATION(Register, i3, (3)); |
aoqi@1 | 74 | CONSTANT_REGISTER_DECLARATION(Register, i4, (4)); |
aoqi@1 | 75 | CONSTANT_REGISTER_DECLARATION(Register, i5, (5)); |
aoqi@1 | 76 | CONSTANT_REGISTER_DECLARATION(Register, i6, (6)); |
aoqi@1 | 77 | CONSTANT_REGISTER_DECLARATION(Register, i7, (7)); |
aoqi@1 | 78 | CONSTANT_REGISTER_DECLARATION(Register, i8, (8)); |
aoqi@1 | 79 | CONSTANT_REGISTER_DECLARATION(Register, i9, (9)); |
aoqi@1 | 80 | CONSTANT_REGISTER_DECLARATION(Register, i10, (10)); |
aoqi@1 | 81 | CONSTANT_REGISTER_DECLARATION(Register, i11, (11)); |
aoqi@1 | 82 | CONSTANT_REGISTER_DECLARATION(Register, i12, (12)); |
aoqi@1 | 83 | CONSTANT_REGISTER_DECLARATION(Register, i13, (13)); |
aoqi@1 | 84 | CONSTANT_REGISTER_DECLARATION(Register, i14, (14)); |
aoqi@1 | 85 | CONSTANT_REGISTER_DECLARATION(Register, i15, (15)); |
aoqi@1 | 86 | CONSTANT_REGISTER_DECLARATION(Register, i16, (16)); |
aoqi@1 | 87 | CONSTANT_REGISTER_DECLARATION(Register, i17, (17)); |
aoqi@1 | 88 | CONSTANT_REGISTER_DECLARATION(Register, i18, (18)); |
aoqi@1 | 89 | CONSTANT_REGISTER_DECLARATION(Register, i19, (19)); |
aoqi@1 | 90 | CONSTANT_REGISTER_DECLARATION(Register, i20, (20)); |
aoqi@1 | 91 | CONSTANT_REGISTER_DECLARATION(Register, i21, (21)); |
aoqi@1 | 92 | CONSTANT_REGISTER_DECLARATION(Register, i22, (22)); |
aoqi@1 | 93 | CONSTANT_REGISTER_DECLARATION(Register, i23, (23)); |
aoqi@1 | 94 | CONSTANT_REGISTER_DECLARATION(Register, i24, (24)); |
aoqi@1 | 95 | CONSTANT_REGISTER_DECLARATION(Register, i25, (25)); |
aoqi@1 | 96 | CONSTANT_REGISTER_DECLARATION(Register, i26, (26)); |
aoqi@1 | 97 | CONSTANT_REGISTER_DECLARATION(Register, i27, (27)); |
aoqi@1 | 98 | CONSTANT_REGISTER_DECLARATION(Register, i28, (28)); |
aoqi@1 | 99 | CONSTANT_REGISTER_DECLARATION(Register, i29, (29)); |
aoqi@1 | 100 | CONSTANT_REGISTER_DECLARATION(Register, i30, (30)); |
aoqi@1 | 101 | CONSTANT_REGISTER_DECLARATION(Register, i31, (31)); |
aoqi@1 | 102 | |
aoqi@1 | 103 | //o32 convention registers |
aoqi@1 | 104 | /*CONSTANT_REGISTER_DECLARATION(Register, zero , ( 0)); |
aoqi@1 | 105 | CONSTANT_REGISTER_DECLARATION(Register, at , ( 1)); |
aoqi@1 | 106 | CONSTANT_REGISTER_DECLARATION(Register, v0 , ( 2)); |
aoqi@1 | 107 | CONSTANT_REGISTER_DECLARATION(Register, v1 , ( 3)); |
aoqi@1 | 108 | CONSTANT_REGISTER_DECLARATION(Register, a0 , ( 4)); |
aoqi@1 | 109 | CONSTANT_REGISTER_DECLARATION(Register, a1 , ( 5)); |
aoqi@1 | 110 | CONSTANT_REGISTER_DECLARATION(Register, a2 , ( 6)); |
aoqi@1 | 111 | CONSTANT_REGISTER_DECLARATION(Register, a3 , ( 7)); |
aoqi@1 | 112 | CONSTANT_REGISTER_DECLARATION(Register, t0 , ( 8)); |
aoqi@1 | 113 | CONSTANT_REGISTER_DECLARATION(Register, t1 , ( 9)); |
aoqi@1 | 114 | CONSTANT_REGISTER_DECLARATION(Register, t2 , ( 10)); |
aoqi@1 | 115 | CONSTANT_REGISTER_DECLARATION(Register, t3 , ( 11)); |
aoqi@1 | 116 | CONSTANT_REGISTER_DECLARATION(Register, t4 , ( 12)); |
aoqi@1 | 117 | CONSTANT_REGISTER_DECLARATION(Register, t5 , ( 13)); |
aoqi@1 | 118 | CONSTANT_REGISTER_DECLARATION(Register, t6 , ( 14)); |
aoqi@1 | 119 | CONSTANT_REGISTER_DECLARATION(Register, t7 , ( 15)); |
aoqi@1 | 120 | CONSTANT_REGISTER_DECLARATION(Register, s0 , ( 16)); |
aoqi@1 | 121 | CONSTANT_REGISTER_DECLARATION(Register, s1 , ( 17)); |
aoqi@1 | 122 | CONSTANT_REGISTER_DECLARATION(Register, s2 , ( 18)); |
aoqi@1 | 123 | CONSTANT_REGISTER_DECLARATION(Register, s3 , ( 19)); |
aoqi@1 | 124 | CONSTANT_REGISTER_DECLARATION(Register, s4 , ( 20)); |
aoqi@1 | 125 | CONSTANT_REGISTER_DECLARATION(Register, s5 , ( 21)); |
aoqi@1 | 126 | CONSTANT_REGISTER_DECLARATION(Register, s6 , ( 22)); |
aoqi@1 | 127 | CONSTANT_REGISTER_DECLARATION(Register, s7 , ( 23)); |
aoqi@1 | 128 | CONSTANT_REGISTER_DECLARATION(Register, t8 , ( 24)); |
aoqi@1 | 129 | CONSTANT_REGISTER_DECLARATION(Register, t9 , ( 25)); |
aoqi@1 | 130 | CONSTANT_REGISTER_DECLARATION(Register, k0 , ( 26)); |
aoqi@1 | 131 | CONSTANT_REGISTER_DECLARATION(Register, k1 , ( 27)); |
aoqi@1 | 132 | CONSTANT_REGISTER_DECLARATION(Register, gp , ( 28)); |
aoqi@1 | 133 | CONSTANT_REGISTER_DECLARATION(Register, sp , ( 29)); |
aoqi@1 | 134 | CONSTANT_REGISTER_DECLARATION(Register, fp , ( 30)); |
aoqi@1 | 135 | CONSTANT_REGISTER_DECLARATION(Register, s8 , ( 30)); |
aoqi@1 | 136 | CONSTANT_REGISTER_DECLARATION(Register, ra , ( 31));*/ |
aoqi@1 | 137 | |
aoqi@1 | 138 | #ifndef DONT_USE_REGISTER_DEFINES |
aoqi@1 | 139 | #define NOREG ((Register)(noreg_RegisterEnumValue)) |
aoqi@1 | 140 | |
aoqi@1 | 141 | #define I0 ((Register)(i0_RegisterEnumValue)) |
aoqi@1 | 142 | #define I1 ((Register)(i1_RegisterEnumValue)) |
aoqi@1 | 143 | #define I2 ((Register)(i2_RegisterEnumValue)) |
aoqi@1 | 144 | #define I3 ((Register)(i3_RegisterEnumValue)) |
aoqi@1 | 145 | #define I4 ((Register)(i4_RegisterEnumValue)) |
aoqi@1 | 146 | #define I5 ((Register)(i5_RegisterEnumValue)) |
aoqi@1 | 147 | #define I6 ((Register)(i6_RegisterEnumValue)) |
aoqi@1 | 148 | #define I7 ((Register)(i7_RegisterEnumValue)) |
aoqi@1 | 149 | #define I8 ((Register)(i8_RegisterEnumValue)) |
aoqi@1 | 150 | #define I9 ((Register)(i9_RegisterEnumValue)) |
aoqi@1 | 151 | #define I10 ((Register)(i10_RegisterEnumValue)) |
aoqi@1 | 152 | #define I11 ((Register)(i11_RegisterEnumValue)) |
aoqi@1 | 153 | #define I12 ((Register)(i12_RegisterEnumValue)) |
aoqi@1 | 154 | #define I13 ((Register)(i13_RegisterEnumValue)) |
aoqi@1 | 155 | #define I14 ((Register)(i14_RegisterEnumValue)) |
aoqi@1 | 156 | #define I15 ((Register)(i15_RegisterEnumValue)) |
aoqi@1 | 157 | #define I16 ((Register)(i16_RegisterEnumValue)) |
aoqi@1 | 158 | #define I17 ((Register)(i17_RegisterEnumValue)) |
aoqi@1 | 159 | #define I18 ((Register)(i18_RegisterEnumValue)) |
aoqi@1 | 160 | #define I19 ((Register)(i19_RegisterEnumValue)) |
aoqi@1 | 161 | #define I20 ((Register)(i20_RegisterEnumValue)) |
aoqi@1 | 162 | #define I21 ((Register)(i21_RegisterEnumValue)) |
aoqi@1 | 163 | #define I22 ((Register)(i22_RegisterEnumValue)) |
aoqi@1 | 164 | #define I23 ((Register)(i23_RegisterEnumValue)) |
aoqi@1 | 165 | #define I24 ((Register)(i24_RegisterEnumValue)) |
aoqi@1 | 166 | #define I25 ((Register)(i25_RegisterEnumValue)) |
aoqi@1 | 167 | #define I26 ((Register)(i26_RegisterEnumValue)) |
aoqi@1 | 168 | #define I27 ((Register)(i27_RegisterEnumValue)) |
aoqi@1 | 169 | #define I28 ((Register)(i28_RegisterEnumValue)) |
aoqi@1 | 170 | #define I29 ((Register)(i29_RegisterEnumValue)) |
aoqi@1 | 171 | #define I30 ((Register)(i30_RegisterEnumValue)) |
aoqi@1 | 172 | #define I31 ((Register)(i31_RegisterEnumValue)) |
aoqi@1 | 173 | |
aoqi@1 | 174 | #ifndef _LP64 |
aoqi@1 | 175 | |
aoqi@1 | 176 | #define R0 ((Register)(i0_RegisterEnumValue)) |
aoqi@1 | 177 | #define AT ((Register)(i1_RegisterEnumValue)) |
aoqi@1 | 178 | #define V0 ((Register)(i2_RegisterEnumValue)) |
aoqi@1 | 179 | #define V1 ((Register)(i3_RegisterEnumValue)) |
aoqi@1 | 180 | #define A0 ((Register)(i4_RegisterEnumValue)) |
aoqi@1 | 181 | #define A1 ((Register)(i5_RegisterEnumValue)) |
aoqi@1 | 182 | #define A2 ((Register)(i6_RegisterEnumValue)) |
aoqi@1 | 183 | #define A3 ((Register)(i7_RegisterEnumValue)) |
aoqi@1 | 184 | #define T0 ((Register)(i8_RegisterEnumValue)) |
aoqi@1 | 185 | #define T1 ((Register)(i9_RegisterEnumValue)) |
aoqi@1 | 186 | #define T2 ((Register)(i10_RegisterEnumValue)) |
aoqi@1 | 187 | #define T3 ((Register)(i11_RegisterEnumValue)) |
aoqi@1 | 188 | #define T4 ((Register)(i12_RegisterEnumValue)) |
aoqi@1 | 189 | #define T5 ((Register)(i13_RegisterEnumValue)) |
aoqi@1 | 190 | #define T6 ((Register)(i14_RegisterEnumValue)) |
aoqi@1 | 191 | #define T7 ((Register)(i15_RegisterEnumValue)) |
aoqi@1 | 192 | #define S0 ((Register)(i16_RegisterEnumValue)) |
aoqi@1 | 193 | #define S1 ((Register)(i17_RegisterEnumValue)) |
aoqi@1 | 194 | #define S2 ((Register)(i18_RegisterEnumValue)) |
aoqi@1 | 195 | #define S3 ((Register)(i19_RegisterEnumValue)) |
aoqi@1 | 196 | #define S4 ((Register)(i20_RegisterEnumValue)) |
aoqi@1 | 197 | #define S5 ((Register)(i21_RegisterEnumValue)) |
aoqi@1 | 198 | #define S6 ((Register)(i22_RegisterEnumValue)) |
aoqi@1 | 199 | #define S7 ((Register)(i23_RegisterEnumValue)) |
aoqi@1 | 200 | #define T8 ((Register)(i24_RegisterEnumValue)) |
aoqi@1 | 201 | #define T9 ((Register)(i25_RegisterEnumValue)) |
aoqi@1 | 202 | #define K0 ((Register)(i26_RegisterEnumValue)) |
aoqi@1 | 203 | #define K1 ((Register)(i27_RegisterEnumValue)) |
aoqi@1 | 204 | #define GP ((Register)(i28_RegisterEnumValue)) |
aoqi@1 | 205 | #define SP ((Register)(i29_RegisterEnumValue)) |
aoqi@1 | 206 | #define FP ((Register)(i30_RegisterEnumValue)) |
aoqi@1 | 207 | #define S8 ((Register)(i30_RegisterEnumValue)) |
aoqi@1 | 208 | #define RA ((Register)(i31_RegisterEnumValue)) |
aoqi@1 | 209 | |
aoqi@1 | 210 | #else |
aoqi@1 | 211 | |
aoqi@1 | 212 | #define R0 ((Register)(i0_RegisterEnumValue)) |
aoqi@1 | 213 | #define AT ((Register)(i1_RegisterEnumValue)) |
aoqi@1 | 214 | #define V0 ((Register)(i2_RegisterEnumValue)) |
aoqi@1 | 215 | #define V1 ((Register)(i3_RegisterEnumValue)) |
aoqi@1 | 216 | #define A0 ((Register)(i4_RegisterEnumValue)) |
aoqi@1 | 217 | #define A1 ((Register)(i5_RegisterEnumValue)) |
aoqi@1 | 218 | #define A2 ((Register)(i6_RegisterEnumValue)) |
aoqi@1 | 219 | #define A3 ((Register)(i7_RegisterEnumValue)) |
aoqi@1 | 220 | #define A4 ((Register)(i8_RegisterEnumValue)) |
aoqi@1 | 221 | #define A5 ((Register)(i9_RegisterEnumValue)) |
aoqi@1 | 222 | #define A6 ((Register)(i10_RegisterEnumValue)) |
aoqi@1 | 223 | #define A7 ((Register)(i11_RegisterEnumValue)) |
aoqi@1 | 224 | #define T0 ((Register)(i12_RegisterEnumValue)) |
aoqi@1 | 225 | #define T1 ((Register)(i13_RegisterEnumValue)) |
aoqi@1 | 226 | #define T2 ((Register)(i14_RegisterEnumValue)) |
aoqi@1 | 227 | #define T3 ((Register)(i15_RegisterEnumValue)) |
aoqi@1 | 228 | #define S0 ((Register)(i16_RegisterEnumValue)) |
aoqi@1 | 229 | #define S1 ((Register)(i17_RegisterEnumValue)) |
aoqi@1 | 230 | #define S2 ((Register)(i18_RegisterEnumValue)) |
aoqi@1 | 231 | #define S3 ((Register)(i19_RegisterEnumValue)) |
aoqi@1 | 232 | #define S4 ((Register)(i20_RegisterEnumValue)) |
aoqi@1 | 233 | #define S5 ((Register)(i21_RegisterEnumValue)) |
aoqi@1 | 234 | #define S6 ((Register)(i22_RegisterEnumValue)) |
aoqi@1 | 235 | #define S7 ((Register)(i23_RegisterEnumValue)) |
aoqi@1 | 236 | #define T8 ((Register)(i24_RegisterEnumValue)) |
aoqi@1 | 237 | #define T9 ((Register)(i25_RegisterEnumValue)) |
aoqi@1 | 238 | #define K0 ((Register)(i26_RegisterEnumValue)) |
aoqi@1 | 239 | #define K1 ((Register)(i27_RegisterEnumValue)) |
aoqi@1 | 240 | #define GP ((Register)(i28_RegisterEnumValue)) |
aoqi@1 | 241 | #define SP ((Register)(i29_RegisterEnumValue)) |
aoqi@1 | 242 | #define FP ((Register)(i30_RegisterEnumValue)) |
aoqi@1 | 243 | #define S8 ((Register)(i30_RegisterEnumValue)) |
aoqi@1 | 244 | #define RA ((Register)(i31_RegisterEnumValue)) |
aoqi@1 | 245 | /* |
aoqi@1 | 246 | #define TA0 ((Register)(i8_RegisterEnumValue)) |
aoqi@1 | 247 | #define TA1 ((Register)(i9_RegisterEnumValue)) |
aoqi@1 | 248 | #define TA2 ((Register)(i10_RegisterEnumValue)) |
aoqi@1 | 249 | #define TA3 ((Register)(i11_RegisterEnumValue)) |
aoqi@1 | 250 | #define T4 ((Register)(i12_RegisterEnumValue)) |
aoqi@1 | 251 | #define T5 ((Register)(i13_RegisterEnumValue)) |
aoqi@1 | 252 | #define T6 ((Register)(i14_RegisterEnumValue)) |
aoqi@1 | 253 | #define T7 ((Register)(i15_RegisterEnumValue)) |
aoqi@1 | 254 | */ |
aoqi@1 | 255 | #define c_rarg0 T0 |
aoqi@1 | 256 | #define c_rarg1 T1 |
aoqi@1 | 257 | #define Rmethod S3 |
aoqi@1 | 258 | #define Rsender S4 |
aoqi@1 | 259 | #define Rnext S1 |
aoqi@1 | 260 | |
aoqi@1 | 261 | #define RT0 T0 |
aoqi@1 | 262 | #define RT1 T1 |
aoqi@1 | 263 | #define RT2 T2 |
aoqi@1 | 264 | #define RT3 T3 |
aoqi@1 | 265 | #define RT4 T8 |
aoqi@1 | 266 | #define RT5 T9 |
aoqi@1 | 267 | #endif //_LP64 |
aoqi@1 | 268 | |
aoqi@1 | 269 | |
aoqi@1 | 270 | //for interpreter frame |
aoqi@1 | 271 | // bytecode pointer register |
aoqi@1 | 272 | #define BCP S0 |
aoqi@1 | 273 | // local variable pointer register |
aoqi@1 | 274 | #define LVP S7 |
aoqi@1 | 275 | // temperary callee saved register, we use this register to save the register maybe blowed cross call_VM |
aoqi@1 | 276 | // be sure to save and restore its value in call_stub |
aoqi@1 | 277 | #define TSR S2 |
aoqi@1 | 278 | |
aoqi@1 | 279 | /* 2013/7/10 Jin: OPT_SAFEPOINT not supported yet */ |
aoqi@1 | 280 | #define OPT_SAFEPOINT 1 |
aoqi@1 | 281 | |
aoqi@1 | 282 | #define OPT_THREAD 1 |
aoqi@1 | 283 | |
aoqi@1 | 284 | #define TREG S6 |
aoqi@1 | 285 | |
aoqi@1 | 286 | #define S5_heapbase S5 |
aoqi@1 | 287 | |
aoqi@1 | 288 | #define mh_SP_save SP |
aoqi@1 | 289 | |
aoqi@1 | 290 | #define FSR V0 |
aoqi@1 | 291 | #define SSR V1 |
aoqi@1 | 292 | #define FSF F0 |
aoqi@1 | 293 | #define SSF F1 |
aoqi@1 | 294 | #define FTF F14 |
aoqi@1 | 295 | #define STF F15 |
aoqi@1 | 296 | |
aoqi@1 | 297 | #define AFT F30 |
aoqi@1 | 298 | |
aoqi@1 | 299 | #define RECEIVER T0 |
aoqi@1 | 300 | #define IC_Klass T1 |
aoqi@1 | 301 | |
aoqi@1 | 302 | #define SHIFT_count T3 |
aoqi@1 | 303 | |
aoqi@1 | 304 | #endif // DONT_USE_REGISTER_DEFINES |
aoqi@1 | 305 | |
aoqi@1 | 306 | // Use FloatRegister as shortcut |
aoqi@1 | 307 | class FloatRegisterImpl; |
aoqi@1 | 308 | typedef FloatRegisterImpl* FloatRegister; |
aoqi@1 | 309 | |
aoqi@1 | 310 | inline FloatRegister as_FloatRegister(int encoding) { |
aoqi@1 | 311 | return (FloatRegister)(intptr_t) encoding; |
aoqi@1 | 312 | } |
aoqi@1 | 313 | |
aoqi@1 | 314 | // The implementation of floating point registers for the ia32 architecture |
aoqi@1 | 315 | class FloatRegisterImpl: public AbstractRegisterImpl { |
aoqi@1 | 316 | public: |
aoqi@1 | 317 | enum { |
aoqi@1 | 318 | float_arg_base = 12, |
aoqi@1 | 319 | number_of_registers = 32 |
aoqi@1 | 320 | }; |
aoqi@1 | 321 | |
aoqi@1 | 322 | // construction |
aoqi@1 | 323 | inline friend FloatRegister as_FloatRegister(int encoding); |
aoqi@1 | 324 | |
aoqi@1 | 325 | VMReg as_VMReg(); |
aoqi@1 | 326 | |
aoqi@1 | 327 | // derived registers, offsets, and addresses |
aoqi@1 | 328 | FloatRegister successor() const { return as_FloatRegister(encoding() + 1); } |
aoqi@1 | 329 | |
aoqi@1 | 330 | // accessors |
aoqi@1 | 331 | int encoding() const { assert(is_valid(), "invalid register"); return (intptr_t)this; } |
aoqi@1 | 332 | bool is_valid() const { return 0 <= (intptr_t)this && (intptr_t)this < number_of_registers; } |
aoqi@1 | 333 | const char* name() const; |
aoqi@1 | 334 | |
aoqi@1 | 335 | }; |
aoqi@1 | 336 | |
aoqi@1 | 337 | CONSTANT_REGISTER_DECLARATION(FloatRegister, fnoreg , (-1)); |
aoqi@1 | 338 | |
aoqi@1 | 339 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f0 , ( 0)); |
aoqi@1 | 340 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f1 , ( 1)); |
aoqi@1 | 341 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f2 , ( 2)); |
aoqi@1 | 342 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f3 , ( 3)); |
aoqi@1 | 343 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f4 , ( 4)); |
aoqi@1 | 344 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f5 , ( 5)); |
aoqi@1 | 345 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f6 , ( 6)); |
aoqi@1 | 346 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f7 , ( 7)); |
aoqi@1 | 347 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f8 , ( 8)); |
aoqi@1 | 348 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f9 , ( 9)); |
aoqi@1 | 349 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f10 , (10)); |
aoqi@1 | 350 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f11 , (11)); |
aoqi@1 | 351 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f12 , (12)); |
aoqi@1 | 352 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f13 , (13)); |
aoqi@1 | 353 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f14 , (14)); |
aoqi@1 | 354 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f15 , (15)); |
aoqi@1 | 355 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f16 , (16)); |
aoqi@1 | 356 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f17 , (17)); |
aoqi@1 | 357 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f18 , (18)); |
aoqi@1 | 358 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f19 , (19)); |
aoqi@1 | 359 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f20 , (20)); |
aoqi@1 | 360 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f21 , (21)); |
aoqi@1 | 361 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f22 , (22)); |
aoqi@1 | 362 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f23 , (23)); |
aoqi@1 | 363 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f24 , (24)); |
aoqi@1 | 364 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f25 , (25)); |
aoqi@1 | 365 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f26 , (26)); |
aoqi@1 | 366 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f27 , (27)); |
aoqi@1 | 367 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f28 , (28)); |
aoqi@1 | 368 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f29 , (29)); |
aoqi@1 | 369 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f30 , (30)); |
aoqi@1 | 370 | CONSTANT_REGISTER_DECLARATION(FloatRegister, f31 , (31)); |
aoqi@1 | 371 | |
aoqi@1 | 372 | #ifndef DONT_USE_REGISTER_DEFINES |
aoqi@1 | 373 | #define FNOREG ((FloatRegister)(fnoreg_FloatRegisterEnumValue)) |
aoqi@1 | 374 | #define F0 ((FloatRegister)( f0_FloatRegisterEnumValue)) |
aoqi@1 | 375 | #define F1 ((FloatRegister)( f1_FloatRegisterEnumValue)) |
aoqi@1 | 376 | #define F2 ((FloatRegister)( f2_FloatRegisterEnumValue)) |
aoqi@1 | 377 | #define F3 ((FloatRegister)( f3_FloatRegisterEnumValue)) |
aoqi@1 | 378 | #define F4 ((FloatRegister)( f4_FloatRegisterEnumValue)) |
aoqi@1 | 379 | #define F5 ((FloatRegister)( f5_FloatRegisterEnumValue)) |
aoqi@1 | 380 | #define F6 ((FloatRegister)( f6_FloatRegisterEnumValue)) |
aoqi@1 | 381 | #define F7 ((FloatRegister)( f7_FloatRegisterEnumValue)) |
aoqi@1 | 382 | #define F8 ((FloatRegister)( f8_FloatRegisterEnumValue)) |
aoqi@1 | 383 | #define F9 ((FloatRegister)( f9_FloatRegisterEnumValue)) |
aoqi@1 | 384 | #define F10 ((FloatRegister)( f10_FloatRegisterEnumValue)) |
aoqi@1 | 385 | #define F11 ((FloatRegister)( f11_FloatRegisterEnumValue)) |
aoqi@1 | 386 | #define F12 ((FloatRegister)( f12_FloatRegisterEnumValue)) |
aoqi@1 | 387 | #define F13 ((FloatRegister)( f13_FloatRegisterEnumValue)) |
aoqi@1 | 388 | #define F14 ((FloatRegister)( f14_FloatRegisterEnumValue)) |
aoqi@1 | 389 | #define F15 ((FloatRegister)( f15_FloatRegisterEnumValue)) |
aoqi@1 | 390 | #define F16 ((FloatRegister)( f16_FloatRegisterEnumValue)) |
aoqi@1 | 391 | #define F17 ((FloatRegister)( f17_FloatRegisterEnumValue)) |
aoqi@1 | 392 | #define F18 ((FloatRegister)( f18_FloatRegisterEnumValue)) |
aoqi@1 | 393 | #define F19 ((FloatRegister)( f19_FloatRegisterEnumValue)) |
aoqi@1 | 394 | #define F20 ((FloatRegister)( f20_FloatRegisterEnumValue)) |
aoqi@1 | 395 | #define F21 ((FloatRegister)( f21_FloatRegisterEnumValue)) |
aoqi@1 | 396 | #define F22 ((FloatRegister)( f22_FloatRegisterEnumValue)) |
aoqi@1 | 397 | #define F23 ((FloatRegister)( f23_FloatRegisterEnumValue)) |
aoqi@1 | 398 | #define F24 ((FloatRegister)( f24_FloatRegisterEnumValue)) |
aoqi@1 | 399 | #define F25 ((FloatRegister)( f25_FloatRegisterEnumValue)) |
aoqi@1 | 400 | #define F26 ((FloatRegister)( f26_FloatRegisterEnumValue)) |
aoqi@1 | 401 | #define F27 ((FloatRegister)( f27_FloatRegisterEnumValue)) |
aoqi@1 | 402 | #define F28 ((FloatRegister)( f28_FloatRegisterEnumValue)) |
aoqi@1 | 403 | #define F29 ((FloatRegister)( f29_FloatRegisterEnumValue)) |
aoqi@1 | 404 | #define F30 ((FloatRegister)( f30_FloatRegisterEnumValue)) |
aoqi@1 | 405 | #define F31 ((FloatRegister)( f31_FloatRegisterEnumValue)) |
aoqi@1 | 406 | #endif // DONT_USE_REGISTER_DEFINES |
aoqi@1 | 407 | |
aoqi@1 | 408 | |
aoqi@1 | 409 | const int MIPS_ARGS_IN_REGS_NUM = 4; |
aoqi@1 | 410 | |
aoqi@1 | 411 | // Need to know the total number of registers of all sorts for SharedInfo. |
aoqi@1 | 412 | // Define a class that exports it. |
aoqi@1 | 413 | class ConcreteRegisterImpl : public AbstractRegisterImpl { |
aoqi@1 | 414 | public: |
aoqi@1 | 415 | enum { |
aoqi@1 | 416 | // A big enough number for C2: all the registers plus flags |
aoqi@1 | 417 | // This number must be large enough to cover REG_COUNT (defined by c2) registers. |
aoqi@1 | 418 | // There is no requirement that any ordering here matches any ordering c2 gives |
aoqi@1 | 419 | // it's optoregs. |
aoqi@1 | 420 | number_of_registers = (RegisterImpl::number_of_registers + FloatRegisterImpl::number_of_registers) |
aoqi@1 | 421 | LP64_ONLY( * 2) |
aoqi@1 | 422 | }; |
aoqi@1 | 423 | |
aoqi@1 | 424 | static const int max_gpr; |
aoqi@1 | 425 | static const int max_fpr; |
aoqi@1 | 426 | |
aoqi@1 | 427 | |
aoqi@1 | 428 | }; |
aoqi@1 | 429 | #endif //CPU_MIPS_VM_REGISTER_MIPS_HPP |