これらは, x86 におけるレジスタを表すクラス.
AbstractRegisterImpl クラスの具象サブクラスの1つ.
このクラスは x86 の汎用レジスタを表す. 1つの RegisterImpl オブジェクトが 1本の汎用レジスタに対応する.
((cite: hotspot/src/cpu/x86/vm/register_x86.hpp))
class RegisterImpl: public AbstractRegisterImpl {
なお Register という型も使われるが, これは RegisterImpl* の別名.
((cite: hotspot/src/cpu/x86/vm/register_x86.hpp))
typedef RegisterImpl* Register;
内部には 1つの int 値だけを持つ
なお int 型のフィールドを持つわけではなく, int 値を RegisterImpl* にキャストして使用する (See: as_Register()).
(つまり, RegisterImpl クラス内ではこの int 値に "this" でアクセスできる)
(あるいは, int 値にアクセスするための encoding() というアクセサメソッドも用意されている)
See: here for details
なお, レジスタを表すという意味では VMReg クラスとも少し似ている.
ただし VMReg では 1 オブジェクトが 32bit (固定長) に対応するのに対し, RegisterImpl では 1 オブジェクトはレジスタ1つ (環境によって可変) に対応する.
このため VMReg の番号との対応は, 32bit なら恒等写像, 64bit なら2倍した値.
See: here for details
AbstractRegisterImpl クラスの具象サブクラスの1つ.
このクラスは x86 の浮動小数レジスタ(x87 レジスタ)を表す. 1つの FloatRegisterImpl オブジェクトが 1本の浮動小数レジスタに対応する.
((cite: hotspot/src/cpu/x86/vm/register_x86.hpp))
// The implementation of floating point registers for the ia32 architecture
class FloatRegisterImpl: public AbstractRegisterImpl {
なお FloatRegister という型も使われるが, これは FloatRegisterImpl* の別名.
((cite: hotspot/src/cpu/x86/vm/register_x86.hpp))
typedef FloatRegisterImpl* FloatRegister;
内部には 1つの int 値だけを持つ.
なお int 型のフィールドを持つわけではなく, int 値を FloatRegisterImpl* にキャストして使用する (See: as_FloatRegister().
(つまり, FloatRegisterImpl クラス内ではこの int 値に "this" でアクセスできる)
(あるいは, int 値にアクセスするための encoding() というアクセサメソッドも用意されている)
See: here for details
なお, レジスタを表すという意味では VMReg クラスとも少し似ている.
ただし VMReg では 1 オブジェクトが 32bit (固定長) に対応するのに対し, FloatRegisterImpl では 1 オブジェクトは 64bit (固定長) に対応する.
このため VMReg の番号との対応は, 2倍した値+ConcreteRegisterImpl::max_gpr.
See: here for details
AbstractRegisterImpl クラスの具象サブクラスの1つ.
このクラスは x86 の XMM レジスタを表す. 1つの XMMRegisterImpl オブジェクトが 1本の XMM レジスタに対応する.
((cite: hotspot/src/cpu/x86/vm/register_x86.hpp))
// The implementation of XMM registers for the IA32 architecture
class XMMRegisterImpl: public AbstractRegisterImpl {
なお XMMRegister という型も使われるが, これは XMMRegisterImpl* の別名.
((cite: hotspot/src/cpu/x86/vm/register_x86.hpp))
typedef XMMRegisterImpl* XMMRegister;
内部には 1つの int 値だけを持つ.
なお int 型のフィールドを持つわけではなく, int 値を XMMRegisterImpl* にキャストして使用する (See: as_XMMRegister()).
(つまり, XMMRegisterImpl クラス内ではこの int 値に "this" でアクセスできる)
(あるいは, int 値にアクセスするための encoding() というアクセサメソッドも用意されている)
See: here for details
なお, レジスタを表すという意味では VMReg クラスとも少し似ている.
ただし VMReg では 1 オブジェクトが 32bit (固定長) に対応するのに対し, XMMRegisterImpl では 1 オブジェクトは 64bit (固定長) に対応する.
このため VMReg の番号との対応は, 2倍した値+ConcreteRegisterImpl::max_fpr.
See: here for details
レジスタの本数に関する定数値を納めた名前空間 (このクラスは AllStatic ではないが, static な定義しか持たない).
汎用レジスタ, 浮動小数レジスタ, XMM レジスタの個数を記録している.
((cite: hotspot/src/cpu/x86/vm/register_x86.hpp))
// Need to know the total number of registers of all sorts for SharedInfo.
// Define a class that exports it.
class ConcreteRegisterImpl : public AbstractRegisterImpl {
内部には以下の定数定義およびフィールド定義(のみ)を含む.
((cite: hotspot/src/cpu/x86/vm/register_x86.hpp))
enum {
// A big enough number for C2: all the registers plus flags
// This number must be large enough to cover REG_COUNT (defined by c2) registers.
// There is no requirement that any ordering here matches any ordering c2 gives
// it's optoregs.
number_of_registers = RegisterImpl::number_of_registers +
#ifdef AMD64
RegisterImpl::number_of_registers + // "H" half of a 64bit register
#endif // AMD64
2 * FloatRegisterImpl::number_of_registers +
2 * XMMRegisterImpl::number_of_registers +
1 // eflags
};
((cite: hotspot/src/cpu/x86/vm/register_x86.hpp))
static const int max_gpr;
static const int max_fpr;
static const int max_xmm;
See: here for details
This document is available under the GNU GENERAL PUBLIC LICENSE Version 2.