Opcodes.h 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672
  1. #pragma once
  2. #include "../CommonDef.h"
  3. namespace hybridclr
  4. {
  5. namespace metadata
  6. {
  7. enum class OpcodeValue : uint8_t
  8. {
  9. //!!!{{OPCODE_VALUE
  10. NOP = 0,
  11. BREAK = 1,
  12. LDARG_0 = 2,
  13. LDARG_1 = 3,
  14. LDARG_2 = 4,
  15. LDARG_3 = 5,
  16. LDLOC_0 = 6,
  17. LDLOC_1 = 7,
  18. LDLOC_2 = 8,
  19. LDLOC_3 = 9,
  20. STLOC_0 = 10,
  21. STLOC_1 = 11,
  22. STLOC_2 = 12,
  23. STLOC_3 = 13,
  24. LDARG_S = 14,
  25. LDARGA_S = 15,
  26. STARG_S = 16,
  27. LDLOC_S = 17,
  28. LDLOCA_S = 18,
  29. STLOC_S = 19,
  30. LDNULL = 20,
  31. LDC_I4_M1 = 21,
  32. LDC_I4_0 = 22,
  33. LDC_I4_1 = 23,
  34. LDC_I4_2 = 24,
  35. LDC_I4_3 = 25,
  36. LDC_I4_4 = 26,
  37. LDC_I4_5 = 27,
  38. LDC_I4_6 = 28,
  39. LDC_I4_7 = 29,
  40. LDC_I4_8 = 30,
  41. LDC_I4_S = 31,
  42. LDC_I4 = 32,
  43. LDC_I8 = 33,
  44. LDC_R4 = 34,
  45. LDC_R8 = 35,
  46. UNUSED99 = 36,
  47. DUP = 37,
  48. POP = 38,
  49. JMP = 39,
  50. CALL = 40,
  51. CALLI = 41,
  52. RET = 42,
  53. BR_S = 43,
  54. BRFALSE_S = 44,
  55. BRTRUE_S = 45,
  56. BEQ_S = 46,
  57. BGE_S = 47,
  58. BGT_S = 48,
  59. BLE_S = 49,
  60. BLT_S = 50,
  61. BNE_UN_S = 51,
  62. BGE_UN_S = 52,
  63. BGT_UN_S = 53,
  64. BLE_UN_S = 54,
  65. BLT_UN_S = 55,
  66. BR = 56,
  67. BRFALSE = 57,
  68. BRTRUE = 58,
  69. BEQ = 59,
  70. BGE = 60,
  71. BGT = 61,
  72. BLE = 62,
  73. BLT = 63,
  74. BNE_UN = 64,
  75. BGE_UN = 65,
  76. BGT_UN = 66,
  77. BLE_UN = 67,
  78. BLT_UN = 68,
  79. SWITCH = 69,
  80. LDIND_I1 = 70,
  81. LDIND_U1 = 71,
  82. LDIND_I2 = 72,
  83. LDIND_U2 = 73,
  84. LDIND_I4 = 74,
  85. LDIND_U4 = 75,
  86. LDIND_I8 = 76,
  87. LDIND_I = 77,
  88. LDIND_R4 = 78,
  89. LDIND_R8 = 79,
  90. LDIND_REF = 80,
  91. STIND_REF = 81,
  92. STIND_I1 = 82,
  93. STIND_I2 = 83,
  94. STIND_I4 = 84,
  95. STIND_I8 = 85,
  96. STIND_R4 = 86,
  97. STIND_R8 = 87,
  98. ADD = 88,
  99. SUB = 89,
  100. MUL = 90,
  101. DIV = 91,
  102. DIV_UN = 92,
  103. REM = 93,
  104. REM_UN = 94,
  105. AND = 95,
  106. OR = 96,
  107. XOR = 97,
  108. SHL = 98,
  109. SHR = 99,
  110. SHR_UN = 100,
  111. NEG = 101,
  112. NOT = 102,
  113. CONV_I1 = 103,
  114. CONV_I2 = 104,
  115. CONV_I4 = 105,
  116. CONV_I8 = 106,
  117. CONV_R4 = 107,
  118. CONV_R8 = 108,
  119. CONV_U4 = 109,
  120. CONV_U8 = 110,
  121. CALLVIRT = 111,
  122. CPOBJ = 112,
  123. LDOBJ = 113,
  124. LDSTR = 114,
  125. NEWOBJ = 115,
  126. CASTCLASS = 116,
  127. ISINST = 117,
  128. CONV_R_UN = 118,
  129. UNUSED58 = 119,
  130. UNUSED1 = 120,
  131. UNBOX = 121,
  132. THROW = 122,
  133. LDFLD = 123,
  134. LDFLDA = 124,
  135. STFLD = 125,
  136. LDSFLD = 126,
  137. LDSFLDA = 127,
  138. STSFLD = 128,
  139. STOBJ = 129,
  140. CONV_OVF_I1_UN = 130,
  141. CONV_OVF_I2_UN = 131,
  142. CONV_OVF_I4_UN = 132,
  143. CONV_OVF_I8_UN = 133,
  144. CONV_OVF_U1_UN = 134,
  145. CONV_OVF_U2_UN = 135,
  146. CONV_OVF_U4_UN = 136,
  147. CONV_OVF_U8_UN = 137,
  148. CONV_OVF_I_UN = 138,
  149. CONV_OVF_U_UN = 139,
  150. BOX = 140,
  151. NEWARR = 141,
  152. LDLEN = 142,
  153. LDELEMA = 143,
  154. LDELEM_I1 = 144,
  155. LDELEM_U1 = 145,
  156. LDELEM_I2 = 146,
  157. LDELEM_U2 = 147,
  158. LDELEM_I4 = 148,
  159. LDELEM_U4 = 149,
  160. LDELEM_I8 = 150,
  161. LDELEM_I = 151,
  162. LDELEM_R4 = 152,
  163. LDELEM_R8 = 153,
  164. LDELEM_REF = 154,
  165. STELEM_I = 155,
  166. STELEM_I1 = 156,
  167. STELEM_I2 = 157,
  168. STELEM_I4 = 158,
  169. STELEM_I8 = 159,
  170. STELEM_R4 = 160,
  171. STELEM_R8 = 161,
  172. STELEM_REF = 162,
  173. LDELEM = 163,
  174. STELEM = 164,
  175. UNBOX_ANY = 165,
  176. UNUSED5 = 166,
  177. UNUSED6 = 167,
  178. UNUSED7 = 168,
  179. UNUSED8 = 169,
  180. UNUSED9 = 170,
  181. UNUSED10 = 171,
  182. UNUSED11 = 172,
  183. UNUSED12 = 173,
  184. UNUSED13 = 174,
  185. UNUSED14 = 175,
  186. UNUSED15 = 176,
  187. UNUSED16 = 177,
  188. UNUSED17 = 178,
  189. CONV_OVF_I1 = 179,
  190. CONV_OVF_U1 = 180,
  191. CONV_OVF_I2 = 181,
  192. CONV_OVF_U2 = 182,
  193. CONV_OVF_I4 = 183,
  194. CONV_OVF_U4 = 184,
  195. CONV_OVF_I8 = 185,
  196. CONV_OVF_U8 = 186,
  197. UNUSED50 = 187,
  198. UNUSED18 = 188,
  199. UNUSED19 = 189,
  200. UNUSED20 = 190,
  201. UNUSED21 = 191,
  202. UNUSED22 = 192,
  203. UNUSED23 = 193,
  204. REFANYVAL = 194,
  205. CKFINITE = 195,
  206. UNUSED24 = 196,
  207. UNUSED25 = 197,
  208. MKREFANY = 198,
  209. UNUSED59 = 199,
  210. UNUSED60 = 200,
  211. UNUSED61 = 201,
  212. UNUSED62 = 202,
  213. UNUSED63 = 203,
  214. UNUSED64 = 204,
  215. UNUSED65 = 205,
  216. UNUSED66 = 206,
  217. UNUSED67 = 207,
  218. LDTOKEN = 208,
  219. CONV_U2 = 209,
  220. CONV_U1 = 210,
  221. CONV_I = 211,
  222. CONV_OVF_I = 212,
  223. CONV_OVF_U = 213,
  224. ADD_OVF = 214,
  225. ADD_OVF_UN = 215,
  226. MUL_OVF = 216,
  227. MUL_OVF_UN = 217,
  228. SUB_OVF = 218,
  229. SUB_OVF_UN = 219,
  230. ENDFINALLY = 220,
  231. LEAVE = 221,
  232. LEAVE_S = 222,
  233. STIND_I = 223,
  234. CONV_U = 224,
  235. UNUSED26 = 225,
  236. UNUSED27 = 226,
  237. UNUSED28 = 227,
  238. UNUSED29 = 228,
  239. UNUSED30 = 229,
  240. UNUSED31 = 230,
  241. UNUSED32 = 231,
  242. UNUSED33 = 232,
  243. UNUSED34 = 233,
  244. UNUSED35 = 234,
  245. UNUSED36 = 235,
  246. UNUSED37 = 236,
  247. UNUSED38 = 237,
  248. UNUSED39 = 238,
  249. UNUSED40 = 239,
  250. UNUSED41 = 240,
  251. UNUSED42 = 241,
  252. UNUSED43 = 242,
  253. UNUSED44 = 243,
  254. UNUSED45 = 244,
  255. UNUSED46 = 245,
  256. UNUSED47 = 246,
  257. UNUSED48 = 247,
  258. PREFIX7 = 248,
  259. PREFIX6 = 249,
  260. PREFIX5 = 250,
  261. PREFIX4 = 251,
  262. PREFIX3 = 252,
  263. PREFIX2 = 253,
  264. PREFIX1 = 254,
  265. PREFIXREF = 255,
  266. ARGLIST = 0,
  267. CEQ = 1,
  268. CGT = 2,
  269. CGT_UN = 3,
  270. CLT = 4,
  271. CLT_UN = 5,
  272. LDFTN = 6,
  273. LDVIRTFTN = 7,
  274. UNUSED56 = 8,
  275. LDARG = 9,
  276. LDARGA = 10,
  277. STARG = 11,
  278. LDLOC = 12,
  279. LDLOCA = 13,
  280. STLOC = 14,
  281. LOCALLOC = 15,
  282. UNUSED57 = 16,
  283. ENDFILTER = 17,
  284. UNALIGNED_ = 18,
  285. VOLATILE_ = 19,
  286. TAIL_ = 20,
  287. INITOBJ = 21,
  288. CONSTRAINED_ = 22,
  289. CPBLK = 23,
  290. INITBLK = 24,
  291. NO_ = 25,
  292. RETHROW = 26,
  293. UNUSED = 27,
  294. SIZEOF = 28,
  295. REFANYTYPE = 29,
  296. READONLY_ = 30,
  297. UNUSED53 = 31,
  298. UNUSED54 = 32,
  299. UNUSED55 = 33,
  300. UNUSED70 = 34,
  301. ILLEGAL = 0,
  302. ENDMAC = 0,
  303. //!!!}}OPCODE_VALUE
  304. };
  305. enum class OpcodeEnum
  306. {
  307. //!!!{{OPCODE_ENUM
  308. NOP,
  309. BREAK,
  310. LDARG_0,
  311. LDARG_1,
  312. LDARG_2,
  313. LDARG_3,
  314. LDLOC_0,
  315. LDLOC_1,
  316. LDLOC_2,
  317. LDLOC_3,
  318. STLOC_0,
  319. STLOC_1,
  320. STLOC_2,
  321. STLOC_3,
  322. LDARG_S,
  323. LDARGA_S,
  324. STARG_S,
  325. LDLOC_S,
  326. LDLOCA_S,
  327. STLOC_S,
  328. LDNULL,
  329. LDC_I4_M1,
  330. LDC_I4_0,
  331. LDC_I4_1,
  332. LDC_I4_2,
  333. LDC_I4_3,
  334. LDC_I4_4,
  335. LDC_I4_5,
  336. LDC_I4_6,
  337. LDC_I4_7,
  338. LDC_I4_8,
  339. LDC_I4_S,
  340. LDC_I4,
  341. LDC_I8,
  342. LDC_R4,
  343. LDC_R8,
  344. UNUSED99,
  345. DUP,
  346. POP,
  347. JMP,
  348. CALL,
  349. CALLI,
  350. RET,
  351. BR_S,
  352. BRFALSE_S,
  353. BRTRUE_S,
  354. BEQ_S,
  355. BGE_S,
  356. BGT_S,
  357. BLE_S,
  358. BLT_S,
  359. BNE_UN_S,
  360. BGE_UN_S,
  361. BGT_UN_S,
  362. BLE_UN_S,
  363. BLT_UN_S,
  364. BR,
  365. BRFALSE,
  366. BRTRUE,
  367. BEQ,
  368. BGE,
  369. BGT,
  370. BLE,
  371. BLT,
  372. BNE_UN,
  373. BGE_UN,
  374. BGT_UN,
  375. BLE_UN,
  376. BLT_UN,
  377. SWITCH,
  378. LDIND_I1,
  379. LDIND_U1,
  380. LDIND_I2,
  381. LDIND_U2,
  382. LDIND_I4,
  383. LDIND_U4,
  384. LDIND_I8,
  385. LDIND_I,
  386. LDIND_R4,
  387. LDIND_R8,
  388. LDIND_REF,
  389. STIND_REF,
  390. STIND_I1,
  391. STIND_I2,
  392. STIND_I4,
  393. STIND_I8,
  394. STIND_R4,
  395. STIND_R8,
  396. ADD,
  397. SUB,
  398. MUL,
  399. DIV,
  400. DIV_UN,
  401. REM,
  402. REM_UN,
  403. AND,
  404. OR,
  405. XOR,
  406. SHL,
  407. SHR,
  408. SHR_UN,
  409. NEG,
  410. NOT,
  411. CONV_I1,
  412. CONV_I2,
  413. CONV_I4,
  414. CONV_I8,
  415. CONV_R4,
  416. CONV_R8,
  417. CONV_U4,
  418. CONV_U8,
  419. CALLVIRT,
  420. CPOBJ,
  421. LDOBJ,
  422. LDSTR,
  423. NEWOBJ,
  424. CASTCLASS,
  425. ISINST,
  426. CONV_R_UN,
  427. UNUSED58,
  428. UNUSED1,
  429. UNBOX,
  430. THROW,
  431. LDFLD,
  432. LDFLDA,
  433. STFLD,
  434. LDSFLD,
  435. LDSFLDA,
  436. STSFLD,
  437. STOBJ,
  438. CONV_OVF_I1_UN,
  439. CONV_OVF_I2_UN,
  440. CONV_OVF_I4_UN,
  441. CONV_OVF_I8_UN,
  442. CONV_OVF_U1_UN,
  443. CONV_OVF_U2_UN,
  444. CONV_OVF_U4_UN,
  445. CONV_OVF_U8_UN,
  446. CONV_OVF_I_UN,
  447. CONV_OVF_U_UN,
  448. BOX,
  449. NEWARR,
  450. LDLEN,
  451. LDELEMA,
  452. LDELEM_I1,
  453. LDELEM_U1,
  454. LDELEM_I2,
  455. LDELEM_U2,
  456. LDELEM_I4,
  457. LDELEM_U4,
  458. LDELEM_I8,
  459. LDELEM_I,
  460. LDELEM_R4,
  461. LDELEM_R8,
  462. LDELEM_REF,
  463. STELEM_I,
  464. STELEM_I1,
  465. STELEM_I2,
  466. STELEM_I4,
  467. STELEM_I8,
  468. STELEM_R4,
  469. STELEM_R8,
  470. STELEM_REF,
  471. LDELEM,
  472. STELEM,
  473. UNBOX_ANY,
  474. UNUSED5,
  475. UNUSED6,
  476. UNUSED7,
  477. UNUSED8,
  478. UNUSED9,
  479. UNUSED10,
  480. UNUSED11,
  481. UNUSED12,
  482. UNUSED13,
  483. UNUSED14,
  484. UNUSED15,
  485. UNUSED16,
  486. UNUSED17,
  487. CONV_OVF_I1,
  488. CONV_OVF_U1,
  489. CONV_OVF_I2,
  490. CONV_OVF_U2,
  491. CONV_OVF_I4,
  492. CONV_OVF_U4,
  493. CONV_OVF_I8,
  494. CONV_OVF_U8,
  495. UNUSED50,
  496. UNUSED18,
  497. UNUSED19,
  498. UNUSED20,
  499. UNUSED21,
  500. UNUSED22,
  501. UNUSED23,
  502. REFANYVAL,
  503. CKFINITE,
  504. UNUSED24,
  505. UNUSED25,
  506. MKREFANY,
  507. UNUSED59,
  508. UNUSED60,
  509. UNUSED61,
  510. UNUSED62,
  511. UNUSED63,
  512. UNUSED64,
  513. UNUSED65,
  514. UNUSED66,
  515. UNUSED67,
  516. LDTOKEN,
  517. CONV_U2,
  518. CONV_U1,
  519. CONV_I,
  520. CONV_OVF_I,
  521. CONV_OVF_U,
  522. ADD_OVF,
  523. ADD_OVF_UN,
  524. MUL_OVF,
  525. MUL_OVF_UN,
  526. SUB_OVF,
  527. SUB_OVF_UN,
  528. ENDFINALLY,
  529. LEAVE,
  530. LEAVE_S,
  531. STIND_I,
  532. CONV_U,
  533. UNUSED26,
  534. UNUSED27,
  535. UNUSED28,
  536. UNUSED29,
  537. UNUSED30,
  538. UNUSED31,
  539. UNUSED32,
  540. UNUSED33,
  541. UNUSED34,
  542. UNUSED35,
  543. UNUSED36,
  544. UNUSED37,
  545. UNUSED38,
  546. UNUSED39,
  547. UNUSED40,
  548. UNUSED41,
  549. UNUSED42,
  550. UNUSED43,
  551. UNUSED44,
  552. UNUSED45,
  553. UNUSED46,
  554. UNUSED47,
  555. UNUSED48,
  556. PREFIX7,
  557. PREFIX6,
  558. PREFIX5,
  559. PREFIX4,
  560. PREFIX3,
  561. PREFIX2,
  562. PREFIX1,
  563. PREFIXREF,
  564. ARGLIST,
  565. CEQ,
  566. CGT,
  567. CGT_UN,
  568. CLT,
  569. CLT_UN,
  570. LDFTN,
  571. LDVIRTFTN,
  572. UNUSED56,
  573. LDARG,
  574. LDARGA,
  575. STARG,
  576. LDLOC,
  577. LDLOCA,
  578. STLOC,
  579. LOCALLOC,
  580. UNUSED57,
  581. ENDFILTER,
  582. UNALIGNED_,
  583. VOLATILE_,
  584. TAIL_,
  585. INITOBJ,
  586. CONSTRAINED_,
  587. CPBLK,
  588. INITBLK,
  589. NO_,
  590. RETHROW,
  591. UNUSED,
  592. SIZEOF,
  593. REFANYTYPE,
  594. READONLY_,
  595. UNUSED53,
  596. UNUSED54,
  597. UNUSED55,
  598. UNUSED70,
  599. ILLEGAL,
  600. ENDMAC,
  601. //!!!}}OPCODE_ENUM
  602. __Count,
  603. };
  604. enum class FlowType
  605. {
  606. Next,
  607. Branch,
  608. CondBranch,
  609. Call,
  610. Return,
  611. Meta,
  612. Throw,
  613. Break,
  614. };
  615. enum class ArgType
  616. {
  617. None,
  618. Data,
  619. StaticBranch,
  620. BranchTarget,
  621. Switch,
  622. };
  623. enum class InputType
  624. {
  625. None,
  626. };
  627. enum class OutputType
  628. {
  629. None,
  630. };
  631. enum class OpCodeKind
  632. {
  633. Primitive,
  634. ObjModel,
  635. Macro,
  636. Prefix,
  637. Nternal,
  638. };
  639. struct OpCodeInfo
  640. {
  641. OpcodeEnum id;
  642. const char name[16];
  643. InputType intput[3];
  644. OutputType output;
  645. ArgType inlineType;
  646. int32_t inlineParam;
  647. uint8_t flag;
  648. OpcodeValue baseOpValue;
  649. FlowType flow;
  650. int32_t constValue;
  651. };
  652. extern OpCodeInfo g_opcodeInfos[(int)OpcodeEnum::__Count];
  653. const OpCodeInfo* DecodeOpCodeInfo(const byte*& ip, const byte* end);
  654. uint32_t GetOpCodeSize(const byte*& ip, const OpCodeInfo* opCodeInfo);
  655. }
  656. }