wasm_opcodes.rs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. macro_rules! c {
  2. ($x:ident, $y:expr) => {
  3. #[allow(dead_code)]
  4. pub const $x: u8 = $y;
  5. };
  6. }
  7. // https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#high-level-structure
  8. c!(WASM_VERSION, 0x1);
  9. // Section codes
  10. c!(SC_TYPE, 1);
  11. c!(SC_IMPORT, 2);
  12. c!(SC_FUNCTION, 3);
  13. c!(SC_TABLE, 4);
  14. c!(SC_MEMORY, 5);
  15. c!(SC_GLOBAL, 6);
  16. c!(SC_EXPORT, 7);
  17. c!(SC_START, 8);
  18. c!(SC_ELEMENT, 9);
  19. c!(SC_CODE, 10);
  20. c!(SC_DATA, 11);
  21. // https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#language-types
  22. c!(TYPE_I32, 0x7f);
  23. c!(TYPE_I64, 0x7e);
  24. c!(TYPE_F32, 0x7d);
  25. c!(TYPE_F64, 0x7c);
  26. c!(TYPE_ANYFUNC, 0x70);
  27. c!(TYPE_FUNC, 0x60);
  28. c!(TYPE_VOID_BLOCK, 0x40);
  29. // https://github.com/WebAssembly/design/blob/master/BinaryEncoding.md#external_kind
  30. c!(EXT_FUNCTION, 0);
  31. c!(EXT_TABLE, 1);
  32. c!(EXT_MEMORY, 2);
  33. c!(EXT_GLOBAL, 3);
  34. // Taken from wasm2ast's source code and modified with vim magic
  35. c!(OP_UNREACHABLE, 0x00);
  36. c!(OP_NOP, 0x01);
  37. c!(OP_BLOCK, 0x02);
  38. c!(OP_LOOP, 0x03);
  39. c!(OP_IF, 0x04);
  40. c!(OP_ELSE, 0x05);
  41. c!(OP_TRY, 0x06);
  42. c!(OP_CATCH, 0x07);
  43. c!(OP_THROW, 0x08);
  44. c!(OP_RETHROW, 0x09);
  45. c!(OP_CATCHALL, 0x0a);
  46. c!(OP_END, 0x0b);
  47. c!(OP_BR, 0x0c);
  48. c!(OP_BRIF, 0x0d);
  49. c!(OP_BRTABLE, 0x0e);
  50. c!(OP_RETURN, 0x0f);
  51. c!(OP_CALL, 0x10);
  52. c!(OP_CALLINDIRECT, 0x11);
  53. c!(OP_DROP, 0x1a);
  54. c!(OP_SELECT, 0x1b);
  55. c!(OP_GETLOCAL, 0x20);
  56. c!(OP_SETLOCAL, 0x21);
  57. c!(OP_TEELOCAL, 0x22);
  58. c!(OP_GETGLOBAL, 0x23);
  59. c!(OP_SETGLOBAL, 0x24);
  60. c!(OP_I32LOAD, 0x28);
  61. c!(OP_I64LOAD, 0x29);
  62. c!(OP_F32LOAD, 0x2a);
  63. c!(OP_F64LOAD, 0x2b);
  64. c!(OP_I32LOAD8S, 0x2c);
  65. c!(OP_I32LOAD8U, 0x2d);
  66. c!(OP_I32LOAD16S, 0x2e);
  67. c!(OP_I32LOAD16U, 0x2f);
  68. c!(OP_I64LOAD8S, 0x30);
  69. c!(OP_I64LOAD8U, 0x31);
  70. c!(OP_I64LOAD16S, 0x32);
  71. c!(OP_I64LOAD16U, 0x33);
  72. c!(OP_I64LOAD32S, 0x34);
  73. c!(OP_I64LOAD32U, 0x35);
  74. c!(OP_I32STORE, 0x36);
  75. c!(OP_I64STORE, 0x37);
  76. c!(OP_F32STORE, 0x38);
  77. c!(OP_F64STORE, 0x39);
  78. c!(OP_I32STORE8, 0x3a);
  79. c!(OP_I32STORE16, 0x3b);
  80. c!(OP_I64STORE8, 0x3c);
  81. c!(OP_I64STORE16, 0x3d);
  82. c!(OP_I64STORE32, 0x3e);
  83. c!(OP_CURRENTMEMORY, 0x3f);
  84. c!(OP_GROWMEMORY, 0x40);
  85. c!(OP_I32CONST, 0x41);
  86. c!(OP_I64CONST, 0x42);
  87. c!(OP_F32CONST, 0x43);
  88. c!(OP_F64CONST, 0x44);
  89. c!(OP_I32EQZ, 0x45);
  90. c!(OP_I32EQ, 0x46);
  91. c!(OP_I32NE, 0x47);
  92. c!(OP_I32LTS, 0x48);
  93. c!(OP_I32LTU, 0x49);
  94. c!(OP_I32GTS, 0x4a);
  95. c!(OP_I32GTU, 0x4b);
  96. c!(OP_I32LES, 0x4c);
  97. c!(OP_I32LEU, 0x4d);
  98. c!(OP_I32GES, 0x4e);
  99. c!(OP_I32GEU, 0x4f);
  100. c!(OP_I64EQZ, 0x50);
  101. c!(OP_I64EQ, 0x51);
  102. c!(OP_I64NE, 0x52);
  103. c!(OP_I64LTS, 0x53);
  104. c!(OP_I64LTU, 0x54);
  105. c!(OP_I64GTS, 0x55);
  106. c!(OP_I64GTU, 0x56);
  107. c!(OP_I64LES, 0x57);
  108. c!(OP_I64LEU, 0x58);
  109. c!(OP_I64GES, 0x59);
  110. c!(OP_I64GEU, 0x5a);
  111. c!(OP_F32EQ, 0x5b);
  112. c!(OP_F32NE, 0x5c);
  113. c!(OP_F32LT, 0x5d);
  114. c!(OP_F32GT, 0x5e);
  115. c!(OP_F32LE, 0x5f);
  116. c!(OP_F32GE, 0x60);
  117. c!(OP_F64EQ, 0x61);
  118. c!(OP_F64NE, 0x62);
  119. c!(OP_F64LT, 0x63);
  120. c!(OP_F64GT, 0x64);
  121. c!(OP_F64LE, 0x65);
  122. c!(OP_F64GE, 0x66);
  123. c!(OP_I32CLZ, 0x67);
  124. c!(OP_I32CTZ, 0x68);
  125. c!(OP_I32POPCNT, 0x69);
  126. c!(OP_I32ADD, 0x6a);
  127. c!(OP_I32SUB, 0x6b);
  128. c!(OP_I32MUL, 0x6c);
  129. c!(OP_I32DIVS, 0x6d);
  130. c!(OP_I32DIVU, 0x6e);
  131. c!(OP_I32REMS, 0x6f);
  132. c!(OP_I32REMU, 0x70);
  133. c!(OP_I32AND, 0x71);
  134. c!(OP_I32OR, 0x72);
  135. c!(OP_I32XOR, 0x73);
  136. c!(OP_I32SHL, 0x74);
  137. c!(OP_I32SHRS, 0x75);
  138. c!(OP_I32SHRU, 0x76);
  139. c!(OP_I32ROTL, 0x77);
  140. c!(OP_I32ROTR, 0x78);
  141. c!(OP_I64CLZ, 0x79);
  142. c!(OP_I64CTZ, 0x7a);
  143. c!(OP_I64POPCNT, 0x7b);
  144. c!(OP_I64ADD, 0x7c);
  145. c!(OP_I64SUB, 0x7d);
  146. c!(OP_I64MUL, 0x7e);
  147. c!(OP_I64DIVS, 0x7f);
  148. c!(OP_I64DIVU, 0x80);
  149. c!(OP_I64REMS, 0x81);
  150. c!(OP_I64REMU, 0x82);
  151. c!(OP_I64AND, 0x83);
  152. c!(OP_I64OR, 0x84);
  153. c!(OP_I64XOR, 0x85);
  154. c!(OP_I64SHL, 0x86);
  155. c!(OP_I64SHRS, 0x87);
  156. c!(OP_I64SHRU, 0x88);
  157. c!(OP_I64ROTL, 0x89);
  158. c!(OP_I64ROTR, 0x8a);
  159. c!(OP_F32ABS, 0x8b);
  160. c!(OP_F32NEG, 0x8c);
  161. c!(OP_F32CEIL, 0x8d);
  162. c!(OP_F32FLOOR, 0x8e);
  163. c!(OP_F32TRUNC, 0x8f);
  164. c!(OP_F32NEAREST, 0x90);
  165. c!(OP_F32SQRT, 0x91);
  166. c!(OP_F32ADD, 0x92);
  167. c!(OP_F32SUB, 0x93);
  168. c!(OP_F32MUL, 0x94);
  169. c!(OP_F32DIV, 0x95);
  170. c!(OP_F32MIN, 0x96);
  171. c!(OP_F32MAX, 0x97);
  172. c!(OP_F32COPYSIGN, 0x98);
  173. c!(OP_F64ABS, 0x99);
  174. c!(OP_F64NEG, 0x9a);
  175. c!(OP_F64CEIL, 0x9b);
  176. c!(OP_F64FLOOR, 0x9c);
  177. c!(OP_F64TRUNC, 0x9d);
  178. c!(OP_F64NEAREST, 0x9e);
  179. c!(OP_F64SQRT, 0x9f);
  180. c!(OP_F64ADD, 0xa0);
  181. c!(OP_F64SUB, 0xa1);
  182. c!(OP_F64MUL, 0xa2);
  183. c!(OP_F64DIV, 0xa3);
  184. c!(OP_F64MIN, 0xa4);
  185. c!(OP_F64MAX, 0xa5);
  186. c!(OP_F64COPYSIGN, 0xa6);
  187. c!(OP_I32WRAPI64, 0xa7);
  188. c!(OP_I32TRUNCSF32, 0xa8);
  189. c!(OP_I32TRUNCUF32, 0xa9);
  190. c!(OP_I32TRUNCSF64, 0xaa);
  191. c!(OP_I32TRUNCUF64, 0xab);
  192. c!(OP_I64EXTENDSI32, 0xac);
  193. c!(OP_I64EXTENDUI32, 0xad);
  194. c!(OP_I64TRUNCSF32, 0xae);
  195. c!(OP_I64TRUNCUF32, 0xaf);
  196. c!(OP_I64TRUNCSF64, 0xb0);
  197. c!(OP_I64TRUNCUF64, 0xb1);
  198. c!(OP_F32CONVERTSI32, 0xb2);
  199. c!(OP_F32CONVERTUI32, 0xb3);
  200. c!(OP_F32CONVERTSI64, 0xb4);
  201. c!(OP_F32CONVERTUI64, 0xb5);
  202. c!(OP_F32DEMOTEF64, 0xb6);
  203. c!(OP_F64CONVERTSI32, 0xb7);
  204. c!(OP_F64CONVERTUI32, 0xb8);
  205. c!(OP_F64CONVERTSI64, 0xb9);
  206. c!(OP_F64CONVERTUI64, 0xba);
  207. c!(OP_F64PROMOTEF32, 0xbb);
  208. c!(OP_I32REINTERPRETF32, 0xbc);
  209. c!(OP_I64REINTERPRETF64, 0xbd);
  210. c!(OP_F32REINTERPRETI32, 0xbe);
  211. c!(OP_F64REINTERPRETI64, 0xbf);
  212. c!(MEM_NO_ALIGN, 0);
  213. c!(MEM_ALIGN16, 1);
  214. c!(MEM_ALIGN32, 2);