OpLayoutsAsmJs.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  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. #ifndef TEMP_DISABLE_ASMJS
  7. namespace Js
  8. {
  9. ///----------------------------------------------------------------------------
  10. ///
  11. /// enum OpCodeAsmJs
  12. ///
  13. /// OpCodeAsmJs defines the set of p-code instructions available for byte-code in Asm.Js.
  14. ///
  15. ///----------------------------------------------------------------------------
  16. enum class OpCodeAsmJs : ushort {
  17. #define DEF_OP(x, y, ...) x,
  18. #include "OpCodeListAsmJs.h"
  19. MaxByteSizedOpcodes = 255,
  20. #include "ExtendedOpCodeListAsmJs.h"
  21. ByteCodeLast,
  22. #undef DEF_OP
  23. Count // Number of operations
  24. };
  25. inline OpCodeAsmJs operator+(OpCodeAsmJs o1, OpCodeAsmJs o2) { return (OpCodeAsmJs)((uint)o1 + (uint)o2); }
  26. inline uint operator+(OpCodeAsmJs o1, uint i) { return ((uint)o1 + i); }
  27. inline uint operator+(uint i, OpCodeAsmJs &o2) { return (i + (uint)o2); }
  28. inline OpCodeAsmJs operator++(OpCodeAsmJs &o) { return o = (OpCodeAsmJs)(o + 1U); }
  29. inline OpCodeAsmJs operator++(OpCodeAsmJs &o, int) { OpCodeAsmJs prev_o = o; o = (OpCodeAsmJs)(o + 1U); return prev_o; }
  30. inline OpCodeAsmJs operator-(OpCodeAsmJs o1, OpCodeAsmJs o2) { return (OpCodeAsmJs)((uint)o1 - (uint)o2); }
  31. inline uint operator-(OpCodeAsmJs o1, uint i) { return ((uint)o1 - i); }
  32. inline uint operator-(uint i, OpCodeAsmJs &o2) { return (i - (uint)o2); }
  33. inline OpCodeAsmJs operator--(OpCodeAsmJs &o) { return o = (OpCodeAsmJs)(o - 1U); }
  34. inline OpCodeAsmJs operator--(OpCodeAsmJs &o, int) { return o = (OpCodeAsmJs)(o - 1U); }
  35. inline uint operator<<(OpCodeAsmJs o1, uint i) { return ((uint)o1 << i); }
  36. inline OpCodeAsmJs& operator+=(OpCodeAsmJs &o, uint i) { return (o = (OpCodeAsmJs)(o + i)); }
  37. inline OpCodeAsmJs& operator-=(OpCodeAsmJs &o, uint i) { return (o = (OpCodeAsmJs)(o - i)); }
  38. inline bool operator==(OpCodeAsmJs &o, uint i) { return ((uint)(o) == i); }
  39. inline bool operator==(uint i, OpCodeAsmJs &o) { return (i == (uint)(o)); }
  40. inline bool operator!=(OpCodeAsmJs &o, uint i) { return ((uint)(o) != i); }
  41. inline bool operator!=(uint i, OpCodeAsmJs &o) { return (i != (uint)(o)); }
  42. inline bool operator<(OpCodeAsmJs &o, uint i) { return ((uint)(o) < i); }
  43. inline bool operator<(uint i, OpCodeAsmJs &o) { return (i < (uint)(o)); }
  44. inline bool operator<=(OpCodeAsmJs &o, uint i) { return ((uint)(o) <= i); }
  45. inline bool operator<=(uint i, OpCodeAsmJs &o) { return (i <= (uint)(o)); }
  46. inline bool operator<=(OpCodeAsmJs o1, OpCode o2) { return ((OpCode)o1 <= (o2)); }
  47. inline bool operator>(OpCodeAsmJs &o, uint i) { return ((uint)(o) > i); }
  48. inline bool operator>(uint i, OpCodeAsmJs &o) { return (i > (uint)(o)); }
  49. inline bool operator>=(OpCodeAsmJs &o, uint i) { return ((uint)(o) >= i); }
  50. inline bool operator>=(uint i, OpCodeAsmJs &o) { return (i >= (uint)(o)); }
  51. inline bool IsSimd128AsmJsOpcode(OpCodeAsmJs o)
  52. {
  53. return (o > Js::OpCodeAsmJs::Simd128_Start && o < Js::OpCodeAsmJs::Simd128_End) || (o > Js::OpCodeAsmJs::Simd128_Start_Extend && o < Js::OpCodeAsmJs::Simd128_End_Extend);
  54. }
  55. inline uint Simd128AsmJsOpcodeCount()
  56. {
  57. return (uint)(Js::OpCodeAsmJs::Simd128_End - Js::OpCodeAsmJs::Simd128_Start) + 1 + (uint)(Js::OpCodeAsmJs::Simd128_End_Extend - Js::OpCodeAsmJs::Simd128_Start_Extend) + 1;
  58. }
  59. ///----------------------------------------------------------------------------
  60. ///
  61. /// enum OpLayoutTypeAsmJs
  62. ///
  63. /// OpLayoutTypeAsmJs defines a set of layouts available for OpCodes. These layouts
  64. /// correspond to "OpLayout" structs defined below, such as "OpLayoutReg1".
  65. ///
  66. ///----------------------------------------------------------------------------
  67. BEGIN_ENUM_UINT( OpLayoutTypeAsmJs )
  68. // This define only one enum for each layout type, but not for each layout variant
  69. #define LAYOUT_TYPE(x) x,
  70. #define LAYOUT_TYPE_WMS LAYOUT_TYPE
  71. #include "LayoutTypesAsmJs.h"
  72. Count,
  73. END_ENUM_UINT()
  74. #pragma pack(push, 1)
  75. /// Asm.js Layout
  76. template <typename SizePolicy>
  77. struct OpLayoutT_AsmTypedArr
  78. {
  79. // force encode 4 bytes because it can be a value
  80. uint32 SlotIndex;
  81. typename SizePolicy::RegSlotType Value;
  82. int8 ViewType;
  83. };
  84. template <typename SizePolicy>
  85. struct OpLayoutT_AsmCall
  86. {
  87. typename SizePolicy::ArgSlotType ArgCount;
  88. typename SizePolicy::RegSlotSType Return;
  89. typename SizePolicy::RegSlotType Function;
  90. int8 ReturnType;
  91. };
  92. template <typename SizePolicy>
  93. struct OpLayoutT_AsmReg1
  94. {
  95. typename SizePolicy::RegSlotType R0;
  96. };
  97. template <typename SizePolicy>
  98. struct OpLayoutT_AsmReg2
  99. {
  100. typename SizePolicy::RegSlotType R0;
  101. typename SizePolicy::RegSlotType R1;
  102. };
  103. template <typename SizePolicy>
  104. struct OpLayoutT_AsmReg3
  105. {
  106. typename SizePolicy::RegSlotType R0;
  107. typename SizePolicy::RegSlotType R1;
  108. typename SizePolicy::RegSlotType R2;
  109. };
  110. template <typename SizePolicy>
  111. struct OpLayoutT_AsmReg4
  112. {
  113. typename SizePolicy::RegSlotType R0;
  114. typename SizePolicy::RegSlotType R1;
  115. typename SizePolicy::RegSlotType R2;
  116. typename SizePolicy::RegSlotType R3;
  117. };
  118. template <typename SizePolicy>
  119. struct OpLayoutT_AsmReg5
  120. {
  121. typename SizePolicy::RegSlotType R0;
  122. typename SizePolicy::RegSlotType R1;
  123. typename SizePolicy::RegSlotType R2;
  124. typename SizePolicy::RegSlotType R3;
  125. typename SizePolicy::RegSlotType R4;
  126. };
  127. template <typename SizePolicy>
  128. struct OpLayoutT_AsmReg6
  129. {
  130. typename SizePolicy::RegSlotType R0;
  131. typename SizePolicy::RegSlotType R1;
  132. typename SizePolicy::RegSlotType R2;
  133. typename SizePolicy::RegSlotType R3;
  134. typename SizePolicy::RegSlotType R4;
  135. typename SizePolicy::RegSlotType R5;
  136. };
  137. template <typename SizePolicy>
  138. struct OpLayoutT_AsmReg7
  139. {
  140. typename SizePolicy::RegSlotType R0;
  141. typename SizePolicy::RegSlotType R1;
  142. typename SizePolicy::RegSlotType R2;
  143. typename SizePolicy::RegSlotType R3;
  144. typename SizePolicy::RegSlotType R4;
  145. typename SizePolicy::RegSlotType R5;
  146. typename SizePolicy::RegSlotType R6;
  147. };
  148. template <typename SizePolicy>
  149. struct OpLayoutT_AsmReg2IntConst1
  150. {
  151. typename SizePolicy::RegSlotType R0;
  152. typename SizePolicy::RegSlotType R1;
  153. typename int C2;
  154. };
  155. template <typename SizePolicy>
  156. struct OpLayoutT_Int1Double1
  157. {
  158. typename SizePolicy::RegSlotType I0;
  159. typename SizePolicy::RegSlotType D1;
  160. };
  161. template <typename SizePolicy>
  162. struct OpLayoutT_Int1Float1
  163. {
  164. typename SizePolicy::RegSlotType I0;
  165. typename SizePolicy::RegSlotType F1;
  166. };
  167. template <typename SizePolicy>
  168. struct OpLayoutT_Double1Int1
  169. {
  170. typename SizePolicy::RegSlotType D0;
  171. typename SizePolicy::RegSlotType I1;
  172. };
  173. template <typename SizePolicy>
  174. struct OpLayoutT_Double1Float1
  175. {
  176. typename SizePolicy::RegSlotType D0;
  177. typename SizePolicy::RegSlotType F1;
  178. };
  179. template <typename SizePolicy>
  180. struct OpLayoutT_Double1Reg1
  181. {
  182. typename SizePolicy::RegSlotType D0;
  183. typename SizePolicy::RegSlotType R1;
  184. };
  185. template <typename SizePolicy>
  186. struct OpLayoutT_Float1Reg1
  187. {
  188. typename SizePolicy::RegSlotType F0;
  189. typename SizePolicy::RegSlotType R1;
  190. };
  191. template <typename SizePolicy>
  192. struct OpLayoutT_Int1Reg1
  193. {
  194. typename SizePolicy::RegSlotType I0;
  195. typename SizePolicy::RegSlotType R1;
  196. };
  197. template <typename SizePolicy>
  198. struct OpLayoutT_Reg1Double1
  199. {
  200. typename SizePolicy::RegSlotType R0;
  201. typename SizePolicy::RegSlotType D1;
  202. };
  203. template <typename SizePolicy>
  204. struct OpLayoutT_Reg1Float1
  205. {
  206. typename SizePolicy::RegSlotType R0;
  207. typename SizePolicy::RegSlotType F1;
  208. };
  209. template <typename SizePolicy>
  210. struct OpLayoutT_Reg1Int1
  211. {
  212. typename SizePolicy::RegSlotType R0;
  213. typename SizePolicy::RegSlotType I1;
  214. };
  215. template <typename SizePolicy>
  216. struct OpLayoutT_Int1Double2
  217. {
  218. typename SizePolicy::RegSlotType I0;
  219. typename SizePolicy::RegSlotType D1;
  220. typename SizePolicy::RegSlotType D2;
  221. };
  222. template <typename SizePolicy>
  223. struct OpLayoutT_Int1Float2
  224. {
  225. typename SizePolicy::RegSlotType I0;
  226. typename SizePolicy::RegSlotType F1;
  227. typename SizePolicy::RegSlotType F2;
  228. };
  229. template <typename SizePolicy>
  230. struct OpLayoutT_Int2
  231. {
  232. typename SizePolicy::RegSlotType I0;
  233. typename SizePolicy::RegSlotType I1;
  234. };
  235. template <typename SizePolicy>
  236. struct OpLayoutT_Int1Const1
  237. {
  238. typename SizePolicy::RegSlotType I0;
  239. typename int C1;
  240. };
  241. template <typename SizePolicy>
  242. struct OpLayoutT_Int3
  243. {
  244. typename SizePolicy::RegSlotType I0;
  245. typename SizePolicy::RegSlotType I1;
  246. typename SizePolicy::RegSlotType I2;
  247. };
  248. template <typename SizePolicy>
  249. struct OpLayoutT_Double2
  250. {
  251. typename SizePolicy::RegSlotType D0;
  252. typename SizePolicy::RegSlotType D1;
  253. };
  254. template <typename SizePolicy>
  255. struct OpLayoutT_Float2
  256. {
  257. typename SizePolicy::RegSlotType F0;
  258. typename SizePolicy::RegSlotType F1;
  259. };
  260. template <typename SizePolicy>
  261. struct OpLayoutT_Float3
  262. {
  263. typename SizePolicy::RegSlotType F0;
  264. typename SizePolicy::RegSlotType F1;
  265. typename SizePolicy::RegSlotType F2;
  266. };
  267. template <typename SizePolicy>
  268. struct OpLayoutT_Float1Double1
  269. {
  270. typename SizePolicy::RegSlotType F0;
  271. typename SizePolicy::RegSlotType D1;
  272. };
  273. template <typename SizePolicy>
  274. struct OpLayoutT_Float1Int1
  275. {
  276. typename SizePolicy::RegSlotType F0;
  277. typename SizePolicy::RegSlotType I1;
  278. };
  279. template <typename SizePolicy>
  280. struct OpLayoutT_Double3
  281. {
  282. typename SizePolicy::RegSlotType D0;
  283. typename SizePolicy::RegSlotType D1;
  284. typename SizePolicy::RegSlotType D2;
  285. };
  286. template <typename SizePolicy>
  287. struct OpLayoutT_AsmUnsigned1
  288. {
  289. typename SizePolicy::UnsignedType C1;
  290. };
  291. struct OpLayoutAsmBr
  292. {
  293. int32 RelativeJumpOffset;
  294. };
  295. template <typename SizePolicy>
  296. struct OpLayoutT_BrInt1
  297. {
  298. int32 RelativeJumpOffset;
  299. typename SizePolicy::RegSlotType I1;
  300. };
  301. template <typename SizePolicy>
  302. struct OpLayoutT_BrInt2
  303. {
  304. int32 RelativeJumpOffset;
  305. typename SizePolicy::RegSlotType I1;
  306. typename SizePolicy::RegSlotType I2;
  307. };
  308. /* Float32x4 layouts */
  309. //--------------------
  310. template <typename SizePolicy>
  311. struct OpLayoutT_Float32x4_2
  312. {
  313. typename SizePolicy::RegSlotType F4_0;
  314. typename SizePolicy::RegSlotType F4_1;
  315. };
  316. template <typename SizePolicy>
  317. struct OpLayoutT_Float32x4_3
  318. {
  319. typename SizePolicy::RegSlotType F4_0;
  320. typename SizePolicy::RegSlotType F4_1;
  321. typename SizePolicy::RegSlotType F4_2;
  322. };
  323. template <typename SizePolicy>
  324. struct OpLayoutT_Float32x4_4
  325. {
  326. typename SizePolicy::RegSlotType F4_0;
  327. typename SizePolicy::RegSlotType F4_1;
  328. typename SizePolicy::RegSlotType F4_2;
  329. typename SizePolicy::RegSlotType F4_3;
  330. };
  331. // 4 floats -> float32x4.
  332. template <typename SizePolicy>
  333. struct OpLayoutT_Float32x4_1Float4
  334. {
  335. typename SizePolicy::RegSlotType F4_0;
  336. typename SizePolicy::RegSlotType F1;
  337. typename SizePolicy::RegSlotType F2;
  338. typename SizePolicy::RegSlotType F3;
  339. typename SizePolicy::RegSlotType F4;
  340. };
  341. template <typename SizePolicy>
  342. struct OpLayoutT_Float32x4_2Int4
  343. {
  344. typename SizePolicy::RegSlotType F4_0;
  345. typename SizePolicy::RegSlotType F4_1;
  346. typename SizePolicy::RegSlotType I2;
  347. typename SizePolicy::RegSlotType I3;
  348. typename SizePolicy::RegSlotType I4;
  349. typename SizePolicy::RegSlotType I5;
  350. };
  351. template <typename SizePolicy>
  352. struct OpLayoutT_Float32x4_3Int4
  353. {
  354. typename SizePolicy::RegSlotType F4_0;
  355. typename SizePolicy::RegSlotType F4_1;
  356. typename SizePolicy::RegSlotType F4_2;
  357. typename SizePolicy::RegSlotType I3;
  358. typename SizePolicy::RegSlotType I4;
  359. typename SizePolicy::RegSlotType I5;
  360. typename SizePolicy::RegSlotType I6;
  361. };
  362. template <typename SizePolicy>
  363. struct OpLayoutT_Float32x4_1Float1
  364. {
  365. typename SizePolicy::RegSlotType F4_0;
  366. typename SizePolicy::RegSlotType F1;
  367. };
  368. template <typename SizePolicy>
  369. struct OpLayoutT_Float32x4_2Float1
  370. {
  371. typename SizePolicy::RegSlotType F4_0;
  372. typename SizePolicy::RegSlotType F4_1;
  373. typename SizePolicy::RegSlotType F2;
  374. };
  375. template <typename SizePolicy>
  376. struct OpLayoutT_Float32x4_1Float64x2_1
  377. {
  378. typename SizePolicy::RegSlotType F4_0;
  379. typename SizePolicy::RegSlotType D2_1;
  380. };
  381. template <typename SizePolicy>
  382. struct OpLayoutT_Float32x4_1Int32x4_1
  383. {
  384. typename SizePolicy::RegSlotType F4_0;
  385. typename SizePolicy::RegSlotType I4_1;
  386. };
  387. template <typename SizePolicy>
  388. struct OpLayoutT_Float32x4_1Int32x4_1Float32x4_2
  389. {
  390. typename SizePolicy::RegSlotType F4_0;
  391. typename SizePolicy::RegSlotType I4_1;
  392. typename SizePolicy::RegSlotType F4_2;
  393. typename SizePolicy::RegSlotType F4_3;
  394. };
  395. template <typename SizePolicy>
  396. struct OpLayoutT_Reg1Float32x4_1
  397. {
  398. typename SizePolicy::RegSlotType R0;
  399. typename SizePolicy::RegSlotType F4_1;
  400. };
  401. template <typename SizePolicy>
  402. struct OpLayoutT_Int1Float32x4_1
  403. {
  404. typename SizePolicy::RegSlotType I0;
  405. typename SizePolicy::RegSlotType F4_1;
  406. };
  407. /* Int32x4 layouts */
  408. //--------------------
  409. template <typename SizePolicy>
  410. struct OpLayoutT_Int32x4_2
  411. {
  412. typename SizePolicy::RegSlotType I4_0;
  413. typename SizePolicy::RegSlotType I4_1;
  414. };
  415. template <typename SizePolicy>
  416. struct OpLayoutT_Int32x4_3
  417. {
  418. typename SizePolicy::RegSlotType I4_0;
  419. typename SizePolicy::RegSlotType I4_1;
  420. typename SizePolicy::RegSlotType I4_2;
  421. };
  422. template <typename SizePolicy>
  423. struct OpLayoutT_Int32x4_4
  424. {
  425. typename SizePolicy::RegSlotType I4_0;
  426. typename SizePolicy::RegSlotType I4_1;
  427. typename SizePolicy::RegSlotType I4_2;
  428. typename SizePolicy::RegSlotType I4_3;
  429. };
  430. template <typename SizePolicy>
  431. struct OpLayoutT_Int32x4_1Int1
  432. {
  433. typename SizePolicy::RegSlotType I4_0;
  434. typename SizePolicy::RegSlotType I1;
  435. };
  436. template <typename SizePolicy>
  437. struct OpLayoutT_Int32x4_1Int4
  438. {
  439. typename SizePolicy::RegSlotType I4_0;
  440. typename SizePolicy::RegSlotType I1;
  441. typename SizePolicy::RegSlotType I2;
  442. typename SizePolicy::RegSlotType I3;
  443. typename SizePolicy::RegSlotType I4;
  444. };
  445. template <typename SizePolicy>
  446. struct OpLayoutT_Int32x4_2Int4
  447. {
  448. typename SizePolicy::RegSlotType I4_0;
  449. typename SizePolicy::RegSlotType I4_1;
  450. typename SizePolicy::RegSlotType I2;
  451. typename SizePolicy::RegSlotType I3;
  452. typename SizePolicy::RegSlotType I4;
  453. typename SizePolicy::RegSlotType I5;
  454. };
  455. template <typename SizePolicy>
  456. struct OpLayoutT_Int32x4_3Int4
  457. {
  458. typename SizePolicy::RegSlotType I4_0;
  459. typename SizePolicy::RegSlotType I4_1;
  460. typename SizePolicy::RegSlotType I4_2;
  461. typename SizePolicy::RegSlotType I3;
  462. typename SizePolicy::RegSlotType I4;
  463. typename SizePolicy::RegSlotType I5;
  464. typename SizePolicy::RegSlotType I6;
  465. };
  466. template <typename SizePolicy>
  467. struct OpLayoutT_Int32x4_2Int1
  468. {
  469. typename SizePolicy::RegSlotType I4_0;
  470. typename SizePolicy::RegSlotType I4_1;
  471. typename SizePolicy::RegSlotType I2;
  472. };
  473. template <typename SizePolicy>
  474. struct OpLayoutT_Int32x4_2Int2
  475. {
  476. typename SizePolicy::RegSlotType I4_0;
  477. typename SizePolicy::RegSlotType I4_1;
  478. typename SizePolicy::RegSlotType I2;
  479. typename SizePolicy::RegSlotType I3;
  480. };
  481. template <typename SizePolicy>
  482. struct OpLayoutT_Int1Int32x4_1Int1
  483. {
  484. typename SizePolicy::RegSlotType I0;
  485. typename SizePolicy::RegSlotType I4_1;
  486. typename SizePolicy::RegSlotType I2;
  487. };
  488. template <typename SizePolicy>
  489. struct OpLayoutT_Float32x4_2Int1Float1
  490. {
  491. typename SizePolicy::RegSlotType F4_0;
  492. typename SizePolicy::RegSlotType F4_1;
  493. typename SizePolicy::RegSlotType I2;
  494. typename SizePolicy::RegSlotType F3;
  495. };
  496. template <typename SizePolicy>
  497. struct OpLayoutT_Float1Float32x4_1Int1
  498. {
  499. typename SizePolicy::RegSlotType F0;
  500. typename SizePolicy::RegSlotType F4_1;
  501. typename SizePolicy::RegSlotType I2;
  502. };
  503. template <typename SizePolicy>
  504. struct OpLayoutT_Reg1Int32x4_1
  505. {
  506. typename SizePolicy::RegSlotType R0;
  507. typename SizePolicy::RegSlotType I4_1;
  508. };
  509. template <typename SizePolicy>
  510. struct OpLayoutT_Int32x4_1Float64x2_1
  511. {
  512. typename SizePolicy::RegSlotType I4_0;
  513. typename SizePolicy::RegSlotType D2_1;
  514. };
  515. template <typename SizePolicy>
  516. struct OpLayoutT_Int32x4_1Float32x4_1
  517. {
  518. typename SizePolicy::RegSlotType I4_0;
  519. typename SizePolicy::RegSlotType F4_1;
  520. };
  521. template <typename SizePolicy>
  522. struct OpLayoutT_Int1Int32x4_1
  523. {
  524. typename SizePolicy::RegSlotType I0;
  525. typename SizePolicy::RegSlotType I4_1;
  526. };
  527. /* Float64x2 layouts */
  528. //--------------------
  529. template <typename SizePolicy>
  530. struct OpLayoutT_Float64x2_2
  531. {
  532. typename SizePolicy::RegSlotType D2_0;
  533. typename SizePolicy::RegSlotType D2_1;
  534. };
  535. template <typename SizePolicy>
  536. struct OpLayoutT_Float64x2_3
  537. {
  538. typename SizePolicy::RegSlotType D2_0;
  539. typename SizePolicy::RegSlotType D2_1;
  540. typename SizePolicy::RegSlotType D2_2;
  541. };
  542. template <typename SizePolicy>
  543. struct OpLayoutT_Float64x2_4
  544. {
  545. typename SizePolicy::RegSlotType D2_0;
  546. typename SizePolicy::RegSlotType D2_1;
  547. typename SizePolicy::RegSlotType D2_2;
  548. typename SizePolicy::RegSlotType D2_3;
  549. };
  550. template <typename SizePolicy>
  551. struct OpLayoutT_Float64x2_1Double2
  552. {
  553. typename SizePolicy::RegSlotType D2_0;
  554. typename SizePolicy::RegSlotType D1;
  555. typename SizePolicy::RegSlotType D2;
  556. };
  557. template <typename SizePolicy>
  558. struct OpLayoutT_Float64x2_1Double1
  559. {
  560. typename SizePolicy::RegSlotType D2_0;
  561. typename SizePolicy::RegSlotType D1;
  562. };
  563. template <typename SizePolicy>
  564. struct OpLayoutT_Float64x2_2Double1
  565. {
  566. typename SizePolicy::RegSlotType D2_0;
  567. typename SizePolicy::RegSlotType D2_1;
  568. typename SizePolicy::RegSlotType D2;
  569. };
  570. template <typename SizePolicy>
  571. struct OpLayoutT_Float64x2_2Int2
  572. {
  573. typename SizePolicy::RegSlotType D2_0;
  574. typename SizePolicy::RegSlotType D2_1;
  575. typename SizePolicy::RegSlotType I2;
  576. typename SizePolicy::RegSlotType I3;
  577. };
  578. template <typename SizePolicy>
  579. struct OpLayoutT_Float64x2_3Int2
  580. {
  581. typename SizePolicy::RegSlotType D2_0;
  582. typename SizePolicy::RegSlotType D2_1;
  583. typename SizePolicy::RegSlotType D2_2;
  584. typename SizePolicy::RegSlotType I3;
  585. typename SizePolicy::RegSlotType I4;
  586. };
  587. template <typename SizePolicy>
  588. struct OpLayoutT_Float64x2_1Float32x4_1
  589. {
  590. typename SizePolicy::RegSlotType D2_0;
  591. typename SizePolicy::RegSlotType F4_1;
  592. };
  593. template <typename SizePolicy>
  594. struct OpLayoutT_Float64x2_1Int32x4_1
  595. {
  596. typename SizePolicy::RegSlotType D2_0;
  597. typename SizePolicy::RegSlotType I4_1;
  598. };
  599. template <typename SizePolicy>
  600. struct OpLayoutT_Float64x2_1Int32x4_1Float64x2_2
  601. {
  602. typename SizePolicy::RegSlotType D2_0;
  603. typename SizePolicy::RegSlotType I4_1;
  604. typename SizePolicy::RegSlotType D2_2;
  605. typename SizePolicy::RegSlotType D2_3;
  606. };
  607. template <typename SizePolicy>
  608. struct OpLayoutT_Reg1Float64x2_1
  609. {
  610. typename SizePolicy::RegSlotType R0;
  611. typename SizePolicy::RegSlotType D2_1;
  612. };
  613. template <typename SizePolicy>
  614. struct OpLayoutT_Int1Float64x2_1
  615. {
  616. typename SizePolicy::RegSlotType I0;
  617. typename SizePolicy::RegSlotType D2_1;
  618. };
  619. template <typename SizePolicy>
  620. struct OpLayoutT_AsmSimdTypedArr
  621. {
  622. // force encode 4 bytes because it can be a value
  623. uint32 SlotIndex;
  624. typename SizePolicy::RegSlotType Value;
  625. int8 ViewType;
  626. int8 DataWidth; // # of bytes to load/store
  627. };
  628. // Generate the multi size layout type defs
  629. #define LAYOUT_TYPE_WMS(layout) \
  630. typedef OpLayoutT_##layout<LargeLayoutSizePolicy> OpLayout##layout##_Large; \
  631. typedef OpLayoutT_##layout<MediumLayoutSizePolicy> OpLayout##layout##_Medium; \
  632. typedef OpLayoutT_##layout<SmallLayoutSizePolicy> OpLayout##layout##_Small;
  633. #include "LayoutTypesAsmJs.h"
  634. #pragma pack(pop)
  635. // Generate structure to automatically map layout to its info
  636. template <OpLayoutTypeAsmJs::_E layout> struct OpLayoutInfoAsmJs;
  637. #define LAYOUT_TYPE(layout) \
  638. CompileAssert(sizeof(OpLayout##layout) <= MaxLayoutSize); \
  639. template <> struct OpLayoutInfoAsmJs<OpLayoutTypeAsmJs::layout> \
  640. { \
  641. static const bool HasMultiSizeLayout = false; \
  642. };
  643. #define LAYOUT_TYPE_WMS(layout) \
  644. CompileAssert(sizeof(OpLayout##layout##_Large) <= MaxLayoutSize); \
  645. template <> struct OpLayoutInfoAsmJs<OpLayoutTypeAsmJs::layout> \
  646. { \
  647. static const bool HasMultiSizeLayout = true; \
  648. };
  649. #include "LayoutTypesAsmJs.h"
  650. // Generate structure to automatically map opcode to its info
  651. // Also generate assert to make sure the layout and opcode use the same macro with and without multiple size layout
  652. template <OpCodeAsmJs opcode> struct OpCodeInfoAsmJs;
  653. #define DEFINE_OPCODEINFO(op, layout, extended) \
  654. CompileAssert(!OpLayoutInfoAsmJs<OpLayoutTypeAsmJs::layout>::HasMultiSizeLayout); \
  655. template <> struct OpCodeInfoAsmJs<OpCodeAsmJs::op> \
  656. { \
  657. static const OpLayoutTypeAsmJs::_E Layout = OpLayoutTypeAsmJs::layout; \
  658. static const bool HasMultiSizeLayout = false; \
  659. static const bool IsExtendedOpcode = extended; \
  660. typedef OpLayout##layout LayoutType; \
  661. };
  662. #define DEFINE_OPCODEINFO_WMS(op, layout, extended) \
  663. CompileAssert(OpLayoutInfoAsmJs<OpLayoutTypeAsmJs::layout>::HasMultiSizeLayout); \
  664. template <> struct OpCodeInfoAsmJs<OpCodeAsmJs::op> \
  665. { \
  666. static const OpLayoutTypeAsmJs::_E Layout = OpLayoutTypeAsmJs::layout; \
  667. static const bool HasMultiSizeLayout = true; \
  668. static const bool IsExtendedOpcode = extended; \
  669. typedef OpLayout##layout##_Large LayoutType_Large; \
  670. typedef OpLayout##layout##_Medium LayoutType_Medium; \
  671. typedef OpLayout##layout##_Small LayoutType_Small; \
  672. };
  673. #define MACRO(op, layout, ...) DEFINE_OPCODEINFO(op, layout, false)
  674. #define MACRO_WMS(op, layout, ...) DEFINE_OPCODEINFO_WMS(op, layout, false)
  675. #define MACRO_EXTEND(op, layout, ...) DEFINE_OPCODEINFO(op, layout, true)
  676. #define MACRO_EXTEND_WMS(op, layout, ...) DEFINE_OPCODEINFO_WMS(op, layout, true)
  677. #include "OpCodesAsmJs.h"
  678. #undef DEFINE_OPCODEINFO
  679. #undef DEFINE_OPCODEINFO_WMS
  680. }
  681. #endif