AsmJSByteCodeDumper.cpp 40 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128
  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. #include "RuntimeByteCodePch.h"
  6. #ifndef TEMP_DISABLE_ASMJS
  7. #if DBG_DUMP
  8. #include "Language\AsmJsModule.h"
  9. #include "ByteCode\AsmJSByteCodeDumper.h"
  10. namespace Js
  11. {
  12. void AsmJsByteCodeDumper::Dump(AsmJsFunc* func, FunctionBody* body)
  13. {
  14. ByteCodeReader reader;
  15. reader.Create(body);
  16. StatementReader statementReader;
  17. statementReader.Create(body);
  18. body->DumpFullFunctionName();
  19. Output::Print(L" Asm.js (");
  20. const ArgSlot argCount = func->GetArgCount();
  21. for (ArgSlot i = 0; i < argCount; i++)
  22. {
  23. AsmJsType var = func->GetArgType(i);
  24. if (i > 0)
  25. {
  26. Output::Print(L", ");
  27. }
  28. if (var.isDouble())
  29. {
  30. Output::Print(L"+In%hu", i);
  31. }
  32. else if (var.isFloat())
  33. {
  34. Output::Print(L"flt(In%hu)", i);
  35. }
  36. else if (var.isInt())
  37. {
  38. Output::Print(L"In%hu|0", i);
  39. }
  40. else if (var.isSIMDType())
  41. {
  42. switch (var.GetWhich())
  43. {
  44. case AsmJsType::Int32x4:
  45. Output::Print(L"I4(In%hu)", i);
  46. break;
  47. case AsmJsType::Float32x4:
  48. Output::Print(L"F4(In%hu)", i);
  49. break;
  50. case AsmJsType::Float64x2:
  51. Output::Print(L"D2(In%hu)", i);
  52. break;
  53. }
  54. }
  55. else
  56. {
  57. Assert(UNREACHED);
  58. }
  59. }
  60. Output::Print(L") ");
  61. Output::Print(L"(size: %d [%d])\n", body->GetByteCodeCount(), body->GetByteCodeWithoutLDACount());
  62. const auto& intRegisters = func->GetRegisterSpace<int>();
  63. const auto& doubleRegisters = func->GetRegisterSpace<double>();
  64. const auto& floatRegisters = func->GetRegisterSpace<float>();
  65. Output::Print(
  66. L" Integer : %u locals (%u temps from I%u)\n",
  67. intRegisters.GetVarCount(),
  68. intRegisters.GetTmpCount(),
  69. intRegisters.GetFirstTmpRegister());
  70. Output::Print(
  71. L" Doubles : %u locals (%u temps from D%u)\n",
  72. doubleRegisters.GetVarCount(),
  73. doubleRegisters.GetTmpCount(),
  74. doubleRegisters.GetFirstTmpRegister());
  75. Output::Print(
  76. L" Floats : %u locals (%u temps from F%u)\n",
  77. floatRegisters.GetVarCount(),
  78. floatRegisters.GetTmpCount(),
  79. floatRegisters.GetFirstTmpRegister());
  80. const auto& simdRegisters = func->GetRegisterSpace<AsmJsSIMDValue>();
  81. Output::Print(
  82. L" SIMDs : %u locals (%u temps from SIMD%u)\n",
  83. simdRegisters.GetVarCount(),
  84. simdRegisters.GetTmpCount(),
  85. simdRegisters.GetFirstTmpRegister());
  86. uint32 statementIndex = 0;
  87. DumpConstants(func, body);
  88. Output::Print(L" Implicit Arg Ins:\n ======== =====\n ");
  89. int iArg = intRegisters.GetConstCount(), dArg = doubleRegisters.GetConstCount(), fArg = floatRegisters.GetConstCount();
  90. int simdArg = simdRegisters.GetConstCount();
  91. for (ArgSlot i = 0; i < argCount; i++)
  92. {
  93. const AsmJsType& var = func->GetArgType(i);
  94. if (var.isDouble())
  95. {
  96. Output::Print(L" D%d In%d", dArg++, i);
  97. }
  98. else if (var.isFloat())
  99. {
  100. Output::Print(L" F%d In%d", fArg++, i);
  101. }
  102. else if (var.isInt())
  103. {
  104. Output::Print(L" I%d In%d", iArg++, i);
  105. }
  106. else if (var.isSIMDType())
  107. {
  108. Output::Print(L" SIMD%d In%d", simdArg++, i);
  109. }
  110. else
  111. {
  112. Assert(UNREACHED);
  113. }
  114. Output::Print(L"\n ");
  115. }
  116. Output::Print(L"\n");
  117. if (func->GetReturnType() == AsmJsRetType::Void)
  118. {
  119. Output::Print(L" 0000 %-20s R0\n", OpCodeUtilAsmJs::GetOpCodeName(OpCodeAsmJs::LdUndef));
  120. }
  121. while (true)
  122. {
  123. while (statementReader.AtStatementBoundary(&reader))
  124. {
  125. body->PrintStatementSourceLine(statementIndex);
  126. statementIndex = statementReader.MoveNextStatementBoundary();
  127. }
  128. int byteOffset = reader.GetCurrentOffset();
  129. LayoutSize layoutSize;
  130. OpCodeAsmJs op = (OpCodeAsmJs)reader.ReadOp(layoutSize);
  131. if (op == OpCodeAsmJs::EndOfBlock)
  132. {
  133. Assert(reader.GetCurrentOffset() == body->GetByteCode()->GetLength());
  134. break;
  135. }
  136. Output::Print(L" %04x %2s", byteOffset, layoutSize == LargeLayout ? L"L-" : layoutSize == MediumLayout ? L"M-" : L"");
  137. DumpOp(op, layoutSize, reader, body);
  138. if (Js::Configuration::Global.flags.Verbose)
  139. {
  140. int layoutStart = byteOffset + 2; // Account for the prefix op
  141. int endByteOffset = reader.GetCurrentOffset();
  142. Output::SkipToColumn(70);
  143. if (layoutSize == LargeLayout)
  144. {
  145. Output::Print(L"%02X ",
  146. op > Js::OpCodeAsmJs::MaxByteSizedOpcodes ?
  147. Js::OpCodeAsmJs::ExtendedLargeLayoutPrefix : Js::OpCodeAsmJs::LargeLayoutPrefix);
  148. }
  149. else if (layoutSize == MediumLayout)
  150. {
  151. Output::Print(L"%02X ",
  152. op > Js::OpCodeAsmJs::MaxByteSizedOpcodes ?
  153. Js::OpCodeAsmJs::ExtendedMediumLayoutPrefix : Js::OpCodeAsmJs::MediumLayoutPrefix);
  154. }
  155. else
  156. {
  157. Assert(layoutSize == SmallLayout);
  158. if (op > Js::OpCodeAsmJs::MaxByteSizedOpcodes)
  159. {
  160. Output::Print(L"%02X ", Js::OpCodeAsmJs::ExtendedOpcodePrefix);
  161. }
  162. else
  163. {
  164. Output::Print(L" ");
  165. layoutStart--; // don't have a prefix
  166. }
  167. }
  168. Output::Print(L"%02x", (byte)op);
  169. for (int i = layoutStart; i < endByteOffset; i++)
  170. {
  171. Output::Print(L" %02x", reader.GetRawByte(i));
  172. }
  173. }
  174. Output::Print(L"\n");
  175. }
  176. if (statementReader.AtStatementBoundary(&reader))
  177. {
  178. body->PrintStatementSourceLine(statementIndex);
  179. statementIndex = statementReader.MoveNextStatementBoundary();
  180. }
  181. Output::Print(L"\n");
  182. Output::Flush();
  183. }
  184. void AsmJsByteCodeDumper::DumpConstants(AsmJsFunc* func, FunctionBody* body)
  185. {
  186. const auto& intRegisters = func->GetRegisterSpace<int>();
  187. const auto& doubleRegisters = func->GetRegisterSpace<double>();
  188. const auto& floatRegisters = func->GetRegisterSpace<float>();
  189. int nbIntConst = intRegisters.GetConstCount();
  190. int nbDoubleConst = doubleRegisters.GetConstCount();
  191. int nbFloatConst = floatRegisters.GetConstCount();
  192. int* constTable = (int*)((Var*)body->GetConstTable() + (AsmJsFunctionMemory::RequiredVarConstants - 1));
  193. if (nbIntConst > 0)
  194. {
  195. Output::Print(L" Constant Integer:\n ======== =======\n ");
  196. for (int i = 0; i < nbIntConst; i++)
  197. {
  198. Output::Print(L" I%d %d\n ", i, *constTable);
  199. ++constTable;
  200. }
  201. }
  202. float* floatTable = (float*)constTable;
  203. Output::Print(L"\n");
  204. if (nbFloatConst > 0)
  205. {
  206. // const int inc = sizeof( double ) / sizeof( void* );
  207. Output::Print(L" Constant Floats:\n ======== ======\n ");
  208. for (int i = 0; i < nbFloatConst; i++)
  209. {
  210. Output::Print(L" F%d %.4f\n ", i, *floatTable);
  211. ++floatTable;
  212. ++constTable;
  213. }
  214. }
  215. double* doubleTable = (double*)constTable;
  216. Output::Print(L"\n");
  217. if (nbDoubleConst > 0)
  218. {
  219. // const int inc = sizeof( double ) / sizeof( void* );
  220. Output::Print(L" Constant Doubles:\n ======== ======\n ");
  221. for (int i = 0; i < nbDoubleConst; i++)
  222. {
  223. Output::Print(L" D%d %.4f\n ", i, *doubleTable);
  224. ++doubleTable;
  225. }
  226. }
  227. // SIMD reg space is un-typed.
  228. // We print each register in its 3 possible types to ease debugging.
  229. const auto& simdRegisters = func->GetRegisterSpace<AsmJsSIMDValue>();
  230. int nbSimdConst = simdRegisters.GetConstCount();
  231. Output::Print(L"\n");
  232. if (nbSimdConst > 0)
  233. {
  234. AsmJsSIMDValue* simdTable = (AsmJsSIMDValue*)doubleTable;
  235. Output::Print(L" Constant SIMD values:\n ======== ======\n ");
  236. for (int i = 0; i < nbSimdConst; i++)
  237. {
  238. Output::Print(L"SIMD%d ", i);
  239. Output::Print(L"\tI4(%d, %d, %d, %d),", simdTable->i32[SIMD_X], simdTable->i32[SIMD_Y], simdTable->i32[SIMD_Z], simdTable->i32[SIMD_W]);
  240. Output::Print(L"\tF4(%.4f, %.4f, %.4f, %.4f),", simdTable->f32[SIMD_X], simdTable->f32[SIMD_Y], simdTable->f32[SIMD_Z], simdTable->f32[SIMD_W]);
  241. Output::Print(L"\tD2(%.4f, %.4f)\n ", simdTable->f64[SIMD_X], simdTable->f64[SIMD_Y]);
  242. ++simdTable;
  243. }
  244. }
  245. Output::Print(L"\n");
  246. }
  247. void AsmJsByteCodeDumper::DumpOp(OpCodeAsmJs op, LayoutSize layoutSize, ByteCodeReader& reader, FunctionBody* dumpFunction)
  248. {
  249. Output::Print(L"%-20s", OpCodeUtilAsmJs::GetOpCodeName(op));
  250. OpLayoutTypeAsmJs nType = OpCodeUtilAsmJs::GetOpCodeLayout(op);
  251. switch (layoutSize * OpLayoutTypeAsmJs::Count + nType)
  252. {
  253. #define LAYOUT_TYPE(layout) \
  254. case OpLayoutTypeAsmJs::layout: \
  255. Assert(layoutSize == SmallLayout); \
  256. Dump##layout(op, reader.layout(), dumpFunction, reader); \
  257. break;
  258. #define LAYOUT_TYPE_WMS(layout) \
  259. case SmallLayout * OpLayoutTypeAsmJs::Count + OpLayoutTypeAsmJs::layout: \
  260. Dump##layout(op, reader.layout##_Small(), dumpFunction, reader); \
  261. break; \
  262. case MediumLayout * OpLayoutTypeAsmJs::Count + OpLayoutTypeAsmJs::layout: \
  263. Dump##layout(op, reader.layout##_Medium(), dumpFunction, reader); \
  264. break; \
  265. case LargeLayout * OpLayoutTypeAsmJs::Count + OpLayoutTypeAsmJs::layout: \
  266. Dump##layout(op, reader.layout##_Large(), dumpFunction, reader); \
  267. break;
  268. #include "LayoutTypesAsmJs.h"
  269. default:
  270. AssertMsg(false, "Unknown OpLayout");
  271. break;
  272. }
  273. }
  274. void AsmJsByteCodeDumper::DumpIntReg(RegSlot reg)
  275. {
  276. Output::Print(L" I%d ", (int)reg);
  277. }
  278. void AsmJsByteCodeDumper::DumpDoubleReg(RegSlot reg)
  279. {
  280. Output::Print(L" D%d ", (int)reg);
  281. }
  282. void AsmJsByteCodeDumper::DumpFloatReg(RegSlot reg)
  283. {
  284. Output::Print(L" F%d ", (int)reg);
  285. }
  286. void AsmJsByteCodeDumper::DumpR8Float(float value)
  287. {
  288. Output::Print(L" float:%f ", value);
  289. }
  290. // Float32x4
  291. void AsmJsByteCodeDumper::DumpFloat32x4Reg(RegSlot reg)
  292. {
  293. Output::Print(L"F4_%d ", (int)reg);
  294. }
  295. // Int32x4
  296. void AsmJsByteCodeDumper::DumpInt32x4Reg(RegSlot reg)
  297. {
  298. Output::Print(L"I4_%d ", (int)reg);
  299. }
  300. // Float64x2
  301. void AsmJsByteCodeDumper::DumpFloat64x2Reg(RegSlot reg)
  302. {
  303. Output::Print(L"D2_%d ", (int)reg);
  304. }
  305. template <class T>
  306. void AsmJsByteCodeDumper::DumpElementSlot(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  307. {
  308. switch (op)
  309. {
  310. case OpCodeAsmJs::LdSlot:
  311. case OpCodeAsmJs::LdSlotArr:
  312. Output::Print(L" R%d = R%d[%d] ", data->Value, data->Instance, data->SlotIndex);
  313. break;
  314. case OpCodeAsmJs::LdArr_Func:
  315. Output::Print(L" R%d = R%d[I%d] ", data->Value, data->Instance, data->SlotIndex);
  316. break;
  317. case OpCodeAsmJs::StSlot_Int:
  318. Output::Print(L" R%d[%d] = I%d ", data->Instance, data->SlotIndex, data->Value);
  319. break;
  320. case OpCodeAsmJs::StSlot_Flt:
  321. Output::Print(L" R%d[%d] = F%d ", data->Instance, data->SlotIndex, data->Value);
  322. break;
  323. case OpCodeAsmJs::StSlot_Db:
  324. Output::Print(L" R%d[%d] = D%d ", data->Instance, data->SlotIndex, data->Value);
  325. break;
  326. case OpCodeAsmJs::LdSlot_Int:
  327. Output::Print(L" I%d = R%d[%d] ", data->Value, data->Instance, data->SlotIndex);
  328. break;
  329. case OpCodeAsmJs::LdSlot_Flt:
  330. Output::Print(L" F%d = R%d[%d] ", data->Value, data->Instance, data->SlotIndex);
  331. break;
  332. case OpCodeAsmJs::LdSlot_Db:
  333. Output::Print(L" D%d = R%d[%d] ", data->Value, data->Instance, data->SlotIndex);
  334. break;
  335. case OpCodeAsmJs::Simd128_LdSlot_F4:
  336. Output::Print(L" F4_%d = R%d[%d] ", data->Value, data->Instance, data->SlotIndex);
  337. break;
  338. case OpCodeAsmJs::Simd128_LdSlot_I4:
  339. Output::Print(L" I4_%d = R%d[%d] ", data->Value, data->Instance, data->SlotIndex);
  340. break;
  341. case OpCodeAsmJs::Simd128_LdSlot_D2:
  342. Output::Print(L" D2_%d = R%d[%d] ", data->Value, data->Instance, data->SlotIndex);
  343. break;
  344. case OpCodeAsmJs::Simd128_StSlot_F4:
  345. Output::Print(L" R%d[%d] = F4_%d", data->Instance, data->SlotIndex, data->Value);
  346. break;
  347. case OpCodeAsmJs::Simd128_StSlot_I4:
  348. Output::Print(L" R%d[%d] = I4_%d", data->Instance, data->SlotIndex, data->Value);
  349. break;
  350. case OpCodeAsmJs::Simd128_StSlot_D2:
  351. Output::Print(L" R%d[%d] = D2_%d", data->Instance, data->SlotIndex, data->Value);
  352. break;
  353. default:
  354. {
  355. AssertMsg(false, "Unknown OpCode for OpLayoutElementSlot");
  356. break;
  357. }
  358. }
  359. }
  360. template <class T>
  361. void AsmJsByteCodeDumper::DumpAsmTypedArr(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  362. {
  363. wchar_t* heapTag = nullptr;
  364. wchar_t valueTag = 'I';
  365. switch (data->ViewType)
  366. {
  367. case ArrayBufferView::TYPE_INT8:
  368. heapTag = L"HEAP8"; valueTag = 'I'; break;
  369. case ArrayBufferView::TYPE_UINT8:
  370. heapTag = L"HEAPU8"; valueTag = 'U'; break;
  371. case ArrayBufferView::TYPE_INT16:
  372. heapTag = L"HEAP16"; valueTag = 'I'; break;
  373. case ArrayBufferView::TYPE_UINT16:
  374. heapTag = L"HEAPU16"; valueTag = 'U'; break;
  375. case ArrayBufferView::TYPE_INT32:
  376. heapTag = L"HEAP32"; valueTag = 'I'; break;
  377. case ArrayBufferView::TYPE_UINT32:
  378. heapTag = L"HEAPU32"; valueTag = 'U'; break;
  379. case ArrayBufferView::TYPE_FLOAT32:
  380. heapTag = L"HEAPF32"; valueTag = 'F'; break;
  381. case ArrayBufferView::TYPE_FLOAT64:
  382. heapTag = L"HEAPF64"; valueTag = 'D'; break;
  383. default:
  384. Assert(false);
  385. __assume(false);
  386. break;
  387. }
  388. switch (op)
  389. {
  390. case OpCodeAsmJs::LdArr:
  391. Output::Print(L"%c%d = %s[I%d]", valueTag, data->Value, heapTag, data->SlotIndex); break;
  392. case OpCodeAsmJs::LdArrConst:
  393. Output::Print(L"%c%d = %s[%d]", valueTag, data->Value, heapTag, data->SlotIndex); break;
  394. case OpCodeAsmJs::StArr:
  395. Output::Print(L"%s[I%d] = %c%d", heapTag, data->SlotIndex, valueTag, data->Value); break;
  396. case OpCodeAsmJs::StArrConst:
  397. Output::Print(L"%s[%d] = %c%d", heapTag, data->SlotIndex, valueTag, data->Value); break;
  398. default:
  399. Assert(false);
  400. __assume(false);
  401. break;
  402. }
  403. }
  404. void AsmJsByteCodeDumper::DumpStartCall(OpCodeAsmJs op, const unaligned OpLayoutStartCall* data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  405. {
  406. Assert(op == OpCodeAsmJs::StartCall || op == OpCodeAsmJs::I_StartCall);
  407. Output::Print(L" ArgSize: %d", data->ArgCount);
  408. }
  409. template <class T>
  410. void AsmJsByteCodeDumper::DumpAsmCall(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  411. {
  412. if (data->Return != Constants::NoRegister)
  413. {
  414. DumpReg((RegSlot)data->Return);
  415. Output::Print(L"=");
  416. }
  417. Output::Print(L" R%d(ArgCount: %d)", data->Function, data->ArgCount);
  418. }
  419. template <class T>
  420. void AsmJsByteCodeDumper::DumpAsmUnsigned1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  421. {
  422. DumpU4(data->C1);
  423. }
  424. void AsmJsByteCodeDumper::DumpEmpty(OpCodeAsmJs op, const unaligned OpLayoutEmpty* data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  425. {
  426. // empty
  427. }
  428. void AsmJsByteCodeDumper::DumpAsmBr(OpCodeAsmJs op, const unaligned OpLayoutAsmBr* data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  429. {
  430. DumpOffset(data->RelativeJumpOffset, reader);
  431. }
  432. template <class T>
  433. void AsmJsByteCodeDumper::DumpAsmReg1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  434. {
  435. DumpReg(data->R0);
  436. }
  437. template <class T>
  438. void AsmJsByteCodeDumper::DumpAsmReg2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  439. {
  440. DumpReg(data->R0);
  441. DumpReg(data->R1);
  442. }
  443. template <class T>
  444. void AsmJsByteCodeDumper::DumpAsmReg3(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  445. {
  446. DumpReg(data->R0);
  447. DumpReg(data->R1);
  448. DumpReg(data->R2);
  449. }
  450. template <class T>
  451. void AsmJsByteCodeDumper::DumpAsmReg4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  452. {
  453. DumpReg(data->R0);
  454. DumpReg(data->R1);
  455. DumpReg(data->R2);
  456. DumpReg(data->R3);
  457. }
  458. template <class T>
  459. void AsmJsByteCodeDumper::DumpAsmReg5(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  460. {
  461. DumpReg(data->R0);
  462. DumpReg(data->R1);
  463. DumpReg(data->R2);
  464. DumpReg(data->R3);
  465. DumpReg(data->R4);
  466. }
  467. template <class T>
  468. void AsmJsByteCodeDumper::DumpAsmReg6(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  469. {
  470. DumpReg(data->R0);
  471. DumpReg(data->R1);
  472. DumpReg(data->R2);
  473. DumpReg(data->R3);
  474. DumpReg(data->R4);
  475. DumpReg(data->R5);
  476. }
  477. template <class T>
  478. void AsmJsByteCodeDumper::DumpAsmReg7(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  479. {
  480. DumpReg(data->R0);
  481. DumpReg(data->R1);
  482. DumpReg(data->R2);
  483. DumpReg(data->R3);
  484. DumpReg(data->R4);
  485. DumpReg(data->R5);
  486. DumpReg(data->R6);
  487. }
  488. template <class T>
  489. void AsmJsByteCodeDumper::DumpAsmReg2IntConst1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  490. {
  491. DumpReg(data->R0);
  492. DumpReg(data->R1);
  493. DumpI4(data->C2);
  494. }
  495. template <class T>
  496. void AsmJsByteCodeDumper::DumpInt1Double1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  497. {
  498. DumpIntReg(data->I0);
  499. DumpDoubleReg(data->D1);
  500. }
  501. template <class T>
  502. void AsmJsByteCodeDumper::DumpInt1Float1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  503. {
  504. DumpIntReg(data->I0);
  505. DumpFloatReg(data->F1);
  506. }
  507. template <class T>
  508. void AsmJsByteCodeDumper::DumpDouble1Int1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  509. {
  510. DumpDoubleReg(data->D0);
  511. DumpIntReg(data->I1);
  512. }
  513. template <class T>
  514. void AsmJsByteCodeDumper::DumpDouble1Float1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  515. {
  516. DumpDoubleReg(data->D0);
  517. DumpFloatReg(data->F1);
  518. }
  519. template <class T>
  520. void AsmJsByteCodeDumper::DumpDouble1Reg1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  521. {
  522. DumpDoubleReg(data->D0);
  523. DumpReg(data->R1);
  524. }
  525. template <class T>
  526. void AsmJsByteCodeDumper::DumpFloat1Reg1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  527. {
  528. DumpFloatReg(data->F0);
  529. DumpReg(data->R1);
  530. }
  531. template <class T>
  532. void AsmJsByteCodeDumper::DumpInt1Reg1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  533. {
  534. DumpIntReg(data->I0);
  535. DumpReg(data->R1);
  536. }
  537. template <class T>
  538. void AsmJsByteCodeDumper::DumpReg1Double1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  539. {
  540. DumpReg(data->R0);
  541. DumpDoubleReg(data->D1);
  542. }
  543. template <class T>
  544. void AsmJsByteCodeDumper::DumpReg1Float1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  545. {
  546. DumpReg(data->R0);
  547. DumpFloatReg(data->F1);
  548. }
  549. template <class T>
  550. void AsmJsByteCodeDumper::DumpInt1Double2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  551. {
  552. DumpIntReg(data->I0);
  553. DumpDoubleReg(data->D1);
  554. DumpDoubleReg(data->D2);
  555. }
  556. template <class T>
  557. void AsmJsByteCodeDumper::DumpInt1Float2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  558. {
  559. DumpIntReg(data->I0);
  560. DumpFloatReg(data->F1);
  561. DumpFloatReg(data->F2);
  562. }
  563. template <class T>
  564. void AsmJsByteCodeDumper::DumpReg1Int1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  565. {
  566. DumpReg(data->R0);
  567. DumpIntReg(data->I1);
  568. }
  569. template <class T>
  570. void AsmJsByteCodeDumper::DumpInt2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  571. {
  572. DumpIntReg(data->I0);
  573. DumpIntReg(data->I1);
  574. }
  575. template <class T>
  576. void AsmJsByteCodeDumper::DumpInt1Const1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  577. {
  578. DumpIntReg(data->I0);
  579. DumpI4(data->C1);
  580. }
  581. template <class T>
  582. void AsmJsByteCodeDumper::DumpInt3(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  583. {
  584. DumpIntReg(data->I0);
  585. DumpIntReg(data->I1);
  586. DumpIntReg(data->I2);
  587. }
  588. template <class T>
  589. void AsmJsByteCodeDumper::DumpDouble2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  590. {
  591. DumpDoubleReg(data->D0);
  592. DumpDoubleReg(data->D1);
  593. }
  594. template <class T>
  595. void AsmJsByteCodeDumper::DumpFloat2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  596. {
  597. DumpFloatReg(data->F0);
  598. DumpFloatReg(data->F1);
  599. }
  600. template <class T>
  601. void AsmJsByteCodeDumper::DumpFloat3(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  602. {
  603. DumpFloatReg(data->F0);
  604. DumpFloatReg(data->F1);
  605. DumpFloatReg(data->F2);
  606. }
  607. template <class T>
  608. void AsmJsByteCodeDumper::DumpFloat1Double1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  609. {
  610. DumpFloatReg(data->F0);
  611. DumpDoubleReg(data->D1);
  612. }
  613. template <class T>
  614. void AsmJsByteCodeDumper::DumpFloat1Int1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  615. {
  616. DumpFloatReg(data->F0);
  617. DumpIntReg(data->I1);
  618. }
  619. template <class T>
  620. void AsmJsByteCodeDumper::DumpDouble3(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  621. {
  622. DumpDoubleReg(data->D0);
  623. DumpDoubleReg(data->D1);
  624. DumpDoubleReg(data->D2);
  625. }
  626. template <class T>
  627. void AsmJsByteCodeDumper::DumpBrInt1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  628. {
  629. DumpOffset(data->RelativeJumpOffset, reader);
  630. DumpIntReg(data->I1);
  631. }
  632. template <class T>
  633. void AsmJsByteCodeDumper::DumpBrInt2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  634. {
  635. DumpOffset(data->RelativeJumpOffset, reader);
  636. DumpIntReg(data->I1);
  637. DumpIntReg(data->I2);
  638. }
  639. // Float32x4
  640. template <class T>
  641. void AsmJsByteCodeDumper::DumpFloat32x4_2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  642. {
  643. DumpFloat32x4Reg(data->F4_0);
  644. DumpFloat32x4Reg(data->F4_1);
  645. }
  646. template <class T>
  647. void AsmJsByteCodeDumper::DumpFloat32x4_3(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  648. {
  649. DumpFloat32x4Reg(data->F4_0);
  650. DumpFloat32x4Reg(data->F4_1);
  651. DumpFloat32x4Reg(data->F4_2);
  652. }
  653. template <class T>
  654. void AsmJsByteCodeDumper::DumpFloat32x4_4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  655. {
  656. DumpFloat32x4Reg(data->F4_0);
  657. DumpFloat32x4Reg(data->F4_1);
  658. DumpFloat32x4Reg(data->F4_2);
  659. DumpFloat32x4Reg(data->F4_3);
  660. }
  661. template <class T>
  662. void AsmJsByteCodeDumper::DumpFloat32x4_1Float4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  663. {
  664. DumpFloat32x4Reg(data->F4_0);
  665. DumpFloatReg(data->F1);
  666. DumpFloatReg(data->F2);
  667. DumpFloatReg(data->F3);
  668. DumpFloatReg(data->F4);
  669. }
  670. template <class T>
  671. void AsmJsByteCodeDumper::DumpFloat32x4_2Int4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  672. {
  673. DumpFloat32x4Reg(data->F4_0);
  674. DumpFloat32x4Reg(data->F4_1);
  675. DumpIntReg(data->I2);
  676. DumpIntReg(data->I3);
  677. DumpIntReg(data->I4);
  678. DumpIntReg(data->I5);
  679. }
  680. template <class T>
  681. void AsmJsByteCodeDumper::DumpFloat32x4_3Int4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  682. {
  683. DumpFloat32x4Reg(data->F4_0);
  684. DumpFloat32x4Reg(data->F4_1);
  685. DumpFloat32x4Reg(data->F4_2);
  686. DumpIntReg(data->I3);
  687. DumpIntReg(data->I4);
  688. DumpIntReg(data->I5);
  689. DumpIntReg(data->I6);
  690. }
  691. template <class T>
  692. void AsmJsByteCodeDumper::DumpFloat32x4_1Float1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  693. {
  694. DumpFloat32x4Reg(data->F4_0);
  695. DumpFloatReg(data->F1);
  696. }
  697. template <class T>
  698. void AsmJsByteCodeDumper::DumpFloat32x4_2Float1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  699. {
  700. DumpFloat32x4Reg(data->F4_0);
  701. DumpFloat32x4Reg(data->F4_1);
  702. DumpFloatReg(data->F2);
  703. }
  704. template <class T>
  705. void AsmJsByteCodeDumper::DumpFloat32x4_1Float64x2_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  706. {
  707. DumpFloat32x4Reg(data->F4_0);
  708. DumpFloat64x2Reg(data->D2_1);
  709. }
  710. template <class T>
  711. void AsmJsByteCodeDumper::DumpFloat32x4_1Int32x4_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  712. {
  713. DumpFloat32x4Reg(data->F4_0);
  714. DumpInt32x4Reg(data->I4_1);
  715. }
  716. template <class T>
  717. void AsmJsByteCodeDumper::DumpFloat32x4_1Int32x4_1Float32x4_2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  718. {
  719. DumpFloat32x4Reg(data->F4_0);
  720. DumpInt32x4Reg(data->I4_1);
  721. DumpFloat32x4Reg(data->F4_2);
  722. DumpFloat32x4Reg(data->F4_3);
  723. }
  724. template <class T>
  725. void AsmJsByteCodeDumper::DumpReg1Float32x4_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  726. {
  727. DumpReg(data->R0);
  728. DumpFloat32x4Reg(data->F4_1);
  729. }
  730. template <class T>
  731. void AsmJsByteCodeDumper::DumpInt1Float32x4_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  732. {
  733. DumpIntReg(data->I0);
  734. DumpFloat32x4Reg(data->F4_1);
  735. }
  736. // Int32x4
  737. template <class T>
  738. void AsmJsByteCodeDumper::DumpInt32x4_2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  739. {
  740. DumpInt32x4Reg(data->I4_0);
  741. DumpInt32x4Reg(data->I4_1);
  742. }
  743. template <class T>
  744. void AsmJsByteCodeDumper::DumpInt32x4_3(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  745. {
  746. DumpInt32x4Reg(data->I4_0);
  747. DumpInt32x4Reg(data->I4_1);
  748. DumpInt32x4Reg(data->I4_2);
  749. }
  750. template <class T>
  751. void AsmJsByteCodeDumper::DumpInt32x4_4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  752. {
  753. DumpInt32x4Reg(data->I4_0);
  754. DumpInt32x4Reg(data->I4_1);
  755. DumpInt32x4Reg(data->I4_2);
  756. DumpInt32x4Reg(data->I4_3);
  757. }
  758. template <class T>
  759. void AsmJsByteCodeDumper::DumpInt32x4_1Int4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  760. {
  761. DumpInt32x4Reg(data->I4_0);
  762. DumpIntReg(data->I1);
  763. DumpIntReg(data->I2);
  764. DumpIntReg(data->I3);
  765. DumpIntReg(data->I4);
  766. }
  767. template <class T>
  768. void AsmJsByteCodeDumper::DumpInt32x4_2Int4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  769. {
  770. DumpInt32x4Reg(data->I4_0);
  771. DumpInt32x4Reg(data->I4_1);
  772. DumpIntReg(data->I2);
  773. DumpIntReg(data->I3);
  774. DumpIntReg(data->I4);
  775. DumpIntReg(data->I5);
  776. }
  777. template <class T>
  778. void AsmJsByteCodeDumper::DumpInt32x4_2Int2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  779. {
  780. DumpInt32x4Reg(data->I4_0);
  781. DumpInt32x4Reg(data->I4_1);
  782. DumpIntReg(data->I2);
  783. DumpIntReg(data->I3);
  784. }
  785. template <class T>
  786. void AsmJsByteCodeDumper::DumpInt1Int32x4_1Int1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  787. {
  788. DumpIntReg(data->I0);
  789. DumpInt32x4Reg(data->I4_1);
  790. DumpIntReg(data->I2);
  791. }
  792. template <class T>
  793. void AsmJsByteCodeDumper::DumpFloat32x4_2Int1Float1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  794. {
  795. DumpFloat32x4Reg(data->F4_0);
  796. DumpFloat32x4Reg(data->F4_1);
  797. DumpIntReg(data->I2);
  798. DumpFloatReg(data->F3);
  799. }
  800. template <class T>
  801. void AsmJsByteCodeDumper::DumpFloat1Float32x4_1Int1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  802. {
  803. DumpFloatReg(data->F0);
  804. DumpInt32x4Reg(data->F4_1);
  805. DumpIntReg(data->I2);
  806. }
  807. template <class T>
  808. void AsmJsByteCodeDumper::DumpInt32x4_3Int4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  809. {
  810. DumpInt32x4Reg(data->I4_0);
  811. DumpInt32x4Reg(data->I4_1);
  812. DumpInt32x4Reg(data->I4_2);
  813. DumpIntReg(data->I3);
  814. DumpIntReg(data->I4);
  815. DumpIntReg(data->I5);
  816. DumpIntReg(data->I6);
  817. }
  818. template <class T>
  819. void AsmJsByteCodeDumper::DumpInt32x4_1Int1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  820. {
  821. DumpInt32x4Reg(data->I4_0);
  822. DumpIntReg(data->I1);
  823. }
  824. template <class T>
  825. void AsmJsByteCodeDumper::DumpInt32x4_2Int1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  826. {
  827. DumpInt32x4Reg(data->I4_0);
  828. DumpInt32x4Reg(data->I4_1);
  829. DumpIntReg(data->I2);
  830. }
  831. template <class T>
  832. void AsmJsByteCodeDumper::DumpReg1Int32x4_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  833. {
  834. DumpReg(data->R0);
  835. DumpInt32x4Reg(data->I4_1);
  836. }
  837. template <class T>
  838. void AsmJsByteCodeDumper::DumpInt32x4_1Float32x4_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  839. {
  840. DumpInt32x4Reg(data->I4_0);
  841. DumpFloat32x4Reg(data->F4_1);
  842. }
  843. template <class T>
  844. void AsmJsByteCodeDumper::DumpInt32x4_1Float64x2_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  845. {
  846. DumpInt32x4Reg(data->I4_0);
  847. DumpFloat64x2Reg(data->D2_1);
  848. }
  849. template <class T>
  850. void AsmJsByteCodeDumper::DumpInt1Int32x4_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  851. {
  852. DumpIntReg(data->I0);
  853. DumpFloat64x2Reg(data->I4_1);
  854. }
  855. // Float64x2
  856. template <class T>
  857. void AsmJsByteCodeDumper::DumpFloat64x2_2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  858. {
  859. DumpFloat64x2Reg(data->D2_0);
  860. DumpFloat64x2Reg(data->D2_1);
  861. }
  862. template <class T>
  863. void AsmJsByteCodeDumper::DumpFloat64x2_3(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  864. {
  865. DumpFloat64x2Reg(data->D2_0);
  866. DumpFloat64x2Reg(data->D2_1);
  867. DumpFloat64x2Reg(data->D2_2);
  868. }
  869. template <class T>
  870. void AsmJsByteCodeDumper::DumpFloat64x2_4(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  871. {
  872. DumpFloat64x2Reg(data->D2_0);
  873. DumpFloat64x2Reg(data->D2_1);
  874. DumpFloat64x2Reg(data->D2_2);
  875. DumpFloat64x2Reg(data->D2_3);
  876. }
  877. template <class T>
  878. void AsmJsByteCodeDumper::DumpFloat64x2_1Double2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  879. {
  880. DumpFloat64x2Reg(data->D2_0);
  881. DumpDoubleReg(data->D1);
  882. DumpDoubleReg(data->D2);
  883. }
  884. template <class T>
  885. void AsmJsByteCodeDumper::DumpFloat64x2_1Double1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  886. {
  887. DumpFloat64x2Reg(data->D2_0);
  888. DumpDoubleReg(data->D1);
  889. }
  890. template <class T>
  891. void AsmJsByteCodeDumper::DumpFloat64x2_2Double1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  892. {
  893. DumpFloat64x2Reg(data->D2_0);
  894. DumpFloat64x2Reg(data->D2_1);
  895. DumpDoubleReg(data->D2);
  896. }
  897. template <class T>
  898. void AsmJsByteCodeDumper::DumpFloat64x2_2Int2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  899. {
  900. DumpFloat64x2Reg(data->D2_0);
  901. DumpFloat64x2Reg(data->D2_1);
  902. DumpIntReg(data->I2);
  903. DumpIntReg(data->I3);
  904. }
  905. template <class T>
  906. void AsmJsByteCodeDumper::DumpFloat64x2_3Int2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  907. {
  908. DumpFloat64x2Reg(data->D2_0);
  909. DumpFloat64x2Reg(data->D2_1);
  910. DumpFloat64x2Reg(data->D2_2);
  911. DumpIntReg(data->I3);
  912. DumpIntReg(data->I4);
  913. }
  914. template <class T>
  915. void AsmJsByteCodeDumper::DumpFloat64x2_1Float32x4_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  916. {
  917. DumpFloat64x2Reg(data->D2_0);
  918. DumpFloat32x4Reg(data->F4_1);
  919. }
  920. template <class T>
  921. void AsmJsByteCodeDumper::DumpFloat64x2_1Int32x4_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  922. {
  923. DumpFloat64x2Reg(data->D2_0);
  924. DumpInt32x4Reg(data->I4_1);
  925. }
  926. template <class T>
  927. void AsmJsByteCodeDumper::DumpFloat64x2_1Int32x4_1Float64x2_2(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  928. {
  929. DumpFloat64x2Reg(data->D2_0);
  930. DumpInt32x4Reg(data->I4_1);
  931. DumpFloat64x2Reg(data->D2_2);
  932. DumpFloat64x2Reg(data->D2_3);
  933. }
  934. template <class T>
  935. void AsmJsByteCodeDumper::DumpReg1Float64x2_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  936. {
  937. DumpReg(data->R0);
  938. DumpFloat64x2Reg(data->D2_1);
  939. }
  940. template <class T>
  941. void AsmJsByteCodeDumper::DumpInt1Float64x2_1(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  942. {
  943. DumpIntReg(data->I0);
  944. DumpFloat64x2Reg(data->D2_1);
  945. }
  946. template <class T>
  947. void AsmJsByteCodeDumper::DumpAsmSimdTypedArr(OpCodeAsmJs op, const unaligned T * data, FunctionBody * dumpFunction, ByteCodeReader& reader)
  948. {
  949. wchar_t* heapTag = nullptr;
  950. switch (data->ViewType)
  951. {
  952. case ArrayBufferView::TYPE_INT8:
  953. heapTag = L"HEAP8"; break;
  954. case ArrayBufferView::TYPE_UINT8:
  955. heapTag = L"HEAPU8"; break;
  956. case ArrayBufferView::TYPE_INT16:
  957. heapTag = L"HEAP16"; break;
  958. case ArrayBufferView::TYPE_UINT16:
  959. heapTag = L"HEAPU16"; break;
  960. case ArrayBufferView::TYPE_INT32:
  961. heapTag = L"HEAP32"; break;
  962. case ArrayBufferView::TYPE_UINT32:
  963. heapTag = L"HEAPU32"; break;
  964. case ArrayBufferView::TYPE_FLOAT32:
  965. heapTag = L"HEAPF32"; break;
  966. case ArrayBufferView::TYPE_FLOAT64:
  967. heapTag = L"HEAPF64"; break;
  968. default:
  969. Assert(false);
  970. __assume(false);
  971. break;
  972. }
  973. switch (op)
  974. {
  975. case OpCodeAsmJs::Simd128_LdArrConst_I4:
  976. case OpCodeAsmJs::Simd128_LdArrConst_F4:
  977. case OpCodeAsmJs::Simd128_LdArrConst_D2:
  978. case OpCodeAsmJs::Simd128_StArrConst_I4:
  979. case OpCodeAsmJs::Simd128_StArrConst_F4:
  980. case OpCodeAsmJs::Simd128_StArrConst_D2:
  981. Output::Print(L" %s[%d] ", heapTag, data->SlotIndex);
  982. break;
  983. case OpCodeAsmJs::Simd128_LdArr_I4:
  984. case OpCodeAsmJs::Simd128_LdArr_F4:
  985. case OpCodeAsmJs::Simd128_LdArr_D2:
  986. case OpCodeAsmJs::Simd128_StArr_I4:
  987. case OpCodeAsmJs::Simd128_StArr_F4:
  988. case OpCodeAsmJs::Simd128_StArr_D2:
  989. Output::Print(L" %s[I%d] ", heapTag, data->SlotIndex);
  990. break;
  991. default:
  992. Assert(false);
  993. __assume(false);
  994. break;
  995. }
  996. switch (op)
  997. {
  998. case OpCodeAsmJs::Simd128_LdArr_I4:
  999. case OpCodeAsmJs::Simd128_LdArrConst_I4:
  1000. case OpCodeAsmJs::Simd128_StArr_I4:
  1001. case OpCodeAsmJs::Simd128_StArrConst_I4:
  1002. DumpInt32x4Reg(data->Value);
  1003. break;
  1004. case OpCodeAsmJs::Simd128_LdArr_F4:
  1005. case OpCodeAsmJs::Simd128_LdArrConst_F4:
  1006. case OpCodeAsmJs::Simd128_StArr_F4:
  1007. case OpCodeAsmJs::Simd128_StArrConst_F4:
  1008. DumpFloat32x4Reg(data->Value);
  1009. break;
  1010. case OpCodeAsmJs::Simd128_LdArr_D2:
  1011. case OpCodeAsmJs::Simd128_LdArrConst_D2:
  1012. case OpCodeAsmJs::Simd128_StArr_D2:
  1013. case OpCodeAsmJs::Simd128_StArrConst_D2:
  1014. DumpFloat64x2Reg(data->Value);
  1015. break;
  1016. default:
  1017. Assert(false);
  1018. __assume(false);
  1019. break;
  1020. }
  1021. // data width
  1022. Output::Print(L" %d bytes ", data->DataWidth);
  1023. }
  1024. }
  1025. #endif
  1026. #endif