Optimizer.Utils.cs 50 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using ILRuntime.Mono.Cecil;
  6. using ILRuntime.Mono.Cecil.Cil;
  7. using ILRuntime.CLR.TypeSystem;
  8. using ILRuntime.CLR.Method;
  9. using ILRuntime.Runtime.Intepreter.OpCodes;
  10. namespace ILRuntime.Runtime.Intepreter.RegisterVM
  11. {
  12. partial class Optimizer
  13. {
  14. public static bool SupportIntemediateValue(OpCodeREnum op)
  15. {
  16. switch (op)
  17. {
  18. case OpCodeREnum.Add:
  19. case OpCodeREnum.Sub:
  20. case OpCodeREnum.Mul:
  21. case OpCodeREnum.Div:
  22. case OpCodeREnum.Rem:
  23. case OpCodeREnum.Rem_Un:
  24. case OpCodeREnum.And:
  25. case OpCodeREnum.Or:
  26. case OpCodeREnum.Xor:
  27. case OpCodeREnum.Shl:
  28. case OpCodeREnum.Shr:
  29. case OpCodeREnum.Shr_Un:
  30. case OpCodeREnum.Beq:
  31. case OpCodeREnum.Beq_S:
  32. case OpCodeREnum.Bge:
  33. case OpCodeREnum.Bge_S:
  34. case OpCodeREnum.Bge_Un:
  35. case OpCodeREnum.Bge_Un_S:
  36. case OpCodeREnum.Bgt:
  37. case OpCodeREnum.Bgt_S:
  38. case OpCodeREnum.Bgt_Un:
  39. case OpCodeREnum.Bgt_Un_S:
  40. case OpCodeREnum.Bne_Un:
  41. case OpCodeREnum.Bne_Un_S:
  42. case OpCodeREnum.Ble:
  43. case OpCodeREnum.Ble_S:
  44. case OpCodeREnum.Ble_Un:
  45. case OpCodeREnum.Ble_Un_S:
  46. case OpCodeREnum.Blt:
  47. case OpCodeREnum.Blt_S:
  48. case OpCodeREnum.Blt_Un:
  49. case OpCodeREnum.Blt_Un_S:
  50. case OpCodeREnum.Ceq:
  51. case OpCodeREnum.Cgt:
  52. case OpCodeREnum.Cgt_Un:
  53. case OpCodeREnum.Clt:
  54. case OpCodeREnum.Clt_Un:
  55. return true;
  56. default:
  57. return false;
  58. }
  59. }
  60. public static void ReplaceRegisterWithConstant(ref OpCodeR op, ref OpCodeR constant)
  61. {
  62. switch (op.Code)
  63. {
  64. case OpCodeREnum.Addi:
  65. case OpCodeREnum.Subi:
  66. case OpCodeREnum.Muli:
  67. case OpCodeREnum.Divi:
  68. case OpCodeREnum.Remi:
  69. case OpCodeREnum.Remi_Un:
  70. case OpCodeREnum.Andi:
  71. case OpCodeREnum.Ori:
  72. case OpCodeREnum.Xori:
  73. case OpCodeREnum.Shli:
  74. case OpCodeREnum.Shri:
  75. case OpCodeREnum.Shri_Un:
  76. case OpCodeREnum.Ceqi:
  77. case OpCodeREnum.Cgti:
  78. case OpCodeREnum.Cgti_Un:
  79. case OpCodeREnum.Clti:
  80. case OpCodeREnum.Clti_Un:
  81. op.Register3 = 0;
  82. break;
  83. case OpCodeREnum.Beqi:
  84. case OpCodeREnum.Beq_S:
  85. case OpCodeREnum.Bgei:
  86. case OpCodeREnum.Bgei_Un:
  87. case OpCodeREnum.Bgti:
  88. case OpCodeREnum.Bgti_Un:
  89. case OpCodeREnum.Bnei_Un:
  90. case OpCodeREnum.Blei:
  91. case OpCodeREnum.Blei_Un:
  92. case OpCodeREnum.Blti:
  93. case OpCodeREnum.Blti_Un:
  94. op.Register2 = 0;
  95. op.Operand4 = op.Operand;
  96. break;
  97. }
  98. switch (constant.Code)
  99. {
  100. case OpCodeREnum.Ldc_I4:
  101. case OpCodeREnum.Ldc_I4_S:
  102. op.Operand = constant.Operand;
  103. break;
  104. case OpCodeREnum.Ldc_I4_0:
  105. op.Operand = 0;
  106. break;
  107. case OpCodeREnum.Ldc_I4_1:
  108. op.Operand = 1;
  109. break;
  110. case OpCodeREnum.Ldc_I4_2:
  111. op.Operand = 2;
  112. break;
  113. case OpCodeREnum.Ldc_I4_3:
  114. op.Operand = 3;
  115. break;
  116. case OpCodeREnum.Ldc_I4_4:
  117. op.Operand = 4;
  118. break;
  119. case OpCodeREnum.Ldc_I4_5:
  120. op.Operand = 5;
  121. break;
  122. case OpCodeREnum.Ldc_I4_6:
  123. op.Operand = 6;
  124. break;
  125. case OpCodeREnum.Ldc_I4_7:
  126. op.Operand = 7;
  127. break;
  128. case OpCodeREnum.Ldc_I4_8:
  129. op.Operand = 8;
  130. break;
  131. case OpCodeREnum.Ldc_I4_M1:
  132. op.Operand = -1;
  133. break;
  134. case OpCodeREnum.Ldc_I8:
  135. op.OperandLong = constant.OperandLong;
  136. break;
  137. case OpCodeREnum.Ldc_R4:
  138. op.OperandFloat = constant.OperandFloat;
  139. break;
  140. case OpCodeREnum.Ldc_R8:
  141. op.OperandDouble = constant.OperandDouble;
  142. break;
  143. }
  144. }
  145. public static OpCodeREnum GetIntemediateValueOpcode(OpCodeREnum op)
  146. {
  147. switch (op)
  148. {
  149. case OpCodeREnum.Add:
  150. return OpCodeREnum.Addi;
  151. case OpCodeREnum.Sub:
  152. return OpCodeREnum.Subi;
  153. case OpCodeREnum.Mul:
  154. return OpCodeREnum.Muli;
  155. case OpCodeREnum.Div:
  156. return OpCodeREnum.Divi;
  157. case OpCodeREnum.Rem:
  158. return OpCodeREnum.Remi;
  159. case OpCodeREnum.Rem_Un:
  160. return OpCodeREnum.Remi_Un;
  161. case OpCodeREnum.And:
  162. return OpCodeREnum.Andi;
  163. case OpCodeREnum.Or:
  164. return OpCodeREnum.Ori;
  165. case OpCodeREnum.Xor:
  166. return OpCodeREnum.Xori;
  167. case OpCodeREnum.Shl:
  168. return OpCodeREnum.Shli;
  169. case OpCodeREnum.Shr:
  170. return OpCodeREnum.Shri;
  171. case OpCodeREnum.Shr_Un:
  172. return OpCodeREnum.Shri_Un;
  173. case OpCodeREnum.Beq:
  174. case OpCodeREnum.Beq_S:
  175. return OpCodeREnum.Beqi;
  176. case OpCodeREnum.Bge:
  177. case OpCodeREnum.Bge_S:
  178. return OpCodeREnum.Bgei;
  179. case OpCodeREnum.Bge_Un:
  180. case OpCodeREnum.Bge_Un_S:
  181. return OpCodeREnum.Bgei_Un;
  182. case OpCodeREnum.Bgt:
  183. case OpCodeREnum.Bgt_S:
  184. return OpCodeREnum.Bgti;
  185. case OpCodeREnum.Bgt_Un:
  186. case OpCodeREnum.Bgt_Un_S:
  187. return OpCodeREnum.Bgti_Un;
  188. case OpCodeREnum.Bne_Un:
  189. case OpCodeREnum.Bne_Un_S:
  190. return OpCodeREnum.Bnei_Un;
  191. case OpCodeREnum.Ble:
  192. case OpCodeREnum.Ble_S:
  193. return OpCodeREnum.Blei;
  194. case OpCodeREnum.Ble_Un:
  195. case OpCodeREnum.Ble_Un_S:
  196. return OpCodeREnum.Blei_Un;
  197. case OpCodeREnum.Blt:
  198. case OpCodeREnum.Blt_S:
  199. return OpCodeREnum.Blti;
  200. case OpCodeREnum.Blt_Un:
  201. case OpCodeREnum.Blt_Un_S:
  202. return OpCodeREnum.Blti_Un;
  203. case OpCodeREnum.Ceq:
  204. return OpCodeREnum.Ceqi;
  205. case OpCodeREnum.Cgt:
  206. return OpCodeREnum.Cgti;
  207. case OpCodeREnum.Cgt_Un:
  208. return OpCodeREnum.Cgti_Un;
  209. case OpCodeREnum.Clt:
  210. return OpCodeREnum.Clti;
  211. case OpCodeREnum.Clt_Un:
  212. return OpCodeREnum.Clti_Un;
  213. default:
  214. throw new NotSupportedException();
  215. }
  216. }
  217. public static bool SupportOperandSwap(OpCodeREnum op)
  218. {
  219. switch (op)
  220. {
  221. case OpCodeREnum.Add:
  222. case OpCodeREnum.Mul:
  223. case OpCodeREnum.And:
  224. case OpCodeREnum.Or:
  225. case OpCodeREnum.Xor:
  226. case OpCodeREnum.Beq:
  227. case OpCodeREnum.Beq_S:
  228. case OpCodeREnum.Bne_Un:
  229. case OpCodeREnum.Bne_Un_S:
  230. case OpCodeREnum.Ceq:
  231. return true;
  232. default:
  233. return false;
  234. }
  235. }
  236. public static bool HasInverseOpcode(OpCodeREnum op)
  237. {
  238. switch (op)
  239. {
  240. case OpCodeREnum.Bge:
  241. case OpCodeREnum.Bge_S:
  242. case OpCodeREnum.Bge_Un:
  243. case OpCodeREnum.Bge_Un_S:
  244. case OpCodeREnum.Bgt:
  245. case OpCodeREnum.Bgt_S:
  246. case OpCodeREnum.Bgt_Un:
  247. case OpCodeREnum.Bgt_Un_S:
  248. case OpCodeREnum.Ble:
  249. case OpCodeREnum.Ble_S:
  250. case OpCodeREnum.Ble_Un:
  251. case OpCodeREnum.Ble_Un_S:
  252. case OpCodeREnum.Blt:
  253. case OpCodeREnum.Blt_S:
  254. case OpCodeREnum.Blt_Un:
  255. case OpCodeREnum.Blt_Un_S:
  256. case OpCodeREnum.Cgt:
  257. case OpCodeREnum.Cgt_Un:
  258. case OpCodeREnum.Clt:
  259. case OpCodeREnum.Clt_Un:
  260. return true;
  261. default:
  262. return false;
  263. }
  264. }
  265. public static OpCodeREnum GetInverseOpcode(OpCodeREnum op)
  266. {
  267. switch (op)
  268. {
  269. case OpCodeREnum.Bge:
  270. case OpCodeREnum.Bge_S:
  271. return OpCodeREnum.Ble;
  272. case OpCodeREnum.Bge_Un:
  273. case OpCodeREnum.Bge_Un_S:
  274. return OpCodeREnum.Ble_Un;
  275. case OpCodeREnum.Bgt:
  276. case OpCodeREnum.Bgt_S:
  277. return OpCodeREnum.Blt;
  278. case OpCodeREnum.Bgt_Un:
  279. case OpCodeREnum.Bgt_Un_S:
  280. return OpCodeREnum.Blt_Un;
  281. case OpCodeREnum.Ble:
  282. case OpCodeREnum.Ble_S:
  283. return OpCodeREnum.Bge;
  284. case OpCodeREnum.Ble_Un:
  285. case OpCodeREnum.Ble_Un_S:
  286. return OpCodeREnum.Bge_Un;
  287. case OpCodeREnum.Blt:
  288. case OpCodeREnum.Blt_S:
  289. return OpCodeREnum.Bgt;
  290. case OpCodeREnum.Blt_Un:
  291. case OpCodeREnum.Blt_Un_S:
  292. return OpCodeREnum.Bgt_Un;
  293. case OpCodeREnum.Cgt:
  294. return OpCodeREnum.Clt;
  295. case OpCodeREnum.Clt:
  296. return OpCodeREnum.Cgt;
  297. case OpCodeREnum.Clt_Un:
  298. return OpCodeREnum.Cgt_Un;
  299. default:
  300. throw new NotSupportedException();
  301. }
  302. }
  303. public static bool IsLoadConstant(OpCodeREnum op)
  304. {
  305. switch (op)
  306. {
  307. case OpCodeREnum.Ldc_I4:
  308. case OpCodeREnum.Ldc_I4_0:
  309. case OpCodeREnum.Ldc_I4_1:
  310. case OpCodeREnum.Ldc_I4_2:
  311. case OpCodeREnum.Ldc_I4_3:
  312. case OpCodeREnum.Ldc_I4_4:
  313. case OpCodeREnum.Ldc_I4_5:
  314. case OpCodeREnum.Ldc_I4_6:
  315. case OpCodeREnum.Ldc_I4_7:
  316. case OpCodeREnum.Ldc_I4_8:
  317. case OpCodeREnum.Ldc_I4_M1:
  318. case OpCodeREnum.Ldc_I4_S:
  319. case OpCodeREnum.Ldc_I8:
  320. case OpCodeREnum.Ldc_R4:
  321. case OpCodeREnum.Ldc_R8:
  322. return true;
  323. default:
  324. return false;
  325. }
  326. }
  327. public static bool IsBranching(OpCodeREnum op)
  328. {
  329. switch (op)
  330. {
  331. case OpCodeREnum.Br_S:
  332. case OpCodeREnum.Br:
  333. case OpCodeREnum.Brtrue:
  334. case OpCodeREnum.Brtrue_S:
  335. case OpCodeREnum.Brfalse:
  336. case OpCodeREnum.Brfalse_S:
  337. case OpCodeREnum.Blt:
  338. case OpCodeREnum.Blt_S:
  339. case OpCodeREnum.Blt_Un:
  340. case OpCodeREnum.Blt_Un_S:
  341. case OpCodeREnum.Ble:
  342. case OpCodeREnum.Ble_S:
  343. case OpCodeREnum.Ble_Un:
  344. case OpCodeREnum.Ble_Un_S:
  345. case OpCodeREnum.Bgt:
  346. case OpCodeREnum.Bgt_S:
  347. case OpCodeREnum.Bgt_Un:
  348. case OpCodeREnum.Bgt_Un_S:
  349. case OpCodeREnum.Bge:
  350. case OpCodeREnum.Bge_S:
  351. case OpCodeREnum.Bge_Un:
  352. case OpCodeREnum.Bge_Un_S:
  353. case OpCodeREnum.Beq:
  354. case OpCodeREnum.Beq_S:
  355. case OpCodeREnum.Bne_Un:
  356. case OpCodeREnum.Bne_Un_S:
  357. return true;
  358. }
  359. return false;
  360. }
  361. public static bool IsIntermediateBranching(OpCodeREnum op)
  362. {
  363. switch (op)
  364. {
  365. case OpCodeREnum.Beqi:
  366. case OpCodeREnum.Beq_S:
  367. case OpCodeREnum.Bgei:
  368. case OpCodeREnum.Bgei_Un:
  369. case OpCodeREnum.Bgti:
  370. case OpCodeREnum.Bgti_Un:
  371. case OpCodeREnum.Bnei_Un:
  372. case OpCodeREnum.Blei:
  373. case OpCodeREnum.Blei_Un:
  374. case OpCodeREnum.Blti:
  375. case OpCodeREnum.Blti_Un:
  376. return true;
  377. }
  378. return false;
  379. }
  380. public static bool GetOpcodeSourceRegister(ref OpCodeR op, bool hasReturn, out short r1, out short r2, out short r3)
  381. {
  382. r1 = -1;
  383. r2 = -1;
  384. r3 = -1;
  385. switch (op.Code)
  386. {
  387. case OpCodeREnum.Move:
  388. case OpCodeREnum.Conv_I:
  389. case OpCodeREnum.Conv_I1:
  390. case OpCodeREnum.Conv_I2:
  391. case OpCodeREnum.Conv_I4:
  392. case OpCodeREnum.Conv_I8:
  393. case OpCodeREnum.Conv_Ovf_I:
  394. case OpCodeREnum.Conv_Ovf_I1:
  395. case OpCodeREnum.Conv_Ovf_I1_Un:
  396. case OpCodeREnum.Conv_Ovf_I2:
  397. case OpCodeREnum.Conv_Ovf_I2_Un:
  398. case OpCodeREnum.Conv_Ovf_I4:
  399. case OpCodeREnum.Conv_Ovf_I4_Un:
  400. case OpCodeREnum.Conv_Ovf_I8:
  401. case OpCodeREnum.Conv_Ovf_I8_Un:
  402. case OpCodeREnum.Conv_Ovf_I_Un:
  403. case OpCodeREnum.Conv_Ovf_U:
  404. case OpCodeREnum.Conv_Ovf_U1:
  405. case OpCodeREnum.Conv_Ovf_U1_Un:
  406. case OpCodeREnum.Conv_Ovf_U2:
  407. case OpCodeREnum.Conv_Ovf_U2_Un:
  408. case OpCodeREnum.Conv_Ovf_U4:
  409. case OpCodeREnum.Conv_Ovf_U4_Un:
  410. case OpCodeREnum.Conv_Ovf_U8:
  411. case OpCodeREnum.Conv_Ovf_U8_Un:
  412. case OpCodeREnum.Conv_Ovf_U_Un:
  413. case OpCodeREnum.Conv_R4:
  414. case OpCodeREnum.Conv_R8:
  415. case OpCodeREnum.Conv_R_Un:
  416. case OpCodeREnum.Conv_U:
  417. case OpCodeREnum.Conv_U1:
  418. case OpCodeREnum.Conv_U2:
  419. case OpCodeREnum.Conv_U4:
  420. case OpCodeREnum.Conv_U8:
  421. case OpCodeREnum.Not:
  422. case OpCodeREnum.Neg:
  423. case OpCodeREnum.Box:
  424. case OpCodeREnum.Unbox:
  425. case OpCodeREnum.Unbox_Any:
  426. case OpCodeREnum.Ldind_I:
  427. case OpCodeREnum.Ldind_I1:
  428. case OpCodeREnum.Ldind_I2:
  429. case OpCodeREnum.Ldind_I4:
  430. case OpCodeREnum.Ldind_I8:
  431. case OpCodeREnum.Ldind_R4:
  432. case OpCodeREnum.Ldind_R8:
  433. case OpCodeREnum.Ldind_U1:
  434. case OpCodeREnum.Ldind_U2:
  435. case OpCodeREnum.Ldind_U4:
  436. case OpCodeREnum.Ldind_Ref:
  437. case OpCodeREnum.Ldobj:
  438. case OpCodeREnum.Ldloca:
  439. case OpCodeREnum.Ldloca_S:
  440. case OpCodeREnum.Ldarg_S:
  441. case OpCodeREnum.Ldarga:
  442. case OpCodeREnum.Ldarga_S:
  443. case OpCodeREnum.Ldlen:
  444. case OpCodeREnum.Newarr:
  445. case OpCodeREnum.Ldfld:
  446. case OpCodeREnum.Ldflda:
  447. case OpCodeREnum.Ldvirtftn:
  448. case OpCodeREnum.Isinst:
  449. r1 = op.Register2;
  450. return true;
  451. case OpCodeREnum.Stind_I:
  452. case OpCodeREnum.Stind_I1:
  453. case OpCodeREnum.Stind_I2:
  454. case OpCodeREnum.Stind_I4:
  455. case OpCodeREnum.Stind_I8:
  456. case OpCodeREnum.Stind_R4:
  457. case OpCodeREnum.Stind_R8:
  458. case OpCodeREnum.Stind_Ref:
  459. case OpCodeREnum.Stobj:
  460. case OpCodeREnum.Stfld:
  461. r1 = op.Register1;
  462. r2 = op.Register2;
  463. return true;
  464. case OpCodeREnum.Ldc_I4_0:
  465. case OpCodeREnum.Ldc_I4_1:
  466. case OpCodeREnum.Ldc_I4_2:
  467. case OpCodeREnum.Ldc_I4_3:
  468. case OpCodeREnum.Ldc_I4_4:
  469. case OpCodeREnum.Ldc_I4_5:
  470. case OpCodeREnum.Ldc_I4_6:
  471. case OpCodeREnum.Ldc_I4_7:
  472. case OpCodeREnum.Ldc_I4_8:
  473. case OpCodeREnum.Ldc_I4_M1:
  474. case OpCodeREnum.Ldnull:
  475. case OpCodeREnum.Ldc_I4:
  476. case OpCodeREnum.Ldc_I4_S:
  477. case OpCodeREnum.Ldc_I8:
  478. case OpCodeREnum.Ldc_R4:
  479. case OpCodeREnum.Ldc_R8:
  480. case OpCodeREnum.Ldstr:
  481. case OpCodeREnum.Ldtoken:
  482. case OpCodeREnum.Ldftn:
  483. case OpCodeREnum.Ldsfld:
  484. case OpCodeREnum.Ldsflda:
  485. case OpCodeREnum.Constrained:
  486. return false;
  487. case OpCodeREnum.Callvirt:
  488. case OpCodeREnum.Call:
  489. case OpCodeREnum.Newobj:
  490. r1 = op.Register2;
  491. r2 = op.Register3;
  492. r3 = op.Register4;
  493. return true;
  494. case OpCodeREnum.Br_S:
  495. case OpCodeREnum.Br:
  496. case OpCodeREnum.Nop:
  497. case OpCodeREnum.InlineStart:
  498. case OpCodeREnum.InlineEnd:
  499. case OpCodeREnum.Castclass:
  500. case OpCodeREnum.Readonly:
  501. case OpCodeREnum.Leave:
  502. case OpCodeREnum.Leave_S:
  503. case OpCodeREnum.Endfinally:
  504. case OpCodeREnum.Volatile:
  505. case OpCodeREnum.Rethrow:
  506. return false;
  507. case OpCodeREnum.Brtrue:
  508. case OpCodeREnum.Brtrue_S:
  509. case OpCodeREnum.Brfalse:
  510. case OpCodeREnum.Brfalse_S:
  511. case OpCodeREnum.Push:
  512. case OpCodeREnum.Initobj:
  513. case OpCodeREnum.Throw:
  514. case OpCodeREnum.Stsfld:
  515. case OpCodeREnum.Switch:
  516. case OpCodeREnum.Beqi:
  517. case OpCodeREnum.Bgei:
  518. case OpCodeREnum.Bgei_Un:
  519. case OpCodeREnum.Bgti:
  520. case OpCodeREnum.Bgti_Un:
  521. case OpCodeREnum.Bnei_Un:
  522. case OpCodeREnum.Blei:
  523. case OpCodeREnum.Blei_Un:
  524. case OpCodeREnum.Blti:
  525. case OpCodeREnum.Blti_Un:
  526. r1 = op.Register1;
  527. return true;
  528. case OpCodeREnum.Blt:
  529. case OpCodeREnum.Blt_S:
  530. case OpCodeREnum.Blt_Un:
  531. case OpCodeREnum.Blt_Un_S:
  532. case OpCodeREnum.Ble:
  533. case OpCodeREnum.Ble_S:
  534. case OpCodeREnum.Ble_Un:
  535. case OpCodeREnum.Ble_Un_S:
  536. case OpCodeREnum.Bgt:
  537. case OpCodeREnum.Bgt_S:
  538. case OpCodeREnum.Bgt_Un:
  539. case OpCodeREnum.Bgt_Un_S:
  540. case OpCodeREnum.Bge:
  541. case OpCodeREnum.Bge_S:
  542. case OpCodeREnum.Bge_Un:
  543. case OpCodeREnum.Bge_Un_S:
  544. case OpCodeREnum.Beq:
  545. case OpCodeREnum.Beq_S:
  546. case OpCodeREnum.Bne_Un:
  547. case OpCodeREnum.Bne_Un_S:
  548. r1 = op.Register1;
  549. r2 = op.Register2;
  550. return true;
  551. case OpCodeREnum.Add:
  552. case OpCodeREnum.Add_Ovf:
  553. case OpCodeREnum.Add_Ovf_Un:
  554. case OpCodeREnum.Sub:
  555. case OpCodeREnum.Sub_Ovf:
  556. case OpCodeREnum.Sub_Ovf_Un:
  557. case OpCodeREnum.Mul:
  558. case OpCodeREnum.Mul_Ovf:
  559. case OpCodeREnum.Mul_Ovf_Un:
  560. case OpCodeREnum.Div:
  561. case OpCodeREnum.Div_Un:
  562. case OpCodeREnum.Rem:
  563. case OpCodeREnum.Rem_Un:
  564. case OpCodeREnum.Xor:
  565. case OpCodeREnum.And:
  566. case OpCodeREnum.Or:
  567. case OpCodeREnum.Shl:
  568. case OpCodeREnum.Shr:
  569. case OpCodeREnum.Shr_Un:
  570. case OpCodeREnum.Clt:
  571. case OpCodeREnum.Clt_Un:
  572. case OpCodeREnum.Cgt:
  573. case OpCodeREnum.Cgt_Un:
  574. case OpCodeREnum.Ceq:
  575. case OpCodeREnum.Ldelem_I1:
  576. case OpCodeREnum.Ldelem_U1:
  577. case OpCodeREnum.Ldelem_I2:
  578. case OpCodeREnum.Ldelem_U2:
  579. case OpCodeREnum.Ldelem_I4:
  580. case OpCodeREnum.Ldelem_U4:
  581. case OpCodeREnum.Ldelem_I8:
  582. case OpCodeREnum.Ldelem_R4:
  583. case OpCodeREnum.Ldelem_R8:
  584. case OpCodeREnum.Ldelem_Any:
  585. case OpCodeREnum.Ldelem_Ref:
  586. case OpCodeREnum.Ldelema:
  587. r1 = op.Register2;
  588. r2 = op.Register3;
  589. return true;
  590. case OpCodeREnum.Addi:
  591. case OpCodeREnum.Subi:
  592. case OpCodeREnum.Muli:
  593. case OpCodeREnum.Divi:
  594. case OpCodeREnum.Remi:
  595. case OpCodeREnum.Remi_Un:
  596. case OpCodeREnum.Andi:
  597. case OpCodeREnum.Ori:
  598. case OpCodeREnum.Xori:
  599. case OpCodeREnum.Shli:
  600. case OpCodeREnum.Shri:
  601. case OpCodeREnum.Shri_Un:
  602. case OpCodeREnum.Ceqi:
  603. case OpCodeREnum.Cgti:
  604. case OpCodeREnum.Cgti_Un:
  605. case OpCodeREnum.Clti:
  606. case OpCodeREnum.Clti_Un:
  607. r1 = op.Register2;
  608. return true;
  609. case OpCodeREnum.Stelem_I:
  610. case OpCodeREnum.Stelem_I1:
  611. case OpCodeREnum.Stelem_I2:
  612. case OpCodeREnum.Stelem_I4:
  613. case OpCodeREnum.Stelem_I8:
  614. case OpCodeREnum.Stelem_R4:
  615. case OpCodeREnum.Stelem_R8:
  616. case OpCodeREnum.Stelem_Ref:
  617. case OpCodeREnum.Stelem_Any:
  618. r1 = op.Register1;
  619. r2 = op.Register2;
  620. r3 = op.Register3;
  621. return true;
  622. case OpCodeREnum.Ret:
  623. if (hasReturn)
  624. {
  625. r1 = op.Register1;
  626. return true;
  627. }
  628. else
  629. return false;
  630. default:
  631. throw new NotImplementedException();
  632. }
  633. }
  634. public static bool GetOpcodeDestRegister(ref OpCodes.OpCodeR op, out short r1)
  635. {
  636. r1 = -1;
  637. switch (op.Code)
  638. {
  639. case OpCodes.OpCodeREnum.Move:
  640. case OpCodeREnum.Conv_I:
  641. case OpCodeREnum.Conv_I1:
  642. case OpCodeREnum.Conv_I2:
  643. case OpCodeREnum.Conv_I4:
  644. case OpCodeREnum.Conv_I8:
  645. case OpCodeREnum.Conv_Ovf_I:
  646. case OpCodeREnum.Conv_Ovf_I1:
  647. case OpCodeREnum.Conv_Ovf_I1_Un:
  648. case OpCodeREnum.Conv_Ovf_I2:
  649. case OpCodeREnum.Conv_Ovf_I2_Un:
  650. case OpCodeREnum.Conv_Ovf_I4:
  651. case OpCodeREnum.Conv_Ovf_I4_Un:
  652. case OpCodeREnum.Conv_Ovf_I8:
  653. case OpCodeREnum.Conv_Ovf_I8_Un:
  654. case OpCodeREnum.Conv_Ovf_I_Un:
  655. case OpCodeREnum.Conv_Ovf_U:
  656. case OpCodeREnum.Conv_Ovf_U1:
  657. case OpCodeREnum.Conv_Ovf_U1_Un:
  658. case OpCodeREnum.Conv_Ovf_U2:
  659. case OpCodeREnum.Conv_Ovf_U2_Un:
  660. case OpCodeREnum.Conv_Ovf_U4:
  661. case OpCodeREnum.Conv_Ovf_U4_Un:
  662. case OpCodeREnum.Conv_Ovf_U8:
  663. case OpCodeREnum.Conv_Ovf_U8_Un:
  664. case OpCodeREnum.Conv_Ovf_U_Un:
  665. case OpCodeREnum.Conv_R4:
  666. case OpCodeREnum.Conv_R8:
  667. case OpCodeREnum.Conv_R_Un:
  668. case OpCodeREnum.Conv_U:
  669. case OpCodeREnum.Conv_U1:
  670. case OpCodeREnum.Conv_U2:
  671. case OpCodeREnum.Conv_U4:
  672. case OpCodeREnum.Conv_U8:
  673. case OpCodeREnum.Not:
  674. case OpCodeREnum.Neg:
  675. case OpCodeREnum.Box:
  676. case OpCodeREnum.Unbox:
  677. case OpCodeREnum.Unbox_Any:
  678. case OpCodeREnum.Ldc_I4_0:
  679. case OpCodeREnum.Ldc_I4_1:
  680. case OpCodeREnum.Ldc_I4_2:
  681. case OpCodeREnum.Ldc_I4_3:
  682. case OpCodeREnum.Ldc_I4_4:
  683. case OpCodeREnum.Ldc_I4_5:
  684. case OpCodeREnum.Ldc_I4_6:
  685. case OpCodeREnum.Ldc_I4_7:
  686. case OpCodeREnum.Ldc_I4_8:
  687. case OpCodeREnum.Ldc_I4_M1:
  688. case OpCodeREnum.Ldnull:
  689. case OpCodeREnum.Ldc_I4:
  690. case OpCodeREnum.Ldc_I4_S:
  691. case OpCodeREnum.Ldc_I8:
  692. case OpCodeREnum.Ldc_R4:
  693. case OpCodeREnum.Ldc_R8:
  694. case OpCodeREnum.Ldstr:
  695. case OpCodeREnum.Callvirt:
  696. case OpCodeREnum.Call:
  697. case OpCodeREnum.Newobj:
  698. case OpCodeREnum.Ldind_I:
  699. case OpCodeREnum.Ldind_I1:
  700. case OpCodeREnum.Ldind_I2:
  701. case OpCodeREnum.Ldind_I4:
  702. case OpCodeREnum.Ldind_I8:
  703. case OpCodeREnum.Ldind_R4:
  704. case OpCodeREnum.Ldind_R8:
  705. case OpCodeREnum.Ldind_U1:
  706. case OpCodeREnum.Ldind_U2:
  707. case OpCodeREnum.Ldind_U4:
  708. case OpCodeREnum.Ldind_Ref:
  709. case OpCodeREnum.Ldobj:
  710. case OpCodeREnum.Ldloca:
  711. case OpCodeREnum.Ldloca_S:
  712. case OpCodeREnum.Ldarg_S:
  713. case OpCodeREnum.Ldarga:
  714. case OpCodeREnum.Ldarga_S:
  715. case OpCodeREnum.Ldlen:
  716. case OpCodeREnum.Newarr:
  717. case OpCodeREnum.Ldfld:
  718. case OpCodeREnum.Ldflda:
  719. case OpCodeREnum.Ldtoken:
  720. case OpCodeREnum.Isinst:
  721. case OpCodeREnum.Ldsfld:
  722. case OpCodeREnum.Ldsflda:
  723. case OpCodeREnum.Ldftn:
  724. case OpCodeREnum.Ldvirtftn:
  725. case OpCodeREnum.Ldelem_I1:
  726. case OpCodeREnum.Ldelem_U1:
  727. case OpCodeREnum.Ldelem_I2:
  728. case OpCodeREnum.Ldelem_U2:
  729. case OpCodeREnum.Ldelem_I4:
  730. case OpCodeREnum.Ldelem_U4:
  731. case OpCodeREnum.Ldelem_I8:
  732. case OpCodeREnum.Ldelem_R4:
  733. case OpCodeREnum.Ldelem_R8:
  734. case OpCodeREnum.Ldelem_Any:
  735. case OpCodeREnum.Ldelem_Ref:
  736. case OpCodeREnum.Ldelema:
  737. r1 = op.Register1;
  738. return true;
  739. case OpCodeREnum.Br_S:
  740. case OpCodeREnum.Br:
  741. case OpCodeREnum.Brtrue:
  742. case OpCodeREnum.Brtrue_S:
  743. case OpCodeREnum.Brfalse:
  744. case OpCodeREnum.Brfalse_S:
  745. case OpCodeREnum.Switch:
  746. case OpCodeREnum.Blt:
  747. case OpCodeREnum.Blt_S:
  748. case OpCodeREnum.Blt_Un:
  749. case OpCodeREnum.Blt_Un_S:
  750. case OpCodeREnum.Ble:
  751. case OpCodeREnum.Ble_S:
  752. case OpCodeREnum.Ble_Un:
  753. case OpCodeREnum.Ble_Un_S:
  754. case OpCodeREnum.Bgt:
  755. case OpCodeREnum.Bgt_S:
  756. case OpCodeREnum.Bgt_Un:
  757. case OpCodeREnum.Bgt_Un_S:
  758. case OpCodeREnum.Bge:
  759. case OpCodeREnum.Bge_S:
  760. case OpCodeREnum.Bge_Un:
  761. case OpCodeREnum.Bge_Un_S:
  762. case OpCodeREnum.Beq:
  763. case OpCodeREnum.Beq_S:
  764. case OpCodeREnum.Bne_Un:
  765. case OpCodeREnum.Bne_Un_S:
  766. case OpCodeREnum.Nop:
  767. case OpCodeREnum.Constrained:
  768. case OpCodeREnum.Ret:
  769. case OpCodeREnum.Push:
  770. case OpCodeREnum.Initobj:
  771. case OpCodeREnum.InlineStart:
  772. case OpCodeREnum.InlineEnd:
  773. case OpCodeREnum.Stind_I:
  774. case OpCodeREnum.Stind_I1:
  775. case OpCodeREnum.Stind_I2:
  776. case OpCodeREnum.Stind_I4:
  777. case OpCodeREnum.Stind_I8:
  778. case OpCodeREnum.Stind_R4:
  779. case OpCodeREnum.Stind_R8:
  780. case OpCodeREnum.Stind_Ref:
  781. case OpCodeREnum.Stobj:
  782. case OpCodeREnum.Stelem_I:
  783. case OpCodeREnum.Stelem_I1:
  784. case OpCodeREnum.Stelem_I2:
  785. case OpCodeREnum.Stelem_I4:
  786. case OpCodeREnum.Stelem_I8:
  787. case OpCodeREnum.Stelem_R4:
  788. case OpCodeREnum.Stelem_R8:
  789. case OpCodeREnum.Stelem_Ref:
  790. case OpCodeREnum.Stelem_Any:
  791. case OpCodeREnum.Stfld:
  792. case OpCodeREnum.Stsfld:
  793. case OpCodeREnum.Throw:
  794. case OpCodeREnum.Castclass:
  795. case OpCodeREnum.Readonly:
  796. case OpCodeREnum.Leave:
  797. case OpCodeREnum.Leave_S:
  798. case OpCodeREnum.Endfinally:
  799. case OpCodeREnum.Volatile:
  800. case OpCodeREnum.Rethrow:
  801. case OpCodeREnum.Beqi:
  802. case OpCodeREnum.Bgei:
  803. case OpCodeREnum.Bgei_Un:
  804. case OpCodeREnum.Bgti:
  805. case OpCodeREnum.Bgti_Un:
  806. case OpCodeREnum.Bnei_Un:
  807. case OpCodeREnum.Blei:
  808. case OpCodeREnum.Blei_Un:
  809. case OpCodeREnum.Blti:
  810. case OpCodeREnum.Blti_Un:
  811. return false;
  812. case OpCodeREnum.Add:
  813. case OpCodeREnum.Add_Ovf:
  814. case OpCodeREnum.Add_Ovf_Un:
  815. case OpCodeREnum.Sub:
  816. case OpCodeREnum.Sub_Ovf:
  817. case OpCodeREnum.Sub_Ovf_Un:
  818. case OpCodeREnum.Mul:
  819. case OpCodeREnum.Mul_Ovf:
  820. case OpCodeREnum.Mul_Ovf_Un:
  821. case OpCodeREnum.Div:
  822. case OpCodeREnum.Div_Un:
  823. case OpCodeREnum.Rem:
  824. case OpCodeREnum.Rem_Un:
  825. case OpCodeREnum.Xor:
  826. case OpCodeREnum.And:
  827. case OpCodeREnum.Or:
  828. case OpCodeREnum.Shl:
  829. case OpCodeREnum.Shr:
  830. case OpCodeREnum.Shr_Un:
  831. case OpCodeREnum.Clt:
  832. case OpCodeREnum.Clt_Un:
  833. case OpCodeREnum.Cgt:
  834. case OpCodeREnum.Cgt_Un:
  835. case OpCodeREnum.Ceq:
  836. case OpCodeREnum.Addi:
  837. case OpCodeREnum.Subi:
  838. case OpCodeREnum.Muli:
  839. case OpCodeREnum.Divi:
  840. case OpCodeREnum.Remi:
  841. case OpCodeREnum.Remi_Un:
  842. case OpCodeREnum.Andi:
  843. case OpCodeREnum.Ori:
  844. case OpCodeREnum.Xori:
  845. case OpCodeREnum.Shli:
  846. case OpCodeREnum.Shri:
  847. case OpCodeREnum.Shri_Un:
  848. case OpCodeREnum.Ceqi:
  849. case OpCodeREnum.Cgti:
  850. case OpCodeREnum.Cgti_Un:
  851. case OpCodeREnum.Clti:
  852. case OpCodeREnum.Clti_Un:
  853. r1 = op.Register1;
  854. return true;
  855. default:
  856. throw new NotImplementedException();
  857. }
  858. }
  859. static void ReplaceOpcodeSource(ref OpCodes.OpCodeR op, int idx, short src)
  860. {
  861. switch (op.Code)
  862. {
  863. case OpCodes.OpCodeREnum.Move:
  864. case OpCodeREnum.Conv_I:
  865. case OpCodeREnum.Conv_I1:
  866. case OpCodeREnum.Conv_I2:
  867. case OpCodeREnum.Conv_I4:
  868. case OpCodeREnum.Conv_I8:
  869. case OpCodeREnum.Conv_Ovf_I:
  870. case OpCodeREnum.Conv_Ovf_I1:
  871. case OpCodeREnum.Conv_Ovf_I1_Un:
  872. case OpCodeREnum.Conv_Ovf_I2:
  873. case OpCodeREnum.Conv_Ovf_I2_Un:
  874. case OpCodeREnum.Conv_Ovf_I4:
  875. case OpCodeREnum.Conv_Ovf_I4_Un:
  876. case OpCodeREnum.Conv_Ovf_I8:
  877. case OpCodeREnum.Conv_Ovf_I8_Un:
  878. case OpCodeREnum.Conv_Ovf_I_Un:
  879. case OpCodeREnum.Conv_Ovf_U:
  880. case OpCodeREnum.Conv_Ovf_U1:
  881. case OpCodeREnum.Conv_Ovf_U1_Un:
  882. case OpCodeREnum.Conv_Ovf_U2:
  883. case OpCodeREnum.Conv_Ovf_U2_Un:
  884. case OpCodeREnum.Conv_Ovf_U4:
  885. case OpCodeREnum.Conv_Ovf_U4_Un:
  886. case OpCodeREnum.Conv_Ovf_U8:
  887. case OpCodeREnum.Conv_Ovf_U8_Un:
  888. case OpCodeREnum.Conv_Ovf_U_Un:
  889. case OpCodeREnum.Conv_R4:
  890. case OpCodeREnum.Conv_R8:
  891. case OpCodeREnum.Conv_R_Un:
  892. case OpCodeREnum.Conv_U:
  893. case OpCodeREnum.Conv_U1:
  894. case OpCodeREnum.Conv_U2:
  895. case OpCodeREnum.Conv_U4:
  896. case OpCodeREnum.Conv_U8:
  897. case OpCodeREnum.Not:
  898. case OpCodeREnum.Neg:
  899. case OpCodeREnum.Box:
  900. case OpCodeREnum.Unbox:
  901. case OpCodeREnum.Unbox_Any:
  902. case OpCodeREnum.Ldind_I:
  903. case OpCodeREnum.Ldind_I1:
  904. case OpCodeREnum.Ldind_I2:
  905. case OpCodeREnum.Ldind_I4:
  906. case OpCodeREnum.Ldind_I8:
  907. case OpCodeREnum.Ldind_R4:
  908. case OpCodeREnum.Ldind_R8:
  909. case OpCodeREnum.Ldind_U1:
  910. case OpCodeREnum.Ldind_U2:
  911. case OpCodeREnum.Ldind_U4:
  912. case OpCodeREnum.Ldind_Ref:
  913. case OpCodeREnum.Ldobj:
  914. case OpCodeREnum.Ldloca:
  915. case OpCodeREnum.Ldloca_S:
  916. case OpCodeREnum.Ldarg_S:
  917. case OpCodeREnum.Ldarga:
  918. case OpCodeREnum.Ldarga_S:
  919. case OpCodeREnum.Ldlen:
  920. case OpCodeREnum.Newarr:
  921. case OpCodeREnum.Ldfld:
  922. case OpCodeREnum.Ldflda:
  923. case OpCodeREnum.Ldvirtftn:
  924. case OpCodeREnum.Isinst:
  925. case OpCodeREnum.Addi:
  926. case OpCodeREnum.Subi:
  927. case OpCodeREnum.Muli:
  928. case OpCodeREnum.Divi:
  929. case OpCodeREnum.Remi:
  930. case OpCodeREnum.Remi_Un:
  931. case OpCodeREnum.Andi:
  932. case OpCodeREnum.Ori:
  933. case OpCodeREnum.Xori:
  934. case OpCodeREnum.Shli:
  935. case OpCodeREnum.Shri:
  936. case OpCodeREnum.Shri_Un:
  937. case OpCodeREnum.Ceqi:
  938. case OpCodeREnum.Cgti:
  939. case OpCodeREnum.Cgti_Un:
  940. case OpCodeREnum.Clti:
  941. case OpCodeREnum.Clti_Un:
  942. op.Register2 = src;
  943. break;
  944. case OpCodeREnum.Stind_I:
  945. case OpCodeREnum.Stind_I1:
  946. case OpCodeREnum.Stind_I2:
  947. case OpCodeREnum.Stind_I4:
  948. case OpCodeREnum.Stind_I8:
  949. case OpCodeREnum.Stind_R4:
  950. case OpCodeREnum.Stind_R8:
  951. case OpCodeREnum.Stind_Ref:
  952. case OpCodeREnum.Stobj:
  953. case OpCodeREnum.Stfld:
  954. switch (idx)
  955. {
  956. case 0:
  957. op.Register1 = src;
  958. break;
  959. case 1:
  960. op.Register2 = src;
  961. break;
  962. default:
  963. throw new NotSupportedException();
  964. }
  965. break;
  966. case OpCodeREnum.Add:
  967. case OpCodeREnum.Add_Ovf:
  968. case OpCodeREnum.Add_Ovf_Un:
  969. case OpCodeREnum.Sub:
  970. case OpCodeREnum.Sub_Ovf:
  971. case OpCodeREnum.Sub_Ovf_Un:
  972. case OpCodeREnum.Mul:
  973. case OpCodeREnum.Mul_Ovf:
  974. case OpCodeREnum.Mul_Ovf_Un:
  975. case OpCodeREnum.Div:
  976. case OpCodeREnum.Div_Un:
  977. case OpCodeREnum.Rem:
  978. case OpCodeREnum.Rem_Un:
  979. case OpCodeREnum.Xor:
  980. case OpCodeREnum.And:
  981. case OpCodeREnum.Or:
  982. case OpCodeREnum.Shl:
  983. case OpCodeREnum.Shr:
  984. case OpCodeREnum.Shr_Un:
  985. case OpCodeREnum.Clt:
  986. case OpCodeREnum.Clt_Un:
  987. case OpCodeREnum.Cgt:
  988. case OpCodeREnum.Cgt_Un:
  989. case OpCodeREnum.Ceq:
  990. case OpCodeREnum.Ldelem_I1:
  991. case OpCodeREnum.Ldelem_U1:
  992. case OpCodeREnum.Ldelem_I2:
  993. case OpCodeREnum.Ldelem_U2:
  994. case OpCodeREnum.Ldelem_I4:
  995. case OpCodeREnum.Ldelem_U4:
  996. case OpCodeREnum.Ldelem_I8:
  997. case OpCodeREnum.Ldelem_R4:
  998. case OpCodeREnum.Ldelem_R8:
  999. case OpCodeREnum.Ldelem_Any:
  1000. case OpCodeREnum.Ldelem_Ref:
  1001. case OpCodeREnum.Ldelema:
  1002. switch (idx)
  1003. {
  1004. case 0:
  1005. op.Register2 = src;
  1006. break;
  1007. case 1:
  1008. op.Register3 = src;
  1009. break;
  1010. default:
  1011. throw new NotSupportedException();
  1012. }
  1013. break;
  1014. case OpCodeREnum.Stelem_I:
  1015. case OpCodeREnum.Stelem_I1:
  1016. case OpCodeREnum.Stelem_I2:
  1017. case OpCodeREnum.Stelem_I4:
  1018. case OpCodeREnum.Stelem_I8:
  1019. case OpCodeREnum.Stelem_R4:
  1020. case OpCodeREnum.Stelem_R8:
  1021. case OpCodeREnum.Stelem_Ref:
  1022. case OpCodeREnum.Stelem_Any:
  1023. switch (idx)
  1024. {
  1025. case 0:
  1026. op.Register1 = src;
  1027. break;
  1028. case 1:
  1029. op.Register2 = src;
  1030. break;
  1031. case 2:
  1032. op.Register3 = src;
  1033. break;
  1034. default:
  1035. throw new NotSupportedException();
  1036. }
  1037. break;
  1038. case OpCodeREnum.Call:
  1039. case OpCodeREnum.Callvirt:
  1040. case OpCodeREnum.Newobj:
  1041. switch (idx)
  1042. {
  1043. case 0:
  1044. op.Register2 = src;
  1045. break;
  1046. case 1:
  1047. op.Register3 = src;
  1048. break;
  1049. case 2:
  1050. op.Register4 = src;
  1051. break;
  1052. default:
  1053. throw new NotSupportedException();
  1054. }
  1055. break;
  1056. case OpCodeREnum.Brtrue:
  1057. case OpCodeREnum.Brtrue_S:
  1058. case OpCodeREnum.Brfalse:
  1059. case OpCodeREnum.Brfalse_S:
  1060. case OpCodeREnum.Switch:
  1061. case OpCodeREnum.Push:
  1062. case OpCodeREnum.Throw:
  1063. case OpCodeREnum.Stsfld:
  1064. case OpCodeREnum.Initobj:
  1065. case OpCodeREnum.Beqi:
  1066. case OpCodeREnum.Bgei:
  1067. case OpCodeREnum.Bgei_Un:
  1068. case OpCodeREnum.Bgti:
  1069. case OpCodeREnum.Bgti_Un:
  1070. case OpCodeREnum.Bnei_Un:
  1071. case OpCodeREnum.Blei:
  1072. case OpCodeREnum.Blei_Un:
  1073. case OpCodeREnum.Blti:
  1074. case OpCodeREnum.Blti_Un:
  1075. op.Register1 = src;
  1076. break;
  1077. case OpCodeREnum.Blt:
  1078. case OpCodeREnum.Blt_S:
  1079. case OpCodeREnum.Blt_Un:
  1080. case OpCodeREnum.Blt_Un_S:
  1081. case OpCodeREnum.Ble:
  1082. case OpCodeREnum.Ble_S:
  1083. case OpCodeREnum.Ble_Un:
  1084. case OpCodeREnum.Ble_Un_S:
  1085. case OpCodeREnum.Bgt:
  1086. case OpCodeREnum.Bgt_S:
  1087. case OpCodeREnum.Bgt_Un:
  1088. case OpCodeREnum.Bgt_Un_S:
  1089. case OpCodeREnum.Bge:
  1090. case OpCodeREnum.Bge_S:
  1091. case OpCodeREnum.Bge_Un:
  1092. case OpCodeREnum.Bge_Un_S:
  1093. case OpCodeREnum.Beq:
  1094. case OpCodeREnum.Beq_S:
  1095. case OpCodeREnum.Bne_Un:
  1096. case OpCodeREnum.Bne_Un_S:
  1097. switch (idx)
  1098. {
  1099. case 0:
  1100. op.Register1 = src;
  1101. break;
  1102. case 1:
  1103. op.Register2 = src;
  1104. break;
  1105. default:
  1106. throw new NotSupportedException();
  1107. }
  1108. break;
  1109. case OpCodeREnum.Ret:
  1110. op.Register1 = src;
  1111. break;
  1112. default:
  1113. throw new NotImplementedException();
  1114. }
  1115. }
  1116. static void ReplaceOpcodeDest(ref OpCodes.OpCodeR op, short dst)
  1117. {
  1118. switch (op.Code)
  1119. {
  1120. case OpCodes.OpCodeREnum.Move:
  1121. case OpCodeREnum.Ldc_I4_0:
  1122. case OpCodeREnum.Ldc_I4_1:
  1123. case OpCodeREnum.Ldc_I4_2:
  1124. case OpCodeREnum.Ldc_I4_3:
  1125. case OpCodeREnum.Ldc_I4_4:
  1126. case OpCodeREnum.Ldc_I4_5:
  1127. case OpCodeREnum.Ldc_I4_6:
  1128. case OpCodeREnum.Ldc_I4_7:
  1129. case OpCodeREnum.Ldc_I4_8:
  1130. case OpCodeREnum.Ldc_I4_M1:
  1131. case OpCodeREnum.Ldnull:
  1132. case OpCodeREnum.Ldc_I4:
  1133. case OpCodeREnum.Ldc_I4_S:
  1134. case OpCodeREnum.Ldc_I8:
  1135. case OpCodeREnum.Ldc_R4:
  1136. case OpCodeREnum.Ldc_R8:
  1137. case OpCodeREnum.Ldstr:
  1138. case OpCodeREnum.Add:
  1139. case OpCodeREnum.Add_Ovf:
  1140. case OpCodeREnum.Add_Ovf_Un:
  1141. case OpCodeREnum.Sub:
  1142. case OpCodeREnum.Sub_Ovf:
  1143. case OpCodeREnum.Sub_Ovf_Un:
  1144. case OpCodeREnum.Mul:
  1145. case OpCodeREnum.Mul_Ovf:
  1146. case OpCodeREnum.Mul_Ovf_Un:
  1147. case OpCodeREnum.Div:
  1148. case OpCodeREnum.Div_Un:
  1149. case OpCodeREnum.Rem:
  1150. case OpCodeREnum.Rem_Un:
  1151. case OpCodeREnum.Xor:
  1152. case OpCodeREnum.And:
  1153. case OpCodeREnum.Or:
  1154. case OpCodeREnum.Shl:
  1155. case OpCodeREnum.Shr:
  1156. case OpCodeREnum.Shr_Un:
  1157. case OpCodeREnum.Clt:
  1158. case OpCodeREnum.Clt_Un:
  1159. case OpCodeREnum.Cgt:
  1160. case OpCodeREnum.Cgt_Un:
  1161. case OpCodeREnum.Ceq:
  1162. case OpCodeREnum.Conv_I:
  1163. case OpCodeREnum.Conv_I1:
  1164. case OpCodeREnum.Conv_I2:
  1165. case OpCodeREnum.Conv_I4:
  1166. case OpCodeREnum.Conv_I8:
  1167. case OpCodeREnum.Conv_Ovf_I:
  1168. case OpCodeREnum.Conv_Ovf_I1:
  1169. case OpCodeREnum.Conv_Ovf_I1_Un:
  1170. case OpCodeREnum.Conv_Ovf_I2:
  1171. case OpCodeREnum.Conv_Ovf_I2_Un:
  1172. case OpCodeREnum.Conv_Ovf_I4:
  1173. case OpCodeREnum.Conv_Ovf_I4_Un:
  1174. case OpCodeREnum.Conv_Ovf_I8:
  1175. case OpCodeREnum.Conv_Ovf_I8_Un:
  1176. case OpCodeREnum.Conv_Ovf_I_Un:
  1177. case OpCodeREnum.Conv_Ovf_U:
  1178. case OpCodeREnum.Conv_Ovf_U1:
  1179. case OpCodeREnum.Conv_Ovf_U1_Un:
  1180. case OpCodeREnum.Conv_Ovf_U2:
  1181. case OpCodeREnum.Conv_Ovf_U2_Un:
  1182. case OpCodeREnum.Conv_Ovf_U4:
  1183. case OpCodeREnum.Conv_Ovf_U4_Un:
  1184. case OpCodeREnum.Conv_Ovf_U8:
  1185. case OpCodeREnum.Conv_Ovf_U8_Un:
  1186. case OpCodeREnum.Conv_Ovf_U_Un:
  1187. case OpCodeREnum.Conv_R4:
  1188. case OpCodeREnum.Conv_R8:
  1189. case OpCodeREnum.Conv_R_Un:
  1190. case OpCodeREnum.Conv_U:
  1191. case OpCodeREnum.Conv_U1:
  1192. case OpCodeREnum.Conv_U2:
  1193. case OpCodeREnum.Conv_U4:
  1194. case OpCodeREnum.Conv_U8:
  1195. case OpCodeREnum.Not:
  1196. case OpCodeREnum.Neg:
  1197. case OpCodeREnum.Box:
  1198. case OpCodeREnum.Unbox:
  1199. case OpCodeREnum.Unbox_Any:
  1200. case OpCodeREnum.Call:
  1201. case OpCodeREnum.Callvirt:
  1202. case OpCodeREnum.Newobj:
  1203. case OpCodeREnum.Ldind_I:
  1204. case OpCodeREnum.Ldind_I1:
  1205. case OpCodeREnum.Ldind_I2:
  1206. case OpCodeREnum.Ldind_I4:
  1207. case OpCodeREnum.Ldind_I8:
  1208. case OpCodeREnum.Ldind_R4:
  1209. case OpCodeREnum.Ldind_R8:
  1210. case OpCodeREnum.Ldind_U1:
  1211. case OpCodeREnum.Ldind_U2:
  1212. case OpCodeREnum.Ldind_U4:
  1213. case OpCodeREnum.Ldind_Ref:
  1214. case OpCodeREnum.Ldobj:
  1215. case OpCodeREnum.Ldloca:
  1216. case OpCodeREnum.Ldloca_S:
  1217. case OpCodeREnum.Ldarg_S:
  1218. case OpCodeREnum.Ldarga:
  1219. case OpCodeREnum.Ldarga_S:
  1220. case OpCodeREnum.Ldlen:
  1221. case OpCodeREnum.Newarr:
  1222. case OpCodeREnum.Ldfld:
  1223. case OpCodeREnum.Ldflda:
  1224. case OpCodeREnum.Ldsfld:
  1225. case OpCodeREnum.Ldsflda:
  1226. case OpCodeREnum.Ldtoken:
  1227. case OpCodeREnum.Ldftn:
  1228. case OpCodeREnum.Ldvirtftn:
  1229. case OpCodeREnum.Isinst:
  1230. case OpCodeREnum.Ldelem_I1:
  1231. case OpCodeREnum.Ldelem_U1:
  1232. case OpCodeREnum.Ldelem_I2:
  1233. case OpCodeREnum.Ldelem_U2:
  1234. case OpCodeREnum.Ldelem_I4:
  1235. case OpCodeREnum.Ldelem_U4:
  1236. case OpCodeREnum.Ldelem_I8:
  1237. case OpCodeREnum.Ldelem_R4:
  1238. case OpCodeREnum.Ldelem_R8:
  1239. case OpCodeREnum.Ldelem_Any:
  1240. case OpCodeREnum.Ldelem_Ref:
  1241. case OpCodeREnum.Ldelema:
  1242. case OpCodeREnum.Addi:
  1243. case OpCodeREnum.Subi:
  1244. case OpCodeREnum.Muli:
  1245. case OpCodeREnum.Divi:
  1246. case OpCodeREnum.Remi:
  1247. case OpCodeREnum.Remi_Un:
  1248. case OpCodeREnum.Andi:
  1249. case OpCodeREnum.Ori:
  1250. case OpCodeREnum.Xori:
  1251. case OpCodeREnum.Shli:
  1252. case OpCodeREnum.Shri:
  1253. case OpCodeREnum.Shri_Un:
  1254. case OpCodeREnum.Ceqi:
  1255. case OpCodeREnum.Cgti:
  1256. case OpCodeREnum.Cgti_Un:
  1257. case OpCodeREnum.Clti:
  1258. case OpCodeREnum.Clti_Un:
  1259. op.Register1 = dst;
  1260. break;
  1261. case OpCodeREnum.Br_S:
  1262. case OpCodeREnum.Br:
  1263. case OpCodeREnum.Brtrue:
  1264. case OpCodeREnum.Brtrue_S:
  1265. case OpCodeREnum.Brfalse:
  1266. case OpCodeREnum.Brfalse_S:
  1267. case OpCodeREnum.Switch:
  1268. case OpCodeREnum.Blt:
  1269. case OpCodeREnum.Blt_S:
  1270. case OpCodeREnum.Blt_Un:
  1271. case OpCodeREnum.Blt_Un_S:
  1272. case OpCodeREnum.Ble:
  1273. case OpCodeREnum.Ble_S:
  1274. case OpCodeREnum.Ble_Un:
  1275. case OpCodeREnum.Ble_Un_S:
  1276. case OpCodeREnum.Bgt:
  1277. case OpCodeREnum.Bgt_S:
  1278. case OpCodeREnum.Bgt_Un:
  1279. case OpCodeREnum.Bgt_Un_S:
  1280. case OpCodeREnum.Bge:
  1281. case OpCodeREnum.Bge_S:
  1282. case OpCodeREnum.Bge_Un:
  1283. case OpCodeREnum.Bge_Un_S:
  1284. case OpCodeREnum.Beq:
  1285. case OpCodeREnum.Beq_S:
  1286. case OpCodeREnum.Bne_Un:
  1287. case OpCodeREnum.Bne_Un_S:
  1288. case OpCodeREnum.Nop:
  1289. case OpCodeREnum.Ret:
  1290. case OpCodeREnum.Push:
  1291. case OpCodeREnum.Constrained:
  1292. break;
  1293. default:
  1294. throw new NotImplementedException();
  1295. }
  1296. }
  1297. }
  1298. }