org.jikesrvm.ia32
Class OutOfLineMachineCode
java.lang.Object
org.jikesrvm.ia32.OutOfLineMachineCode
- All Implemented Interfaces:
- Constants, HeapLayoutConstants, ArchConstants, BaselineConstants, RegisterConstants, StackframeLayoutConstants, TrapConstants, ThinLockConstants, TIBLayoutConstants, SizeConstants
- Direct Known Subclasses:
- ArchitectureSpecific.OutOfLineMachineCode
public abstract class OutOfLineMachineCode
- extends Object
- implements BaselineConstants
A place to put hand written machine code typically invoked by Magic
methods.
Hand coding of small inline instruction sequences is typically handled by
each compiler's implementation of Magic methods.
A few Magic methods are so complex that their implementations require
many instructions. But our compilers do not inline
arbitrary amounts of machine code. We therefore write such code blocks
here, out of line.
These code blocks can be shared by all compilers. They can be branched to
via a jtoc offset (obtained from Entrypoints.XXXInstructionsField).
Fields inherited from interface org.jikesrvm.ia32.BaselineConstants |
BRIDGE_FRAME_EXTRA_SIZE, EBP_SAVE_OFFSET, EBX_SAVE_OFFSET, EDI_SAVE_OFFSET, FPU_SAVE_OFFSET, LG_WORDSIZE, S0, S1, SAVED_GPRS, SAVED_GPRS_FOR_SAVE_LS_REGISTERS, SP, STACKFRAME_FIRST_PARAMETER_OFFSET, STACKFRAME_REG_SAVE_OFFSET, T0, T0_int, T0_SAVE_OFFSET, T1, T1_int, T1_SAVE_OFFSET, TR, WORDSIZE, XMM_SAVE_OFFSET |
Fields inherited from interface org.jikesrvm.objectmodel.ThinLockConstants |
TL_DEDICATED_U16_OFFSET, TL_DEDICATED_U16_SHIFT, TL_LOCK_COUNT_MASK, TL_LOCK_COUNT_SHIFT, TL_LOCK_COUNT_UNIT, TL_LOCK_ID_MASK, TL_LOCK_ID_SHIFT, TL_NUM_BITS_RC, TL_NUM_BITS_STAT, TL_NUM_BITS_TID, TL_STAT_BIASABLE, TL_STAT_FAT, TL_STAT_MASK, TL_STAT_SHIFT, TL_STAT_THIN, TL_THREAD_ID_MASK, TL_THREAD_ID_SHIFT, TL_UNLOCK_MASK |
Fields inherited from interface org.jikesrvm.SizeConstants |
BITS_IN_ADDRESS, BITS_IN_BOOLEAN, BITS_IN_BYTE, BITS_IN_CHAR, BITS_IN_DOUBLE, BITS_IN_EXTENT, BITS_IN_FLOAT, BITS_IN_INT, BITS_IN_LONG, BITS_IN_OFFSET, BITS_IN_PAGE, BITS_IN_SHORT, BITS_IN_WORD, BYTES_IN_ADDRESS, BYTES_IN_BOOLEAN, BYTES_IN_BYTE, BYTES_IN_CHAR, BYTES_IN_DOUBLE, BYTES_IN_EXTENT, BYTES_IN_FLOAT, BYTES_IN_INT, BYTES_IN_LONG, BYTES_IN_OFFSET, BYTES_IN_PAGE, BYTES_IN_SHORT, BYTES_IN_WORD, LOG_BITS_IN_ADDRESS, LOG_BITS_IN_BOOLEAN, LOG_BITS_IN_BYTE, LOG_BITS_IN_CHAR, LOG_BITS_IN_DOUBLE, LOG_BITS_IN_EXTENT, LOG_BITS_IN_FLOAT, LOG_BITS_IN_INT, LOG_BITS_IN_LONG, LOG_BITS_IN_OFFSET, LOG_BITS_IN_PAGE, LOG_BITS_IN_SHORT, LOG_BITS_IN_WORD, LOG_BYTES_IN_ADDRESS, LOG_BYTES_IN_BOOLEAN, LOG_BYTES_IN_BYTE, LOG_BYTES_IN_CHAR, LOG_BYTES_IN_DOUBLE, LOG_BYTES_IN_EXTENT, LOG_BYTES_IN_FLOAT, LOG_BYTES_IN_INT, LOG_BYTES_IN_LONG, LOG_BYTES_IN_OFFSET, LOG_BYTES_IN_PAGE, LOG_BYTES_IN_SHORT, LOG_BYTES_IN_WORD |
Fields inherited from interface org.jikesrvm.HeapLayoutConstants |
BAD_MAP_COMPRESSION, BOOT_IMAGE_CODE_END, BOOT_IMAGE_CODE_SIZE, BOOT_IMAGE_CODE_START, BOOT_IMAGE_DATA_END, BOOT_IMAGE_DATA_SIZE, BOOT_IMAGE_DATA_START, BOOT_IMAGE_END, BOOT_IMAGE_RMAP_END, BOOT_IMAGE_RMAP_START, MAX_BOOT_IMAGE_RMAP_SIZE, MAXIMUM_MAPPABLE |
Fields inherited from interface org.jikesrvm.ia32.StackframeLayoutConstants |
BYTES_IN_STACKSLOT, FPU_STATE_SIZE, INVISIBLE_METHOD_ID, LOG_BYTES_IN_STACKSLOT, STACK_SIZE_BOOT, STACK_SIZE_COLLECTOR, STACK_SIZE_DLOPEN, STACK_SIZE_GCDISABLED, STACK_SIZE_GROW, STACK_SIZE_GUARD, STACK_SIZE_JNINATIVE_GROW, STACK_SIZE_MAX, STACK_SIZE_NORMAL, STACK_SIZE_SYSCALL, STACKFRAME_ALIGNMENT, STACKFRAME_BODY_OFFSET, STACKFRAME_FRAME_POINTER_OFFSET, STACKFRAME_HEADER_SIZE, STACKFRAME_METHOD_ID_OFFSET, STACKFRAME_RETURN_ADDRESS_OFFSET, STACKFRAME_SENTINEL_FP, XMM_STATE_SIZE |
Fields inherited from interface org.jikesrvm.ia32.RegisterConstants |
ALL_FPRS, ALL_GPRS, EAX, EBP, EBX, ECX, EDI, EDX, ESI, ESP, FP0, FP1, FP2, FP3, FP4, FP5, FP6, FP7, INSTRUCTION_WIDTH, LG_INSTRUCTION_WIDTH, MM0, MM1, MM10, MM11, MM12, MM13, MM14, MM15, MM2, MM3, MM4, MM5, MM6, MM7, MM8, MM9, NATIVE_NONVOLATILE_FPRS, NATIVE_NONVOLATILE_GPRS, NATIVE_PARAMETER_FPRS, NATIVE_PARAMETER_GPRS, NATIVE_VOLATILE_FPRS, NATIVE_VOLATILE_GPRS, NONVOLATILE_FPRS, NONVOLATILE_GPRS, NUM_FPRS, NUM_GPRS, NUM_NONVOLATILE_FPRS, NUM_NONVOLATILE_GPRS, NUM_PARAMETER_FPRS, NUM_PARAMETER_GPRS, NUM_RETURN_FPRS, NUM_RETURN_GPRS, NUM_VOLATILE_FPRS, NUM_VOLATILE_GPRS, PARAMETER_FPRS, PARAMETER_GPRS, R0, R1, R10, R11, R12, R13, R14, R15, R2, R3, R4, R5, R6, R7, R8, R9, RETURN_FPRS, RETURN_GPRS, STACK_POINTER, THREAD_REGISTER, VOLATILE_FPRS, VOLATILE_GPRS, XMM0, XMM1, XMM10, XMM11, XMM12, XMM13, XMM14, XMM15, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7, XMM8, XMM9 |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
pcThunkInstructionsField
public static final RVMField[] pcThunkInstructionsField
pcThunkEAXInstructions
private static ArchitectureSpecific.CodeArray pcThunkEAXInstructions
pcThunkEBXInstructions
private static ArchitectureSpecific.CodeArray pcThunkEBXInstructions
pcThunkECXInstructions
private static ArchitectureSpecific.CodeArray pcThunkECXInstructions
pcThunkEDXInstructions
private static ArchitectureSpecific.CodeArray pcThunkEDXInstructions
pcThunkEBPInstructions
private static ArchitectureSpecific.CodeArray pcThunkEBPInstructions
pcThunkESIInstructions
private static ArchitectureSpecific.CodeArray pcThunkESIInstructions
pcThunkEDIInstructions
private static ArchitectureSpecific.CodeArray pcThunkEDIInstructions
reflectiveMethodInvokerInstructions
private static ArchitectureSpecific.CodeArray reflectiveMethodInvokerInstructions
saveThreadStateInstructions
private static ArchitectureSpecific.CodeArray saveThreadStateInstructions
threadSwitchInstructions
private static ArchitectureSpecific.CodeArray threadSwitchInstructions
restoreHardwareExceptionStateInstructions
private static ArchitectureSpecific.CodeArray restoreHardwareExceptionStateInstructions
PARAMS_FP_OFFSET
private static final Offset PARAMS_FP_OFFSET
FPRMETA_FP_OFFSET
private static final Offset FPRMETA_FP_OFFSET
FPRS_FP_OFFSET
private static final Offset FPRS_FP_OFFSET
GPRS_FP_OFFSET
private static final Offset GPRS_FP_OFFSET
CODE_FP_OFFSET
private static final Offset CODE_FP_OFFSET
OutOfLineMachineCode
public OutOfLineMachineCode()
init
public static void init()
generatePcThunkInstructions
private static void generatePcThunkInstructions()
- Machine code to get the address of the instruction after the call to this
method
generateReflectiveMethodInvokerInstructions
private static ArchitectureSpecific.CodeArray generateReflectiveMethodInvokerInstructions()
- Machine code for reflective method invocation.
VM compiled with NUM_PARAMETERS_GPRS == 0
Registers taken at runtime:
none
Stack taken at runtime:
hi-mem
address of method entrypoint to be called
address of gpr registers to be loaded
address of fpr registers to be loaded
address of parameters area in calling frame
return address
low-mem
VM compiled with NUM_PARAMETERS_GPRS == 1
T0 == address of method entrypoint to be called
Stack taken at runtime:
hi-mem
space ???
address of gpr registers to be loaded
address of fpr registers to be loaded
address of parameters area in calling frame
return address
low-mem
VM compiled with NUM_PARAMETERS_GPRS == 2
T0 == address of method entrypoint to be called
T1 == address of gpr registers to be loaded
Stack taken at runtime:
hi-mem
space ???
space ???
address of fpr registers to be loaded
address of parameters area in calling frame
return address
low-mem
Registers returned at runtime:
standard return value conventions used
Side effects at runtime:
artificial stackframe created and destroyed
volatile, and scratch registers destroyed
generateSaveThreadStateInstructions
private static ArchitectureSpecific.CodeArray generateSaveThreadStateInstructions()
- Machine code to implement "Magic.saveThreadState()".
Registers taken at runtime:
T0 == address of Registers object
Registers returned at runtime:
none
Side effects at runtime:
S0, T1 destroyed
Thread state stored into Registers object
generateStackTrampolineBridgeInstructions
private static ArchitectureSpecific.CodeArray generateStackTrampolineBridgeInstructions()
- Machine code to perform a stack trampoline bridge for
implementing a return barrier.
This code is used to hijack a return and bridge to some
other method (which implements the return barrier) before
falling back to the intended return address.
The key here is to preserve register and stack state so that
the caller is oblivious of the detour that occurred during
the return.
generateThreadSwitchInstructions
private static ArchitectureSpecific.CodeArray generateThreadSwitchInstructions()
- Machine code to implement "Magic.threadSwitch()".
NOTE: Currently not functional for PNT: left as a guide for possible reimplementation.
Parameters taken at runtime:
T0 == address of Thread object for the current thread
T1 == address of Registers object for the new thread
Registers returned at runtime:
none
Side effects at runtime:
sets current Thread's beingDispatched field to false
saves current Thread's nonvolatile hardware state in its Registers object
restores new thread's Registers nonvolatile hardware state.
execution resumes at address specificed by restored thread's Registers ip field
generateRestoreHardwareExceptionStateInstructions
private static ArchitectureSpecific.CodeArray generateRestoreHardwareExceptionStateInstructions()
- Machine code to implement "Magic.restoreHardwareExceptionState()".
Registers taken at runtime:
T0 == address of Registers object
Registers returned at runtime:
none
Side effects at runtime:
all registers are restored except THREAD_REGISTER and EFLAGS;
execution resumes at "registers.ip"