You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by Apache Wiki <wi...@apache.org> on 2008/05/06 12:58:14 UTC

[Harmony Wiki] Update of "Jitrino OPT/opcodes" by AlexeyVarlamov

Dear Wiki user,

You have subscribed to a wiki page or wiki category on "Harmony Wiki" for change notification.

The following page has been changed by AlexeyVarlamov:
http://wiki.apache.org/harmony/Jitrino_OPT/opcodes

New page:
== List of High-Level IR opcodes used in Jitrino.OPT compiler: ==

=== Arithmetic: ===
 * [:Jitrino_OPT/opcodes/Add: Op_Add]    
 * [:Jitrino_OPT/opcodes/Mul: Op_Mul]    
 * [:Jitrino_OPT/opcodes/Sub: Op_Sub] -  OverflowModifier, ExceptionModifier
 * [:Jitrino_OPT/opcodes/TauDiv: Op_TauDiv]    
 * [:Jitrino_OPT/opcodes/TauRem: Op_TauRem] -  SignedModifier, (opnds must already be checked for 0/overflow)
 * [:Jitrino_OPT/opcodes/Neg: Op_Neg]
 * [:Jitrino_OPT/opcodes/MulHi: Op_MulHi] -  SignedModifier (but only signed needed now)
 * [:Jitrino_OPT/opcodes/Min: Op_Min]   
 * [:Jitrino_OPT/opcodes/Max: Op_Max]   
 * [:Jitrino_OPT/opcodes/Abs: Op_Abs] -  no modifiers
// Bitwise
 * [:Jitrino_OPT/opcodes/And: Op_And]    
 * [:Jitrino_OPT/opcodes/Or: Op_Or]    
 * [:Jitrino_OPT/opcodes/Xor: Op_Xor]
 * [:Jitrino_OPT/opcodes/Not: Op_Not]
// Selection
 * [:Jitrino_OPT/opcodes/Select: Op_Select] -  (src1 ? src2 : src3)
// Conversion
 * [:Jitrino_OPT/opcodes/Conv: Op_Conv] -  OverflowModifier, ExceptionModifier
 * [:Jitrino_OPT/opcodes/ConvZE: Op_ConvZE] -  OverflowModifier, ExceptionModifier    
 * [:Jitrino_OPT/opcodes/ConvUnmanaged: Op_ConvUnmanaged] -  OverflowModifier, ExceptionModifier
// Shift
 * [:Jitrino_OPT/opcodes/Shladd: Op_Shladd] -  no mods, 2nd operand must be LdConstant
 * [:Jitrino_OPT/opcodes/Shl: Op_Shl] -  ShiftMaskModifier
 * [:Jitrino_OPT/opcodes/Shr: Op_Shr] -  ShiftMaskModifier, SignedModifier
// Comparison
 * [:Jitrino_OPT/opcodes/Cmp: Op_Cmp] -  ComparisonModifier
 * [:Jitrino_OPT/opcodes/Cmp3: Op_Cmp3] -  3-way compare, e.g.: ((s0>s1)?1:((s1>s0)?-1:0)). For floats, exactly 1 of the two comparisons is unordered; the modifier in the instruction applies to the first test
                                
=== Control flow: ===
 * [:Jitrino_OPT/opcodes/Branch: Op_Branch] -  ComparisonModifier
 * [:Jitrino_OPT/opcodes/Jump: Op_Jump] -  (different from the CLI jmp opcode) 
 * [:Jitrino_OPT/opcodes/Switch: Op_Switch]
 * [:Jitrino_OPT/opcodes/DirectCall: Op_DirectCall]
 * [:Jitrino_OPT/opcodes/TauVirtualCall: Op_TauVirtualCall]
 * [:Jitrino_OPT/opcodes/IndirectCall: Op_IndirectCall]
 * [:Jitrino_OPT/opcodes/IndirectMemoryCall: Op_IndirectMemoryCall]
 * [:Jitrino_OPT/opcodes/JitHelperCall: Op_JitHelperCall] -  call to a jit helper routine
 * [:Jitrino_OPT/opcodes/VMHelperCall: Op_VMHelperCall] -  call to a vm (runtime) helper routine 
 * [:Jitrino_OPT/opcodes/Return: Op_Return]

=== Exception processing: ===
 * [:Jitrino_OPT/opcodes/Catch: Op_Catch]
 * [:Jitrino_OPT/opcodes/Throw: Op_Throw] 
 * [:Jitrino_OPT/opcodes/PseudoThrow: Op_PseudoThrow] -  pseudo instruction to break infinte loops
 * [:Jitrino_OPT/opcodes/ThrowSystemException: Op_ThrowSystemException] -  takes a CompilationInterface::SystemExceptionId parameter
 * [:Jitrino_OPT/opcodes/ThrowLinkingException: Op_ThrowLinkingException] -  generate a call to Helper_Throw_LinkingException
 * [:Jitrino_OPT/opcodes/Leave: Op_Leave]                       
 * [:Jitrino_OPT/opcodes/EndFinally: Op_EndFinally]                  

 * [:Jitrino_OPT/opcodes/EndFilter: Op_EndFilter]                   
 * [:Jitrino_OPT/opcodes/EndCatch: Op_EndCatch]                    
 * [:Jitrino_OPT/opcodes/JSR: Op_JSR]                         
 * [:Jitrino_OPT/opcodes/Ret: Op_Ret]                         
 * [:Jitrino_OPT/opcodes/SaveRet: Op_SaveRet]                     

=== Move instruction: ===
 * [:Jitrino_OPT/opcodes/Copy: Op_Copy]
 * [:Jitrino_OPT/opcodes/DefArg: Op_DefArg] -  DefArgModifier

=== Load instructions: ===
 * [:Jitrino_OPT/opcodes/LdConstant: Op_LdConstant]
 * [:Jitrino_OPT/opcodes/LdRef: Op_LdRef] -  String or reference
 * [:Jitrino_OPT/opcodes/LdVar: Op_LdVar]    
 * [:Jitrino_OPT/opcodes/LdVarAddr: Op_LdVarAddr]
 * [:Jitrino_OPT/opcodes/TauLdInd: Op_TauLdInd]
 * [:Jitrino_OPT/opcodes/TauLdField: Op_TauLdField]
 * [:Jitrino_OPT/opcodes/LdStatic: Op_LdStatic]
 * [:Jitrino_OPT/opcodes/TauLdElem: Op_TauLdElem]
 * [:Jitrino_OPT/opcodes/LdFieldAddr: Op_LdFieldAddr] -  lower to ldoffset+addoffset
 * [:Jitrino_OPT/opcodes/LdStaticAddr: Op_LdStaticAddr]
 * [:Jitrino_OPT/opcodes/LdElemAddr: Op_LdElemAddr]
 * [:Jitrino_OPT/opcodes/TauLdVTableAddr: Op_TauLdVTableAddr]

 * [:Jitrino_OPT/opcodes/TauLdIntfcVTableAddr: Op_TauLdIntfcVTableAddr]
 * [:Jitrino_OPT/opcodes/TauLdVirtFunAddr: Op_TauLdVirtFunAddr]    
 * [:Jitrino_OPT/opcodes/TauLdVirtFunAddrSlot: Op_TauLdVirtFunAddrSlot]
 * [:Jitrino_OPT/opcodes/LdFunAddr: Op_LdFunAddr]
 * [:Jitrino_OPT/opcodes/LdFunAddrSlot: Op_LdFunAddrSlot]
 * [:Jitrino_OPT/opcodes/GetVTableAddr: Op_GetVTableAddr] -  obtains the address of the vtable for a particular object type

=== Array manipulation: ===
 * [:Jitrino_OPT/opcodes/TauArrayLen: Op_TauArrayLen]        
 * [:Jitrino_OPT/opcodes/LdArrayBaseAddr: Op_LdArrayBaseAddr] -  load the base (zero'th element) address of array
 * [:Jitrino_OPT/opcodes/AddScaledIndex: Op_AddScaledIndex] -  Add a scaled index to an array element address

=== Store instructions: ===
 * [:Jitrino_OPT/opcodes/StVar: Op_StVar]
 * [:Jitrino_OPT/opcodes/TauStInd: Op_TauStInd] -  StoreModifier
 * [:Jitrino_OPT/opcodes/TauStField: Op_TauStField] -  StoreModifier
 * [:Jitrino_OPT/opcodes/TauStElem: Op_TauStElem] -  StoreModifier
 * [:Jitrino_OPT/opcodes/TauStStatic: Op_TauStStatic]                    
 * [:Jitrino_OPT/opcodes/TauStRef: Op_TauStRef] -  high-level version that will make a call to the VM

=== Runtime exception check instructions: ===
// all of these take ExceptionModifier
 * [:Jitrino_OPT/opcodes/TauCheckBounds: Op_TauCheckBounds] -  takes index and array length arguments, ovf mod==none indicates 0<=idx*eltsize<2^31
 * [:Jitrino_OPT/opcodes/TauCheckLowerBound: Op_TauCheckLowerBound] -  throws unless src0 <= src1
 * [:Jitrino_OPT/opcodes/TauCheckUpperBound: Op_TauCheckUpperBound] -  throws unless src0 < src1
 * [:Jitrino_OPT/opcodes/TauCheckNull: Op_TauCheckNull] -  throws NullPointerException if source is null
 * [:Jitrino_OPT/opcodes/TauCheckZero: Op_TauCheckZero] -  for divide by zero exceptions (div and rem)
 * [:Jitrino_OPT/opcodes/TauCheckDivOpnds: Op_TauCheckDivOpnds] -  for signed divide overflow in CLI (div/rem of MAXNEGINT, -1): generates an ArithmeticException
 * [:Jitrino_OPT/opcodes/TauCheckElemType: Op_TauCheckElemType] -  Array element type check for aastore
 * [:Jitrino_OPT/opcodes/TauCheckFinite: Op_TauCheckFinite] -  throws ArithmeticException if value is NaN or +- inifinity

=== Allocation: ===
 * [:Jitrino_OPT/opcodes/NewObj: Op_NewObj] -  OutOfMemoryException
 * [:Jitrino_OPT/opcodes/NewArray: Op_NewArray] -  OutOfMemoryException, NegativeArraySizeException
 * [:Jitrino_OPT/opcodes/NewMultiArray: Op_NewMultiArray] -  OutOfMemoryException, NegativeArraySizeException

=== Synchronization: ===
 * [:Jitrino_OPT/opcodes/TauMonitorEnter: Op_TauMonitorEnter] -  (opnd must be non-null)
// this could take an ExceptionModifier
 * [:Jitrino_OPT/opcodes/TauMonitorExit: Op_TauMonitorExit] -  (opnd must be non-null), IllegalMonitorStateException
 * [:Jitrino_OPT/opcodes/TypeMonitorEnter: Op_TypeMonitorEnter]
 * [:Jitrino_OPT/opcodes/TypeMonitorExit: Op_TypeMonitorExit]
// Lowered parts of MonitorEnter/Exit
 * [:Jitrino_OPT/opcodes/LdLockAddr: Op_LdLockAddr] -  yields ref:int16
 * [:Jitrino_OPT/opcodes/IncRecCount: Op_IncRecCount] -  allows BalancedMonitorEnter to be used with regular MonitorExit
 * [:Jitrino_OPT/opcodes/TauBalancedMonitorEnter: Op_TauBalancedMonitorEnter] -  (opnd must be non-null), post-dominated by BalancedMonitorExit
 * [:Jitrino_OPT/opcodes/BalancedMonitorExit: Op_BalancedMonitorExit] -  (cannot yield exception), dominated by BalancedMonitorEnter
 * [:Jitrino_OPT/opcodes/TauOptimisticBalancedMonitorEnter: Op_TauOptimisticBalancedMonitorEnter] -  (opnd must be non-null), post-dominated by BalancedMonitorExit
 * [:Jitrino_OPT/opcodes/OptimisticBalancedMonitorExit: Op_OptimisticBalancedMonitorExit] -  (may yield exception), dominated by BalancedMonitorEnter
 * [:Jitrino_OPT/opcodes/MonitorEnterFence: Op_MonitorEnterFence] -  (opnd must be non-null)
 * [:Jitrino_OPT/opcodes/MonitorExitFence: Op_MonitorExitFence] -  (opnd must be non-null)

=== Type checking: ===
// cast takes an ExceptionModifier
 * [:Jitrino_OPT/opcodes/TauStaticCast: Op_TauStaticCast] -  Compile-time assertion.  Asserts that cast is legal.
 * [:Jitrino_OPT/opcodes/TauCast: Op_TauCast] -  CastException (succeeds if argument is null, returns casted object)
 * [:Jitrino_OPT/opcodes/TauAsType: Op_TauAsType] -  returns casted object if argument is an instance of, null otherwise
 * [:Jitrino_OPT/opcodes/TauInstanceOf: Op_TauInstanceOf] -  returns true if argument is a non-null instance of type T
 * [:Jitrino_OPT/opcodes/TauCheckCast: Op_TauCheckCast]
 * [:Jitrino_OPT/opcodes/TauHasType: Op_TauHasType]
 * [:Jitrino_OPT/opcodes/TauHasExactType: Op_TauHasExactType]
 * [:Jitrino_OPT/opcodes/TauIsNonNull: Op_TauIsNonNull]

=== Type initialization: ===
 * [:Jitrino_OPT/opcodes/InitType: Op_InitType] -  initialize type before static method invocation or field access. 

=== Labels & markers: ===
 * [:Jitrino_OPT/opcodes/Label: Op_Label] -  special label instructions for branch labels, finally, catch
 * [:Jitrino_OPT/opcodes/MethodEntry: Op_MethodEntry] -  method entry label
 * [:Jitrino_OPT/opcodes/MethodEnd: Op_MethodEnd] -  end of a method
 * [:Jitrino_OPT/opcodes/SourceLineNumber: Op_SourceLineNumber] -  change to source position
            
=== Memory instructions: ===
 * [:Jitrino_OPT/opcodes/InitBlock: Op_InitBlock] -  memset
 * [:Jitrino_OPT/opcodes/CopyBlock: Op_CopyBlock] -  memcopy
 * [:Jitrino_OPT/opcodes/Alloca: Op_Alloca] -  allocations memory from the stack, not verifiable
 * [:Jitrino_OPT/opcodes/ArgList: Op_ArgList] -  for implementing varargs; use is private to CLI System.ArgIterator

=== Profile instrumentation instructions: ===
 * [:Jitrino_OPT/opcodes/IncCounter: Op_IncCounter] -  Increment a profile counter by 1
 * [:Jitrino_OPT/opcodes/Prefetch: Op_Prefetch]

=== Compressed Pointer instructions: ===
 * [:Jitrino_OPT/opcodes/UncompressRef: Op_UncompressRef] -  uncmpref = (cmpref<<s) + heapbase 
 * [:Jitrino_OPT/opcodes/CompressRef: Op_CompressRef] -  cmpref = uncmpref - heapbase

 * [:Jitrino_OPT/opcodes/LdFieldOffset: Op_LdFieldOffset] -  just offset
 * [:Jitrino_OPT/opcodes/LdFieldOffsetPlusHeapbase: Op_LdFieldOffsetPlusHeapbase] -  offset + heapbase
 * [:Jitrino_OPT/opcodes/LdArrayBaseOffset: Op_LdArrayBaseOffset] -  offset of array base
 * [:Jitrino_OPT/opcodes/LdArrayBaseOffsetPlusHeapbase: Op_LdArrayBaseOffsetPlusHeapbase] -  offset of array base
 * [:Jitrino_OPT/opcodes/LdArrayLenOffset: Op_LdArrayLenOffset] -  offset of array length field
 * [:Jitrino_OPT/opcodes/LdArrayLenOffsetPlusHeapbase: Op_LdArrayLenOffsetPlusHeapbase] -  offset of array length field

 * [:Jitrino_OPT/opcodes/AddOffset: Op_AddOffset] -  add uncompref+offset
 * [:Jitrino_OPT/opcodes/AddOffsetPlusHeapbase: Op_AddOffsetPlusHeapbase] -  add compref+offsetPlusHeapbase (uncompressing)

=== Special SSA nodes: ===
 * [:Jitrino_OPT/opcodes/Phi: Op_Phi] -  merge point
 * [:Jitrino_OPT/opcodes/TauPi: Op_TauPi] -  leverage split based on condition 

 * [:Jitrino_OPT/opcodes/TauPoint: Op_TauPoint]
 * [:Jitrino_OPT/opcodes/TauEdge: Op_TauEdge]
 * [:Jitrino_OPT/opcodes/TauAnd: Op_TauAnd]
 * [:Jitrino_OPT/opcodes/TauUnsafe: Op_TauUnsafe]
 * [:Jitrino_OPT/opcodes/TauSafe: Op_TauSafe]

=== Instructions for manipulating value objects in CLI: ===
 * [:Jitrino_OPT/opcodes/LdObj: Op_LdObj] -  load a value type to the stack
 * [:Jitrino_OPT/opcodes/StObj: Op_StObj] -  store a value type from the stack
 * [:Jitrino_OPT/opcodes/CopyObj: Op_CopyObj] -  copy a value type
 * [:Jitrino_OPT/opcodes/InitObj: Op_InitObj] -  initialize a value type
 * [:Jitrino_OPT/opcodes/Sizeof: Op_Sizeof] -  Pushes the size of a value type as a U4
 * [:Jitrino_OPT/opcodes/Box: Op_Box]
 * [:Jitrino_OPT/opcodes/Unbox: Op_Unbox]
 * [:Jitrino_OPT/opcodes/LdToken: Op_LdToken]    - Pushes a RuntimeMethodHandle, RuntimeTypeHandle, or RuntimeFieldHandle for 
 passing to the Reflection methods in the system class library.


=== Instruction for manipulating typed references: ===
 * [:Jitrino_OPT/opcodes/MkRefAny: Op_MkRefAny] -  transforms a pointer to a typed reference
 * [:Jitrino_OPT/opcodes/RefAnyVal: Op_RefAnyVal]                   
 * [:Jitrino_OPT/opcodes/RefAnyType: Op_RefAnyType]