Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/asm/register.hpp
38829 views
/*1* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#ifndef SHARE_VM_ASM_REGISTER_HPP25#define SHARE_VM_ASM_REGISTER_HPP2627#include "utilities/top.hpp"2829// Use AbstractRegister as shortcut30class AbstractRegisterImpl;31typedef AbstractRegisterImpl* AbstractRegister;323334// The super class for platform specific registers. Instead of using value objects,35// registers are implemented as pointers. Subclassing is used so all registers can36// use the debugging suport below. No virtual functions are used for efficiency.37// They are canonicalized; i.e., registers are equal if their pointers are equal,38// and vice versa. A concrete implementation may just map the register onto 'this'.3940class AbstractRegisterImpl {41protected:42int value() const { return (int)(intx)this; }43};444546//47// Macros for use in defining Register instances. We'd like to be48// able to simply define const instances of the RegisterImpl* for each49// of the registers needed on a system in a header file. However many50// compilers don't handle this very well and end up producing a51// private definition in every file which includes the header file.52// Along with the static constructors necessary for initialization it53// can consume a significant amount of space in the result library.54//55// The following macros allow us to declare the instance in a .hpp and56// produce an enumeration value which has the same number. Then in a57// .cpp the the register instance can be defined using the enumeration58// value. This avoids the use of static constructors and multiple59// definitions per .cpp. In addition #defines for the register can be60// produced so that the constant registers can be inlined. These61// macros should not be used inside other macros, because you may get62// multiple evaluations of the macros which can give bad results.63//64// Here are some example uses and expansions. Note that the macro65// invocation is terminated with a ;.66//67// CONSTANT_REGISTER_DECLARATION(Register, G0, 0);68//69// extern const Register G0 ;70// enum { G0_RegisterEnumValue = 0 } ;71//72// REGISTER_DECLARATION(Register, Gmethod, G5);73//74// extern const Register Gmethod ;75// enum { Gmethod_RegisterEnumValue = G5_RegisterEnumValue } ;76//77// REGISTER_DEFINITION(Register, G0);78//79// const Register G0 = ( ( Register ) G0_RegisterEnumValue ) ;80//8182#define AS_REGISTER(type,name) ((type)name##_##type##EnumValue)8384#define CONSTANT_REGISTER_DECLARATION(type, name, value) \85extern const type name; \86enum { name##_##type##EnumValue = (value) }8788#define REGISTER_DECLARATION(type, name, value) \89extern const type name; \90enum { name##_##type##EnumValue = value##_##type##EnumValue }9192#define REGISTER_DEFINITION(type, name) \93const type name = ((type)name##_##type##EnumValue)9495#ifdef TARGET_ARCH_x8696# include "register_x86.hpp"97#endif98#ifdef TARGET_ARCH_sparc99# include "register_sparc.hpp"100#endif101#ifdef TARGET_ARCH_zero102# include "register_zero.hpp"103#endif104#ifdef TARGET_ARCH_arm105# include "register_arm.hpp"106#endif107#ifdef TARGET_ARCH_ppc108# include "register_ppc.hpp"109#endif110#ifdef TARGET_ARCH_aarch32111# include "register_aarch32.hpp"112#endif113#ifdef TARGET_ARCH_aarch64114# include "register_aarch64.hpp"115#endif116117118// Debugging support119120inline void assert_different_registers(121AbstractRegister a,122AbstractRegister b123) {124assert(125a != b,126err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT "",127p2i(a), p2i(b))128);129}130131132inline void assert_different_registers(133AbstractRegister a,134AbstractRegister b,135AbstractRegister c136) {137assert(138a != b && a != c139&& b != c,140err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT141", c=" INTPTR_FORMAT "",142p2i(a), p2i(b), p2i(c))143);144}145146147inline void assert_different_registers(148AbstractRegister a,149AbstractRegister b,150AbstractRegister c,151AbstractRegister d152) {153assert(154a != b && a != c && a != d155&& b != c && b != d156&& c != d,157err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT158", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT "",159p2i(a), p2i(b), p2i(c), p2i(d))160);161}162163164inline void assert_different_registers(165AbstractRegister a,166AbstractRegister b,167AbstractRegister c,168AbstractRegister d,169AbstractRegister e170) {171assert(172a != b && a != c && a != d && a != e173&& b != c && b != d && b != e174&& c != d && c != e175&& d != e,176err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT177", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT "",178p2i(a), p2i(b), p2i(c), p2i(d), p2i(e))179);180}181182183inline void assert_different_registers(184AbstractRegister a,185AbstractRegister b,186AbstractRegister c,187AbstractRegister d,188AbstractRegister e,189AbstractRegister f190) {191assert(192a != b && a != c && a != d && a != e && a != f193&& b != c && b != d && b != e && b != f194&& c != d && c != e && c != f195&& d != e && d != f196&& e != f,197err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT198", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT199", f=" INTPTR_FORMAT "",200p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f))201);202}203204205inline void assert_different_registers(206AbstractRegister a,207AbstractRegister b,208AbstractRegister c,209AbstractRegister d,210AbstractRegister e,211AbstractRegister f,212AbstractRegister g213) {214assert(215a != b && a != c && a != d && a != e && a != f && a != g216&& b != c && b != d && b != e && b != f && b != g217&& c != d && c != e && c != f && c != g218&& d != e && d != f && d != g219&& e != f && e != g220&& f != g,221err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT222", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT223", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT "",224p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g))225);226}227228229inline void assert_different_registers(230AbstractRegister a,231AbstractRegister b,232AbstractRegister c,233AbstractRegister d,234AbstractRegister e,235AbstractRegister f,236AbstractRegister g,237AbstractRegister h238) {239assert(240a != b && a != c && a != d && a != e && a != f && a != g && a != h241&& b != c && b != d && b != e && b != f && b != g && b != h242&& c != d && c != e && c != f && c != g && c != h243&& d != e && d != f && d != g && d != h244&& e != f && e != g && e != h245&& f != g && f != h246&& g != h,247err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT248", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT249", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT "",250p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h))251);252}253254255inline void assert_different_registers(256AbstractRegister a,257AbstractRegister b,258AbstractRegister c,259AbstractRegister d,260AbstractRegister e,261AbstractRegister f,262AbstractRegister g,263AbstractRegister h,264AbstractRegister i265) {266assert(267a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i268&& b != c && b != d && b != e && b != f && b != g && b != h && b != i269&& c != d && c != e && c != f && c != g && c != h && c != i270&& d != e && d != f && d != g && d != h && d != i271&& e != f && e != g && e != h && e != i272&& f != g && f != h && f != i273&& g != h && g != i274&& h != i,275err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT276", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT277", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT278", i=" INTPTR_FORMAT "",279p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h), p2i(i))280);281}282283inline void assert_different_registers(284AbstractRegister a,285AbstractRegister b,286AbstractRegister c,287AbstractRegister d,288AbstractRegister e,289AbstractRegister f,290AbstractRegister g,291AbstractRegister h,292AbstractRegister i,293AbstractRegister j294) {295assert(296a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i && a != j297&& b != c && b != d && b != e && b != f && b != g && b != h && b != i && b != j298&& c != d && c != e && c != f && c != g && c != h && c != i && c != j299&& d != e && d != f && d != g && d != h && d != i && d != j300&& e != f && e != g && e != h && e != i && e != j301&& f != g && f != h && f != i && f != j302&& g != h && g != i && g != j303&& h != i && h != j304&& i != j,305err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT306", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT307", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT308", i=" INTPTR_FORMAT ", j=" INTPTR_FORMAT "",309p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h), p2i(i), p2i(j))310);311}312313inline void assert_different_registers(314AbstractRegister a,315AbstractRegister b,316AbstractRegister c,317AbstractRegister d,318AbstractRegister e,319AbstractRegister f,320AbstractRegister g,321AbstractRegister h,322AbstractRegister i,323AbstractRegister j,324AbstractRegister k325) {326assert(327a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i && a != j && a !=k328&& b != c && b != d && b != e && b != f && b != g && b != h && b != i && b != j && b !=k329&& c != d && c != e && c != f && c != g && c != h && c != i && c != j && c !=k330&& d != e && d != f && d != g && d != h && d != i && d != j && d !=k331&& e != f && e != g && e != h && e != i && e != j && e !=k332&& f != g && f != h && f != i && f != j && f !=k333&& g != h && g != i && g != j && g !=k334&& h != i && h != j && h !=k335&& i != j && i !=k336&& j !=k,337err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT338", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT339", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT340", i=" INTPTR_FORMAT ", j=" INTPTR_FORMAT ", k=" INTPTR_FORMAT "",341p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h), p2i(i), p2i(j), p2i(k))342);343}344345inline void assert_different_registers(346AbstractRegister a,347AbstractRegister b,348AbstractRegister c,349AbstractRegister d,350AbstractRegister e,351AbstractRegister f,352AbstractRegister g,353AbstractRegister h,354AbstractRegister i,355AbstractRegister j,356AbstractRegister k,357AbstractRegister l358) {359assert(360a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i && a != j && a !=k && a !=l361&& b != c && b != d && b != e && b != f && b != g && b != h && b != i && b != j && b !=k && b !=l362&& c != d && c != e && c != f && c != g && c != h && c != i && c != j && c !=k && c !=l363&& d != e && d != f && d != g && d != h && d != i && d != j && d !=k && d !=l364&& e != f && e != g && e != h && e != i && e != j && e !=k && e !=l365&& f != g && f != h && f != i && f != j && f !=k && f !=l366&& g != h && g != i && g != j && g !=k && g !=l367&& h != i && h != j && h !=k && h !=l368&& i != j && i !=k && i !=l369&& j !=k && j !=l370&& k !=l,371err_msg_res("registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT372", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT373", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT374", i=" INTPTR_FORMAT ", j=" INTPTR_FORMAT ", k=" INTPTR_FORMAT375", l=" INTPTR_FORMAT "",376p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h), p2i(i), p2i(j), p2i(k), p2i(l))377);378}379380#endif // SHARE_VM_ASM_REGISTER_HPP381382383