asmjit::VirtReg Class Reference

Virtual register data, managed by BaseCompiler.

Public Members

Members

Member Functions

Construction & Destruction
Accessors

Member Function Documentation

uint32_t VirtReg::id() constnoexcept◆ 

Returns the virtual register id.

const char* VirtReg::name() constnoexcept◆ 

Returns the virtual register name.

uint32_t VirtReg::nameSize() constnoexcept◆ 

Returns the size of the virtual register name.

OperandSignature VirtReg::signature() constnoexcept◆ 

Returns a register signature of this virtual register.

RegType VirtReg::type() constnoexcept◆ 

Returns a virtual register type (maps to the physical register type as well).

RegGroup VirtReg::group() constnoexcept◆ 

Returns a virtual register group (maps to the physical register group as well).

uint32_t VirtReg::regSize() constnoexcept◆ 

Returns a real size of the register this virtual register maps to.

For example if this is a 128-bit SIMD register used for a scalar single precision floating point value then its virtSize would be 4, however, the regSize would still say 16 (128-bits), because it's the smallest size of that register type.

uint32_t VirtReg::virtSize() constnoexcept◆ 

Returns the virtual register size.

The virtual register size describes how many bytes the virtual register needs to store its content. It can be smaller than the physical register size, see regSize().

uint32_t VirtReg::alignment() constnoexcept◆ 

Returns the virtual register alignment.

TypeId VirtReg::typeId() constnoexcept◆ 

Returns the virtual register type id.

uint32_t VirtReg::weight() constnoexcept◆ 

Returns the virtual register weight - the register allocator can use it as explicit hint for alloc/spill decisions.

void VirtReg::setWeight(uint32_t weight)noexcept◆ 

Sets the virtual register weight (0 to 255) - the register allocator can use it as explicit hint for alloc/spill decisions and initial bin-packing.

bool VirtReg::isFixed() constnoexcept◆ 

Returns whether the virtual register is always allocated to a fixed physical register (and never reallocated).

Note
This is only used for special purposes and it's mostly internal.

bool VirtReg::isStack() constnoexcept◆ 

Tests whether the virtual register is in fact a stack that only uses the virtual register id.

Note
It's an error if a stack is accessed as a register.

bool VirtReg::hasStackSlot() constnoexcept◆ 

Tests whether this virtual register (or stack) has assigned a stack offset.

If this is a virtual register that was never allocated on stack, it would return false, otherwise if it's a virtual register that was spilled or explicitly allocated stack, the return value would be true.

void VirtReg::assignStackSlot(int32_t stackOffset)noexcept◆ 

Assigns a stack offset of this virtual register to stackOffset and sets _hasStackSlot to true.

int32_t VirtReg::stackOffset() constnoexcept◆ 

Returns a stack offset associated with a virtual register or explicit stack allocation.

Note
Always verify that the stack offset has been assigned by calling hasStackSlot(). The return value will be zero when the stack offset was not assigned.

bool VirtReg::hasWorkReg() constnoexcept◆ 

Tests whether the virtual register has an associated RAWorkReg at the moment.

RAWorkReg* VirtReg::workReg() constnoexcept◆ 

Returns an associated RAWorkReg with this virtual register (only valid during register allocation).

void VirtReg::setWorkReg(RAWorkReg* workReg)noexcept◆ 

Associates a RAWorkReg with this virtual register (used by register allocator).

void VirtReg::resetWorkReg()noexcept◆ 

Reset the RAWorkReg association (used by register allocator).

Member Data Documentation

OperandSignature VirtReg::_signature {}◆ 

Virtual register signature.

uint32_t VirtReg::_id = 0◆ 

Virtual register id.

uint32_t VirtReg::_virtSize = 0◆ 

Virtual register size (can be smaller than _signature._size).

uint8_t VirtReg::_alignment = 0◆ 

Virtual register alignment (for spilling).

TypeId VirtReg::_typeId = TypeId::kVoid◆ 

Type-id.

uint8_t VirtReg::_weight = 1◆ 

Virtual register weight for alloc/spill decisions.

uint8_t VirtReg::_isFixed◆ 

True if this is a fixed register, never reallocated.

uint8_t VirtReg::_isStack◆ 

True if the virtual register is only used as a stack (never accessed as register).

uint8_t VirtReg::_hasStackSlot◆ 

True if this virtual register has assigned stack offset (can be only valid after register allocation pass).

int32_t VirtReg::_stackOffset = 0◆ 

Stack offset assigned by the register allocator relative to stack pointer (can be negative as well).

uint32_t VirtReg::_reservedU32 = 0◆ 

Reserved for future use (padding).

ZoneString<16>VirtReg::_name {}◆ 

Virtual register name (user provided or automatically generated).

RAWorkReg* VirtReg::_workReg = nullptr◆ 

Reference to RAWorkReg, used during register allocation.