AsmJsEncoder.inl 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. 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. #define PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix) \
  7. CompileAssert(OpCodeInfoAsmJs<OpCodeAsmJs::name>::Layout == OpLayoutTypeAsmJs::layout); \
  8. const unaligned OpLayout##layout##suffix * playout = mReader.layout##suffix(ip);
  9. #define PROCESS_ENCODE_CUSTOM_COMMON(name, func, layout, suffix) \
  10. case OpCodeAsmJs::name: \
  11. { \
  12. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix); \
  13. func(playout); \
  14. break; \
  15. }
  16. #define PROCESS_ENCODE_CUSTOM(name,func,layout) PROCESS_ENCODE_CUSTOM_COMMON(name,func,layout,)
  17. #define PROCESS_ENCODE_INT2_COMMON(name, func, layout, suffix) \
  18. case OpCodeAsmJs::name: \
  19. { \
  20. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix); \
  21. AsmJsJitTemplate::func::ApplyTemplate( this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<int>(playout->I1) );\
  22. break; \
  23. }
  24. #define PROCESS_ENCODE_INT2(name,func,layout) PROCESS_ENCODE_INT2_COMMON(name,func,layout,)
  25. #define PROCESS_ENCODE_INT3_COMMON(name, func, layout, suffix) \
  26. case OpCodeAsmJs::name: \
  27. { \
  28. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix); \
  29. AsmJsJitTemplate::func::ApplyTemplate( this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<int>(playout->I1), CalculateOffset<int>(playout->I2) );\
  30. break; \
  31. }
  32. #define PROCESS_ENCODE_INT3(name,func,layout) PROCESS_ENCODE_INT3_COMMON(name,func,layout,)
  33. #define PROCESS_ENCODE_DOUBLE2_COMMON(name, func, layout, suffix) \
  34. case OpCodeAsmJs::name: \
  35. { \
  36. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix); \
  37. AsmJsJitTemplate::func::ApplyTemplate( this, mPc, CalculateOffset<double>(playout->D0), CalculateOffset<double>(playout->D1) );\
  38. break; \
  39. }
  40. #define PROCESS_ENCODE_DOUBLE2(name,func,layout) PROCESS_ENCODE_DOUBLE2_COMMON(name,func,layout,)
  41. #define PROCESS_ENCODE_DOUBLE3_COMMON(name, func, layout, suffix) \
  42. case OpCodeAsmJs::name: \
  43. { \
  44. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix); \
  45. AsmJsJitTemplate::func::ApplyTemplate( this, mPc, CalculateOffset<double>(playout->D0), CalculateOffset<double>(playout->D1), CalculateOffset<double>(playout->D2) );\
  46. break; \
  47. }
  48. #define PROCESS_ENCODE_DOUBLE3(name,func,layout) PROCESS_ENCODE_DOUBLE3_COMMON(name,func,layout,)
  49. #define PROCESS_ENCODE_INT1DOUBLE2_COMMON(name, func, layout, suffix) \
  50. case OpCodeAsmJs::name: \
  51. { \
  52. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix); \
  53. AsmJsJitTemplate::func::ApplyTemplate( this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<double>(playout->D1), CalculateOffset<double>(playout->D2) );\
  54. break; \
  55. }
  56. #define PROCESS_ENCODE_INT1DOUBLE2(name,func,layout) PROCESS_ENCODE_INT1DOUBLE2_COMMON(name,func,layout,)
  57. typedef double( *UnaryDoubleFunc )( double );
  58. #define PROCESS_ENCODE_CALLDOUBLE2_COMMON(name, func, addEsp, suffix) \
  59. case OpCodeAsmJs::name: \
  60. { \
  61. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, Double2, suffix); \
  62. int offsets[2] = {CalculateOffset<double>(playout->D0),CalculateOffset<double>(playout->D1)};\
  63. AsmJsJitTemplate::Call_Db::ApplyTemplate( this, mPc, 2, offsets, ((UnaryDoubleFunc)(func)),addEsp );\
  64. break; \
  65. }
  66. #define PROCESS_ENCODE_CALLDOUBLE2(name,func,layout) PROCESS_ENCODE_CALLDOUBLE2_COMMON(name,func,layout,)
  67. typedef double( *BinaryDoubleFunc )( double, double );
  68. #define PROCESS_ENCODE_CALLDOUBLE3_COMMON(name, func, addEsp, suffix) \
  69. case OpCodeAsmJs::name: \
  70. { \
  71. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, Double3, suffix); \
  72. int offsets[3] = {CalculateOffset<double>(playout->D0),CalculateOffset<double>(playout->D1),CalculateOffset<double>(playout->D2)};\
  73. AsmJsJitTemplate::Call_Db::ApplyTemplate( this, mPc, 3, offsets, ((BinaryDoubleFunc)(func)),addEsp );\
  74. break; \
  75. }
  76. #define PROCESS_ENCODE_CALLDOUBLE3(name,func,addEsp) PROCESS_ENCODE_CALLDOUBLE3_COMMON(name,func,addEsp,)
  77. //Floats
  78. #define PROCESS_ENCODE_FLOAT2_COMMON(name, func, layout, suffix) \
  79. case OpCodeAsmJs::name: \
  80. { \
  81. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix); \
  82. AsmJsJitTemplate::func::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->F0), CalculateOffset<float>(playout->F1)); \
  83. break; \
  84. }
  85. #define PROCESS_ENCODE_FLOAT2(name,func,layout) PROCESS_ENCODE_FLOAT2_COMMON(name,func,layout,)
  86. #define PROCESS_ENCODE_FLOAT3_COMMON(name, func, layout, suffix) \
  87. case OpCodeAsmJs::name: \
  88. { \
  89. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix); \
  90. AsmJsJitTemplate::func::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->F0), CalculateOffset<float>(playout->F1), CalculateOffset<float>(playout->F2)); \
  91. break; \
  92. }
  93. #define PROCESS_ENCODE_FLOAT3(name,func,layout) PROCESS_ENCODE_FLOAT3_COMMON(name,func,layout,)
  94. #define PROCESS_ENCODE_INT1FLOAT2_COMMON(name, func, layout, suffix) \
  95. case OpCodeAsmJs::name: \
  96. { \
  97. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix); \
  98. AsmJsJitTemplate::func::ApplyTemplate(this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<float>(playout->F1), CalculateOffset<float>(playout->F2)); \
  99. break; \
  100. }
  101. #define PROCESS_ENCODE_INT1FLOAT2(name,func,layout) PROCESS_ENCODE_INT1FLOAT2_COMMON(name,func,layout,)
  102. typedef float(*UnaryFloatFunc)(float);
  103. #define PROCESS_ENCODE_CALLFLOAT2_COMMON(name, func, addEsp, suffix) \
  104. case OpCodeAsmJs::name: \
  105. { \
  106. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, Float2, suffix); \
  107. int offsets[2] = { CalculateOffset<float>(playout->F0), CalculateOffset<float>(playout->F1) }; \
  108. AsmJsJitTemplate::Call_Flt::ApplyTemplate(this, mPc, 2, offsets, ((UnaryFloatFunc)(func)), addEsp); \
  109. break; \
  110. }
  111. #define PROCESS_ENCODE_CALLFLOAT2(name,func,layout) PROCESS_ENCODE_CALLFLOAT2_COMMON(name,func,layout,)
  112. #define PROCESS_ENCODE_ELEMENTSLOT_COMMON(name, func, layout, suffix) \
  113. case OpCodeAsmJs::name: \
  114. { \
  115. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, layout, suffix); \
  116. AsmJsJitTemplate::func::ApplyTemplate( this, mPc, CalculateOffset<Var>(playout->Value), CalculateOffset<Var>(playout->Instance), CalculateOffset<int>(playout->SlotIndex) );\
  117. break; \
  118. }
  119. #define PROCESS_ENCODE_ELEMENTSLOT(name,func,layout) PROCESS_ENCODE_ELEMENTSLOT_COMMON(name,func,layout,)
  120. #define PROCESS_ENCODE_TYPED_ARR_COMMON(name, func, viewType, suffix, type ) \
  121. case OpCodeAsmJs::name: \
  122. { \
  123. PROCESS_ENCODE_READ_LAYOUT_ASMJS(name, ElementSlot, suffix); \
  124. AsmJsJitTemplate::func::ApplyTemplate( this, mPc, CalculateOffset<type>(playout->Value), CalculateOffset<int>(playout->SlotIndex), ArrayBufferView::viewType );\
  125. break; \
  126. }
  127. #define PROCESS_ENCODE_TYPED_ARR(name,viewType, func,layout) PROCESS_ENCODE_TYPED_ARR_COMMON(name,viewType, func,layout,)
  128. namespace Js
  129. {
  130. template <class T>
  131. void AsmJsEncoder::OP_Empty( const unaligned T* playout )
  132. {
  133. }
  134. void AsmJsEncoder::OP_Label( const unaligned OpLayoutEmpty* playout )
  135. {
  136. const int labelOffset = mReader.GetCurrentOffset() - 1;
  137. AsmJsJitTemplate::Label::ApplyTemplate( this, mPc );
  138. EncoderRelocLabel* label = nullptr;
  139. if( mRelocLabelMap->TryGetReference( labelOffset,&label ) )
  140. {
  141. label->labelSeen = true;
  142. label->pc = mPc;
  143. }
  144. else
  145. {
  146. EncoderRelocLabel newLabel( mPc );
  147. mRelocLabelMap->AddNew( labelOffset, newLabel );
  148. }
  149. // Check - this should not be needed as we add to the map in Relocs , but the bytecodeoffset is off by 1 in relocs , see if we can work around that
  150. ptrdiff_t offset = mPc - mEncodeBuffer;
  151. this->GetAsmJsFunctionInfo()->mbyteCodeTJMap->AddNew(mReader.GetCurrentOffset(), offset);
  152. }
  153. template <class T>
  154. void AsmJsEncoder::OP_LdUndef( const unaligned T* playout )
  155. {
  156. AsmJsJitTemplate::LdUndef::ApplyTemplate( this, mPc, CalculateOffset<Var>(playout->R0) );
  157. }
  158. template <class T>
  159. void AsmJsEncoder::OP_Br( const unaligned T* playout )
  160. {
  161. if( playout->RelativeJumpOffset )
  162. {
  163. const int labelOffset = mReader.GetCurrentOffset() + playout->RelativeJumpOffset;
  164. Assert( playout->RelativeJumpOffset > 0 || mRelocLabelMap->ContainsKey( labelOffset ) );
  165. bool isBackEdge = false;
  166. if (playout->RelativeJumpOffset < 0)
  167. {
  168. isBackEdge = true;
  169. }
  170. BYTE* relocAddr = nullptr;
  171. AsmJsJitTemplate::Br::ApplyTemplate(this, mPc, &relocAddr, isBackEdge);
  172. Assert( relocAddr );
  173. AddReloc( labelOffset, relocAddr );
  174. }
  175. }
  176. template <class T>
  177. void AsmJsEncoder::OP_BrTrue( const unaligned T* playout )
  178. {
  179. if( playout->RelativeJumpOffset )
  180. {
  181. const int labelOffset = mReader.GetCurrentOffset() + playout->RelativeJumpOffset;
  182. Assert( playout->RelativeJumpOffset > 0 || mRelocLabelMap->ContainsKey( labelOffset ) );
  183. bool isBackEdge = false;
  184. if (playout->RelativeJumpOffset < 0)
  185. isBackEdge = true;
  186. BYTE* relocAddr = nullptr;
  187. AsmJsJitTemplate::BrTrue::ApplyTemplate( this, mPc, CalculateOffset<int>( playout->I1 ), &relocAddr, isBackEdge );
  188. Assert( relocAddr );
  189. AddReloc( labelOffset, relocAddr );
  190. }
  191. }
  192. template <class T>
  193. void AsmJsEncoder::OP_BrEq( const unaligned T* playout )
  194. {
  195. if( playout->RelativeJumpOffset )
  196. {
  197. const int labelOffset = mReader.GetCurrentOffset() + playout->RelativeJumpOffset;
  198. Assert( playout->RelativeJumpOffset > 0 || mRelocLabelMap->ContainsKey( labelOffset ) );
  199. bool isBackEdge = false;
  200. if (playout->RelativeJumpOffset < 0)
  201. isBackEdge = true;
  202. BYTE* relocAddr = nullptr;
  203. AsmJsJitTemplate::BrEq::ApplyTemplate(this, mPc, CalculateOffset<int>(playout->I1), CalculateOffset<int>(playout->I2), &relocAddr, isBackEdge);
  204. Assert( relocAddr );
  205. AddReloc( labelOffset, relocAddr );
  206. }
  207. }
  208. template <class T>
  209. void Js::AsmJsEncoder::Op_LdConst_Int( const unaligned T* playout )
  210. {
  211. AsmJsJitTemplate::LdConst_Int::ApplyTemplate( this, mPc, CalculateOffset<int>(playout->I0), playout->C1 );
  212. }
  213. template <class T>
  214. void Js::AsmJsEncoder::OP_SetReturnInt( const unaligned T* playout )
  215. {
  216. AsmJsJitTemplate::SetReturn_Int::ApplyTemplate( this, mPc, CalculateOffset<int>(playout->I1) );
  217. }
  218. template <class T>
  219. void Js::AsmJsEncoder::OP_SetReturnDouble( const unaligned T* playout )
  220. {
  221. AsmJsJitTemplate::SetReturn_Db::ApplyTemplate( this, mPc, CalculateOffset<double>(playout->D1) );
  222. }
  223. template <class T>
  224. void Js::AsmJsEncoder::OP_SetReturnFloat(const unaligned T* playout)
  225. {
  226. AsmJsJitTemplate::SetReturn_Flt::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->F1));
  227. }
  228. template <class T>
  229. void Js::AsmJsEncoder::OP_SetFroundInt(const unaligned T* playout)
  230. {
  231. AsmJsJitTemplate::SetFround_Int::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->F0), CalculateOffset<int>(playout->I1));
  232. }
  233. template <class T>
  234. void Js::AsmJsEncoder::OP_SetFroundDb(const unaligned T* playout)
  235. {
  236. AsmJsJitTemplate::SetFround_Db::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->F0), CalculateOffset<double>(playout->D1));
  237. }
  238. template <class T>
  239. void Js::AsmJsEncoder::OP_SetFroundFlt(const unaligned T* playout)
  240. {
  241. AsmJsJitTemplate::SetFround_Flt::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->F0), CalculateOffset<float>(playout->F1));
  242. }
  243. template <class T>
  244. void Js::AsmJsEncoder::OP_AsmJsLoopBody(const unaligned T* playout)
  245. {
  246. AsmJsJitTemplate::AsmJsLoopBody::ApplyTemplate(this, mPc, (int)playout->C1);
  247. }
  248. template <class T>
  249. void Js::AsmJsEncoder::Op_Float_To_Int(const unaligned T* playout)
  250. {
  251. AsmJsJitTemplate::Float_To_Int::ApplyTemplate(this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<float>(playout->F1));
  252. }
  253. template <class T>
  254. void Js::AsmJsEncoder::Op_Float_To_Db(const unaligned T* playout)
  255. {
  256. AsmJsJitTemplate::Float_To_Db::ApplyTemplate(this, mPc, CalculateOffset<double>(playout->D0), CalculateOffset<float>(playout->F1));
  257. }
  258. template <class T>
  259. void Js::AsmJsEncoder::Op_UInt_To_Db( const unaligned T* playout )
  260. {
  261. AsmJsJitTemplate::UInt_To_Db::ApplyTemplate( this, mPc, CalculateOffset<double>(playout->D0), CalculateOffset<int>(playout->I1) );
  262. }
  263. template <class T>
  264. void Js::AsmJsEncoder::Op_Int_To_Db( const unaligned T* playout )
  265. {
  266. AsmJsJitTemplate::Int_To_Db::ApplyTemplate( this, mPc, CalculateOffset<double>(playout->D0), CalculateOffset<int>(playout->I1) );
  267. }
  268. template <class T>
  269. void Js::AsmJsEncoder::Op_Db_To_Int( const unaligned T* playout )
  270. {
  271. AsmJsJitTemplate::Db_To_Int::ApplyTemplate( this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<double>(playout->D1) );
  272. }
  273. template <class T>
  274. void Js::AsmJsEncoder::Op_StSlot_Int( const unaligned T* playout )
  275. {
  276. AsmJsJitTemplate::StSlot_Int::ApplyTemplate( this, mPc, CalculateOffset<int>(playout->Value), playout->SlotIndex );
  277. }
  278. template <class T>
  279. void Js::AsmJsEncoder::Op_StSlot_Db( const unaligned T* playout )
  280. {
  281. AsmJsJitTemplate::StSlot_Db::ApplyTemplate( this, mPc, CalculateOffset<double>(playout->Value), playout->SlotIndex );
  282. }
  283. template <class T>
  284. void Js::AsmJsEncoder::Op_StSlot_Flt(const unaligned T* playout)
  285. {
  286. AsmJsJitTemplate::StSlot_Flt::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->Value), playout->SlotIndex);
  287. }
  288. template <class T>
  289. void Js::AsmJsEncoder::Op_LdSlot_Int( const unaligned T* playout )
  290. {
  291. AsmJsJitTemplate::LdSlot_Int::ApplyTemplate( this, mPc, CalculateOffset<int>(playout->Value), playout->SlotIndex );
  292. }
  293. template <class T>
  294. void Js::AsmJsEncoder::Op_LdSlot_Db( const unaligned T* playout )
  295. {
  296. AsmJsJitTemplate::LdSlot_Db::ApplyTemplate( this, mPc, CalculateOffset<double>(playout->Value), playout->SlotIndex );
  297. }
  298. template <class T>
  299. void Js::AsmJsEncoder::Op_LdSlot_Flt(const unaligned T* playout)
  300. {
  301. AsmJsJitTemplate::LdSlot_Flt::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->Value), playout->SlotIndex);
  302. }
  303. template <class T>
  304. void Js::AsmJsEncoder::Op_LdAddr_Db( const unaligned T* playout )
  305. {
  306. AsmJsJitTemplate::LdAddr_Db::ApplyTemplate( this, mPc, CalculateOffset<double>(playout->D0), playout->A1 );
  307. }
  308. template <class T> void Js::AsmJsEncoder::OP_LdSlot( const unaligned T* playout )
  309. {
  310. AsmJsJitTemplate::LdSlot::ApplyTemplate( this, mPc, CalculateOffset<Var>(playout->Value), CalculateOffset<Var>(playout->Instance), playout->SlotIndex );
  311. }
  312. template <class T> void Js::AsmJsEncoder::OP_StartCall( const unaligned T* playout )
  313. {
  314. AsmJsJitTemplate::StartCall::ApplyTemplate( this, mPc, playout->ArgCount);
  315. }
  316. template <class T> void Js::AsmJsEncoder::OP_Call( const unaligned T* playout )
  317. {
  318. AsmJsJitTemplate::Call::ApplyTemplate( this, mPc, CalculateOffset<Var>(playout->Return), CalculateOffset<Var>(playout->Function), playout->ArgCount );
  319. }
  320. template <class T> void Js::AsmJsEncoder::OP_ArgOut_Db( const unaligned T* playout )
  321. {
  322. AsmJsJitTemplate::ArgOut_Db::ApplyTemplate( this, mPc, playout->R0, CalculateOffset<double>(playout->D1));
  323. }
  324. template <class T> void Js::AsmJsEncoder::OP_ArgOut_Int( const unaligned T* playout )
  325. {
  326. AsmJsJitTemplate::ArgOut_Int::ApplyTemplate( this, mPc, playout->R0, CalculateOffset<int>(playout->I1));
  327. }
  328. template <class T> void Js::AsmJsEncoder::OP_Conv_VTD( const unaligned T* playout )
  329. {
  330. AsmJsJitTemplate::Conv_VTD::ApplyTemplate( this, mPc, CalculateOffset<double>(playout->D0), CalculateOffset<Var>(playout->R1));
  331. }
  332. template <class T> void Js::AsmJsEncoder::OP_Conv_VTF(const unaligned T* playout)
  333. {
  334. AsmJsJitTemplate::Conv_VTF::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->F0), CalculateOffset<Var>(playout->R1));
  335. }
  336. template <class T> void Js::AsmJsEncoder::OP_Conv_VTI( const unaligned T* playout )
  337. {
  338. AsmJsJitTemplate::Conv_VTI::ApplyTemplate( this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<Var>(playout->R1));
  339. }
  340. template <class T> void Js::AsmJsEncoder::OP_I_StartCall( const unaligned T* playout )
  341. {
  342. AsmJsJitTemplate::I_StartCall::ApplyTemplate( this, mPc, playout->ArgCount);
  343. }
  344. template <class T> void Js::AsmJsEncoder::OP_I_Call( const unaligned T* playout )
  345. {
  346. AsmJsJitTemplate::I_Call::ApplyTemplate( this, mPc, CalculateOffset<Var>(playout->Return), CalculateOffset<Var>(playout->Function), playout->ArgCount, AsmJsRetType((AsmJsRetType::Which)playout->ReturnType) );
  347. }
  348. template <class T> void Js::AsmJsEncoder::OP_I_ArgOut_Db( const unaligned T* playout )
  349. {
  350. AsmJsJitTemplate::I_ArgOut_Db::ApplyTemplate( this, mPc, playout->R0, CalculateOffset<double>(playout->D1));
  351. }
  352. template <class T> void Js::AsmJsEncoder::OP_I_ArgOut_Flt(const unaligned T* playout)
  353. {
  354. AsmJsJitTemplate::I_ArgOut_Flt::ApplyTemplate(this, mPc, playout->R0, CalculateOffset<float>(playout->F1));
  355. }
  356. template <class T> void Js::AsmJsEncoder::OP_I_ArgOut_Int( const unaligned T* playout )
  357. {
  358. AsmJsJitTemplate::I_ArgOut_Int::ApplyTemplate( this, mPc, playout->R0, CalculateOffset<int>(playout->I1));
  359. }
  360. template <class T> void Js::AsmJsEncoder::OP_I_Conv_VTD( const unaligned T* playout )
  361. {
  362. AsmJsJitTemplate::I_Conv_VTD::ApplyTemplate(this, mPc, CalculateOffset<double>(playout->D0), CalculateOffset<double>(playout->D1));
  363. }
  364. template <class T> void Js::AsmJsEncoder::OP_I_Conv_VTF(const unaligned T* playout)
  365. {
  366. AsmJsJitTemplate::I_Conv_VTF::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->F0), CalculateOffset<float>(playout->F1));
  367. }
  368. template <class T> void Js::AsmJsEncoder::OP_I_Conv_VTI( const unaligned T* playout )
  369. {
  370. AsmJsJitTemplate::I_Conv_VTI::ApplyTemplate( this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<int>(playout->I1));
  371. }
  372. template <class T>
  373. void Js::AsmJsEncoder::Op_LdArr( const unaligned T* playout )
  374. {
  375. if (playout->ViewType == ArrayBufferView::TYPE_FLOAT32)
  376. {
  377. AsmJsJitTemplate::LdArrFlt::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->Value), CalculateOffset<int>(playout->SlotIndex), (ArrayBufferView::ViewType)playout->ViewType);
  378. }
  379. else if(playout->ViewType == ArrayBufferView::TYPE_FLOAT64)
  380. {
  381. AsmJsJitTemplate::LdArrDb::ApplyTemplate( this, mPc, CalculateOffset<double>( playout->Value ), CalculateOffset<int>( playout->SlotIndex ), (ArrayBufferView::ViewType)playout->ViewType );
  382. }
  383. else
  384. {
  385. AsmJsJitTemplate::LdArr::ApplyTemplate( this, mPc, CalculateOffset<int>( playout->Value ), CalculateOffset<int>( playout->SlotIndex ), (ArrayBufferView::ViewType)playout->ViewType );
  386. }
  387. }
  388. template <class T>
  389. void Js::AsmJsEncoder::Op_LdArrConst( const unaligned T* playout )
  390. {
  391. if (playout->ViewType == ArrayBufferView::TYPE_FLOAT32)
  392. {
  393. AsmJsJitTemplate::ConstLdArrFlt::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->Value), playout->SlotIndex, (ArrayBufferView::ViewType)playout->ViewType);
  394. }
  395. else if(playout->ViewType == ArrayBufferView::TYPE_FLOAT64 )
  396. {
  397. AsmJsJitTemplate::ConstLdArrDb::ApplyTemplate( this, mPc, CalculateOffset<double>( playout->Value ), playout->SlotIndex, (ArrayBufferView::ViewType)playout->ViewType );
  398. }
  399. else
  400. {
  401. AsmJsJitTemplate::ConstLdArr::ApplyTemplate( this, mPc, CalculateOffset<int>( playout->Value ), playout->SlotIndex, (ArrayBufferView::ViewType)playout->ViewType );
  402. }
  403. }
  404. template <class T>
  405. void Js::AsmJsEncoder::Op_StArr( const unaligned T* playout )
  406. {
  407. if (playout->ViewType == ArrayBufferView::TYPE_FLOAT32 )
  408. {
  409. //Value can be double
  410. AsmJsJitTemplate::StArrFlt::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->Value), CalculateOffset<int>(playout->SlotIndex), (ArrayBufferView::ViewType)playout->ViewType);
  411. }
  412. else if( playout->ViewType == ArrayBufferView::TYPE_FLOAT64 )
  413. {
  414. AsmJsJitTemplate::StArrDb::ApplyTemplate( this, mPc, CalculateOffset<double>( playout->Value ), CalculateOffset<int>( playout->SlotIndex ), (ArrayBufferView::ViewType)playout->ViewType );
  415. }
  416. else
  417. {
  418. AsmJsJitTemplate::StArr::ApplyTemplate( this, mPc, CalculateOffset<int>( playout->Value ), CalculateOffset<int>( playout->SlotIndex ), (ArrayBufferView::ViewType)playout->ViewType );
  419. }
  420. }
  421. template <class T>
  422. void Js::AsmJsEncoder::Op_StArrConst( const unaligned T* playout )
  423. {
  424. if (playout->ViewType == ArrayBufferView::TYPE_FLOAT32 )
  425. {
  426. AsmJsJitTemplate::ConstStArrFlt::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->Value), playout->SlotIndex, (ArrayBufferView::ViewType)playout->ViewType);
  427. }
  428. else if( playout->ViewType == ArrayBufferView::TYPE_FLOAT64 )
  429. {
  430. AsmJsJitTemplate::ConstStArrDb::ApplyTemplate( this, mPc, CalculateOffset<double>( playout->Value ), playout->SlotIndex , (ArrayBufferView::ViewType)playout->ViewType );
  431. }
  432. else
  433. {
  434. AsmJsJitTemplate::ConstStArr::ApplyTemplate( this, mPc, CalculateOffset<int>( playout->Value ), playout->SlotIndex, (ArrayBufferView::ViewType)playout->ViewType );
  435. }
  436. }
  437. template <class T>
  438. void Js::AsmJsEncoder::OP_Simd128_LdF4(const unaligned T* playout)
  439. {
  440. AsmJsJitTemplate::Simd128_Ld_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  441. }
  442. template <class T>
  443. void Js::AsmJsEncoder::OP_Simd128_LdI4(const unaligned T* playout)
  444. {
  445. AsmJsJitTemplate::Simd128_Ld_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  446. }
  447. template <class T>
  448. void Js::AsmJsEncoder::OP_Simd128_LdD2(const unaligned T* playout)
  449. {
  450. AsmJsJitTemplate::Simd128_Ld_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  451. }
  452. template <class T>
  453. void Js::AsmJsEncoder::OP_Simd128_LdSlotF4(const unaligned T* playout)
  454. {
  455. AsmJsJitTemplate::Simd128_LdSlot_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->Value), playout->SlotIndex);
  456. }
  457. template <class T>
  458. void Js::AsmJsEncoder::OP_Simd128_LdSlotI4(const unaligned T* playout)
  459. {
  460. AsmJsJitTemplate::Simd128_LdSlot_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->Value), playout->SlotIndex);
  461. }
  462. template <class T>
  463. void Js::AsmJsEncoder::OP_Simd128_LdSlotD2(const unaligned T* playout)
  464. {
  465. AsmJsJitTemplate::Simd128_LdSlot_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->Value), playout->SlotIndex);
  466. }
  467. template <class T>
  468. void Js::AsmJsEncoder::OP_Simd128_StSlotF4(const unaligned T* playout)
  469. {
  470. AsmJsJitTemplate::Simd128_StSlot_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->Value), playout->SlotIndex);
  471. }
  472. template <class T>
  473. void Js::AsmJsEncoder::OP_Simd128_StSlotI4(const unaligned T* playout)
  474. {
  475. AsmJsJitTemplate::Simd128_StSlot_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->Value), playout->SlotIndex);
  476. }
  477. template <class T>
  478. void Js::AsmJsEncoder::OP_Simd128_StSlotD2(const unaligned T* playout)
  479. {
  480. AsmJsJitTemplate::Simd128_StSlot_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->Value), playout->SlotIndex);
  481. }
  482. template <class T>
  483. void Js::AsmJsEncoder::OP_Simd128_FloatsToF4(const unaligned T* playout)
  484. {
  485. AsmJsJitTemplate::Simd128_FloatsToF4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), \
  486. CalculateOffset<float>(playout->F1), CalculateOffset<float>(playout->F2), CalculateOffset<float>(playout->F3), CalculateOffset<float>(playout->F4));
  487. }
  488. template <class T>
  489. void Js::AsmJsEncoder::OP_Simd128_IntsToI4(const unaligned T* playout)
  490. {
  491. AsmJsJitTemplate::Simd128_IntsToI4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), \
  492. CalculateOffset<int>(playout->I1), CalculateOffset<int>(playout->I2), CalculateOffset<int>(playout->I3), CalculateOffset<int>(playout->I4));
  493. }
  494. template <class T>
  495. void Js::AsmJsEncoder::OP_Simd128_DoublesToD2(const unaligned T* playout)
  496. {
  497. AsmJsJitTemplate::Simd128_DoublesToD2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), \
  498. CalculateOffset<double>(playout->D1), CalculateOffset<double>(playout->D2));
  499. }
  500. template <class T>
  501. void Js::AsmJsEncoder::OP_Simd128_ReturnF4(const unaligned T* playout)
  502. {
  503. AsmJsJitTemplate::Simd128_Return_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  504. }
  505. template <class T>
  506. void Js::AsmJsEncoder::OP_Simd128_ReturnI4(const unaligned T* playout)
  507. {
  508. AsmJsJitTemplate::Simd128_Return_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  509. }
  510. template <class T>
  511. void Js::AsmJsEncoder::OP_Simd128_ReturnD2(const unaligned T* playout)
  512. {
  513. AsmJsJitTemplate::Simd128_Return_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  514. }
  515. template <class T>
  516. void Js::AsmJsEncoder::OP_Simd128_SplatF4(const unaligned T* playout)
  517. {
  518. AsmJsJitTemplate::Simd128_Splat_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<float>(playout->F1));
  519. }
  520. template <class T>
  521. void Js::AsmJsEncoder::OP_Simd128_SplatI4(const unaligned T* playout)
  522. {
  523. AsmJsJitTemplate::Simd128_Splat_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<int>(playout->I1));
  524. }
  525. template <class T>
  526. void Js::AsmJsEncoder::OP_Simd128_SplatD2(const unaligned T* playout)
  527. {
  528. AsmJsJitTemplate::Simd128_Splat_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<double>(playout->D1));
  529. }
  530. template <class T>
  531. void Js::AsmJsEncoder::OP_Simd128_FromFloat64x2F4(const unaligned T* playout)
  532. {
  533. AsmJsJitTemplate::Simd128_FromFloat64x2_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  534. }
  535. template <class T>
  536. void Js::AsmJsEncoder::OP_Simd128_FromInt32x4F4(const unaligned T* playout)
  537. {
  538. AsmJsJitTemplate::Simd128_FromInt32x4_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  539. }
  540. template <class T>
  541. void Js::AsmJsEncoder::OP_Simd128_FromFloat32x4I4(const unaligned T* playout)
  542. {
  543. AsmJsJitTemplate::Simd128_FromFloat32x4_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  544. }
  545. template <class T>
  546. void Js::AsmJsEncoder::OP_Simd128_FromFloat64x2I4(const unaligned T* playout)
  547. {
  548. AsmJsJitTemplate::Simd128_FromFloat64x2_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  549. }
  550. template <class T>
  551. void Js::AsmJsEncoder::OP_Simd128_FromFloat32x4D2(const unaligned T* playout)
  552. {
  553. AsmJsJitTemplate::Simd128_FromFloat32x4_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  554. }
  555. template <class T>
  556. void Js::AsmJsEncoder::OP_Simd128_FromInt32x4D2(const unaligned T* playout)
  557. {
  558. AsmJsJitTemplate::Simd128_FromInt32x4_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  559. }
  560. template <class T>
  561. void Js::AsmJsEncoder::OP_Simd128_FromFloat64x2BitsF4(const unaligned T* playout)
  562. {
  563. AsmJsJitTemplate::Simd128_FromFloat64x2Bits_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  564. }
  565. template <class T>
  566. void Js::AsmJsEncoder::OP_Simd128_FromInt32x4BitsF4(const unaligned T* playout)
  567. {
  568. AsmJsJitTemplate::Simd128_FromInt32x4Bits_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  569. }
  570. template <class T>
  571. void Js::AsmJsEncoder::OP_Simd128_FromFloat32x4BitsI4(const unaligned T* playout)
  572. {
  573. AsmJsJitTemplate::Simd128_FromFloat32x4Bits_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  574. }
  575. template <class T>
  576. void Js::AsmJsEncoder::OP_Simd128_FromFloat64x2BitsI4(const unaligned T* playout)
  577. {
  578. AsmJsJitTemplate::Simd128_FromFloat64x2Bits_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  579. }
  580. template <class T>
  581. void Js::AsmJsEncoder::OP_Simd128_FromFloat32x4BitsD2(const unaligned T* playout)
  582. {
  583. AsmJsJitTemplate::Simd128_FromFloat32x4Bits_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  584. }
  585. template <class T>
  586. void Js::AsmJsEncoder::OP_Simd128_FromInt32x4BitsD2(const unaligned T* playout)
  587. {
  588. AsmJsJitTemplate::Simd128_FromInt32x4Bits_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  589. }
  590. template <class T>
  591. void Js::AsmJsEncoder::OP_Simd128_AbsF4(const unaligned T* playout)
  592. {
  593. AsmJsJitTemplate::Simd128_Abs_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  594. }
  595. template <class T>
  596. void Js::AsmJsEncoder::OP_Simd128_AbsD2(const unaligned T* playout)
  597. {
  598. AsmJsJitTemplate::Simd128_Abs_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  599. }
  600. template <class T>
  601. void Js::AsmJsEncoder::OP_Simd128_NegF4(const unaligned T* playout)
  602. {
  603. AsmJsJitTemplate::Simd128_Neg_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  604. }
  605. template <class T>
  606. void Js::AsmJsEncoder::OP_Simd128_NegI4(const unaligned T* playout)
  607. {
  608. AsmJsJitTemplate::Simd128_Neg_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  609. }
  610. template <class T>
  611. void Js::AsmJsEncoder::OP_Simd128_NegD2(const unaligned T* playout)
  612. {
  613. AsmJsJitTemplate::Simd128_Neg_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  614. }
  615. template <class T>
  616. void Js::AsmJsEncoder::OP_Simd128_RcpF4(const unaligned T* playout)
  617. {
  618. AsmJsJitTemplate::Simd128_Rcp_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  619. }
  620. template <class T>
  621. void Js::AsmJsEncoder::OP_Simd128_RcpD2(const unaligned T* playout)
  622. {
  623. AsmJsJitTemplate::Simd128_Rcp_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  624. }
  625. template <class T>
  626. void Js::AsmJsEncoder::OP_Simd128_RcpSqrtF4(const unaligned T* playout)
  627. {
  628. AsmJsJitTemplate::Simd128_RcpSqrt_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  629. }
  630. template <class T>
  631. void Js::AsmJsEncoder::OP_Simd128_RcpSqrtD2(const unaligned T* playout)
  632. {
  633. AsmJsJitTemplate::Simd128_RcpSqrt_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  634. }
  635. template <class T>
  636. void Js::AsmJsEncoder::OP_Simd128_SqrtF4(const unaligned T* playout)
  637. {
  638. AsmJsJitTemplate::Simd128_Sqrt_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  639. }
  640. template <class T>
  641. void Js::AsmJsEncoder::OP_Simd128_SqrtD2(const unaligned T* playout)
  642. {
  643. AsmJsJitTemplate::Simd128_Sqrt_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  644. }
  645. template <class T>
  646. void Js::AsmJsEncoder::OP_Simd128_NotF4(const unaligned T* playout)
  647. {
  648. AsmJsJitTemplate::Simd128_Not_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  649. }
  650. template <class T>
  651. void Js::AsmJsEncoder::OP_Simd128_NotI4(const unaligned T* playout)
  652. {
  653. AsmJsJitTemplate::Simd128_Not_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  654. }
  655. template <class T>
  656. void Js::AsmJsEncoder::OP_Simd128_AddF4(const unaligned T* playout)
  657. {
  658. AsmJsJitTemplate::Simd128_Add_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  659. }
  660. template <class T>
  661. void Js::AsmJsEncoder::OP_Simd128_AddI4(const unaligned T* playout)
  662. {
  663. AsmJsJitTemplate::Simd128_Add_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->I4_2));
  664. }
  665. template <class T>
  666. void Js::AsmJsEncoder::OP_Simd128_AddD2(const unaligned T* playout)
  667. {
  668. AsmJsJitTemplate::Simd128_Add_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  669. }
  670. template <class T>
  671. void Js::AsmJsEncoder::OP_Simd128_SubF4(const unaligned T* playout)
  672. {
  673. AsmJsJitTemplate::Simd128_Sub_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  674. }
  675. template <class T>
  676. void Js::AsmJsEncoder::OP_Simd128_SubI4(const unaligned T* playout)
  677. {
  678. AsmJsJitTemplate::Simd128_Sub_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->I4_2));
  679. }
  680. template <class T>
  681. void Js::AsmJsEncoder::OP_Simd128_SubD2(const unaligned T* playout)
  682. {
  683. AsmJsJitTemplate::Simd128_Sub_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  684. }
  685. template <class T>
  686. void Js::AsmJsEncoder::OP_Simd128_MulF4(const unaligned T* playout)
  687. {
  688. AsmJsJitTemplate::Simd128_Mul_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  689. }
  690. template <class T>
  691. void Js::AsmJsEncoder::OP_Simd128_MulI4(const unaligned T* playout)
  692. {
  693. AsmJsJitTemplate::Simd128_Mul_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->I4_2));
  694. }
  695. template <class T>
  696. void Js::AsmJsEncoder::OP_Simd128_MulD2(const unaligned T* playout)
  697. {
  698. AsmJsJitTemplate::Simd128_Mul_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  699. }
  700. template <class T>
  701. void Js::AsmJsEncoder::OP_Simd128_DivF4(const unaligned T* playout)
  702. {
  703. AsmJsJitTemplate::Simd128_Div_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  704. }
  705. template <class T>
  706. void Js::AsmJsEncoder::OP_Simd128_DivD2(const unaligned T* playout)
  707. {
  708. AsmJsJitTemplate::Simd128_Div_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  709. }
  710. template <class T>
  711. void Js::AsmJsEncoder::OP_Simd128_MinF4(const unaligned T* playout)
  712. {
  713. AsmJsJitTemplate::Simd128_Min_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  714. }
  715. template <class T>
  716. void Js::AsmJsEncoder::OP_Simd128_MinD2(const unaligned T* playout)
  717. {
  718. AsmJsJitTemplate::Simd128_Min_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  719. }
  720. template <class T>
  721. void Js::AsmJsEncoder::OP_Simd128_MaxF4(const unaligned T* playout)
  722. {
  723. AsmJsJitTemplate::Simd128_Max_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  724. }
  725. template <class T>
  726. void Js::AsmJsEncoder::OP_Simd128_MaxD2(const unaligned T* playout)
  727. {
  728. AsmJsJitTemplate::Simd128_Max_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  729. }
  730. template <class T>
  731. void Js::AsmJsEncoder::OP_Simd128_LtF4(const unaligned T* playout)
  732. {
  733. AsmJsJitTemplate::Simd128_Lt_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  734. }
  735. template <class T>
  736. void Js::AsmJsEncoder::OP_Simd128_LtI4(const unaligned T* playout)
  737. {
  738. AsmJsJitTemplate::Simd128_Lt_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->I4_2));
  739. }
  740. template <class T>
  741. void Js::AsmJsEncoder::OP_Simd128_LtD2(const unaligned T* playout)
  742. {
  743. AsmJsJitTemplate::Simd128_Lt_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  744. }
  745. template <class T>
  746. void Js::AsmJsEncoder::OP_Simd128_GtF4(const unaligned T* playout)
  747. {
  748. AsmJsJitTemplate::Simd128_Gt_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  749. }
  750. template <class T>
  751. void Js::AsmJsEncoder::OP_Simd128_GtI4(const unaligned T* playout)
  752. {
  753. AsmJsJitTemplate::Simd128_Gt_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->I4_2));
  754. }
  755. template <class T>
  756. void Js::AsmJsEncoder::OP_Simd128_GtD2(const unaligned T* playout)
  757. {
  758. AsmJsJitTemplate::Simd128_Gt_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  759. }
  760. template <class T>
  761. void Js::AsmJsEncoder::OP_Simd128_LtEqF4(const unaligned T* playout)
  762. {
  763. AsmJsJitTemplate::Simd128_LtEq_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  764. }
  765. template <class T>
  766. void Js::AsmJsEncoder::OP_Simd128_LtEqD2(const unaligned T* playout)
  767. {
  768. AsmJsJitTemplate::Simd128_LtEq_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  769. }
  770. template <class T>
  771. void Js::AsmJsEncoder::OP_Simd128_GtEqF4(const unaligned T* playout)
  772. {
  773. AsmJsJitTemplate::Simd128_GtEq_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  774. }
  775. template <class T>
  776. void Js::AsmJsEncoder::OP_Simd128_GtEqD2(const unaligned T* playout)
  777. {
  778. AsmJsJitTemplate::Simd128_GtEq_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  779. }
  780. template <class T>
  781. void Js::AsmJsEncoder::OP_Simd128_EqF4(const unaligned T* playout)
  782. {
  783. AsmJsJitTemplate::Simd128_Eq_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  784. }
  785. template <class T>
  786. void Js::AsmJsEncoder::OP_Simd128_EqI4(const unaligned T* playout)
  787. {
  788. AsmJsJitTemplate::Simd128_Eq_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->I4_2));
  789. }
  790. template <class T>
  791. void Js::AsmJsEncoder::OP_Simd128_EqD2(const unaligned T* playout)
  792. {
  793. AsmJsJitTemplate::Simd128_Eq_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  794. }
  795. template <class T>
  796. void Js::AsmJsEncoder::OP_Simd128_NeqF4(const unaligned T* playout)
  797. {
  798. AsmJsJitTemplate::Simd128_Neq_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  799. }
  800. template <class T>
  801. void Js::AsmJsEncoder::OP_Simd128_NeqD2(const unaligned T* playout)
  802. {
  803. AsmJsJitTemplate::Simd128_Neq_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2));
  804. }
  805. template <class T>
  806. void Js::AsmJsEncoder::OP_Simd128_AndF4(const unaligned T* playout)
  807. {
  808. AsmJsJitTemplate::Simd128_And_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  809. }
  810. template <class T>
  811. void Js::AsmJsEncoder::OP_Simd128_AndI4(const unaligned T* playout)
  812. {
  813. AsmJsJitTemplate::Simd128_And_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->I4_2));
  814. }
  815. template <class T>
  816. void Js::AsmJsEncoder::OP_Simd128_OrF4(const unaligned T* playout)
  817. {
  818. AsmJsJitTemplate::Simd128_Or_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  819. }
  820. template <class T>
  821. void Js::AsmJsEncoder::OP_Simd128_OrI4(const unaligned T* playout)
  822. {
  823. AsmJsJitTemplate::Simd128_Or_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->I4_2));
  824. }
  825. template <class T>
  826. void Js::AsmJsEncoder::OP_Simd128_XorF4(const unaligned T* playout)
  827. {
  828. AsmJsJitTemplate::Simd128_Xor_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2));
  829. }
  830. template <class T>
  831. void Js::AsmJsEncoder::OP_Simd128_XorI4(const unaligned T* playout)
  832. {
  833. AsmJsJitTemplate::Simd128_Xor_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->I4_2));
  834. }
  835. template <class T>
  836. void Js::AsmJsEncoder::OP_Simd128_SelectF4(const unaligned T* playout)
  837. {
  838. AsmJsJitTemplate::Simd128_Select_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->F4_2), CalculateOffset<AsmJsSIMDValue>(playout->F4_3));
  839. }
  840. template <class T>
  841. void Js::AsmJsEncoder::OP_Simd128_SelectI4(const unaligned T* playout)
  842. {
  843. AsmJsJitTemplate::Simd128_Select_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->I4_2), CalculateOffset<AsmJsSIMDValue>(playout->I4_3));
  844. }
  845. template <class T>
  846. void Js::AsmJsEncoder::OP_Simd128_SelectD2(const unaligned T* playout)
  847. {
  848. AsmJsJitTemplate::Simd128_Select_D2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<AsmJsSIMDValue>(playout->D2_2), CalculateOffset<AsmJsSIMDValue>(playout->D2_3));
  849. }
  850. template <class T>
  851. void Js::AsmJsEncoder::OP_Simd128_ExtractLaneI4(const unaligned T* playout)
  852. {
  853. AsmJsJitTemplate::Simd128_ExtractLane_I4::ApplyTemplate(this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<int>(playout->I2));
  854. }
  855. template <class T>
  856. void Js::AsmJsEncoder::OP_Simd128_ExtractLaneF4(const unaligned T* playout)
  857. {
  858. AsmJsJitTemplate::Simd128_ExtractLane_F4::ApplyTemplate(this, mPc, CalculateOffset<float>(playout->F0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<int>(playout->I2));
  859. }
  860. template <class T>
  861. void Js::AsmJsEncoder::OP_Simd128_ReplaceLaneI4(const unaligned T* playout)
  862. {
  863. AsmJsJitTemplate::Simd128_ReplaceLane_I4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1), CalculateOffset<int>(playout->I2), CalculateOffset<int>(playout->I3));
  864. }
  865. template <class T>
  866. void Js::AsmJsEncoder::OP_Simd128_ReplaceLaneF4(const unaligned T* playout)
  867. {
  868. AsmJsJitTemplate::Simd128_ReplaceLane_F4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1), CalculateOffset<int>(playout->I2), CalculateOffset<float>(playout->F3));
  869. }
  870. template <class T>
  871. void Js::AsmJsEncoder::OP_Simd128_LdSignMaskF4(const unaligned T* playout)
  872. {
  873. AsmJsJitTemplate::Simd128_LdSignMask_F4::ApplyTemplate(this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  874. }
  875. template <class T>
  876. void Js::AsmJsEncoder::OP_Simd128_LdSignMaskI4(const unaligned T* playout)
  877. {
  878. AsmJsJitTemplate::Simd128_LdSignMask_I4::ApplyTemplate(this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  879. }
  880. template <class T>
  881. void Js::AsmJsEncoder::OP_Simd128_LdSignMaskD2(const unaligned T* playout)
  882. {
  883. AsmJsJitTemplate::Simd128_LdSignMask_D2::ApplyTemplate(this, mPc, CalculateOffset<int>(playout->I0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  884. }
  885. template <class T>
  886. void Js::AsmJsEncoder::OP_Simd128_I_ArgOutF4(const unaligned T* playout)
  887. {
  888. AsmJsJitTemplate::Simd128_I_ArgOut_F4::ApplyTemplate(this, mPc, playout->R0, CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  889. }
  890. template <class T>
  891. void Js::AsmJsEncoder::OP_Simd128_I_ArgOutI4(const unaligned T* playout)
  892. {
  893. AsmJsJitTemplate::Simd128_I_ArgOut_I4::ApplyTemplate(this, mPc, playout->R0, CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  894. }
  895. template <class T>
  896. void Js::AsmJsEncoder::OP_Simd128_I_ArgOutD2(const unaligned T* playout)
  897. {
  898. AsmJsJitTemplate::Simd128_I_ArgOut_D2::ApplyTemplate(this, mPc, playout->R0, CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  899. }
  900. template <class T> void Js::AsmJsEncoder::OP_Simd128_I_Conv_VTF4(const unaligned T* playout)
  901. {
  902. AsmJsJitTemplate::Simd128_I_Conv_VTF4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->F4_0), CalculateOffset<AsmJsSIMDValue>(playout->F4_1));
  903. }
  904. template <class T> void Js::AsmJsEncoder::OP_Simd128_I_Conv_VTI4(const unaligned T* playout)
  905. {
  906. AsmJsJitTemplate::Simd128_I_Conv_VTI4::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->I4_0), CalculateOffset<AsmJsSIMDValue>(playout->I4_1));
  907. }
  908. template <class T> void Js::AsmJsEncoder::OP_Simd128_I_Conv_VTD2(const unaligned T* playout)
  909. {
  910. AsmJsJitTemplate::Simd128_I_Conv_VTD2::ApplyTemplate(this, mPc, CalculateOffset<AsmJsSIMDValue>(playout->D2_0), CalculateOffset<AsmJsSIMDValue>(playout->D2_1));
  911. }
  912. }