org.jikesrvm.ia32
Class OutOfLineMachineCode

java.lang.Object
  extended by 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).


Nested Class Summary
 
Nested classes/interfaces inherited from interface org.jikesrvm.ia32.RegisterConstants
RegisterConstants.FloatingPointMachineRegister, RegisterConstants.FPR, RegisterConstants.GPR, RegisterConstants.MachineRegister, RegisterConstants.MM, RegisterConstants.XMM
 
Field Summary
private static Offset CODE_FP_OFFSET
           
private static Offset FPRMETA_FP_OFFSET
           
private static Offset FPRS_FP_OFFSET
           
private static Offset GPRS_FP_OFFSET
           
private static Offset PARAMS_FP_OFFSET
           
private static ArchitectureSpecific.CodeArray pcThunkEAXInstructions
           
private static ArchitectureSpecific.CodeArray pcThunkEBPInstructions
           
private static ArchitectureSpecific.CodeArray pcThunkEBXInstructions
           
private static ArchitectureSpecific.CodeArray pcThunkECXInstructions
           
private static ArchitectureSpecific.CodeArray pcThunkEDIInstructions
           
private static ArchitectureSpecific.CodeArray pcThunkEDXInstructions
           
private static ArchitectureSpecific.CodeArray pcThunkESIInstructions
           
static RVMField[] pcThunkInstructionsField
           
private static ArchitectureSpecific.CodeArray reflectiveMethodInvokerInstructions
           
private static ArchitectureSpecific.CodeArray restoreHardwareExceptionStateInstructions
           
private static ArchitectureSpecific.CodeArray saveThreadStateInstructions
           
private static ArchitectureSpecific.CodeArray threadSwitchInstructions
           
 
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.Constants
NOT_REACHED, REFLECTION_FPRS_BITS, REFLECTION_FPRS_MASK, REFLECTION_GPRS_BITS, REFLECTION_GPRS_MASK
 
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.objectmodel.TIBLayoutConstants
IMT_METHOD_SLOTS, NEEDS_DYNAMIC_LINK, TIB_ARRAY_ELEMENT_TIB_INDEX, TIB_DOES_IMPLEMENT_INDEX, TIB_FIRST_SPECIALIZED_METHOD_INDEX, TIB_FIRST_VIRTUAL_METHOD_INDEX, TIB_INTERFACE_DISPATCH_TABLE_INDEX, TIB_SUPERCLASS_IDS_INDEX, TIB_TYPE_INDEX
 
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.ArchConstants
SSE2_BASE, SSE2_FULL
 
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
 
Fields inherited from interface org.jikesrvm.ia32.TrapConstants
RVM_TRAP_BASE
 
Constructor Summary
OutOfLineMachineCode()
           
 
Method Summary
private static void generatePcThunkInstructions()
          Machine code to get the address of the instruction after the call to this method
private static ArchitectureSpecific.CodeArray generateReflectiveMethodInvokerInstructions()
          Machine code for reflective method invocation.
private static ArchitectureSpecific.CodeArray generateRestoreHardwareExceptionStateInstructions()
          Machine code to implement "Magic.restoreHardwareExceptionState()".
private static ArchitectureSpecific.CodeArray generateSaveThreadStateInstructions()
          Machine code to implement "Magic.saveThreadState()".
private static ArchitectureSpecific.CodeArray generateStackTrampolineBridgeInstructions()
          Machine code to perform a stack trampoline bridge for implementing a return barrier.
private static ArchitectureSpecific.CodeArray generateThreadSwitchInstructions()
          Machine code to implement "Magic.threadSwitch()".
static void init()
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

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
Constructor Detail

OutOfLineMachineCode

public OutOfLineMachineCode()
Method Detail

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"