AsmJsEncoder.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  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. #pragma once
  6. #ifdef ASMJS_PLAT
  7. namespace Js
  8. {
  9. class AsmJsEncoder
  10. {
  11. struct EncoderRelocLabel;
  12. struct EncoderReloc
  13. {
  14. static void New( EncoderRelocLabel* label, BYTE* _patchAddr, BYTE* _pc, ArenaAllocator* allocator );
  15. BYTE* patchAddr;
  16. BYTE* pc;
  17. EncoderReloc* next;
  18. };
  19. struct EncoderRelocLabel
  20. {
  21. EncoderRelocLabel() :labelSeen( false ), relocList( nullptr ){}
  22. EncoderRelocLabel(BYTE* _pc) :labelSeen( true ), pc(_pc), relocList( nullptr ){}
  23. bool labelSeen : 1;
  24. BYTE* pc;
  25. EncoderReloc* relocList;
  26. };
  27. // the key is the bytecode address
  28. typedef JsUtil::BaseDictionary<int, EncoderRelocLabel, ArenaAllocator> RelocLabelMap;
  29. const byte* ip;
  30. ByteCodeReader mReader;
  31. uint32 mEncodeBufferSize;
  32. BYTE* mEncodeBuffer;
  33. BYTE* mPc;
  34. PageAllocator* mPageAllocator;
  35. InProcCodeGenAllocators* mForegroundAllocators;
  36. FunctionBody* mFunctionBody;
  37. RelocLabelMap* mRelocLabelMap;
  38. ArenaAllocator* mLocalAlloc;
  39. // Byte offset of first int and double
  40. int mIntOffset, mDoubleOffset, mFloatOffset;
  41. int mSimdOffset;
  42. // architecture dependant data to build templatized JIT
  43. void* mTemplateData;
  44. public:
  45. void* Encode( FunctionBody* functionBody );
  46. void* GetTemplateData() { return mTemplateData; }
  47. inline PageAllocator* GetPageAllocator() const{return mPageAllocator;}
  48. inline void SetPageAllocator( PageAllocator* val ){mPageAllocator = val;}
  49. inline InProcCodeGenAllocators* GetCodeGenAllocator() const{return mForegroundAllocators;}
  50. inline void SetCodeGenAllocator( InProcCodeGenAllocators* val ){mForegroundAllocators = val;}
  51. FunctionBody* GetFunctionBody() { return mFunctionBody; }
  52. private:
  53. void ApplyRelocs();
  54. void AddReloc( const int labelOffset, BYTE* patchAddr );
  55. uint32 GetEncodeBufferSize(FunctionBody* functionBody);
  56. AsmJsFunctionInfo* GetAsmJsFunctionInfo(){ return mFunctionBody->GetAsmJsFunctionInfo(); }
  57. AsmJsFunctionInfo* GetAsmJsFunctionInfoWithLock() { return mFunctionBody->GetAsmJsFunctionInfoWithLock(); }
  58. bool ReadOp();
  59. template<LayoutSize T> void ReadOpTemplate( OpCodeAsmJs op );
  60. template<typename T> int GetOffset() const;
  61. template<typename T> int CalculateOffset(int stackLocation) { return stackLocation*sizeof(T)+GetOffset<T>(); }
  62. void OP_Label( const unaligned OpLayoutEmpty* playout );
  63. template <class T> void OP_Br( const unaligned T* playout );
  64. template <class T> void OP_BrEq( const unaligned T* playout );
  65. template <class T> void OP_BrEqConst( const unaligned T* playout );
  66. template <class T> void OP_BrTrue( const unaligned T* playout );
  67. template <class T> void OP_Empty( const unaligned T* playout );
  68. template <class T> void OP_CheckHeap(const unaligned T* playout);
  69. template <class T> void Op_LdSlot_Db( const unaligned T* playout );
  70. template <class T> void Op_LdSlot_Int(const unaligned T* playout);
  71. template <class T> void Op_LdSlot_Flt(const unaligned T* playout);
  72. template <class T> void Op_StSlot_Db( const unaligned T* playout );
  73. template <class T> void Op_StSlot_Int(const unaligned T* playout);
  74. template <class T> void Op_StSlot_Flt(const unaligned T* playout);
  75. template <class T> void Op_LdConst_Int(const unaligned T* playout);
  76. template <class T> void Op_LdArr ( const unaligned T* playout );
  77. template <class T> void Op_LdArrConst( const unaligned T* playout );
  78. template <class T> void Op_StArr ( const unaligned T* playout );
  79. template <class T> void Op_StArrConst( const unaligned T* playout );
  80. template <class T> void OP_SetReturnInt( const unaligned T* playout );
  81. template <class T> void OP_SetReturnDouble(const unaligned T* playout);
  82. template <class T> void OP_SetReturnFloat(const unaligned T* playout);
  83. template <class T> void OP_SetFroundInt(const unaligned T* playout);
  84. template <class T> void OP_SetFroundDb(const unaligned T* playout);
  85. template <class T> void OP_SetFroundFlt(const unaligned T* playout);
  86. template <class T> void Op_Float_To_Int(const unaligned T* playout);
  87. template <class T> void Op_Float_To_Db(const unaligned T* playout);
  88. template <class T> void Op_UInt_To_Db(const unaligned T* playout);
  89. template <class T> void Op_Int_To_Db( const unaligned T* playout );
  90. template <class T> void Op_Db_To_Int( const unaligned T* playout );
  91. template <class T> void Op_LdAddr_Db( const unaligned T* playout );
  92. template <class T> void OP_LdSlot( const unaligned T* playout );
  93. template <class T> void OP_StartCall( const unaligned T* playout );
  94. template <class T> void OP_Call( const unaligned T* playout );
  95. template <class T> void OP_ArgOut_Db( const unaligned T* playout );
  96. template <class T> void OP_ArgOut_Int(const unaligned T* playout);
  97. template <class T> void OP_Conv_VTD( const unaligned T* playout );
  98. template <class T> void OP_Conv_VTI( const unaligned T* playout );
  99. template <class T> void OP_Conv_VTF( const unaligned T* playout );
  100. template <class T> void OP_I_StartCall( const unaligned T* playout );
  101. template <class T> void OP_I_Call( const unaligned T* playout );
  102. template <class T> void OP_I_ArgOut_Db( const unaligned T* playout );
  103. template <class T> void OP_I_ArgOut_Int(const unaligned T* playout);
  104. template <class T> void OP_I_ArgOut_Flt(const unaligned T* playout);
  105. template <class T> void OP_AsmJsLoopBody(const unaligned T* playout);
  106. template <class T> void OP_Simd128_LdF4(const unaligned T* playout);
  107. template <class T> void OP_Simd128_LdI4(const unaligned T* playout);
  108. template <class T> void OP_Simd128_LdD2(const unaligned T* playout);
  109. template <class T> void OP_Simd128_LdSlotF4(const unaligned T* playout);
  110. template <class T> void OP_Simd128_LdSlotI4(const unaligned T* playout);
  111. template <class T> void OP_Simd128_LdSlotD2(const unaligned T* playout);
  112. template <class T> void OP_Simd128_StSlotF4(const unaligned T* playout);
  113. template <class T> void OP_Simd128_StSlotI4(const unaligned T* playout);
  114. template <class T> void OP_Simd128_StSlotD2(const unaligned T* playout);
  115. template <class T> void OP_Simd128_FloatsToF4(const unaligned T* playout);
  116. template <class T> void OP_Simd128_IntsToI4(const unaligned T* playout);
  117. template <class T> void OP_Simd128_DoublesToD2(const unaligned T* playout);
  118. template <class T> void OP_Simd128_ReturnF4(const unaligned T* playout);
  119. template <class T> void OP_Simd128_ReturnI4(const unaligned T* playout);
  120. template <class T> void OP_Simd128_ReturnD2(const unaligned T* playout);
  121. template <class T> void OP_Simd128_SplatF4(const unaligned T* playout);
  122. template <class T> void OP_Simd128_SplatI4(const unaligned T* playout);
  123. template <class T> void OP_Simd128_SplatD2(const unaligned T* playout);
  124. template <class T> void OP_Simd128_FromFloat64x2F4(const unaligned T* playout);
  125. template <class T> void OP_Simd128_FromInt32x4F4(const unaligned T* playout);
  126. template <class T> void OP_Simd128_FromFloat32x4I4(const unaligned T* playout);
  127. template <class T> void OP_Simd128_FromFloat64x2I4(const unaligned T* playout);
  128. template <class T> void OP_Simd128_FromFloat32x4D2(const unaligned T* playout);
  129. template <class T> void OP_Simd128_FromInt32x4D2(const unaligned T* playout);
  130. template <class T> void OP_Simd128_FromFloat32x4BitsD2(const unaligned T* playout);
  131. template <class T> void OP_Simd128_FromInt32x4BitsD2(const unaligned T* playout);
  132. template <class T> void OP_Simd128_FromFloat32x4BitsI4(const unaligned T* playout);
  133. template <class T> void OP_Simd128_FromFloat64x2BitsI4(const unaligned T* playout);
  134. template <class T> void OP_Simd128_FromFloat64x2BitsF4(const unaligned T* playout);
  135. template <class T> void OP_Simd128_FromInt32x4BitsF4(const unaligned T* playout);
  136. template <class T> void OP_Simd128_AbsF4(const unaligned T* playout);
  137. template <class T> void OP_Simd128_AbsD2(const unaligned T* playout);
  138. template <class T> void OP_Simd128_NegF4(const unaligned T* playout);
  139. template <class T> void OP_Simd128_NegI4(const unaligned T* playout);
  140. template <class T> void OP_Simd128_NegD2(const unaligned T* playout);
  141. template <class T> void OP_Simd128_RcpF4(const unaligned T* playout);
  142. template <class T> void OP_Simd128_RcpD2(const unaligned T* playout);
  143. template <class T> void OP_Simd128_RcpSqrtF4(const unaligned T* playout);
  144. template <class T> void OP_Simd128_RcpSqrtD2(const unaligned T* playout);
  145. template <class T> void OP_Simd128_SqrtF4(const unaligned T* playout);
  146. template <class T> void OP_Simd128_SqrtD2(const unaligned T* playout);
  147. template <class T> void OP_Simd128_NotF4(const unaligned T* playout);
  148. template <class T> void OP_Simd128_NotI4(const unaligned T* playout);
  149. template <class T> void OP_Simd128_AddF4(const unaligned T* playout);
  150. template <class T> void OP_Simd128_AddI4(const unaligned T* playout);
  151. template <class T> void OP_Simd128_AddD2(const unaligned T* playout);
  152. template <class T> void OP_Simd128_SubF4(const unaligned T* playout);
  153. template <class T> void OP_Simd128_SubI4(const unaligned T* playout);
  154. template <class T> void OP_Simd128_SubD2(const unaligned T* playout);
  155. template <class T> void OP_Simd128_MulF4(const unaligned T* playout);
  156. template <class T> void OP_Simd128_MulI4(const unaligned T* playout);
  157. template <class T> void OP_Simd128_MulD2(const unaligned T* playout);
  158. template <class T> void OP_Simd128_DivF4(const unaligned T* playout);
  159. template <class T> void OP_Simd128_DivD2(const unaligned T* playout);
  160. template <class T> void OP_Simd128_MinF4(const unaligned T* playout);
  161. template <class T> void OP_Simd128_MinD2(const unaligned T* playout);
  162. template <class T> void OP_Simd128_MaxF4(const unaligned T* playout);
  163. template <class T> void OP_Simd128_MaxD2(const unaligned T* playout);
  164. template <class T> void OP_Simd128_LtF4(const unaligned T* playout);
  165. template <class T> void OP_Simd128_LtI4(const unaligned T* playout);
  166. template <class T> void OP_Simd128_LtD2(const unaligned T* playout);
  167. template <class T> void OP_Simd128_GtF4(const unaligned T* playout);
  168. template <class T> void OP_Simd128_GtI4(const unaligned T* playout);
  169. template <class T> void OP_Simd128_GtD2(const unaligned T* playout);
  170. template <class T> void OP_Simd128_LtEqF4(const unaligned T* playout);
  171. template <class T> void OP_Simd128_LtEqD2(const unaligned T* playout);
  172. template <class T> void OP_Simd128_GtEqF4(const unaligned T* playout);
  173. template <class T> void OP_Simd128_GtEqD2(const unaligned T* playout);
  174. template <class T> void OP_Simd128_EqF4(const unaligned T* playout);
  175. template <class T> void OP_Simd128_EqI4(const unaligned T* playout);
  176. template <class T> void OP_Simd128_EqD2(const unaligned T* playout);
  177. template <class T> void OP_Simd128_NeqF4(const unaligned T* playout);
  178. template <class T> void OP_Simd128_NeqD2(const unaligned T* playout);
  179. template <class T> void OP_Simd128_AndF4(const unaligned T* playout);
  180. template <class T> void OP_Simd128_AndI4(const unaligned T* playout);
  181. template <class T> void OP_Simd128_OrF4(const unaligned T* playout);
  182. template <class T> void OP_Simd128_OrI4(const unaligned T* playout);
  183. template <class T> void OP_Simd128_XorF4(const unaligned T* playout);
  184. template <class T> void OP_Simd128_XorI4(const unaligned T* playout);
  185. template <class T> void OP_Simd128_SelectF4(const unaligned T* playout);
  186. template <class T> void OP_Simd128_SelectI4(const unaligned T* playout);
  187. template <class T> void OP_Simd128_SelectD2(const unaligned T* playout);
  188. template <class T> void OP_Simd128_ExtractLaneI4(const unaligned T* playout);
  189. template <class T> void OP_Simd128_ExtractLaneF4(const unaligned T* playout);
  190. template <class T> void OP_Simd128_ReplaceLaneI4(const unaligned T* playout);
  191. template <class T> void OP_Simd128_ReplaceLaneF4(const unaligned T* playout);
  192. template <class T> void OP_Simd128_I_ArgOutF4(const unaligned T* playout);
  193. template <class T> void OP_Simd128_I_ArgOutI4(const unaligned T* playout);
  194. template <class T> void OP_Simd128_I_ArgOutD2(const unaligned T* playout);
  195. };
  196. }
  197. #endif