Path: blob/master/src/hotspot/share/asm/register.hpp
51315 views
/*1* Copyright (c) 2000, 2019, 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_ASM_REGISTER_HPP25#define SHARE_ASM_REGISTER_HPP2627#include "utilities/debug.hpp"28#include "utilities/globalDefinitions.hpp"29#include "utilities/macros.hpp"3031// Use AbstractRegister as shortcut32class AbstractRegisterImpl;33typedef AbstractRegisterImpl* AbstractRegister;343536// The super class for platform specific registers. Instead of using value objects,37// registers are implemented as pointers. Subclassing is used so all registers can38// use the debugging suport below. No virtual functions are used for efficiency.39// They are canonicalized; i.e., registers are equal if their pointers are equal,40// and vice versa. A concrete implementation may just map the register onto 'this'.4142class AbstractRegisterImpl {43protected:44int value() const { return (int)(intx)this; }45};464748//49// Macros for use in defining Register instances. We'd like to be50// able to simply define const instances of the RegisterImpl* for each51// of the registers needed on a system in a header file. However many52// compilers don't handle this very well and end up producing a53// private definition in every file which includes the header file.54// Along with the static constructors necessary for initialization it55// can consume a significant amount of space in the result library.56//57// The following macros allow us to declare the instance in a .hpp and58// produce an enumeration value which has the same number. Then in a59// .cpp the the register instance can be defined using the enumeration60// value. This avoids the use of static constructors and multiple61// definitions per .cpp. In addition #defines for the register can be62// produced so that the constant registers can be inlined. These63// macros should not be used inside other macros, because you may get64// multiple evaluations of the macros which can give bad results.65//66// Here are some example uses and expansions. Note that the macro67// invocation is terminated with a ;.68//69// CONSTANT_REGISTER_DECLARATION(Register, G0, 0);70//71// extern const Register G0 ;72// enum { G0_RegisterEnumValue = 0 } ;73//74// REGISTER_DECLARATION(Register, Gmethod, G5);75//76// extern const Register Gmethod ;77// enum { Gmethod_RegisterEnumValue = G5_RegisterEnumValue } ;78//79// REGISTER_DEFINITION(Register, G0);80//81// const Register G0 = ( ( Register ) G0_RegisterEnumValue ) ;82//8384#define AS_REGISTER(type,name) ((type)name##_##type##EnumValue)8586#define CONSTANT_REGISTER_DECLARATION(type, name, value) \87extern const type name; \88enum { name##_##type##EnumValue = (value) }8990#define REGISTER_DECLARATION(type, name, value) \91extern const type name; \92enum { name##_##type##EnumValue = value##_##type##EnumValue }9394#define REGISTER_DEFINITION(type, name) \95const type name = ((type)name##_##type##EnumValue)9697#include CPU_HEADER(register)9899// Debugging support100101inline void assert_different_registers(102AbstractRegister a,103AbstractRegister b104) {105assert(106a != b,107"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT "", p2i(a), p2i(b)108);109}110111112inline void assert_different_registers(113AbstractRegister a,114AbstractRegister b,115AbstractRegister c116) {117assert(118a != b && a != c119&& b != c,120"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT121", c=" INTPTR_FORMAT "",122p2i(a), p2i(b), p2i(c)123);124}125126127inline void assert_different_registers(128AbstractRegister a,129AbstractRegister b,130AbstractRegister c,131AbstractRegister d132) {133assert(134a != b && a != c && a != d135&& b != c && b != d136&& c != d,137"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT138", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT "",139p2i(a), p2i(b), p2i(c), p2i(d)140);141}142143144inline void assert_different_registers(145AbstractRegister a,146AbstractRegister b,147AbstractRegister c,148AbstractRegister d,149AbstractRegister e150) {151assert(152a != b && a != c && a != d && a != e153&& b != c && b != d && b != e154&& c != d && c != e155&& d != e,156"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT157", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT "",158p2i(a), p2i(b), p2i(c), p2i(d), p2i(e)159);160}161162163inline void assert_different_registers(164AbstractRegister a,165AbstractRegister b,166AbstractRegister c,167AbstractRegister d,168AbstractRegister e,169AbstractRegister f170) {171assert(172a != b && a != c && a != d && a != e && a != f173&& b != c && b != d && b != e && b != f174&& c != d && c != e && c != f175&& d != e && d != f176&& e != f,177"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT178", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT179", f=" INTPTR_FORMAT "",180p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f)181);182}183184185inline void assert_different_registers(186AbstractRegister a,187AbstractRegister b,188AbstractRegister c,189AbstractRegister d,190AbstractRegister e,191AbstractRegister f,192AbstractRegister g193) {194assert(195a != b && a != c && a != d && a != e && a != f && a != g196&& b != c && b != d && b != e && b != f && b != g197&& c != d && c != e && c != f && c != g198&& d != e && d != f && d != g199&& e != f && e != g200&& f != g,201"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT202", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT203", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT "",204p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g)205);206}207208209inline void assert_different_registers(210AbstractRegister a,211AbstractRegister b,212AbstractRegister c,213AbstractRegister d,214AbstractRegister e,215AbstractRegister f,216AbstractRegister g,217AbstractRegister h218) {219assert(220a != b && a != c && a != d && a != e && a != f && a != g && a != h221&& b != c && b != d && b != e && b != f && b != g && b != h222&& c != d && c != e && c != f && c != g && c != h223&& d != e && d != f && d != g && d != h224&& e != f && e != g && e != h225&& f != g && f != h226&& g != h,227"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT228", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT229", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT "",230p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h)231);232}233234235inline void assert_different_registers(236AbstractRegister a,237AbstractRegister b,238AbstractRegister c,239AbstractRegister d,240AbstractRegister e,241AbstractRegister f,242AbstractRegister g,243AbstractRegister h,244AbstractRegister i245) {246assert(247a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i248&& b != c && b != d && b != e && b != f && b != g && b != h && b != i249&& c != d && c != e && c != f && c != g && c != h && c != i250&& d != e && d != f && d != g && d != h && d != i251&& e != f && e != g && e != h && e != i252&& f != g && f != h && f != i253&& g != h && g != i254&& h != i,255"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT256", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT257", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT258", i=" INTPTR_FORMAT "",259p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h), p2i(i)260);261}262263inline void assert_different_registers(264AbstractRegister a,265AbstractRegister b,266AbstractRegister c,267AbstractRegister d,268AbstractRegister e,269AbstractRegister f,270AbstractRegister g,271AbstractRegister h,272AbstractRegister i,273AbstractRegister j274) {275assert(276a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i && a != j277&& b != c && b != d && b != e && b != f && b != g && b != h && b != i && b != j278&& c != d && c != e && c != f && c != g && c != h && c != i && c != j279&& d != e && d != f && d != g && d != h && d != i && d != j280&& e != f && e != g && e != h && e != i && e != j281&& f != g && f != h && f != i && f != j282&& g != h && g != i && g != j283&& h != i && h != j284&& i != j,285"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT286", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT287", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT288", i=" INTPTR_FORMAT ", j=" INTPTR_FORMAT "",289p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h), p2i(i), p2i(j)290);291}292293inline void assert_different_registers(294AbstractRegister a,295AbstractRegister b,296AbstractRegister c,297AbstractRegister d,298AbstractRegister e,299AbstractRegister f,300AbstractRegister g,301AbstractRegister h,302AbstractRegister i,303AbstractRegister j,304AbstractRegister k305) {306assert(307a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i && a != j && a !=k308&& b != c && b != d && b != e && b != f && b != g && b != h && b != i && b != j && b !=k309&& c != d && c != e && c != f && c != g && c != h && c != i && c != j && c !=k310&& d != e && d != f && d != g && d != h && d != i && d != j && d !=k311&& e != f && e != g && e != h && e != i && e != j && e !=k312&& f != g && f != h && f != i && f != j && f !=k313&& g != h && g != i && g != j && g !=k314&& h != i && h != j && h !=k315&& i != j && i !=k316&& j !=k,317"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT318", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT319", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT320", i=" INTPTR_FORMAT ", j=" INTPTR_FORMAT ", k=" INTPTR_FORMAT "",321p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h), p2i(i), p2i(j), p2i(k)322);323}324325inline void assert_different_registers(326AbstractRegister a,327AbstractRegister b,328AbstractRegister c,329AbstractRegister d,330AbstractRegister e,331AbstractRegister f,332AbstractRegister g,333AbstractRegister h,334AbstractRegister i,335AbstractRegister j,336AbstractRegister k,337AbstractRegister l338) {339assert(340a != b && a != c && a != d && a != e && a != f && a != g && a != h && a != i && a != j && a !=k && a !=l341&& b != c && b != d && b != e && b != f && b != g && b != h && b != i && b != j && b !=k && b !=l342&& c != d && c != e && c != f && c != g && c != h && c != i && c != j && c !=k && c !=l343&& d != e && d != f && d != g && d != h && d != i && d != j && d !=k && d !=l344&& e != f && e != g && e != h && e != i && e != j && e !=k && e !=l345&& f != g && f != h && f != i && f != j && f !=k && f !=l346&& g != h && g != i && g != j && g !=k && g !=l347&& h != i && h != j && h !=k && h !=l348&& i != j && i !=k && i !=l349&& j !=k && j !=l350&& k !=l,351"registers must be different: a=" INTPTR_FORMAT ", b=" INTPTR_FORMAT352", c=" INTPTR_FORMAT ", d=" INTPTR_FORMAT ", e=" INTPTR_FORMAT353", f=" INTPTR_FORMAT ", g=" INTPTR_FORMAT ", h=" INTPTR_FORMAT354", i=" INTPTR_FORMAT ", j=" INTPTR_FORMAT ", k=" INTPTR_FORMAT355", l=" INTPTR_FORMAT "",356p2i(a), p2i(b), p2i(c), p2i(d), p2i(e), p2i(f), p2i(g), p2i(h), p2i(i), p2i(j), p2i(k), p2i(l)357);358}359360#endif // SHARE_ASM_REGISTER_HPP361362363