2
0

OpCodes.h 91 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft Corporation and contributors. All rights reserved.
  3. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  4. //-------------------------------------------------------------------------------------------------------
  5. // Default all macro to nothing
  6. #ifndef MACRO_WITH_DBG_ATTR
  7. #ifdef MACRO
  8. #define MACRO_WITH_DBG_ATTR(opcode, layout, attr, ...) MACRO(opcode, layout, attr)
  9. #else
  10. #define MACRO_WITH_DBG_ATTR(...)
  11. #endif
  12. #endif
  13. #ifndef MACRO_WMS_WITH_DBG_ATTR
  14. #ifdef MACRO_WMS
  15. #define MACRO_WMS_WITH_DBG_ATTR(opcode, layout, attr, ...) MACRO_WMS(opcode, layout, attr)
  16. #else
  17. #define MACRO_WMS_WITH_DBG_ATTR(...)
  18. #endif
  19. #endif
  20. #ifndef MACRO_EXTEND_WITH_DBG_ATTR
  21. #ifdef MACRO_EXTEND
  22. #define MACRO_EXTEND_WITH_DBG_ATTR(opcode, layout, attr, ...) MACRO_EXTEND(opcode, layout, attr)
  23. #else
  24. #define MACRO_EXTEND_WITH_DBG_ATTR(...)
  25. #endif
  26. #endif
  27. #ifndef MACRO_EXTEND_WMS_WITH_DBG_ATTR
  28. #ifdef MACRO_EXTEND_WMS
  29. #define MACRO_EXTEND_WMS_WITH_DBG_ATTR(opcode, layout, attr, ...) MACRO_EXTEND_WMS(opcode, layout, attr)
  30. #else
  31. #define MACRO_EXTEND_WMS_WITH_DBG_ATTR(...)
  32. #endif
  33. #endif
  34. #ifndef MACRO_BACKEND_ONLY_WITH_DBG_ATTR
  35. #ifdef MACRO_BACKEND_ONLY
  36. #define MACRO_BACKEND_ONLY_WITH_DBG_ATTR(opcode, layout, attr, ...) MACRO_BACKEND_ONLY(opcode, layout, attr)
  37. #else
  38. #define MACRO_BACKEND_ONLY_WITH_DBG_ATTR(...)
  39. #endif
  40. #endif
  41. // Default the debug attributes to OpDbgAttr_None
  42. #ifndef MACRO
  43. #define MACRO(opcode, layout, attr) MACRO_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_None)
  44. #endif
  45. #ifndef MACRO_WMS
  46. #define MACRO_WMS(opcode, layout, attr) MACRO_WMS_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_None)
  47. #endif
  48. #ifndef MACRO_EXTEND
  49. #define MACRO_EXTEND(opcode, layout, attr) MACRO_EXTEND_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_None)
  50. #endif
  51. #ifndef MACRO_EXTEND_WMS
  52. #define MACRO_EXTEND_WMS(opcode, layout, attr) MACRO_EXTEND_WMS_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_None)
  53. #endif
  54. #ifndef MACRO_BACKEND_ONLY
  55. #define MACRO_BACKEND_ONLY(opcode, layout, attr) MACRO_BACKEND_ONLY_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_None)
  56. #endif
  57. #define MACRO_ROOT(opcode, layout, attr) \
  58. MACRO_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_LoadRoot)
  59. #define MACRO_WMS_ROOT(opcode, layout, attr) \
  60. MACRO_WMS_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_LoadRoot)
  61. #define MACRO_EXTENDED_ROOT(opcode, layout, attr) \
  62. MACRO_EXTEND_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_LoadRoot)
  63. #define MACRO_EXTEND_WMS_ROOT(opcode, layout, attr) \
  64. MACRO_EXTEND_WMS_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_LoadRoot)
  65. #define MACRO_WMS_PROFILED( opcode, layout, attr) \
  66. MACRO_WMS(opcode, layout, OpHasProfiled|attr) \
  67. MACRO_WMS(Profiled##opcode, Profiled##layout, OpByteCodeOnly|OpProfiled|attr) \
  68. #define MACRO_WMS_PROFILED2(opcode, layout, attr) \
  69. MACRO_WMS(opcode, layout, OpHasProfiled|attr) \
  70. MACRO_WMS(Profiled##opcode, Profiled2##layout, OpByteCodeOnly|OpProfiled|attr) \
  71. #define MACRO_WMS_PROFILED_INDEX(opcode, layout, attr) \
  72. MACRO_WMS(opcode, layout, OpHasProfiled|OpHasProfiledWithICIndex|attr) \
  73. MACRO_WMS(Profiled##opcode, Profiled##layout, OpByteCodeOnly|OpProfiled|attr) \
  74. MACRO_WMS(Profiled##opcode##WithICIndex, Profiled##layout##WithICIndex, OpByteCodeOnly|OpProfiledWithICIndex|attr) \
  75. #define MACRO_WMS_PROFILED_OP_WITH_DBG_ATTR(opcode, layout, attr, dbgAttr) \
  76. MACRO_WMS_WITH_DBG_ATTR(opcode, layout, OpHasProfiled|attr, dbgAttr) \
  77. MACRO_WMS_WITH_DBG_ATTR(Profiled##opcode, layout, OpByteCodeOnly|OpProfiled|attr, dbgAttr) \
  78. #define MACRO_WMS_PROFILED_OP(opcode, layout, attr) \
  79. MACRO_WMS_PROFILED_OP_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_None)
  80. #define MACRO_WMS_PROFILED_OP_ROOT(opcode, layout, attr) \
  81. MACRO_WMS_PROFILED_OP_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_LoadRoot)
  82. #define MACRO_EXTEND_WMS_AND_PROFILED_OP_WITH_DBG_ATTR(opcode, layout, attr, dbgAttr) \
  83. MACRO_EXTEND_WMS_WITH_DBG_ATTR(opcode, layout, OpHasProfiled | attr, dbgAttr) \
  84. MACRO_EXTEND_WMS_WITH_DBG_ATTR(Profiled##opcode, layout, OpByteCodeOnly | OpProfiled | attr, dbgAttr) \
  85. #define MACRO_EXTEND_WMS_AND_PROFILED_OP(opcode, layout, attr) \
  86. MACRO_EXTEND_WMS_AND_PROFILED_OP_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_None)
  87. #define MACRO_EXTEND_WMS_AND_PROFILED_OP_ROOT(opcode, layout, attr) \
  88. MACRO_EXTEND_WMS_AND_PROFILED_OP_WITH_DBG_ATTR(opcode, layout, attr, OpDbgAttr_LoadRoot)
  89. #define MACRO_PROFILED(opcode, layout, attr) \
  90. MACRO(opcode, layout, OpHasProfiled|attr) \
  91. MACRO(Profiled##opcode, Profiled##layout, OpByteCodeOnly|OpProfiled|attr) \
  92. #define MACRO_EXTEND_WMS_AND_PROFILED(opcode, layout, attr) \
  93. MACRO_EXTEND_WMS(opcode, layout, OpHasProfiled|attr) \
  94. MACRO_EXTEND_WMS(Profiled##opcode, Profiled##layout, OpByteCodeOnly|OpProfiled|attr) \
  95. MACRO( EndOfBlock, Empty, OpByteCodeOnly) // End-of-buffer
  96. MACRO( ExtendedOpcodePrefix,Empty, OpByteCodeOnly)
  97. MACRO( MediumLayoutPrefix, Empty, OpByteCodeOnly)
  98. MACRO( ExtendedMediumLayoutPrefix,Empty, OpByteCodeOnly)
  99. MACRO( LargeLayoutPrefix, Empty, OpByteCodeOnly)
  100. MACRO( ExtendedLargeLayoutPrefix,Empty, OpByteCodeOnly)
  101. MACRO( Nop, Empty, None) // No operation (Default value = 0)
  102. MACRO( StartCall, StartCall, OpSideEffect)
  103. MACRO_BACKEND_ONLY( LoweredStartCall, StartCall, OpSideEffect) // StartCall instruction after it's been lowered
  104. MACRO( Break, Empty, OpSideEffect) // Break into debugger
  105. MACRO_EXTEND( InvalidOpCode, Empty, None) // Inserted in a dead call sequence, should not be present after GlobOpt
  106. // Control flow
  107. #ifdef BYTECODE_BRANCH_ISLAND
  108. MACRO_EXTEND( BrLong, BrLong, OpByteCodeOnly|OpSideEffect|OpNoFallThrough)
  109. #endif
  110. MACRO( Br , Br, OpSideEffect|OpNoFallThrough) // Unconditional branch
  111. MACRO_BACKEND_ONLY( MultiBr, Empty, OpSideEffect|OpNoFallThrough) // Unconditional multi-target branch
  112. MACRO_BACKEND_ONLY( BrHasSideEffects, BrS, OpSideEffect|OpTempNumberSources) // Branch if there are any of the side effects in val
  113. MACRO( BrNotHasSideEffects,BrS, OpSideEffect|OpTempNumberSources) // Branch if there are none of the side effects in val
  114. MACRO_BACKEND_ONLY( BrFncEqApply , BrReg1, OpSideEffect|OpTempNumberSources) // Branch if R1 is func whose native code ptr == Apply
  115. MACRO_WMS( BrFncNeqApply , BrReg1, OpSideEffect|OpTempNumberSources) // Branch if R1 is func whose native code ptr != Apply
  116. MACRO_WMS( BrEq_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if '==' (general equals)
  117. MACRO_WMS( BrNeq_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if '!=' (not general equals)
  118. MACRO_WMS( BrFalse_A, BrReg1, OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if 'false' (NOTE: do not call ToPrimitive, no implicit call)
  119. MACRO_WMS( BrTrue_A, BrReg1, OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if 'true' (NOTE: do not call ToPrimitive, no implicit call)
  120. MACRO_WMS( BrGe_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if '>='
  121. MACRO_BACKEND_ONLY( BrUnGe_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if '>='
  122. MACRO_WMS( BrGt_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if '>'
  123. MACRO_BACKEND_ONLY( BrUnGt_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if '>'
  124. MACRO_WMS( BrLt_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if '<'
  125. MACRO_BACKEND_ONLY( BrUnLt_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if '<'
  126. MACRO_WMS( BrLe_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if '<='
  127. MACRO_BACKEND_ONLY( BrUnLe_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if '<='
  128. MACRO_WMS( BrSrEq_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if '===' (strict equals) (NOTE: May have DOM implicit calls)
  129. MACRO_WMS( BrSrNeq_A, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if '!==' (not strict equals) (NOTE: May have DOM implicit calls)
  130. MACRO_EXTEND( BrOnHasProperty, BrProperty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if object has the given property (NOTE: May have DOM implicit calls)
  131. MACRO_EXTEND( BrOnNoProperty, BrProperty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if object does not have the given property (NOTE: May have DOM implicit calls)
  132. MACRO( BrOnHasLocalProperty,BrLocalProperty,OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if object does not have the given property (NOTE: May have DOM implicit calls)
  133. MACRO_BACKEND_ONLY( BrOnNoLocalProperty,BrLocalProperty,OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if object does not have the given property (NOTE: May have DOM implicit calls)
  134. MACRO_EXTEND( BrOnHasEnvProperty, BrEnvProperty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if object does not have the given property (NOTE: May have DOM implicit calls)
  135. MACRO_BACKEND_ONLY( BrOnNoEnvProperty, BrEnvProperty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if object does not have the given property (NOTE: May have DOM implicit calls)
  136. MACRO( BrOnHasLocalEnvProperty, BrEnvProperty, OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if object does not have the given property (NOTE: May have DOM implicit calls)
  137. MACRO_EXTEND( BrOnNoLocalEnvProperty, BrEnvProperty, OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if object does not have the given property (NOTE: May have DOM implicit calls)
  138. MACRO_WMS( BrOnObject_A, BrReg1, OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if typeId is not primitive type (i.e. > TypeIds_LastJavascriptPrimitiveType)
  139. MACRO_WMS( BrNotNull_A, BrReg1, OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if not NULL
  140. MACRO_BACKEND_ONLY( BrOnNotNullObj_A, BrReg1, OpTempNumberSources|OpTempObjectSources)
  141. MACRO_EXTEND_WMS( BrOnObjectOrNull_A, BrReg1, OpTempNumberSources|OpTempObjectSources)
  142. MACRO_EXTEND_WMS( BrNotUndecl_A, BrReg1, OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if source reg is NEQ to Undecl
  143. MACRO_BACKEND_ONLY( BrNotEq_A, Empty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if !'>='
  144. MACRO_BACKEND_ONLY( BrNotNeq_A, Empty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if !'>='
  145. MACRO_BACKEND_ONLY( BrSrNotEq_A, Empty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if !'>='
  146. MACRO_BACKEND_ONLY( BrSrNotNeq_A, Empty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Branch if !'>='
  147. MACRO_BACKEND_ONLY( BrNotGe_A, Empty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if !'>='
  148. MACRO_BACKEND_ONLY( BrNotGt_A, Empty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if !'>'
  149. MACRO_BACKEND_ONLY( BrNotLt_A, Empty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if !'<'
  150. MACRO_BACKEND_ONLY( BrNotLe_A, Empty, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut) // Branch if !'<='
  151. MACRO_BACKEND_ONLY( BrNotAddr_A, BrReg2, OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if != Address
  152. MACRO_BACKEND_ONLY( BrAddr_A, BrReg2, OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Branch if == Address
  153. MACRO_BACKEND_ONLY( BrOnException, Br, OpSideEffect)
  154. MACRO_BACKEND_ONLY( BrOnNoException, Br, OpSideEffect) // Mark it OpNoFallThrough?
  155. MACRO_BACKEND_ONLY( DeadBrEqual, Reg3, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Dead BrEqual, but still need to reference srcs
  156. MACRO_BACKEND_ONLY( DeadBrSrEqual, Reg3, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Dead BrSrEqual, but still need to reference srcs
  157. MACRO_BACKEND_ONLY( DeadBrRelational, Reg3, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Dead BrRelational, but still need to reference srcs
  158. MACRO_BACKEND_ONLY( DeadBrOnHasProperty,Reg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Dead BrOnHasProperty, but still need to reference srcs
  159. MACRO_BACKEND_ONLY( DeletedNonHelperBranch,Empty, OpSideEffect) // Deleted branch to non-helper. Used to avoid opHleper asserts.
  160. MACRO_BACKEND_ONLY( BrEq_I4, Empty, OpSideEffect|OpTempNumberSources) // int32 Branch if '==' (general equals)
  161. MACRO_BACKEND_ONLY( BrTrue_I4, Empty, OpSideEffect|OpTempNumberSources) // int32 Branch if 'true'
  162. MACRO_BACKEND_ONLY( BrFalse_I4, Empty, OpSideEffect|OpTempNumberSources) // int32 Branch if 'false'
  163. MACRO_BACKEND_ONLY( BrGe_I4, Empty, OpSideEffect|OpTempNumberSources) // int32 Branch if '>='
  164. MACRO_BACKEND_ONLY( BrUnGe_I4, Empty, OpSideEffect|OpTempNumberSources) // uint32 Branch if '>='
  165. MACRO_BACKEND_ONLY( BrGt_I4, Empty, OpSideEffect|OpTempNumberSources) // int32 Branch if '>'
  166. MACRO_BACKEND_ONLY( BrUnGt_I4, Empty, OpSideEffect|OpTempNumberSources) // uint32 Branch if '>'
  167. MACRO_BACKEND_ONLY( BrLt_I4, Empty, OpSideEffect|OpTempNumberSources) // int32 Branch if '<'
  168. MACRO_BACKEND_ONLY( BrUnLt_I4, Empty, OpSideEffect|OpTempNumberSources) // uint32 Branch if '<'
  169. MACRO_BACKEND_ONLY( BrLe_I4, Empty, OpSideEffect|OpTempNumberSources) // int32 Branch if '<='
  170. MACRO_BACKEND_ONLY( BrUnLe_I4, Empty, OpSideEffect|OpTempNumberSources) // uint32 Branch if '<='
  171. MACRO_BACKEND_ONLY( BrNeq_I4, Empty, OpSideEffect|OpTempNumberSources) // int32 Branch if '!=' (not general equals)
  172. // For Switch Case optimization
  173. MACRO( EndSwitch, Br, OpSideEffect) // Unconditional branch - This is equivalent to Br OpCode
  174. MACRO_WMS( Case, BrReg2, OpSideEffect|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources) // Equivalent to Branch if '===' (strict equals) (NOTE: May have DOM implicit calls)
  175. MACRO_WMS_PROFILED( BeginSwitch, Reg2, OpTempNumberTransfer|OpTempObjectTransfer|OpNonIntTransfer) // Switch statement - identifies the start of a switch statement
  176. // performs the function of Ld_A and does profiling
  177. // All the Call* function need to be together so that ProfileCall* can be calculated
  178. MACRO_BACKEND_ONLY( Call, Reg1, OpSideEffect|OpUseAllFields|OpCallInstr) // R0 <- Call (direct) registered function
  179. MACRO_BACKEND_ONLY( AsmJsCallI, Reg1, OpSideEffect|OpUseAllFields|OpCallInstr) // call from asm.js to asm.js
  180. MACRO_BACKEND_ONLY( AsmJsCallE, Reg1, OpSideEffect|OpUseAllFields|OpCallInstr) // call from asm.js to javascript
  181. // CallI through CallIExtendedFlags need to stay in this order since all the ProfiledCall* opcodes are calculated based on this order
  182. MACRO_WMS( CallI, CallI, OpSideEffect|OpUseAllFields|OpCallInstr|OpInlineCallInstr) // Return <- Call (indirect) Function(ArgCount)
  183. MACRO_WMS( CallIFlags, CallIFlags, OpSideEffect|OpUseAllFields|OpCallInstr|OpInlineCallInstr) // Return <- Call (indirect) Function(ArgCount)
  184. MACRO_WMS( CallIExtended, CallIExtended, OpSideEffect|OpUseAllFields|OpCallInstr)
  185. MACRO_WMS( CallIExtendedFlags, CallIExtendedFlags, OpSideEffect|OpUseAllFields|OpCallInstr)
  186. MACRO_BACKEND_ONLY( CallINew, CallIFlags, OpSideEffect|OpUseAllFields|OpCallInstr)
  187. MACRO_BACKEND_ONLY( CallINewTargetNew, CallIFlags, OpSideEffect|OpUseAllFields|OpCallInstr)
  188. MACRO_BACKEND_ONLY( CallIExtendedNew, CallIExtendedFlags, OpSideEffect|OpUseAllFields|OpCallInstr)
  189. MACRO_BACKEND_ONLY( CallIEval, CallIExtendedFlags, OpSideEffect|OpUseAllFields|OpCallInstr)
  190. MACRO_BACKEND_ONLY( CallIExtendedNewTargetNew, CallIExtendedFlags, OpSideEffect|OpUseAllFields|OpCallInstr)
  191. MACRO_BACKEND_ONLY( CallIDynamic, CallI, OpSideEffect|OpUseAllFields|OpCallInstr)
  192. MACRO_BACKEND_ONLY( CallIDynamicSpread, CallI, OpSideEffect|OpUseAllFields|OpCallInstr)
  193. MACRO_BACKEND_ONLY( CallDirect, Empty, OpTempNumberSources|OpCallInstr|OpSideEffect|OpHasImplicitCall|OpTempObjectProducing) // For direct calls to helper (used in inlining built-ins)
  194. MACRO_BACKEND_ONLY( InlineThrow, Reg1, OpSideEffect|OpPostOpDbgBailOut|OpDeadFallThrough) // Throw exception
  195. MACRO_BACKEND_ONLY( EHThrow, Reg1, OpSideEffect|OpPostOpDbgBailOut|OpDeadFallThrough) // Throw exception
  196. MACRO_WMS( Throw, Reg1, OpSideEffect|OpNoFallThrough|OpPostOpDbgBailOut) // Throw exception
  197. MACRO( Ret, Empty, OpSideEffect|OpUseAllFields|OpNoFallThrough) // Return from function
  198. MACRO_WMS( Yield, Reg2, OpSideEffect|OpUseAllFields) // Yield from generator function
  199. // Unary operations
  200. MACRO_WMS( Incr_A, Reg2, OpTempNumberProducing|OpOpndHasImplicitCall|OpDoNotTransfer|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Increment
  201. MACRO_WMS( Decr_A, Reg2, OpTempNumberProducing|OpOpndHasImplicitCall|OpDoNotTransfer|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Decrement
  202. MACRO_WMS( Neg_A, Reg2, OpTempNumberProducing|OpOpndHasImplicitCall|OpDoNotTransfer|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Arithmetic '-' (negate)
  203. MACRO_WMS( Not_A, Reg2, OpTempNumberProducing|OpOpndHasImplicitCall|OpDoNotTransfer|OpIsInt32|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Boolean '!' (not)
  204. // Integer Unary operations
  205. MACRO_BACKEND_ONLY( Neg_I4, Empty, OpDoNotTransfer|OpTempNumberSources|OpCanCSE) // int32 Arithmetic '-' (negate)
  206. MACRO_BACKEND_ONLY( Not_I4, Empty, OpDoNotTransfer|OpTempNumberSources|OpCanCSE) // int32 '!' (not)
  207. // NOTE:
  208. // Typeof
  209. // Only have external call for HostDispatch, but only QI, and shouldn't have direct side effect,
  210. // so we can dead store it but still need to check for implicit call.
  211. // It also doesn't call valueOf/toString
  212. // TypeofElem
  213. // May throw exception if x (in x.y or x[y]) is null or undefined, so it can't be dead store (OpSideEffect)
  214. // GetProperty may call getter, Typeof may have external call for HostDispatch
  215. // It also doesn't call valueOf/toString
  216. // REVIEW: TypeofRootFld will be off the root object which can't be null? So we could remove OpSideEffect?
  217. MACRO_WMS( Typeof, Reg2, OpTempNumberProducing|OpDoNotTransfer|OpOpndHasImplicitCall|OpCanCSE) // typeof x
  218. MACRO_EXTEND_WMS( Typeof_ReuseLoc, Reg2, OpTempNumberProducing|OpDoNotTransfer|OpOpndHasImplicitCall|OpCanCSE) // typeof x
  219. MACRO_WMS( TypeofElem, ElementI, OpTempNumberProducing|OpSideEffect|OpDoNotTransfer|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // typeof x[y]
  220. MACRO_WMS( ApplyArgs, Reg5, OpByteCodeOnly|OpSideEffect|OpUseAllFields) // apply function to this function's arguments and this pointer
  221. // Binary operations
  222. MACRO_WMS( Add_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut) // Arithmetic '+'
  223. MACRO_WMS_PROFILED( Div_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Arithmetic '/'
  224. MACRO_WMS( Mul_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Arithmetic '*'
  225. MACRO_WMS_PROFILED( Rem_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Arithmetic '%'
  226. MACRO_WMS( Sub_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Arithmetic '-' (subtract)
  227. MACRO_WMS( Expo_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Arithmetic '**' (exponentiation)
  228. MACRO_WMS( And_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpIsInt32|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Bitwise '&'
  229. MACRO_WMS( Or_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpIsInt32|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Bitwise '|'
  230. MACRO_WMS( Xor_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpIsInt32|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Bitwise '^'
  231. MACRO_WMS( Shl_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpIsInt32|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Shift '<<' (signed, truncate)
  232. MACRO_WMS( Shr_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpIsInt32|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpProducesNumber) // Shift '>>' (signed, truncate)
  233. MACRO_WMS( ShrU_A, Reg3, OpTempNumberProducing|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut|OpProducesNumber) // Shift '>>>'(unsigned, truncate)
  234. // Integer Binary operations used only by backend, hence no need for one byte variant
  235. MACRO_BACKEND_ONLY( Add_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 Arithmetic '+'
  236. MACRO_BACKEND_ONLY( Sub_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 Arithmetic '-' (subtract)
  237. MACRO_BACKEND_ONLY( Mul_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 Arithmetic '*'
  238. MACRO_BACKEND_ONLY( Div_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 Arithmetic '/'
  239. MACRO_BACKEND_ONLY( DivU_I4, Empty, OpTempNumberSources|OpCanCSE) // uint32 Arithmetic '/'
  240. MACRO_BACKEND_ONLY( Rem_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 Arithmetic '%'
  241. MACRO_BACKEND_ONLY( RemU_I4, Empty, OpTempNumberSources|OpCanCSE) // uint32 Arithmetic '%'
  242. MACRO_BACKEND_ONLY( And_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 Bitwise '&'
  243. MACRO_BACKEND_ONLY( Or_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 Bitwise '|'
  244. MACRO_BACKEND_ONLY( Xor_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 Bitwise '^'
  245. MACRO_BACKEND_ONLY( Shl_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 Shift '<<' (signed, truncate)
  246. MACRO_BACKEND_ONLY( Shr_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 Shift '>>' (signed, truncate)
  247. MACRO_BACKEND_ONLY( ShrU_I4, Empty, OpTempNumberSources|OpCanCSE) // uint32 Shift '>>>'(unsigned, truncate)
  248. MACRO_BACKEND_ONLY( Rol_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 rol (signed)
  249. MACRO_BACKEND_ONLY( Ror_I4, Empty, OpTempNumberSources|OpCanCSE) // int32 ror (signed)
  250. // Comparison
  251. MACRO_WMS( CmEq_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE) // Compare if '==' (general equals)
  252. MACRO_WMS( CmGe_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut) // Compare if '>='
  253. MACRO_BACKEND_ONLY( CmUnGe_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut) // Compare if '>='
  254. MACRO_WMS( CmGt_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut) // Compare if '>'
  255. MACRO_BACKEND_ONLY( CmUnGt_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut) // Compare if '>'
  256. MACRO_WMS( CmLt_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut) // Compare if '<'
  257. MACRO_BACKEND_ONLY( CmUnLt_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut) // Compare if '<'
  258. MACRO_WMS( CmLe_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut) // Compare if '<='
  259. MACRO_BACKEND_ONLY( CmUnLe_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut) // Compare if '<='
  260. MACRO_WMS( CmNeq_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE) // Compare if '!=' (not general equals)
  261. MACRO_WMS( CmSrEq_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpTempObjectSources) // Compare if '===' (strict equals) (NOTE: May have DOM implicit calls)
  262. MACRO_WMS( CmSrNeq_A, Reg3, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpTempObjectSources) // Compare if '!==' (not strict equals) (NOTE: May have DOM implicit calls)
  263. MACRO_BACKEND_ONLY( CmEq_I4, Reg3, OpTempNumberSources|OpCanCSE) // Unsigned I4 Compare if '=='
  264. MACRO_BACKEND_ONLY( CmNeq_I4, Reg3, OpTempNumberSources|OpCanCSE) // Unsigned I4 Compare if '!='
  265. MACRO_BACKEND_ONLY( CmLt_I4, Reg3, OpTempNumberSources|OpCanCSE) // Unsigned I4 Compare if '<'
  266. MACRO_BACKEND_ONLY( CmLe_I4, Reg3, OpTempNumberSources|OpCanCSE) // Unsigned I4 Compare if '<='
  267. MACRO_BACKEND_ONLY( CmGt_I4, Reg3, OpTempNumberSources|OpCanCSE) // Unsigned I4 Compare if '>'
  268. MACRO_BACKEND_ONLY( CmGe_I4, Reg3, OpTempNumberSources|OpCanCSE) // Unsigned I4 Compare if '>='
  269. MACRO_BACKEND_ONLY( CmUnLt_I4, Reg3, OpTempNumberSources|OpCanCSE) // Unsigned I4 Compare if '<'
  270. MACRO_BACKEND_ONLY( CmUnLe_I4, Reg3, OpTempNumberSources|OpCanCSE) // Unsigned I4 Compare if '<='
  271. MACRO_BACKEND_ONLY( CmUnGt_I4, Reg3, OpTempNumberSources|OpCanCSE) // Unsigned I4 Compare if '>'
  272. MACRO_BACKEND_ONLY( CmUnGe_I4, Reg3, OpTempNumberSources|OpCanCSE) // Unsigned I4 Compare if '>='
  273. // Conversions
  274. MACRO_WMS( Conv_Num, Reg2, OpSideEffect|OpTempNumberProducing|OpTempNumberTransfer|OpTempObjectSources|OpOpndHasImplicitCall|OpProducesNumber) // Convert to Number. [[ToNumber()]]
  275. // Operation ToString(str)
  276. MACRO_EXTEND_WMS( Conv_Str, Reg2, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut)
  277. // Operation ToPropertyKey(var)
  278. MACRO_EXTEND_WMS( Conv_Prop, Reg2, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut)
  279. // Conv_Obj:
  280. // OpSideEffect - May throw exception on null/undefined.
  281. // Do not call valueOf/toString no implicit call
  282. MACRO_WMS( Conv_Obj, Reg2, OpSideEffect|OpPostOpDbgBailOut|OpTempObjectTransfer) // Convert to Object
  283. MACRO_EXTEND_WMS( NewUnscopablesWrapperObject, Reg2, OpSideEffect | OpPostOpDbgBailOut) // Wrap in a with Object
  284. MACRO_BACKEND_ONLY( ToVar, Reg2, OpTempNumberProducing|OpTempNumberSources|OpCanCSE) // Load from int32/float64 to Var(reg)
  285. // Load from Var(reg) to int32/float64, NOTE: always bail if it is not primitive. so no implicit call, but still mark with CallsValueOf so it won't get automatically dead stored
  286. // TODO: Consider changing the code so we don't have mark this as CallsValueOf
  287. MACRO_BACKEND_ONLY( FromVar, Reg2, OpTempNumberSources|OpTempObjectSources|OpCanCSE)
  288. MACRO_BACKEND_ONLY( Conv_Prim, Reg2, OpTempNumberProducing|OpTempNumberSources|OpCanCSE|OpPostOpDbgBailOut) // Convert between primitives (int32/float64)
  289. MACRO_BACKEND_ONLY( Conv_Prim_Sat, Reg2, OpTempNumberProducing|OpTempNumberSources|OpCanCSE) // Convert between primitives (int/float), saturating OOB values
  290. MACRO_BACKEND_ONLY( Conv_Bool, Reg2, OpTempNumberSources|OpCanCSE) // Convert from i4 to bool
  291. MACRO_BACKEND_ONLY( Reinterpret_Prim, Reg2, OpTempNumberProducing|OpTempNumberSources|OpCanCSE) // Reinterpret bits between primitives (int32/float32)
  292. MACRO_BACKEND_ONLY( TrapIfTruncOverflow, Reg2, OpSideEffect)
  293. // Register
  294. MACRO_EXTEND_WMS( UnwrapWithObj, Reg2, OpSideEffect) // Copy Var register with unwrapped object
  295. MACRO_EXTEND_WMS( UnwrapWithObj_ReuseLoc,Reg2, OpSideEffect) // Copy Var register with unwrapped object
  296. MACRO_EXTEND_WMS( SetComputedNameVar, Reg2, OpSideEffect)
  297. MACRO_WMS( Ld_A, Reg2, OpTempNumberTransfer|OpTempObjectTransfer|OpNonIntTransfer|OpCanCSE) // Copy Var register
  298. MACRO_WMS( Ld_A_ReuseLoc, Reg2, OpTempNumberTransfer|OpTempObjectTransfer|OpNonIntTransfer|OpCanCSE) // Copy Var register
  299. MACRO_WMS( LdLocalObj, Reg1, OpCanCSE) // Load non-stack frame object
  300. MACRO_EXTEND_WMS( LdLocalObj_ReuseLoc,Reg1, OpCanCSE) // Load non-stack frame object
  301. MACRO_EXTEND_WMS( LdParamObj, Reg1, OpCanCSE) // Load non-stack param scope frame object
  302. MACRO_WMS( LdInnerScope, Reg1Unsigned1, OpCanCSE) // Load non-stack inner scope
  303. MACRO_WMS( LdC_A_Null, Reg1, OpByteCodeOnly|OpCanCSE) // Load from 'null' as Var
  304. MACRO_BACKEND_ONLY( Ld_I4, Empty, OpCanCSE) // Copy I4 register
  305. MACRO_BACKEND_ONLY( LdC_A_I4, Empty, OpCanCSE) // Load from 'int32' as Var(C)
  306. MACRO_BACKEND_ONLY( LdC_A_R8, Empty, OpCanCSE) // Load from 'double' constant
  307. MACRO_BACKEND_ONLY( LdC_F8_R8, Empty, OpCanCSE) // Load 'double' constant
  308. MACRO_BACKEND_ONLY( LdIndir, Empty, OpTempNumberSources|OpTempObjectSources|OpCanCSE)
  309. MACRO_WMS( ChkUndecl, Reg1, OpSideEffect)
  310. MACRO_WMS_ROOT( EnsureNoRootFld, ElementRootU, OpSideEffect)
  311. MACRO_WMS_ROOT( EnsureNoRootRedeclFld, ElementRootU, OpSideEffect)
  312. MACRO_EXTEND_WMS_ROOT( EnsureCanDeclGloFunc, ElementRootU, OpSideEffect)
  313. MACRO_WMS( ScopedEnsureNoRedeclFld, ElementScopedC, OpSideEffect)
  314. MACRO_WMS( InitUndecl, Reg1, OpCanCSE)
  315. // TODO: Change InitUndeclLetFld and InitUndeclConstFld to ElementU layouts since they do not use their inline cache
  316. MACRO_WMS( InitUndeclLetFld, ElementPIndexed,OpByteCodeOnly|OpSideEffect)
  317. MACRO_EXTEND_WMS( InitUndeclLocalLetFld, ElementP, OpByteCodeOnly|OpSideEffect)
  318. MACRO_WMS_ROOT( InitUndeclRootLetFld, ElementRootU, OpSideEffect)
  319. MACRO_EXTEND_WMS( InitUndeclConstFld, ElementPIndexed,OpByteCodeOnly|OpSideEffect)
  320. MACRO_EXTEND_WMS( InitUndeclLocalConstFld, ElementP, OpByteCodeOnly|OpSideEffect)
  321. MACRO_WMS_ROOT( InitUndeclRootConstFld, ElementRootU, OpSideEffect)
  322. MACRO_EXTEND_WMS( InitUndeclConsoleLetFld, ElementScopedU, OpSideEffect)
  323. MACRO_EXTEND_WMS( InitUndeclConsoleConstFld, ElementScopedU, OpSideEffect)
  324. MACRO_WMS( InitConstSlot, ElementSlot, None)
  325. // Re-evaluate following 4 opcodes and InitInnerLetFld for obj type spec and inline cache lookup when we add sharing of types having properties with non-default
  326. // attributes. Currently, these opcodes are used to set properties on scope objects, whose types we do not share as all their properties are non-configurable
  327. MACRO_WMS( InitLetFld, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Declare a property with an initial value
  328. MACRO_WMS_ROOT( InitRootLetFld, ElementRootCP, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Declare a property with an initial value
  329. MACRO_WMS( InitConstFld, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Declare a property with an initial value
  330. MACRO_WMS_ROOT( InitRootConstFld, ElementRootCP, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Declare a property with an initial value
  331. MACRO_WMS( InitClassMember, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Class member
  332. MACRO_EXTEND_WMS( InitClassMemberComputedName,ElementI, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Class member with computed property name
  333. MACRO_EXTEND_WMS( InitClassMemberSet, ElementC, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Class member in set syntax
  334. MACRO_EXTEND_WMS( InitClassMemberGet, ElementC, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Class member in get syntax
  335. MACRO_EXTEND_WMS( InitClassMemberSetComputedName,ElementI, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Class member in set syntax with computed property name
  336. MACRO_EXTEND_WMS( InitClassMemberGetComputedName,ElementI, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Class member in get syntax with computed property name
  337. MACRO_EXTEND_WMS( BrOnClassConstructor, BrReg1, None) // Branch if argument is a class constructor
  338. MACRO_EXTEND_WMS( BrOnBaseConstructorKind, BrReg1, None) // Branch if argument's [[ConstructorKind]] is 'base'
  339. MACRO_BACKEND_ONLY( NewClassProto, Empty, OpSideEffect)
  340. MACRO_BACKEND_ONLY( NewClassConstructor, Empty, OpSideEffect)
  341. MACRO_BACKEND_ONLY( BrOnConstructor_A, BrReg1, None)
  342. MACRO_BACKEND_ONLY( ArgIn_A, Empty, None) // Copy from "in slot" to "local slot", unchecked
  343. MACRO_WMS( ArgIn0, Reg1, OpByteCodeOnly) // Copy from "in slot" to "local slot", unchecked
  344. MACRO_BACKEND_ONLY( ArgIn_Rest, Empty, OpSideEffect)
  345. MACRO_WMS_PROFILED( ArgOut_A, Arg, OpSideEffect) // Copy from "local slot" to "out slot"
  346. MACRO_BACKEND_ONLY( ArgOut_A_Inline, Empty, OpSideEffect|OpTempNumberSources|OpTempObjectSources) // Copy from "local slot" to "out slot"
  347. MACRO_BACKEND_ONLY( ArgOut_A_InlineBuiltIn, Empty, OpSideEffect|OpTempNumberTransfer|OpTempObjectTransfer) // Used as virtual ArgOut for inline built-ins (Math.sin, etc). Removed in lowerer.
  348. MACRO_BACKEND_ONLY( ArgOut_A_InlineSpecialized, Empty, OpSideEffect) // Used as virtual ArgOut to keep function object around for inlining built-ins by direct call to helpers.
  349. MACRO_WMS( ArgOut_ANonVar, Arg, OpByteCodeOnly|OpSideEffect) // Copy from "local slot" to "out slot"
  350. MACRO_WMS( ArgOut_Env, ArgNoSrc, OpByteCodeOnly|OpSideEffect) // Copy from "local slot" to "out slot"
  351. MACRO_BACKEND_ONLY( ArgOut_A_Dynamic, Empty, OpSideEffect) // Copy from "local slot" to "out slot"
  352. MACRO_BACKEND_ONLY( ArgOut_A_FromStackArgs, Empty, OpSideEffect) // Copy from "local slot" to "out slot"
  353. MACRO_BACKEND_ONLY( ArgOut_A_FixupForStackArgs, Empty, OpSideEffect)
  354. MACRO_BACKEND_ONLY( ArgOut_A_SpreadArg, Empty, OpSideEffect)
  355. MACRO_WMS( Delete_A, Reg2, OpSideEffect|OpPostOpDbgBailOut) // Delete Var
  356. // Object operations
  357. MACRO_WMS_PROFILED_OP( LdFld, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut|OpCanLoadFixedFields) // Load from ScriptObject instance's direct field
  358. MACRO_WMS_PROFILED_OP( LdFld_ReuseLoc, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut|OpCanLoadFixedFields) // Load from ScriptObject instance's direct field
  359. MACRO_WMS_PROFILED_OP( LdLocalFld, ElementP, OpSideEffect|OpFastFldInstr|OpPostOpDbgBailOut|OpCanLoadFixedFields) // Load from ScriptObject instance's direct field
  360. MACRO_WMS_PROFILED_OP( LdLocalFld_ReuseLoc, ElementP, OpSideEffect|OpFastFldInstr|OpPostOpDbgBailOut|OpCanLoadFixedFields) // Load from ScriptObject instance's direct field
  361. MACRO_EXTEND_WMS( LdEnvObj, ElementSlotI1, OpTempNumberSources)
  362. MACRO_EXTEND_WMS( LdEnvObj_ReuseLoc, ElementSlotI1, OpTempNumberSources)
  363. MACRO_EXTEND_WMS_AND_PROFILED_OP(LdSuperFld, ElementC2, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut|OpCanLoadFixedFields) // Load from ScriptObject super instance's direct field
  364. MACRO_WMS_PROFILED_OP( LdFldForTypeOf, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut|OpCanLoadFixedFields)
  365. MACRO_EXTEND_WMS_AND_PROFILED_OP_ROOT(LdRootFldForTypeOf, ElementRootCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut|OpCanLoadFixedFields)
  366. MACRO_WMS_PROFILED_OP( LdFldForCallApplyTarget, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut)
  367. MACRO_WMS_PROFILED_OP_ROOT(LdRootFld, ElementRootCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut|OpCanLoadFixedFields) // Load from ScriptObject instance's direct field (access to let/const on root object)
  368. MACRO_WMS_PROFILED_OP(LdMethodFld, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut|OpCanLoadFixedFields) // Load call target from ScriptObject instance's direct field
  369. MACRO_EXTEND_WMS_AND_PROFILED_OP(LdLocalMethodFld, ElementP, OpSideEffect|OpFastFldInstr|OpPostOpDbgBailOut|OpCanLoadFixedFields) // Load call target from ScriptObject instance's direct field
  370. MACRO_BACKEND_ONLY( LdMethodFldPolyInlineMiss, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpDoNotTransfer|OpPostOpDbgBailOut) // Load call target from ScriptObject instance's direct field, when the call target is neither of
  371. // the ones we inlined using fixed methods, at a polymorphic call site,
  372. // but don't allow it to participate in any obj type spec optimizations,
  373. // as it will always result in a helper call.
  374. MACRO_WMS_PROFILED_OP_ROOT(LdRootMethodFld, ElementRootCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Load call target from ScriptObject instance's direct field (access to let/const on root object)
  375. MACRO_WMS_PROFILED_OP( StFld, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject instance's direct field
  376. MACRO_EXTEND_WMS_AND_PROFILED_OP(StSuperFld, ElementC2, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject super instance's direct field
  377. MACRO_EXTEND_WMS_AND_PROFILED_OP(StSuperFldStrict, ElementC2, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject super instance's direct field (strict mode, super.x = ...)
  378. MACRO_WMS_PROFILED_OP_ROOT(StRootFld, ElementRootCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject instance's direct field (access to let/const on root object)
  379. MACRO_WMS_PROFILED_OP( StLocalFld, ElementP, OpSideEffect|OpFastFldInstr|OpPostOpDbgBailOut) // Store into local activation object
  380. MACRO_WMS_PROFILED_OP( StFldStrict, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject instance's direct field (strict mode, a.x = ...)
  381. MACRO_WMS_PROFILED_OP_ROOT(StRootFldStrict, ElementRootCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Store into ScriptObject instance's direct field (strict mode, x = ..., access to let/const on root object)
  382. MACRO_WMS_PROFILED_OP( InitFld, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Declare a property with an initial value
  383. MACRO_WMS_PROFILED_OP( InitLocalFld, ElementP, OpSideEffect|OpFastFldInstr|OpPostOpDbgBailOut) // Declare a property with an initial value
  384. MACRO_EXTEND_WMS( InitLocalLetFld, ElementP, OpSideEffect|OpPostOpDbgBailOut) // Declare a property with an initial value
  385. MACRO_EXTEND_WMS( InitInnerFld, ElementPIndexed,OpSideEffect|OpFastFldInstr|OpPostOpDbgBailOut) // Declare a property with an initial value
  386. MACRO_EXTEND_WMS( InitInnerLetFld, ElementPIndexed,OpSideEffect|OpPostOpDbgBailOut) // Declare a property with an initial value
  387. MACRO_WMS_PROFILED_OP_ROOT(InitRootFld, ElementRootCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut) // Declare a property with an initial value
  388. MACRO_BACKEND_ONLY( LdMethodFromFlags, ElementCP, OpFastFldInstr|OpCanCSE)
  389. MACRO_WMS( DeleteFld, ElementC, OpSideEffect|OpOpndHasImplicitCall|OpDoNotTransfer|OpPostOpDbgBailOut) // Remove a property
  390. MACRO_EXTEND_WMS( DeleteFld_ReuseLoc, ElementC, OpSideEffect|OpOpndHasImplicitCall|OpDoNotTransfer|OpPostOpDbgBailOut) // Remove a property
  391. MACRO_EXTEND_WMS( DeleteLocalFld, ElementU, OpSideEffect|OpDoNotTransfer|OpPostOpDbgBailOut) // Remove a property
  392. MACRO_EXTEND_WMS( DeleteLocalFld_ReuseLoc, ElementU, OpSideEffect|OpDoNotTransfer|OpPostOpDbgBailOut) // Remove a property
  393. MACRO_WMS_ROOT( DeleteRootFld, ElementC, OpSideEffect|OpOpndHasImplicitCall|OpDoNotTransfer|OpPostOpDbgBailOut) // Remove a property (access to let/const on root object)
  394. MACRO_WMS( DeleteFldStrict, ElementC, OpSideEffect|OpOpndHasImplicitCall|OpDoNotTransfer|OpPostOpDbgBailOut) // Remove a property in strict mode
  395. MACRO_WMS_ROOT( DeleteRootFldStrict, ElementC, OpSideEffect|OpHasImplicitCall|OpDoNotTransfer|OpPostOpDbgBailOut) // Remove a property in strict mode (access to let/const on root object)
  396. MACRO_WMS( ScopedLdFld, ElementP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Load from function's scope stack
  397. MACRO_EXTEND_WMS( ScopedLdFldForTypeOf, ElementP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Load from function's scope stack for Typeof of a property
  398. MACRO_WMS( ScopedLdMethodFld, ElementCP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Load call target from ScriptObject instance's direct field, but either scope object or root load from root object
  399. MACRO_WMS( ScopedLdInst, ElementScopedC2,OpSideEffect|OpHasImplicitCall) // Load owning instance from function's scope stack (NOTE: HasProperty may call DOM)
  400. MACRO_WMS( ScopedInitFunc, ElementScopedC, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Init on instance on scope stack
  401. MACRO_WMS( ScopedStFld, ElementP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Store to function's scope stack
  402. MACRO_EXTEND_WMS( ConsoleScopedStFld, ElementP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Store to function's scope stack
  403. MACRO_WMS( ScopedStFldStrict, ElementP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Store to function's scope stack
  404. MACRO_EXTEND_WMS( ConsoleScopedStFldStrict, ElementP, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Store to function's scope stack in strict mode for console scope
  405. MACRO_WMS( ScopedDeleteFld, ElementScopedC, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Remove a property through a stack of scopes
  406. MACRO_WMS( ScopedDeleteFldStrict, ElementScopedC, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Remove a property through a stack of scopes in strict mode
  407. MACRO_WMS_PROFILED( LdSlot, ElementSlot, OpTempNumberSources)
  408. MACRO_WMS_PROFILED( LdEnvSlot, ElementSlotI2, OpTempNumberSources)
  409. MACRO_WMS_PROFILED( LdInnerSlot, ElementSlotI2, OpTempNumberSources)
  410. MACRO_WMS_PROFILED( LdLocalSlot, ElementSlotI1, OpTempNumberSources)
  411. MACRO_EXTEND_WMS_AND_PROFILED(LdParamSlot, ElementSlotI1, OpTempNumberSources)
  412. MACRO_BACKEND_ONLY( LdSlotArr, ElementSlot, OpTempNumberSources)
  413. MACRO_EXTEND_WMS_AND_PROFILED(LdInnerObjSlot, ElementSlotI2, OpTempNumberSources)
  414. MACRO_EXTEND_WMS_AND_PROFILED(LdObjSlot, ElementSlot, None)
  415. MACRO_EXTEND_WMS_AND_PROFILED(LdLocalObjSlot, ElementSlotI1, None)
  416. MACRO_EXTEND_WMS_AND_PROFILED(LdParamObjSlot, ElementSlotI1, None)
  417. MACRO_EXTEND_WMS_AND_PROFILED(LdEnvObjSlot, ElementSlotI2, None)
  418. MACRO_EXTEND_WMS_AND_PROFILED(LdModuleSlot, ElementSlotI2, None)
  419. MACRO_BACKEND_ONLY( StSlot, ElementSlot, None)
  420. MACRO_WMS( StEnvSlot, ElementSlotI2, None)
  421. MACRO_WMS( StInnerSlot, ElementSlotI2, None)
  422. MACRO_WMS( StLocalSlot, ElementSlotI1, None)
  423. MACRO_EXTEND_WMS( StParamSlot, ElementSlotI1, None)
  424. MACRO_BACKEND_ONLY( StSlotChkUndecl, ElementSlot, OpSideEffect|OpNonIntTransfer) // Src1 is transferred to Dst, Src2 holds the same value as Dst to communicate Dst's liveness.
  425. MACRO_EXTEND_WMS( StEnvSlotChkUndecl, ElementSlotI2, OpSideEffect|OpNonIntTransfer)
  426. MACRO_EXTEND_WMS( StInnerSlotChkUndecl, ElementSlotI2, OpSideEffect|OpNonIntTransfer)
  427. MACRO_EXTEND_WMS( StLocalSlotChkUndecl, ElementSlotI1, OpSideEffect|OpNonIntTransfer)
  428. MACRO_EXTEND_WMS( StParamSlotChkUndecl, ElementSlotI1, OpSideEffect|OpNonIntTransfer)
  429. MACRO_EXTEND_WMS( StObjSlot, ElementSlot, OpSideEffect)
  430. MACRO_EXTEND_WMS( StInnerObjSlot, ElementSlotI2, OpSideEffect)
  431. MACRO_EXTEND_WMS( StLocalObjSlot, ElementSlotI1, OpSideEffect)
  432. MACRO_EXTEND_WMS( StParamObjSlot, ElementSlotI1, OpSideEffect)
  433. MACRO_EXTEND_WMS( StLocalObjSlotChkUndecl, ElementSlotI1, OpSideEffect|OpNonIntTransfer)
  434. MACRO_EXTEND_WMS( StParamObjSlotChkUndecl, ElementSlotI1, OpSideEffect|OpNonIntTransfer)
  435. MACRO_EXTEND_WMS( StEnvObjSlot, ElementSlotI2, OpSideEffect)
  436. MACRO_EXTEND_WMS( StObjSlotChkUndecl, ElementSlot, OpSideEffect|OpNonIntTransfer)
  437. MACRO_EXTEND_WMS( StInnerObjSlotChkUndecl, ElementSlotI2, OpSideEffect|OpNonIntTransfer)
  438. MACRO_EXTEND_WMS( StEnvObjSlotChkUndecl, ElementSlotI2, OpSideEffect|OpNonIntTransfer)
  439. MACRO_EXTEND_WMS( StModuleSlot, ElementSlotI2, OpSideEffect)
  440. MACRO_BACKEND_ONLY( LdAsmJsFunc, ElementSlot, OpTempNumberSources|OpCanCSE)
  441. MACRO_BACKEND_ONLY( LdWasmFunc, ElementSlot, OpSideEffect)
  442. MACRO_BACKEND_ONLY( CheckWasmSignature, Reg2, OpSideEffect)
  443. MACRO_BACKEND_ONLY( GrowWasmMemory, Reg3, OpSideEffect)
  444. #ifndef FLOAT_VAR
  445. MACRO_BACKEND_ONLY( StSlotBoxTemp, Empty, OpSideEffect|OpTempNumberSources)
  446. #endif
  447. MACRO_WMS_PROFILED( LdElemI_A, ElementI, OpHasImplicitCall|OpCanCSE|OpPostOpDbgBailOut) // Load from instance's indirect element / field, checked
  448. MACRO_WMS( LdMethodElem, ElementI, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Load call target from instance's indirect element / field, checked
  449. MACRO_WMS_PROFILED( StElemI_A, ElementI, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Store into instance's indirect element / field, checked
  450. MACRO_WMS_PROFILED( StElemI_A_Strict, ElementI, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Store into instance's indirect element / field, checked
  451. MACRO_BACKEND_ONLY( StArrViewElem, ElementI, OpSideEffect ) // Store into typed array view
  452. MACRO_BACKEND_ONLY( LdArrViewElem, ElementI, OpCanCSE ) // Load from typed array view
  453. MACRO_BACKEND_ONLY( LdArrViewElemWasm, ElementI, OpSideEffect ) // Load from wasm array
  454. MACRO_BACKEND_ONLY( StAtomicWasm, ElementI, OpSideEffect ) // Atomic store into typed array view
  455. MACRO_BACKEND_ONLY( LdAtomicWasm, ElementI, OpSideEffect ) // Atomic load from typed array view
  456. MACRO_BACKEND_ONLY( Memset, ElementI, OpSideEffect)
  457. MACRO_BACKEND_ONLY( Memcopy, ElementI, OpSideEffect)
  458. MACRO_BACKEND_ONLY( ArrayDetachedCheck, Reg1, None) // ensures that an ArrayBuffer has not been detached
  459. MACRO_BACKEND_ONLY( LdNativeCodeData, Reg1, OpSideEffect) // load native code data buffer
  460. MACRO_WMS( StArrItemI_CI4, ElementUnsigned1, OpSideEffect)
  461. MACRO_WMS( StArrItemC_CI4, ElementUnsigned1, OpSideEffect)
  462. MACRO_WMS( LdArrHead, Reg2, OpTempObjectSources)
  463. MACRO_BACKEND_ONLY( BoundCheck, Empty, OpTempNumberSources|OpTempObjectSources)
  464. MACRO_BACKEND_ONLY( UnsignedBoundCheck, Empty, OpTempNumberSources|OpTempObjectSources)
  465. MACRO_WMS( StArrInlineItem_CI4, ElementUnsigned1, OpSideEffect)
  466. MACRO_WMS( StArrSegItem_CI4, ElementUnsigned1, OpSideEffect)
  467. MACRO( StArrSegItem_A, Auxiliary, OpSideEffect)
  468. MACRO_WMS( DeleteElemI_A, ElementI, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Remove from instance's indirect element / field, checked
  469. MACRO_WMS( DeleteElemIStrict_A, ElementI, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // Remove from instance's indirect element / field, checked
  470. MACRO_EXTEND_WMS( InitSetFld, ElementC, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Set in Object Literal Syntax {set prop(args){}};
  471. MACRO_EXTEND_WMS( InitGetFld, ElementC, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Get in Object Literal Syntax {get prop(){}};
  472. MACRO_EXTEND_WMS( InitSetElemI, ElementI, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Set in Object Literal Syntax {set [expr](args){}};
  473. MACRO_EXTEND_WMS( InitGetElemI, ElementI, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Get in Object Literal Syntax {get [expr](args){}};
  474. MACRO_EXTEND_WMS( InitComputedProperty, ElementI, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Data property in Object Literal Syntax { [expr] : expr};
  475. MACRO_EXTEND_WMS( InitProto, ElementC, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // Declare __proto__ in Object Literal Syntax {__proto__: ...}
  476. MACRO_WMS_PROFILED( LdLen_A, ElementCP, OpSideEffect|OpOpndHasImplicitCall|OpFastFldInstr|OpPostOpDbgBailOut|OpTempObjectSources|OpCanLoadFixedFields) // Push array / string length
  477. MACRO_WMS( LdUndef, Reg1, OpByteCodeOnly|OpCanCSE) // Load 'undefined'
  478. MACRO_WMS( LdNaN, Reg1, OpByteCodeOnly|OpCanCSE) // Load 'NaN'
  479. MACRO_WMS( LdInfinity, Reg1, OpByteCodeOnly|OpCanCSE) // Load 'Infinity'
  480. MACRO_WMS( LdTrue, Reg1, OpByteCodeOnly|OpCanCSE) // Load 'true' boolean primitive
  481. MACRO_WMS( LdTrue_ReuseLoc, Reg1, OpByteCodeOnly|OpCanCSE) // Load 'true' boolean primitive
  482. MACRO_WMS( LdFalse, Reg1, OpByteCodeOnly|OpCanCSE) // Load 'false' boolean primitive
  483. MACRO_WMS( LdFalse_ReuseLoc, Reg1, OpByteCodeOnly|OpCanCSE) // Load 'false' boolean primitive
  484. MACRO_EXTEND_WMS( LdChakraLib, Reg1, OpByteCodeOnly|OpCanCSE) // Load '__chakraLibrary'
  485. MACRO_EXTEND_WMS( LdImportMeta, Reg1Unsigned1, OpHasImplicitCall) // Load 'import.meta' object
  486. MACRO_BACKEND_ONLY( LdEnv, Reg1, None) // Load the optional FixedSizeArray environment for closures
  487. MACRO_BACKEND_ONLY( LdAsmJsEnv, Reg1, None) // Load the asm.js memory
  488. MACRO_WMS( LdArgCnt, Reg1, None) // Load the argument count from the current function
  489. MACRO_BACKEND_ONLY( InitLoopBodyCount, Reg1, None) // fake instruction for loop body counter init
  490. MACRO_BACKEND_ONLY( IncrLoopBodyCount, Reg2, None) // fake instruction for loop body counter increment
  491. MACRO_BACKEND_ONLY( StLoopBodyCount, Reg1, OpSideEffect) // fake instruction for loop body counter store to loopheader profiledLoopCounter
  492. MACRO_WMS( LdHeapArguments, Reg1, OpSideEffect) // Load the heap-based "arguments" object
  493. MACRO_WMS( LdLetHeapArguments, Reg1, OpSideEffect) // Load the heap-based "arguments" object (formals are let-like instead of var-like)
  494. MACRO_WMS( LdHeapArgsCached, Reg1, OpSideEffect) // Load the heap-based "arguments" object in a cached scope
  495. MACRO_EXTEND_WMS( LdLetHeapArgsCached,Reg1, OpSideEffect) // Load the heap-based "arguments" object in a cached scope (formals are let-like instead of var-like)
  496. MACRO_EXTEND_WMS( LdStackArgPtr, Reg1, OpSideEffect) // Load the address of the base of the input parameter area
  497. MACRO_WMS_PROFILED_OP( LdThis, Reg2Int1, OpOpndHasImplicitCall|OpTempNumberTransfer) // Load this object (NOTE: TryLoadRoot exit scripts on host dispatch, but otherwise, no side effect)
  498. MACRO_BACKEND_ONLY( CheckThis, Reg1, OpCanCSE|OpBailOutRec)
  499. MACRO_BACKEND_ONLY( LdHandlerScope, Reg1, OpHasImplicitCall) // Load a scope stack for an event handler (both "this" and parent scopes)
  500. MACRO_BACKEND_ONLY( LdFrameDisplay, Reg3, None) // Set up a frame display for this function and its parent frames
  501. #if DBG
  502. MACRO_BACKEND_ONLY( LdFrameDisplayNoParent,Reg1, None) // Set up a frame display for this function and its parent frames
  503. MACRO_BACKEND_ONLY( CheckLowerIntBound, Reg2, None) // Check if the value of the operand is greater than or equal to the lower bound determined by the globopt for it
  504. MACRO_BACKEND_ONLY( CheckUpperIntBound, Reg2, None) // Check if the value of the operand is lesser than or equal to the upper bound determined by the globopt for it
  505. #endif
  506. MACRO_WMS( LdInnerFrameDisplay,Reg3, None) // Set up a frame display for this function and its parent frames -- this is for an inner scope, not the function-level scope
  507. MACRO_WMS( LdInnerFrameDisplayNoParent,Reg2, None) // Set up a frame display for this function and its parent frames -- this is for an inner scope, not the function-level scope
  508. MACRO_WMS( LdIndexedFrameDisplay,Reg2Int1, None) // Set up a frame display for this function and its parent frames -- this is for an inner scope, not the function-level scope
  509. MACRO_WMS( LdIndexedFrameDisplayNoParent,Reg1Unsigned1, None) // Set up a frame display for this function and its parent frames -- this is for an inner scope, not the function-level scope
  510. MACRO_WMS( LdFuncExprFrameDisplay,Reg2, None)
  511. MACRO_BACKEND_ONLY( NewStackFrameDisplay,Reg3, None) // Set up a frame display allocated on the stack
  512. MACRO_WMS_PROFILED( IsIn, Reg3, OpSideEffect|OpOpndHasImplicitCall|OpPostOpDbgBailOut) // "x in y" (NOTE: calls valueOf for the index
  513. MACRO_WMS( LdArgumentsFromFrame,Reg1, None) // Load the argument object from frame
  514. MACRO_WMS( LdElemUndef, ElementU, OpSideEffect) // Load 'undefined' to instance.property if not already present
  515. MACRO_EXTEND_WMS( LdLocalElemUndef, ElementRootU, OpSideEffect) // Load 'undefined' to instance.property if not already present
  516. MACRO_WMS( LdElemUndefScoped, ElementScopedU, OpSideEffect) // Load 'undefined' to [env].property if not already present in the scope
  517. MACRO_WMS( LdFuncExpr, Reg1, None) // Load the function expression to its location
  518. MACRO( LdPropIds, Auxiliary, None) // Load the property id array
  519. MACRO_WMS( StFuncExpr, ElementC, OpSideEffect) // Store the function expression to an activation object with attributes
  520. MACRO_WMS( StLocalFuncExpr, ElementU, OpSideEffect) // Store the function expression to the local activation object with attributes
  521. MACRO_EXTEND_WMS( LdNewTarget, Reg1, None) // Load new.target in an ordinary function call or construct call
  522. MACRO_EXTEND( ChkNewCallFlag, Empty, OpSideEffect) // Check to see if the current call has the CallFlags_New flag set and throw if it does not
  523. // Instancing operations
  524. MACRO_EXTEND_WMS(LdCustomSpreadIteratorList, Reg2, OpHasImplicitCall|OpSideEffect) // Runs the iterator on a function spread Argument
  525. MACRO_WMS_PROFILED_INDEX( NewScObject, CallI, OpSideEffect|OpUseAllFields|OpCallInstr) // Create new ScriptObject instance
  526. MACRO_EXTEND_WMS_AND_PROFILED(NewScObjectSpread, CallIExtended, OpSideEffect|OpUseAllFields|OpCallInstr) // Create new ScriptObject instance
  527. MACRO_WMS_PROFILED2( NewScObjArray, CallI, OpSideEffect|OpUseAllFields|OpCallInstr) // Create new ScriptObject instance
  528. MACRO_WMS_PROFILED2( NewScObjArraySpread, CallIExtended, OpSideEffect|OpUseAllFields|OpCallInstr) // Create new ScriptObject instance
  529. MACRO( NewScObject_A, Auxiliary, OpSideEffect|OpUseAllFields) // Create new ScriptObject instance passing only constants
  530. MACRO_WMS( NewScObjectNoCtorFull, Reg2, OpTempObjectCanStoreTemp|OpHasImplicitCall) // Create new object that will be used for the 'this' binding in a base class constructor
  531. MACRO_BACKEND_ONLY( NewScObjectNoCtor, Empty, OpTempObjectCanStoreTemp|OpHasImplicitCall) // Create new object that will be passed into a constructor
  532. MACRO_BACKEND_ONLY( GetNewScObject, Empty, OpTempObjectTransfer) // Determine which object to finally use as the result of NewScObject (object passed into constructor as 'this', or object returned by constructor)
  533. MACRO_BACKEND_ONLY( UpdateNewScObjectCache, Empty, None) // Update the cache used for NewScObject
  534. MACRO_WMS( NewScObjectSimple, Reg1, OpTempObjectCanStoreTemp)
  535. MACRO( NewScObjectLiteral, Auxiliary, OpSideEffect|OpTempObjectCanStoreTemp) // Create new ScriptObject instance with no constructor or arguments
  536. MACRO_WMS_PROFILED( NewScArray, Reg1Unsigned1, OpSideEffect|OpTempObjectProducing) // Create new ScriptArray instance
  537. MACRO_WMS( NewScArrayWithMissingValues, Reg1Unsigned1, OpSideEffect|OpTempObjectProducing) // Create new ScriptArray instance
  538. MACRO_PROFILED( NewScIntArray, Auxiliary, OpSideEffect|OpTempObjectProducing) // Create new ScriptArray instance
  539. MACRO_PROFILED( NewScFltArray, Auxiliary, OpSideEffect|OpTempObjectProducing) // Create new ScriptArray instance
  540. MACRO_EXTEND_WMS( InitBaseClass, Reg2U, OpSideEffect|OpPostOpDbgBailOut)
  541. MACRO_EXTEND_WMS( InitInnerBaseClass, Reg3U, OpSideEffect|OpPostOpDbgBailOut)
  542. MACRO_EXTEND_WMS( InitClass, Reg4U, OpSideEffect|OpPostOpDbgBailOut)
  543. MACRO_EXTEND_WMS( InitInnerClass, Reg5U, OpSideEffect|OpPostOpDbgBailOut)
  544. MACRO_EXTEND_WMS( CheckExtends, BrReg3, OpSideEffect)
  545. MACRO_WMS( NewScFunc, ElementSlotI1, OpSideEffect) // Create new ScriptFunction instance
  546. MACRO_BACKEND_ONLY( NewScFuncData, Reg2, None)
  547. MACRO_WMS( NewScGenFunc, ElementSlotI1, OpSideEffect) // Create new JavascriptGeneratorFunction instance
  548. MACRO_WMS( NewStackScFunc, ElementSlotI1, OpSideEffect|OpByteCodeOnly) // Create new ScriptFunction instance
  549. MACRO_EXTEND_WMS( NewInnerScFunc, ElementSlot, OpSideEffect) // Create new ScriptFunction instance
  550. MACRO_EXTEND_WMS( NewInnerScGenFunc, ElementSlot, OpSideEffect) // Create new JavascriptGeneratorFunction instance
  551. MACRO_EXTEND_WMS( NewInnerStackScFunc,ElementSlot, OpSideEffect|OpByteCodeOnly) // Create new ScriptFunction instance
  552. MACRO_WMS( NewScFuncHomeObj, ElementSlot, OpSideEffect) // Create new ScriptFunction instance that has home object
  553. MACRO_EXTEND_WMS( NewScGenFuncHomeObj, ElementSlot, OpSideEffect) // Create new JavascriptGeneratorFunction instance that has home object
  554. MACRO_EXTEND_WMS( NewInnerScFuncHomeObj, ElementSlotI3, OpSideEffect) // Create new ScriptFunction instance that has home object
  555. MACRO_EXTEND_WMS( NewInnerScGenFuncHomeObj, ElementSlotI3, OpSideEffect) // Create new JavascriptGeneratorFunction instance that has home object
  556. MACRO_EXTEND_WMS( NewAsyncFromSyncIterator, Reg2, OpSideEffect) // Create new JavascriptAsyncFromSyncOperator instance
  557. MACRO_EXTEND_WMS( NewAwaitObject, Reg2, OpSideEffect) // Create new internal await object instance
  558. MACRO_BACKEND_ONLY( NewScopeObject, Reg1, None) // Create new NewScopeObject
  559. MACRO_BACKEND_ONLY( InitCachedScope, Reg2Aux, None) // Retrieve cached scope; create if not cached
  560. MACRO_BACKEND_ONLY( InitLetCachedScope, Reg2Aux, OpSideEffect) // Retrieve cached scope; create if not cached (formals are let-like instead of var-like)
  561. MACRO( InitCachedFuncs, AuxNoReg, OpSideEffect)
  562. MACRO_WMS( GetCachedFunc, Reg1Unsigned1, None)
  563. MACRO( CommitScope, Empty, OpSideEffect) // Mark the cached scope object as committed on exit from the function
  564. MACRO_EXTEND_WMS( InvalCachedScope, Unsigned1, OpSideEffect)
  565. MACRO_WMS( NewPseudoScope, Unsigned1, None) // Create new scope that can't take normal var inits
  566. MACRO_WMS( NewBlockScope, Unsigned1, None) // Create new scope that takes only block-scoped inits
  567. MACRO_WMS( CloneBlockScope, Unsigned1, OpSideEffect) // Clone existing block scope in place for for-loop iterations
  568. MACRO_BACKEND_ONLY( NewScopeSlots, Reg1Unsigned1, None)
  569. MACRO_BACKEND_ONLY( NewStackScopeSlots, Reg1, None)
  570. MACRO_BACKEND_ONLY( InitLocalClosure, Reg1, None)
  571. MACRO_WMS( NewInnerScopeSlots, Reg3, None)
  572. MACRO_WMS( CloneInnerScopeSlots, Unsigned1, OpSideEffect) // Clone existing inner scope slots in place for for-loop iterations
  573. MACRO_BACKEND_ONLY( NewScopeSlotsWithoutPropIds, Reg3, None)
  574. MACRO_WMS( NewRegEx, Reg1Unsigned1, OpTempObjectCanStoreTemp|OpSideEffect) // Create a new RegEx expression
  575. MACRO_WMS( IsInst, Reg3C, OpSideEffect|OpHasImplicitCall|OpPostOpDbgBailOut) // instanceof() - SideEffect: can throw...
  576. // Collection operations
  577. MACRO_WMS_PROFILED( InitForInEnumerator,Reg1Unsigned1, OpSideEffect|OpHasImplicitCall) // Get enumerator from collection
  578. MACRO_WMS( BrOnEmpty, BrReg1Unsigned1,OpSideEffect|OpHasImplicitCall) // Move to next item; return value if not NULL, otherwise branch
  579. MACRO_BACKEND_ONLY ( BrOnNotEmpty, BrReg1Unsigned1,OpSideEffect|OpHasImplicitCall) // Move to next item; return true if done
  580. MACRO( TryCatch, Br, OpSideEffect)
  581. MACRO( TryFinally, Br, OpSideEffect|OpPostOpDbgBailOut)
  582. MACRO_EXTEND_WMS( TryFinallyWithYield, BrReg2, OpSideEffect|OpPostOpDbgBailOut)
  583. MACRO_WMS( Catch, Reg1, OpSideEffect)
  584. MACRO_EXTEND( Finally, Empty, OpSideEffect)
  585. MACRO_EXTEND( ResumeCatch, Empty, OpSideEffect)
  586. MACRO_EXTEND_WMS( ResumeFinally, BrReg2, OpSideEffect)
  587. MACRO( LeaveNull, Empty, OpSideEffect)
  588. MACRO( Leave, Empty, OpSideEffect|OpNoFallThrough)
  589. MACRO_BACKEND_ONLY( InlineRuntimeTypeError, W1, OpSideEffect|OpPostOpDbgBailOut) // Throws TypeError at runtime.
  590. MACRO_EXTEND( RuntimeTypeError, W1, OpSideEffect|OpPostOpDbgBailOut) // Throws TypeError at runtime.
  591. MACRO_BACKEND_ONLY( InlineRuntimeReferenceError, W1, OpSideEffect|OpPostOpDbgBailOut) // Throws ReferenceError at runtime.
  592. MACRO_EXTEND( RuntimeReferenceError, W1, OpSideEffect|OpPostOpDbgBailOut) // Throws ReferenceError at runtime.
  593. // Dynamic profile opcodes
  594. MACRO_WMS( LoopBodyStart, Unsigned1, OpByteCodeOnly) // Marks the start of a loop body
  595. MACRO_WMS( ProfiledLoopStart, Unsigned1, OpSideEffect) // Marks the start of a profiled loop
  596. MACRO_WMS( ProfiledLoopBodyStart, Unsigned1, OpSideEffect) // Marks the start of a profiled loop body
  597. MACRO_WMS( ProfiledLoopEnd, Unsigned1, OpSideEffect) // Marks the end of a profiled loop
  598. // The order of this need to be the same as the Call* order
  599. MACRO_WMS( ProfiledCallI, ProfiledCallI, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr|OpInlineCallInstr) // Return <- Call (indirect) Function(ArgCount)
  600. MACRO_WMS( ProfiledCallIFlags, ProfiledCallIFlags, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr|OpInlineCallInstr) // Return <- Call (indirect) Function(ArgCount)
  601. MACRO_WMS( ProfiledCallIExtended, ProfiledCallIExtended, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr)
  602. MACRO_WMS( ProfiledCallIExtendedFlags, ProfiledCallIExtendedFlags, OpByteCodeOnly|OpSideEffect|OpUseAllFields| OpCallInstr)
  603. MACRO_WMS( ProfiledCallIWithICIndex, ProfiledCallIWithICIndex, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr|OpInlineCallInstr) // Return <- Call (indirect) Function(ArgCount)
  604. MACRO_WMS( ProfiledCallIFlagsWithICIndex, ProfiledCallIFlagsWithICIndex, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr|OpInlineCallInstr) // Return <- Call (indirect) Function(ArgCount)
  605. MACRO_WMS( ProfiledCallIExtendedWithICIndex, ProfiledCallIExtendedWithICIndex, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr|OpInlineCallInstr) // Return <- Call (indirect) Function(ArgCount)
  606. MACRO_WMS( ProfiledCallIExtendedFlagsWithICIndex, ProfiledCallIExtendedFlagsWithICIndex, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr)
  607. // The order of this needs to be the same as the Call* order
  608. MACRO_WMS( ProfiledReturnTypeCallI, ProfiledCallI, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr|OpInlineCallInstr) // Return <- Call (indirect) Function(ArgCount)
  609. MACRO_WMS( ProfiledReturnTypeCallIFlags, ProfiledCallIFlags, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr|OpInlineCallInstr) // Return <- Call (indirect) Function(ArgCount)
  610. MACRO_WMS( ProfiledReturnTypeCallIExtended, ProfiledCallIExtended, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr)
  611. MACRO_WMS( ProfiledReturnTypeCallIExtendedFlags, ProfiledCallIExtendedFlags, OpByteCodeOnly|OpSideEffect|OpUseAllFields|OpCallInstr)
  612. MACRO_EXTEND_WMS( EmitTmpRegCount, Unsigned1, OpByteCodeOnly)
  613. MACRO_BACKEND_ONLY( Unused, Reg1, None)
  614. // String operations
  615. MACRO_WMS( Concat3, Reg4, OpByteCodeOnly|OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut)
  616. MACRO_WMS( NewConcatStrMulti, Reg3B1, None) // Although the byte code version include the concat, and has value of/to string, the BE version doesn't
  617. MACRO_BACKEND_ONLY( NewConcatStrMultiBE, Reg3B1, OpCanCSE) // Although the byte code version include the concat, and has value of/to string, the BE version doesn't
  618. MACRO_WMS( SetConcatStrMultiItem, Reg2B1, None) // Although the byte code version include the concat, and has value of/to string, the BE version doesn't
  619. MACRO_BACKEND_ONLY( SetConcatStrMultiItemBE, Reg2B1, OpCanCSE) // Although the byte code version include the concat, and has value of/to string, the BE version doesn't
  620. MACRO_WMS( SetConcatStrMultiItem2, Reg3B1, None) // Although the byte code version include the concat, and has value of/to string, the BE version doesn't
  621. MACRO_BACKEND_ONLY( LdStr, Empty, OpTempNumberProducing|OpCanCSE) // Load string literal
  622. MACRO_BACKEND_ONLY( CloneStr, Empty, OpTempNumberSources | OpTempNumberProducing) // Load string literal
  623. // Operation ToString(str) if str != null or str != undefined
  624. MACRO_BACKEND_ONLY( Coerce_Str, Empty, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpPostOpDbgBailOut)
  625. // Operation CreateRegex(regex)
  626. MACRO_BACKEND_ONLY( Coerce_Regex, Empty, OpOpndHasImplicitCall|OpTempNumberSources|OpTempNumberTransfer|OpPostOpDbgBailOut)
  627. // Operation CreateRegex(regex) or CoerseStr(arg)
  628. MACRO_BACKEND_ONLY( Coerce_StrOrRegex, Empty, OpOpndHasImplicitCall|OpTempNumberSources|OpTempNumberTransfer|OpPostOpDbgBailOut)
  629. // Operation ToString(ToPrimitive(src1))
  630. MACRO_BACKEND_ONLY( Conv_PrimStr, Empty, OpOpndHasImplicitCall|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpPostOpDbgBailOut)
  631. // The following are for lowering; currently the specified layout is not used
  632. MACRO_BACKEND_ONLY( StElemC, ElementC, OpSideEffect) // Store into Array instance's direct element, unchecked
  633. MACRO_BACKEND_ONLY( StArrSegElemC, ElementC, OpSideEffect) // Store into Array segment's direct element, unchecked
  634. MACRO_EXTEND( Label, Empty, OpSideEffect) // Label (branch target)
  635. MACRO_BACKEND_ONLY( CallHelper, Empty, OpSideEffect|OpUseAllFields) // Call a helper function
  636. MACRO_EXTEND( FunctionEntry, Empty, OpSideEffect) // Marks the start of a function
  637. MACRO_EXTEND( FunctionExit, Empty, OpSideEffect|OpNoFallThrough) // Marks the end of a function
  638. MACRO_EXTEND( StatementBoundary, Empty, None) // Marks the start or end of a statement
  639. MACRO_BACKEND_ONLY( BailOut, Empty, OpSideEffect|OpBailOutRec)
  640. MACRO_BACKEND_ONLY( BailOnEqual, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE)
  641. MACRO_BACKEND_ONLY( BailOnNotEqual, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE)
  642. MACRO_BACKEND_ONLY( BailOnNegative, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE)
  643. MACRO_BACKEND_ONLY( BailOnNotStackArgs, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE) // Bail out if not stack args or actuals exceed InlineeCallInfo::MaxInlineeArgoutCount (15)
  644. MACRO_BACKEND_ONLY( BailOnNotSpreadable, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE)
  645. MACRO_BACKEND_ONLY( BailOnNotPolymorphicInlinee, Empty, OpBailOutRec|OpTempNumberSources)
  646. MACRO_BACKEND_ONLY( BailTarget, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources)
  647. MACRO_BACKEND_ONLY( BailOnNoProfile, Empty, OpBailOutRec|OpDeadFallThrough)
  648. MACRO_BACKEND_ONLY( BailOnNoSimdTypeSpec, Empty, OpBailOutRec|OpDeadFallThrough)
  649. MACRO_BACKEND_ONLY( BailOnNotObject, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpTempObjectSources)
  650. MACRO_BACKEND_ONLY( BailOnNotPrimitive, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpTempObjectSources)
  651. MACRO_BACKEND_ONLY( BailOnPowIntIntOverflow, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpTempObjectSources)
  652. MACRO_BACKEND_ONLY( BailOnNotArray, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE|OpTempObjectSources)
  653. MACRO_BACKEND_ONLY( BailForDebugger, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpSideEffect) // Bail out so that we can continue the function under debugger. Disable optimizations for this instr so that it's not moved.
  654. MACRO_BACKEND_ONLY( BailOnNotBuiltIn, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE)
  655. MACRO_BACKEND_ONLY( BailOnException, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpDeadFallThrough)
  656. MACRO_BACKEND_ONLY( BailOnEarlyExit, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpDeadFallThrough)
  657. MACRO_BACKEND_ONLY( BailOnTaggedValue, Empty, OpBailOutRec|OpTempNumberSources|OpTempObjectSources|OpCanCSE)
  658. MACRO_BACKEND_ONLY( BytecodeArgOutCapture, Empty, OpTempNumberTransfer|OpTempObjectTransfer|OpNonIntTransfer) // Represents snapshotting of bytecode ArgOut_A in backend for purpose of bailout
  659. MACRO_BACKEND_ONLY( BytecodeArgOutUse, Empty, OpTempNumberSources | OpTempObjectSources) // Represents bytecode ArgOut_A use in the backend to keep args alive for the globopt
  660. MACRO_BACKEND_ONLY( ByteCodeUses, Empty, OpSideEffect|OpTempNumberSources|OpTempObjectSources)
  661. MACRO_BACKEND_ONLY( BailOutStackRestore,Empty, OpSideEffect)
  662. MACRO_BACKEND_ONLY( NoImplicitCallUses, Empty, None)
  663. MACRO_BACKEND_ONLY( NoIntOverflowBoundary, Empty, None)
  664. MACRO_BACKEND_ONLY( EndCallForPolymorphicInlinee, Empty, OpSideEffect|OpDeadFallThrough)
  665. MACRO_BACKEND_ONLY( InlineeStart, Empty, OpSideEffect)
  666. MACRO_BACKEND_ONLY( InlineeEnd, Empty, OpSideEffect)
  667. MACRO_BACKEND_ONLY( InlineeMetaArg, Empty, OpSideEffect)
  668. MACRO_BACKEND_ONLY( InlineBuiltInStart, Empty, OpSideEffect)
  669. MACRO_BACKEND_ONLY( InlineBuiltInEnd, Empty, OpSideEffect)
  670. MACRO_BACKEND_ONLY( InlineNonTrackingBuiltInEnd, Empty, OpSideEffect)
  671. MACRO_BACKEND_ONLY( InlineMathAcos, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  672. MACRO_BACKEND_ONLY( InlineMathAsin, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  673. MACRO_BACKEND_ONLY( InlineMathAtan, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  674. MACRO_BACKEND_ONLY( InlineMathAtan2, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  675. MACRO_BACKEND_ONLY( InlineMathCos, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  676. MACRO_BACKEND_ONLY( InlineMathExp, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  677. MACRO_BACKEND_ONLY( InlineMathLog, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  678. MACRO_BACKEND_ONLY( InlineMathPow, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  679. MACRO_BACKEND_ONLY( InlineMathSin, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  680. MACRO_BACKEND_ONLY( InlineMathSqrt, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  681. MACRO_BACKEND_ONLY( InlineMathTan, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpProducesNumber|OpCanCSE)
  682. // IE11 inline built-ins
  683. // TODO: put these upfront so that all built-ins are sorted.
  684. MACRO_BACKEND_ONLY( InlineMathAbs, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpCanCSE|OpProducesNumber)
  685. MACRO_BACKEND_ONLY( InlineMathClz, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpCanCSE|OpProducesNumber)
  686. MACRO_BACKEND_ONLY( Ctz, Empty, OpTempNumberSources|OpCanCSE|OpProducesNumber)
  687. MACRO_BACKEND_ONLY( Clz, Empty, OpTempNumberSources|OpCanCSE|OpProducesNumber)
  688. MACRO_BACKEND_ONLY( InlineMathCeil, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpCanCSE|OpBailOutRec|OpProducesNumber)
  689. MACRO_BACKEND_ONLY( InlineMathFloor, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpCanCSE|OpBailOutRec|OpProducesNumber)
  690. MACRO_BACKEND_ONLY( InlineMathMax, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpCanCSE|OpProducesNumber)
  691. MACRO_BACKEND_ONLY( InlineMathImul, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpCanCSE|OpProducesNumber)
  692. MACRO_BACKEND_ONLY( InlineMathMin, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpCanCSE|OpProducesNumber)
  693. MACRO_BACKEND_ONLY( InlineMathRandom, Empty, OpSideEffect|OpInlinableBuiltIn|OpProducesNumber)
  694. MACRO_BACKEND_ONLY( InlineMathRound, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpCanCSE|OpBailOutRec|OpProducesNumber)
  695. MACRO_BACKEND_ONLY( InlineMathFround, Empty, OpInlinableBuiltIn|OpTempNumberSources|OpCanCSE|OpProducesNumber)
  696. MACRO_BACKEND_ONLY( InlineStringCharAt, Empty, OpInlinableBuiltIn|OpCanCSE)
  697. MACRO_BACKEND_ONLY( InlineStringCharCodeAt, Empty, OpInlinableBuiltIn|OpCanCSE)
  698. MACRO_BACKEND_ONLY( InlineStringCodePointAt, Empty, OpInlinableBuiltIn|OpCanCSE)
  699. MACRO_BACKEND_ONLY( InlineArrayPop, Empty, OpSideEffect|OpInlinableBuiltIn|OpHasImplicitCall)
  700. MACRO_BACKEND_ONLY( InlineArrayPush, Empty, OpSideEffect|OpInlinableBuiltIn|OpHasImplicitCall)
  701. MACRO_BACKEND_ONLY( InlineFunctionApply, Empty, OpSideEffect|OpInlinableBuiltIn)
  702. MACRO_BACKEND_ONLY( InlineFunctionCall, Empty, OpSideEffect|OpInlinableBuiltIn)
  703. MACRO_BACKEND_ONLY( InlineCallInstanceFunction, Empty, OpSideEffect|OpInlinableBuiltIn)
  704. MACRO_BACKEND_ONLY( InlineRegExpExec, Empty, OpSideEffect|OpInlinableBuiltIn)
  705. MACRO_BACKEND_ONLY( CallIFixed, Empty, OpSideEffect|OpUseAllFields|OpCallInstr|OpInlineCallInstr)
  706. MACRO_BACKEND_ONLY( CheckFixedFld, Empty, OpFastFldInstr|OpTempObjectSources|OpCanCSE)
  707. MACRO_BACKEND_ONLY( CheckIsFuncObj, Empty, OpCanCSE | OpBailOutRec)
  708. MACRO_BACKEND_ONLY( CheckFuncInfo, Empty, OpCanCSE | OpBailOutRec)
  709. MACRO_BACKEND_ONLY( CheckPropertyGuardAndLoadType, Empty, OpFastFldInstr|OpTempObjectSources|OpDoNotTransfer)
  710. MACRO_BACKEND_ONLY( CheckObjType, Empty, OpFastFldInstr|OpTempObjectSources|OpCanCSE)
  711. MACRO_BACKEND_ONLY( AdjustObjType, Empty, OpSideEffect)
  712. MACRO_BACKEND_ONLY( AdjustObjTypeReloadAuxSlotPtr, Empty, OpSideEffect)
  713. MACRO_BACKEND_ONLY( ExtendArg_A, Empty, OpCanCSE) // extend a list of arguments to be passed to functions.
  714. #ifdef _M_X64
  715. MACRO_BACKEND_ONLY( PrologStart, Empty, None)
  716. MACRO_BACKEND_ONLY( PrologEnd, Empty, None)
  717. MACRO_BACKEND_ONLY( LdArgSize, Empty, None)
  718. MACRO_BACKEND_ONLY( LdSpillSize, Empty, None)
  719. #endif
  720. #if DBG_DUMP
  721. MACRO_BACKEND_ONLY( LdRoot, Empty, None) // Load root object
  722. MACRO_BACKEND_ONLY( LdModuleRoot, Empty, None) // Load module root with given moduleID
  723. MACRO_BACKEND_ONLY( LdNullDisplay, Empty, None) // Load the null frame display
  724. MACRO_BACKEND_ONLY( LdStrictNullDisplay,Empty, None) // Load the strict null frame display
  725. #endif
  726. MACRO_EXTEND( SpreadArrayLiteral, Reg2Aux, OpSideEffect|OpHasImplicitCall)
  727. MACRO_BACKEND_ONLY( LdSpreadIndices, Empty, None)
  728. MACRO_EXTEND_WMS( ClearAttributes, ElementU, None)
  729. MACRO_BACKEND_ONLY( SpeculatedLoadFence,Reg1, None)
  730. MACRO_EXTEND_WMS( LdHomeObj, Reg1, OpSideEffect)
  731. MACRO_EXTEND_WMS( LdFuncObj, Reg1, OpSideEffect)
  732. MACRO_EXTEND_WMS( LdHomeObjProto, Reg2, OpSideEffect)
  733. MACRO_EXTEND_WMS( LdFuncObjProto, Reg2, OpSideEffect)
  734. MACRO_EXTEND_WMS( ImportCall, Reg2, OpSideEffect|OpHasImplicitCall)
  735. MACRO_BACKEND_ONLY( BrFncCachedScopeEq, Reg2, None)
  736. MACRO_BACKEND_ONLY( BrFncCachedScopeNeq,Reg2, None)
  737. MACRO_BACKEND_ONLY( RestoreOutParam, Empty, None)
  738. MACRO_BACKEND_ONLY( SlotArrayCheck, Empty, OpCanCSE)
  739. MACRO_BACKEND_ONLY( FrameDisplayCheck, Empty, OpCanCSE)
  740. MACRO_EXTEND( BeginBodyScope, Empty, OpSideEffect)
  741. MACRO_BACKEND_ONLY( PopCnt, Empty, OpTempNumberSources|OpCanCSE|OpProducesNumber)
  742. MACRO_BACKEND_ONLY( Copysign_A, Empty, OpTempNumberSources|OpCanCSE|OpProducesNumber)
  743. MACRO_BACKEND_ONLY( Trunc_A, Empty, OpTempNumberSources|OpCanCSE|OpProducesNumber)
  744. MACRO_BACKEND_ONLY( Nearest_A, Empty, OpTempNumberSources|OpCanCSE|OpProducesNumber)
  745. MACRO_BACKEND_ONLY( ThrowRuntimeError, Empty, OpSideEffect)
  746. MACRO_BACKEND_ONLY( TrapIfMinIntOverNegOne, Reg3, OpSideEffect)
  747. MACRO_BACKEND_ONLY( TrapIfZero, Reg3, OpSideEffect)
  748. MACRO_BACKEND_ONLY( TrapIfUnalignedAccess, Reg3, OpSideEffect)
  749. MACRO_EXTEND_WMS( SpreadObjectLiteral,Reg2, OpSideEffect|OpHasImplicitCall)
  750. MACRO_EXTEND_WMS( StPropIdArrFromVar, ElementSlot, OpSideEffect|OpHasImplicitCall)
  751. MACRO_EXTEND_WMS( Restify, Reg4, OpSideEffect|OpHasImplicitCall)
  752. MACRO_EXTEND_WMS( NewPropIdArrForCompProps, Reg1Unsigned1, OpSideEffect)
  753. MACRO_BACKEND_ONLY(BigIntLiteral, Empty, None) // Load BigInt literal
  754. MACRO_EXTEND_WMS(Conv_Numeric, Reg2, OpSideEffect | OpTempNumberProducing | OpTempNumberTransfer | OpTempObjectSources | OpOpndHasImplicitCall | OpProducesNumber) // Convert to Numeric. [[ToNumeric()]]
  755. MACRO_EXTEND_WMS(Incr_Num_A, Reg2, OpTempNumberProducing | OpOpndHasImplicitCall | OpDoNotTransfer | OpTempNumberSources | OpTempObjectSources | OpCanCSE | OpPostOpDbgBailOut | OpProducesNumber) // Increment Numeric
  756. MACRO_EXTEND_WMS(Decr_Num_A, Reg2, OpTempNumberProducing | OpOpndHasImplicitCall | OpDoNotTransfer | OpTempNumberSources | OpTempObjectSources | OpCanCSE | OpPostOpDbgBailOut | OpProducesNumber) // Increment Numeric
  757. MACRO_BACKEND_ONLY(LazyBailOutThunkLabel, Empty, None)
  758. // Jitting Generator
  759. MACRO_BACKEND_ONLY(GeneratorResumeJumpTable, Reg1, OpSideEffect) // OpSideEffect because we don't want this to be deadstored
  760. MACRO_BACKEND_ONLY(GeneratorCreateInterpreterStackFrame, Reg1, OpSideEffect) // OpSideEffect because we don't want this to be deadstored
  761. MACRO_BACKEND_ONLY(GeneratorResumeYield, Reg1, OpSideEffect) // OpSideEffect because we don't want this to be deadstored
  762. MACRO_BACKEND_ONLY(GeneratorOutputBailInTrace, Empty, OpSideEffect) // OpSideEffect because we don't want this to be deadstored
  763. MACRO_BACKEND_ONLY(GeneratorOutputBailInTraceLabel, Empty, None)
  764. MACRO_BACKEND_ONLY(GeneratorBailInLabel, Empty, None)
  765. MACRO_BACKEND_ONLY(GeneratorEpilogueFrameNullOutLabel, Empty, None)
  766. MACRO_BACKEND_ONLY(GeneratorEpilogueNoFrameNullOutLabel, Empty, None)
  767. // All SIMD ops are backend only for non-asmjs.
  768. #define MACRO_SIMD(opcode, asmjsLayout, opCodeAttrAsmJs, OpCodeAttr, ...) MACRO_BACKEND_ONLY(opcode, Empty, OpCodeAttr)
  769. #define MACRO_SIMD_WMS(opcode, asmjsLayout, opCodeAttrAsmJs, OpCodeAttr, ...) MACRO_BACKEND_ONLY(opcode, Empty, OpCodeAttr)
  770. #define MACRO_SIMD_BACKEND_ONLY(opcode, asmjsLayout, opCodeAttrAsmJs, OpCodeAttr) MACRO_BACKEND_ONLY(opcode, Empty, OpCodeAttr)
  771. #define MACRO_SIMD_EXTEND(opcode, asmjsLayout, opCodeAttrAsmJs, OpCodeAttr, ...) MACRO_BACKEND_ONLY(opcode, Empty, OpCodeAttr)
  772. #define MACRO_SIMD_EXTEND_WMS(opcode, asmjsLayout, opCodeAttrAsmJs, OpCodeAttr, ...) MACRO_BACKEND_ONLY(opcode, Empty, OpCodeAttr)
  773. #define MACRO_SIMD_BACKEND_ONLY_EXTEND(opcode, asmjsLayout, opCodeAttrAsmJs, OpCodeAttr) MACRO_BACKEND_ONLY(opcode, Empty, OpCodeAttr)
  774. #include "OpCodesSimd.h"
  775. #undef MACRO_WMS_PROFILED
  776. #undef MACRO_WMS_PROFILED2
  777. #undef MACRO_WMS_PROFILED_OP
  778. #undef MACRO_PROFILED
  779. #undef MACRO_DEBUG_WMS
  780. #undef MACRO_DEBUG
  781. // help the caller to undefine all the macros
  782. #undef MACRO
  783. #undef MACRO_WMS
  784. #undef MACRO_EXTEND
  785. #undef MACRO_EXTEND_WMS
  786. #undef MACRO_BACKEND_ONLY
  787. #undef MACRO_WITH_DBG_ATTR
  788. #undef MACRO_WMS_WITH_DBG_ATTR
  789. #undef MACRO_EXTEND_WITH_DBG_ATTR
  790. #undef MACRO_EXTEND_WMS_WITH_DBG_ATTR
  791. #undef MACRO_BACKEND_ONLY_WITH_DBG_ATTR