OpCodes.h 82 KB

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