fisk 2.0.0 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1252) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +34 -0
  3. data/CODE_OF_CONDUCT.md +78 -0
  4. data/Gemfile +1 -2
  5. data/README.md +62 -2
  6. data/Rakefile +4 -2
  7. data/bin/build-machine.rb +16 -2
  8. data/bin/instruction.rb.erb +31 -57
  9. data/bin/instructions.rb.erb +34 -4
  10. data/fisk.gemspec +10 -1
  11. data/lib/fisk/basic_block.rb +162 -0
  12. data/lib/fisk/encoding.rb +83 -17
  13. data/lib/fisk/errors.rb +50 -0
  14. data/lib/fisk/helpers.rb +33 -2
  15. data/lib/fisk/instructions/adc.rb +561 -595
  16. data/lib/fisk/instructions/adcx.rb +85 -89
  17. data/lib/fisk/instructions/add.rb +561 -595
  18. data/lib/fisk/instructions/addpd.rb +42 -44
  19. data/lib/fisk/instructions/addps.rb +40 -42
  20. data/lib/fisk/instructions/addsd.rb +42 -44
  21. data/lib/fisk/instructions/addss.rb +42 -44
  22. data/lib/fisk/instructions/addsubpd.rb +42 -44
  23. data/lib/fisk/instructions/addsubps.rb +42 -44
  24. data/lib/fisk/instructions/adox.rb +85 -89
  25. data/lib/fisk/instructions/aesdec.rb +44 -46
  26. data/lib/fisk/instructions/aesdeclast.rb +44 -46
  27. data/lib/fisk/instructions/aesenc.rb +44 -46
  28. data/lib/fisk/instructions/aesenclast.rb +44 -46
  29. data/lib/fisk/instructions/aesimc.rb +44 -46
  30. data/lib/fisk/instructions/aeskeygenassist.rb +48 -50
  31. data/lib/fisk/instructions/and.rb +561 -595
  32. data/lib/fisk/instructions/andn.rb +67 -71
  33. data/lib/fisk/instructions/andnpd.rb +42 -44
  34. data/lib/fisk/instructions/andnps.rb +40 -42
  35. data/lib/fisk/instructions/andpd.rb +42 -44
  36. data/lib/fisk/instructions/andps.rb +40 -42
  37. data/lib/fisk/instructions/bextr.rb +135 -143
  38. data/lib/fisk/instructions/blcfill.rb +59 -63
  39. data/lib/fisk/instructions/blci.rb +59 -63
  40. data/lib/fisk/instructions/blcic.rb +59 -63
  41. data/lib/fisk/instructions/blcmsk.rb +59 -63
  42. data/lib/fisk/instructions/blcs.rb +59 -63
  43. data/lib/fisk/instructions/blendpd.rb +48 -50
  44. data/lib/fisk/instructions/blendps.rb +48 -50
  45. data/lib/fisk/instructions/blendvpd.rb +46 -48
  46. data/lib/fisk/instructions/blendvps.rb +46 -48
  47. data/lib/fisk/instructions/blsfill.rb +59 -63
  48. data/lib/fisk/instructions/blsi.rb +59 -63
  49. data/lib/fisk/instructions/blsic.rb +59 -63
  50. data/lib/fisk/instructions/blsmsk.rb +59 -63
  51. data/lib/fisk/instructions/blsr.rb +59 -63
  52. data/lib/fisk/instructions/bsf.rb +116 -122
  53. data/lib/fisk/instructions/bsr.rb +116 -122
  54. data/lib/fisk/instructions/bswap.rb +29 -31
  55. data/lib/fisk/instructions/bt.rb +223 -235
  56. data/lib/fisk/instructions/btc.rb +223 -235
  57. data/lib/fisk/instructions/btr.rb +223 -235
  58. data/lib/fisk/instructions/bts.rb +223 -235
  59. data/lib/fisk/instructions/bzhi.rb +67 -71
  60. data/lib/fisk/instructions/call.rb +43 -46
  61. data/lib/fisk/instructions/cbw.rb +13 -14
  62. data/lib/fisk/instructions/cdq.rb +12 -13
  63. data/lib/fisk/instructions/cdqe.rb +14 -15
  64. data/lib/fisk/instructions/clc.rb +12 -13
  65. data/lib/fisk/instructions/cld.rb +12 -13
  66. data/lib/fisk/instructions/clflush.rb +19 -20
  67. data/lib/fisk/instructions/clflushopt.rb +20 -21
  68. data/lib/fisk/instructions/clwb.rb +20 -21
  69. data/lib/fisk/instructions/clzero.rb +14 -15
  70. data/lib/fisk/instructions/cmc.rb +12 -13
  71. data/lib/fisk/instructions/cmova.rb +116 -122
  72. data/lib/fisk/instructions/cmovae.rb +116 -122
  73. data/lib/fisk/instructions/cmovb.rb +116 -122
  74. data/lib/fisk/instructions/cmovbe.rb +116 -122
  75. data/lib/fisk/instructions/cmovc.rb +116 -122
  76. data/lib/fisk/instructions/cmove.rb +116 -122
  77. data/lib/fisk/instructions/cmovg.rb +116 -122
  78. data/lib/fisk/instructions/cmovge.rb +116 -122
  79. data/lib/fisk/instructions/cmovl.rb +116 -122
  80. data/lib/fisk/instructions/cmovle.rb +116 -122
  81. data/lib/fisk/instructions/cmovna.rb +116 -122
  82. data/lib/fisk/instructions/cmovnae.rb +116 -122
  83. data/lib/fisk/instructions/cmovnb.rb +116 -122
  84. data/lib/fisk/instructions/cmovnbe.rb +116 -122
  85. data/lib/fisk/instructions/cmovnc.rb +116 -122
  86. data/lib/fisk/instructions/cmovne.rb +116 -122
  87. data/lib/fisk/instructions/cmovng.rb +116 -122
  88. data/lib/fisk/instructions/cmovnge.rb +116 -122
  89. data/lib/fisk/instructions/cmovnl.rb +116 -122
  90. data/lib/fisk/instructions/cmovnle.rb +116 -122
  91. data/lib/fisk/instructions/cmovno.rb +116 -122
  92. data/lib/fisk/instructions/cmovnp.rb +116 -122
  93. data/lib/fisk/instructions/cmovns.rb +116 -122
  94. data/lib/fisk/instructions/cmovnz.rb +116 -122
  95. data/lib/fisk/instructions/cmovo.rb +116 -122
  96. data/lib/fisk/instructions/cmovp.rb +116 -122
  97. data/lib/fisk/instructions/cmovpe.rb +116 -122
  98. data/lib/fisk/instructions/cmovpo.rb +116 -122
  99. data/lib/fisk/instructions/cmovs.rb +116 -122
  100. data/lib/fisk/instructions/cmovz.rb +116 -122
  101. data/lib/fisk/instructions/cmp.rb +561 -595
  102. data/lib/fisk/instructions/cmppd.rb +46 -48
  103. data/lib/fisk/instructions/cmpps.rb +44 -46
  104. data/lib/fisk/instructions/cmpsd.rb +46 -48
  105. data/lib/fisk/instructions/cmpss.rb +46 -48
  106. data/lib/fisk/instructions/cmpxchg.rb +153 -161
  107. data/lib/fisk/instructions/cmpxchg16b.rb +19 -20
  108. data/lib/fisk/instructions/cmpxchg8b.rb +19 -20
  109. data/lib/fisk/instructions/comisd.rb +42 -44
  110. data/lib/fisk/instructions/comiss.rb +40 -42
  111. data/lib/fisk/instructions/cpuid.rb +13 -14
  112. data/lib/fisk/instructions/cqo.rb +14 -15
  113. data/lib/fisk/instructions/crc32.rb +210 -220
  114. data/lib/fisk/instructions/cvtdq2pd.rb +42 -44
  115. data/lib/fisk/instructions/cvtdq2ps.rb +40 -42
  116. data/lib/fisk/instructions/cvtpd2dq.rb +42 -44
  117. data/lib/fisk/instructions/cvtpd2pi.rb +42 -44
  118. data/lib/fisk/instructions/cvtpd2ps.rb +42 -44
  119. data/lib/fisk/instructions/cvtpi2pd.rb +42 -44
  120. data/lib/fisk/instructions/cvtpi2ps.rb +40 -42
  121. data/lib/fisk/instructions/cvtps2dq.rb +42 -44
  122. data/lib/fisk/instructions/cvtps2pd.rb +40 -42
  123. data/lib/fisk/instructions/cvtps2pi.rb +40 -42
  124. data/lib/fisk/instructions/cvtsd2si.rb +81 -85
  125. data/lib/fisk/instructions/cvtsd2ss.rb +42 -44
  126. data/lib/fisk/instructions/cvtsi2sd.rb +81 -85
  127. data/lib/fisk/instructions/cvtsi2ss.rb +81 -85
  128. data/lib/fisk/instructions/cvtss2sd.rb +42 -44
  129. data/lib/fisk/instructions/cvtss2si.rb +81 -85
  130. data/lib/fisk/instructions/cvttpd2dq.rb +42 -44
  131. data/lib/fisk/instructions/cvttpd2pi.rb +42 -44
  132. data/lib/fisk/instructions/cvttps2dq.rb +42 -44
  133. data/lib/fisk/instructions/cvttps2pi.rb +40 -42
  134. data/lib/fisk/instructions/cvttsd2si.rb +81 -85
  135. data/lib/fisk/instructions/cvttss2si.rb +81 -85
  136. data/lib/fisk/instructions/cwd.rb +13 -14
  137. data/lib/fisk/instructions/cwde.rb +12 -13
  138. data/lib/fisk/instructions/dec.rb +121 -129
  139. data/lib/fisk/instructions/div.rb +121 -129
  140. data/lib/fisk/instructions/divpd.rb +42 -44
  141. data/lib/fisk/instructions/divps.rb +40 -42
  142. data/lib/fisk/instructions/divsd.rb +42 -44
  143. data/lib/fisk/instructions/divss.rb +42 -44
  144. data/lib/fisk/instructions/dppd.rb +48 -50
  145. data/lib/fisk/instructions/dpps.rb +48 -50
  146. data/lib/fisk/instructions/emms.rb +13 -14
  147. data/lib/fisk/instructions/extractps.rb +48 -50
  148. data/lib/fisk/instructions/extrq.rb +42 -44
  149. data/lib/fisk/instructions/femms.rb +13 -14
  150. data/lib/fisk/instructions/haddpd.rb +42 -44
  151. data/lib/fisk/instructions/haddps.rb +42 -44
  152. data/lib/fisk/instructions/hsubpd.rb +42 -44
  153. data/lib/fisk/instructions/hsubps.rb +42 -44
  154. data/lib/fisk/instructions/idiv.rb +121 -129
  155. data/lib/fisk/instructions/imul.rb +481 -507
  156. data/lib/fisk/instructions/inc.rb +121 -129
  157. data/lib/fisk/instructions/insertps.rb +48 -50
  158. data/lib/fisk/instructions/insertq.rb +45 -47
  159. data/lib/fisk/instructions/int.rb +24 -26
  160. data/lib/fisk/instructions/ja.rb +26 -28
  161. data/lib/fisk/instructions/jae.rb +26 -28
  162. data/lib/fisk/instructions/jb.rb +26 -28
  163. data/lib/fisk/instructions/jbe.rb +26 -28
  164. data/lib/fisk/instructions/jc.rb +26 -28
  165. data/lib/fisk/instructions/je.rb +26 -28
  166. data/lib/fisk/instructions/jecxz.rb +14 -15
  167. data/lib/fisk/instructions/jg.rb +26 -28
  168. data/lib/fisk/instructions/jge.rb +26 -28
  169. data/lib/fisk/instructions/jl.rb +26 -28
  170. data/lib/fisk/instructions/jle.rb +26 -28
  171. data/lib/fisk/instructions/jmp.rb +54 -58
  172. data/lib/fisk/instructions/jna.rb +26 -28
  173. data/lib/fisk/instructions/jnae.rb +26 -28
  174. data/lib/fisk/instructions/jnb.rb +26 -28
  175. data/lib/fisk/instructions/jnbe.rb +26 -28
  176. data/lib/fisk/instructions/jnc.rb +26 -28
  177. data/lib/fisk/instructions/jne.rb +26 -28
  178. data/lib/fisk/instructions/jng.rb +26 -28
  179. data/lib/fisk/instructions/jnge.rb +26 -28
  180. data/lib/fisk/instructions/jnl.rb +26 -28
  181. data/lib/fisk/instructions/jnle.rb +26 -28
  182. data/lib/fisk/instructions/jno.rb +26 -28
  183. data/lib/fisk/instructions/jnp.rb +26 -28
  184. data/lib/fisk/instructions/jns.rb +26 -28
  185. data/lib/fisk/instructions/jnz.rb +26 -28
  186. data/lib/fisk/instructions/jo.rb +26 -28
  187. data/lib/fisk/instructions/jp.rb +26 -28
  188. data/lib/fisk/instructions/jpe.rb +26 -28
  189. data/lib/fisk/instructions/jpo.rb +26 -28
  190. data/lib/fisk/instructions/jrcxz.rb +14 -15
  191. data/lib/fisk/instructions/js.rb +26 -28
  192. data/lib/fisk/instructions/jz.rb +26 -28
  193. data/lib/fisk/instructions/kaddb.rb +19 -20
  194. data/lib/fisk/instructions/kaddd.rb +19 -20
  195. data/lib/fisk/instructions/kaddq.rb +19 -20
  196. data/lib/fisk/instructions/kaddw.rb +19 -20
  197. data/lib/fisk/instructions/kandb.rb +19 -20
  198. data/lib/fisk/instructions/kandd.rb +19 -20
  199. data/lib/fisk/instructions/kandnb.rb +19 -20
  200. data/lib/fisk/instructions/kandnd.rb +19 -20
  201. data/lib/fisk/instructions/kandnq.rb +19 -20
  202. data/lib/fisk/instructions/kandnw.rb +19 -20
  203. data/lib/fisk/instructions/kandq.rb +19 -20
  204. data/lib/fisk/instructions/kandw.rb +19 -20
  205. data/lib/fisk/instructions/kmovb.rb +78 -83
  206. data/lib/fisk/instructions/kmovd.rb +78 -83
  207. data/lib/fisk/instructions/kmovq.rb +78 -83
  208. data/lib/fisk/instructions/kmovw.rb +78 -83
  209. data/lib/fisk/instructions/knotb.rb +18 -19
  210. data/lib/fisk/instructions/knotd.rb +18 -19
  211. data/lib/fisk/instructions/knotq.rb +18 -19
  212. data/lib/fisk/instructions/knotw.rb +18 -19
  213. data/lib/fisk/instructions/korb.rb +19 -20
  214. data/lib/fisk/instructions/kord.rb +19 -20
  215. data/lib/fisk/instructions/korq.rb +19 -20
  216. data/lib/fisk/instructions/kortestb.rb +18 -19
  217. data/lib/fisk/instructions/kortestd.rb +18 -19
  218. data/lib/fisk/instructions/kortestq.rb +18 -19
  219. data/lib/fisk/instructions/kortestw.rb +18 -19
  220. data/lib/fisk/instructions/korw.rb +19 -20
  221. data/lib/fisk/instructions/kshiftlb.rb +20 -21
  222. data/lib/fisk/instructions/kshiftld.rb +20 -21
  223. data/lib/fisk/instructions/kshiftlq.rb +20 -21
  224. data/lib/fisk/instructions/kshiftlw.rb +20 -21
  225. data/lib/fisk/instructions/kshiftrb.rb +20 -21
  226. data/lib/fisk/instructions/kshiftrd.rb +20 -21
  227. data/lib/fisk/instructions/kshiftrq.rb +20 -21
  228. data/lib/fisk/instructions/kshiftrw.rb +20 -21
  229. data/lib/fisk/instructions/ktestb.rb +18 -19
  230. data/lib/fisk/instructions/ktestd.rb +18 -19
  231. data/lib/fisk/instructions/ktestq.rb +18 -19
  232. data/lib/fisk/instructions/ktestw.rb +18 -19
  233. data/lib/fisk/instructions/kunpckbw.rb +19 -20
  234. data/lib/fisk/instructions/kunpckdq.rb +19 -20
  235. data/lib/fisk/instructions/kunpckwd.rb +19 -20
  236. data/lib/fisk/instructions/kxnorb.rb +19 -20
  237. data/lib/fisk/instructions/kxnord.rb +19 -20
  238. data/lib/fisk/instructions/kxnorq.rb +19 -20
  239. data/lib/fisk/instructions/kxnorw.rb +19 -20
  240. data/lib/fisk/instructions/kxorb.rb +19 -20
  241. data/lib/fisk/instructions/kxord.rb +19 -20
  242. data/lib/fisk/instructions/kxorq.rb +19 -20
  243. data/lib/fisk/instructions/kxorw.rb +19 -20
  244. data/lib/fisk/instructions/lddqu.rb +23 -24
  245. data/lib/fisk/instructions/ldmxcsr.rb +19 -20
  246. data/lib/fisk/instructions/lea.rb +58 -61
  247. data/lib/fisk/instructions/lfence.rb +14 -15
  248. data/lib/fisk/instructions/lzcnt.rb +122 -128
  249. data/lib/fisk/instructions/maskmovdqu.rb +22 -23
  250. data/lib/fisk/instructions/maskmovq.rb +21 -22
  251. data/lib/fisk/instructions/maxpd.rb +42 -44
  252. data/lib/fisk/instructions/maxps.rb +40 -42
  253. data/lib/fisk/instructions/maxsd.rb +42 -44
  254. data/lib/fisk/instructions/maxss.rb +42 -44
  255. data/lib/fisk/instructions/mfence.rb +14 -15
  256. data/lib/fisk/instructions/minpd.rb +42 -44
  257. data/lib/fisk/instructions/minps.rb +40 -42
  258. data/lib/fisk/instructions/minsd.rb +42 -44
  259. data/lib/fisk/instructions/minss.rb +42 -44
  260. data/lib/fisk/instructions/monitor.rb +14 -15
  261. data/lib/fisk/instructions/monitorx.rb +14 -15
  262. data/lib/fisk/instructions/mov.rb +503 -535
  263. data/lib/fisk/instructions/movapd.rb +76 -80
  264. data/lib/fisk/instructions/movaps.rb +72 -76
  265. data/lib/fisk/instructions/movbe.rb +125 -131
  266. data/lib/fisk/instructions/movd.rb +159 -167
  267. data/lib/fisk/instructions/movddup.rb +42 -44
  268. data/lib/fisk/instructions/movdq2q.rb +22 -23
  269. data/lib/fisk/instructions/movdqa.rb +76 -80
  270. data/lib/fisk/instructions/movdqu.rb +76 -80
  271. data/lib/fisk/instructions/movhlps.rb +21 -22
  272. data/lib/fisk/instructions/movhpd.rb +43 -45
  273. data/lib/fisk/instructions/movhps.rb +41 -43
  274. data/lib/fisk/instructions/movlhps.rb +21 -22
  275. data/lib/fisk/instructions/movlpd.rb +43 -45
  276. data/lib/fisk/instructions/movlps.rb +41 -43
  277. data/lib/fisk/instructions/movmskpd.rb +22 -23
  278. data/lib/fisk/instructions/movmskps.rb +21 -22
  279. data/lib/fisk/instructions/movntdq.rb +23 -24
  280. data/lib/fisk/instructions/movntdqa.rb +24 -25
  281. data/lib/fisk/instructions/movnti.rb +41 -43
  282. data/lib/fisk/instructions/movntpd.rb +23 -24
  283. data/lib/fisk/instructions/movntps.rb +22 -23
  284. data/lib/fisk/instructions/movntq.rb +22 -23
  285. data/lib/fisk/instructions/movntsd.rb +23 -24
  286. data/lib/fisk/instructions/movntss.rb +23 -24
  287. data/lib/fisk/instructions/movq.rb +277 -293
  288. data/lib/fisk/instructions/movq2dq.rb +22 -23
  289. data/lib/fisk/instructions/movsd.rb +76 -80
  290. data/lib/fisk/instructions/movshdup.rb +42 -44
  291. data/lib/fisk/instructions/movsldup.rb +42 -44
  292. data/lib/fisk/instructions/movss.rb +76 -80
  293. data/lib/fisk/instructions/movsx.rb +195 -205
  294. data/lib/fisk/instructions/movsxd.rb +38 -40
  295. data/lib/fisk/instructions/movupd.rb +76 -80
  296. data/lib/fisk/instructions/movups.rb +72 -76
  297. data/lib/fisk/instructions/movzx.rb +195 -205
  298. data/lib/fisk/instructions/mpsadbw.rb +48 -50
  299. data/lib/fisk/instructions/mul.rb +121 -129
  300. data/lib/fisk/instructions/mulpd.rb +42 -44
  301. data/lib/fisk/instructions/mulps.rb +40 -42
  302. data/lib/fisk/instructions/mulsd.rb +42 -44
  303. data/lib/fisk/instructions/mulss.rb +42 -44
  304. data/lib/fisk/instructions/mulx.rb +67 -71
  305. data/lib/fisk/instructions/mwait.rb +14 -15
  306. data/lib/fisk/instructions/mwaitx.rb +14 -15
  307. data/lib/fisk/instructions/neg.rb +121 -129
  308. data/lib/fisk/instructions/nop.rb +12 -13
  309. data/lib/fisk/instructions/not.rb +121 -129
  310. data/lib/fisk/instructions/or.rb +561 -595
  311. data/lib/fisk/instructions/orpd.rb +42 -44
  312. data/lib/fisk/instructions/orps.rb +40 -42
  313. data/lib/fisk/instructions/pabsb.rb +83 -87
  314. data/lib/fisk/instructions/pabsd.rb +83 -87
  315. data/lib/fisk/instructions/pabsw.rb +83 -87
  316. data/lib/fisk/instructions/packssdw.rb +79 -83
  317. data/lib/fisk/instructions/packsswb.rb +79 -83
  318. data/lib/fisk/instructions/packusdw.rb +44 -46
  319. data/lib/fisk/instructions/packuswb.rb +79 -83
  320. data/lib/fisk/instructions/paddb.rb +79 -83
  321. data/lib/fisk/instructions/paddd.rb +79 -83
  322. data/lib/fisk/instructions/paddq.rb +79 -83
  323. data/lib/fisk/instructions/paddsb.rb +79 -83
  324. data/lib/fisk/instructions/paddsw.rb +79 -83
  325. data/lib/fisk/instructions/paddusb.rb +79 -83
  326. data/lib/fisk/instructions/paddusw.rb +79 -83
  327. data/lib/fisk/instructions/paddw.rb +79 -83
  328. data/lib/fisk/instructions/palignr.rb +91 -95
  329. data/lib/fisk/instructions/pand.rb +79 -83
  330. data/lib/fisk/instructions/pandn.rb +79 -83
  331. data/lib/fisk/instructions/pause.rb +13 -14
  332. data/lib/fisk/instructions/pavgb.rb +79 -83
  333. data/lib/fisk/instructions/pavgusb.rb +42 -44
  334. data/lib/fisk/instructions/pavgw.rb +79 -83
  335. data/lib/fisk/instructions/pblendvb.rb +46 -48
  336. data/lib/fisk/instructions/pblendw.rb +48 -50
  337. data/lib/fisk/instructions/pclmulqdq.rb +48 -50
  338. data/lib/fisk/instructions/pcmpeqb.rb +79 -83
  339. data/lib/fisk/instructions/pcmpeqd.rb +79 -83
  340. data/lib/fisk/instructions/pcmpeqq.rb +44 -46
  341. data/lib/fisk/instructions/pcmpeqw.rb +79 -83
  342. data/lib/fisk/instructions/pcmpestri.rb +48 -50
  343. data/lib/fisk/instructions/pcmpestrm.rb +48 -50
  344. data/lib/fisk/instructions/pcmpgtb.rb +79 -83
  345. data/lib/fisk/instructions/pcmpgtd.rb +79 -83
  346. data/lib/fisk/instructions/pcmpgtq.rb +44 -46
  347. data/lib/fisk/instructions/pcmpgtw.rb +79 -83
  348. data/lib/fisk/instructions/pcmpistri.rb +48 -50
  349. data/lib/fisk/instructions/pcmpistrm.rb +48 -50
  350. data/lib/fisk/instructions/pdep.rb +67 -71
  351. data/lib/fisk/instructions/pext.rb +67 -71
  352. data/lib/fisk/instructions/pextrb.rb +48 -50
  353. data/lib/fisk/instructions/pextrd.rb +48 -50
  354. data/lib/fisk/instructions/pextrq.rb +48 -50
  355. data/lib/fisk/instructions/pextrw.rb +83 -87
  356. data/lib/fisk/instructions/pf2id.rb +42 -44
  357. data/lib/fisk/instructions/pf2iw.rb +42 -44
  358. data/lib/fisk/instructions/pfacc.rb +42 -44
  359. data/lib/fisk/instructions/pfadd.rb +42 -44
  360. data/lib/fisk/instructions/pfcmpeq.rb +42 -44
  361. data/lib/fisk/instructions/pfcmpge.rb +42 -44
  362. data/lib/fisk/instructions/pfcmpgt.rb +42 -44
  363. data/lib/fisk/instructions/pfmax.rb +42 -44
  364. data/lib/fisk/instructions/pfmin.rb +42 -44
  365. data/lib/fisk/instructions/pfmul.rb +42 -44
  366. data/lib/fisk/instructions/pfnacc.rb +42 -44
  367. data/lib/fisk/instructions/pfpnacc.rb +42 -44
  368. data/lib/fisk/instructions/pfrcp.rb +42 -44
  369. data/lib/fisk/instructions/pfrcpit1.rb +42 -44
  370. data/lib/fisk/instructions/pfrcpit2.rb +42 -44
  371. data/lib/fisk/instructions/pfrsqit1.rb +42 -44
  372. data/lib/fisk/instructions/pfrsqrt.rb +42 -44
  373. data/lib/fisk/instructions/pfsub.rb +42 -44
  374. data/lib/fisk/instructions/pfsubr.rb +42 -44
  375. data/lib/fisk/instructions/phaddd.rb +83 -87
  376. data/lib/fisk/instructions/phaddsw.rb +83 -87
  377. data/lib/fisk/instructions/phaddw.rb +83 -87
  378. data/lib/fisk/instructions/phminposuw.rb +44 -46
  379. data/lib/fisk/instructions/phsubd.rb +83 -87
  380. data/lib/fisk/instructions/phsubsw.rb +83 -87
  381. data/lib/fisk/instructions/phsubw.rb +83 -87
  382. data/lib/fisk/instructions/pi2fd.rb +42 -44
  383. data/lib/fisk/instructions/pi2fw.rb +42 -44
  384. data/lib/fisk/instructions/pinsrb.rb +48 -50
  385. data/lib/fisk/instructions/pinsrd.rb +48 -50
  386. data/lib/fisk/instructions/pinsrq.rb +48 -50
  387. data/lib/fisk/instructions/pinsrw.rb +87 -91
  388. data/lib/fisk/instructions/pmaddubsw.rb +83 -87
  389. data/lib/fisk/instructions/pmaddwd.rb +79 -83
  390. data/lib/fisk/instructions/pmaxsb.rb +44 -46
  391. data/lib/fisk/instructions/pmaxsd.rb +44 -46
  392. data/lib/fisk/instructions/pmaxsw.rb +79 -83
  393. data/lib/fisk/instructions/pmaxub.rb +79 -83
  394. data/lib/fisk/instructions/pmaxud.rb +44 -46
  395. data/lib/fisk/instructions/pmaxuw.rb +44 -46
  396. data/lib/fisk/instructions/pminsb.rb +44 -46
  397. data/lib/fisk/instructions/pminsd.rb +44 -46
  398. data/lib/fisk/instructions/pminsw.rb +79 -83
  399. data/lib/fisk/instructions/pminub.rb +79 -83
  400. data/lib/fisk/instructions/pminud.rb +44 -46
  401. data/lib/fisk/instructions/pminuw.rb +44 -46
  402. data/lib/fisk/instructions/pmovmskb.rb +40 -42
  403. data/lib/fisk/instructions/pmovsxbd.rb +44 -46
  404. data/lib/fisk/instructions/pmovsxbq.rb +44 -46
  405. data/lib/fisk/instructions/pmovsxbw.rb +44 -46
  406. data/lib/fisk/instructions/pmovsxdq.rb +44 -46
  407. data/lib/fisk/instructions/pmovsxwd.rb +44 -46
  408. data/lib/fisk/instructions/pmovsxwq.rb +44 -46
  409. data/lib/fisk/instructions/pmovzxbd.rb +44 -46
  410. data/lib/fisk/instructions/pmovzxbq.rb +44 -46
  411. data/lib/fisk/instructions/pmovzxbw.rb +44 -46
  412. data/lib/fisk/instructions/pmovzxdq.rb +44 -46
  413. data/lib/fisk/instructions/pmovzxwd.rb +44 -46
  414. data/lib/fisk/instructions/pmovzxwq.rb +44 -46
  415. data/lib/fisk/instructions/pmuldq.rb +44 -46
  416. data/lib/fisk/instructions/pmulhrsw.rb +83 -87
  417. data/lib/fisk/instructions/pmulhrw.rb +42 -44
  418. data/lib/fisk/instructions/pmulhuw.rb +79 -83
  419. data/lib/fisk/instructions/pmulhw.rb +79 -83
  420. data/lib/fisk/instructions/pmulld.rb +44 -46
  421. data/lib/fisk/instructions/pmullw.rb +79 -83
  422. data/lib/fisk/instructions/pmuludq.rb +79 -83
  423. data/lib/fisk/instructions/pop.rb +80 -86
  424. data/lib/fisk/instructions/popcnt.rb +122 -128
  425. data/lib/fisk/instructions/por.rb +79 -83
  426. data/lib/fisk/instructions/prefetch.rb +19 -20
  427. data/lib/fisk/instructions/prefetchnta.rb +19 -20
  428. data/lib/fisk/instructions/prefetcht0.rb +19 -20
  429. data/lib/fisk/instructions/prefetcht1.rb +19 -20
  430. data/lib/fisk/instructions/prefetcht2.rb +19 -20
  431. data/lib/fisk/instructions/prefetchw.rb +19 -20
  432. data/lib/fisk/instructions/prefetchwt1.rb +19 -20
  433. data/lib/fisk/instructions/psadbw.rb +79 -83
  434. data/lib/fisk/instructions/pshufb.rb +83 -87
  435. data/lib/fisk/instructions/pshufd.rb +46 -48
  436. data/lib/fisk/instructions/pshufhw.rb +46 -48
  437. data/lib/fisk/instructions/pshuflw.rb +46 -48
  438. data/lib/fisk/instructions/pshufw.rb +44 -46
  439. data/lib/fisk/instructions/psignb.rb +83 -87
  440. data/lib/fisk/instructions/psignd.rb +83 -87
  441. data/lib/fisk/instructions/psignw.rb +83 -87
  442. data/lib/fisk/instructions/pslld.rb +114 -120
  443. data/lib/fisk/instructions/pslldq.rb +21 -22
  444. data/lib/fisk/instructions/psllq.rb +114 -120
  445. data/lib/fisk/instructions/psllw.rb +114 -120
  446. data/lib/fisk/instructions/psrad.rb +114 -120
  447. data/lib/fisk/instructions/psraw.rb +114 -120
  448. data/lib/fisk/instructions/psrld.rb +114 -120
  449. data/lib/fisk/instructions/psrldq.rb +21 -22
  450. data/lib/fisk/instructions/psrlq.rb +114 -120
  451. data/lib/fisk/instructions/psrlw.rb +114 -120
  452. data/lib/fisk/instructions/psubb.rb +79 -83
  453. data/lib/fisk/instructions/psubd.rb +79 -83
  454. data/lib/fisk/instructions/psubq.rb +79 -83
  455. data/lib/fisk/instructions/psubsb.rb +79 -83
  456. data/lib/fisk/instructions/psubsw.rb +79 -83
  457. data/lib/fisk/instructions/psubusb.rb +79 -83
  458. data/lib/fisk/instructions/psubusw.rb +79 -83
  459. data/lib/fisk/instructions/psubw.rb +79 -83
  460. data/lib/fisk/instructions/pswapd.rb +42 -44
  461. data/lib/fisk/instructions/ptest.rb +44 -46
  462. data/lib/fisk/instructions/punpckhbw.rb +79 -83
  463. data/lib/fisk/instructions/punpckhdq.rb +79 -83
  464. data/lib/fisk/instructions/punpckhqdq.rb +42 -44
  465. data/lib/fisk/instructions/punpckhwd.rb +79 -83
  466. data/lib/fisk/instructions/punpcklbw.rb +79 -83
  467. data/lib/fisk/instructions/punpckldq.rb +79 -83
  468. data/lib/fisk/instructions/punpcklqdq.rb +42 -44
  469. data/lib/fisk/instructions/punpcklwd.rb +79 -83
  470. data/lib/fisk/instructions/push.rb +102 -110
  471. data/lib/fisk/instructions/pxor.rb +79 -83
  472. data/lib/fisk/instructions/rcl.rb +389 -413
  473. data/lib/fisk/instructions/rcpps.rb +40 -42
  474. data/lib/fisk/instructions/rcpss.rb +42 -44
  475. data/lib/fisk/instructions/rcr.rb +389 -413
  476. data/lib/fisk/instructions/rdrand.rb +49 -52
  477. data/lib/fisk/instructions/rdseed.rb +49 -52
  478. data/lib/fisk/instructions/rdtsc.rb +13 -14
  479. data/lib/fisk/instructions/rdtscp.rb +14 -15
  480. data/lib/fisk/instructions/ret.rb +23 -25
  481. data/lib/fisk/instructions/rol.rb +389 -413
  482. data/lib/fisk/instructions/ror.rb +389 -413
  483. data/lib/fisk/instructions/rorx.rb +71 -75
  484. data/lib/fisk/instructions/roundpd.rb +48 -50
  485. data/lib/fisk/instructions/roundps.rb +48 -50
  486. data/lib/fisk/instructions/roundsd.rb +48 -50
  487. data/lib/fisk/instructions/roundss.rb +48 -50
  488. data/lib/fisk/instructions/rsqrtps.rb +40 -42
  489. data/lib/fisk/instructions/rsqrtss.rb +42 -44
  490. data/lib/fisk/instructions/sal.rb +389 -413
  491. data/lib/fisk/instructions/sar.rb +389 -413
  492. data/lib/fisk/instructions/sarx.rb +67 -71
  493. data/lib/fisk/instructions/sbb.rb +561 -595
  494. data/lib/fisk/instructions/seta.rb +34 -36
  495. data/lib/fisk/instructions/setae.rb +34 -36
  496. data/lib/fisk/instructions/setb.rb +34 -36
  497. data/lib/fisk/instructions/setbe.rb +34 -36
  498. data/lib/fisk/instructions/setc.rb +34 -36
  499. data/lib/fisk/instructions/sete.rb +34 -36
  500. data/lib/fisk/instructions/setg.rb +34 -36
  501. data/lib/fisk/instructions/setge.rb +34 -36
  502. data/lib/fisk/instructions/setl.rb +34 -36
  503. data/lib/fisk/instructions/setle.rb +34 -36
  504. data/lib/fisk/instructions/setna.rb +34 -36
  505. data/lib/fisk/instructions/setnae.rb +34 -36
  506. data/lib/fisk/instructions/setnb.rb +34 -36
  507. data/lib/fisk/instructions/setnbe.rb +34 -36
  508. data/lib/fisk/instructions/setnc.rb +34 -36
  509. data/lib/fisk/instructions/setne.rb +34 -36
  510. data/lib/fisk/instructions/setng.rb +34 -36
  511. data/lib/fisk/instructions/setnge.rb +34 -36
  512. data/lib/fisk/instructions/setnl.rb +34 -36
  513. data/lib/fisk/instructions/setnle.rb +34 -36
  514. data/lib/fisk/instructions/setno.rb +34 -36
  515. data/lib/fisk/instructions/setnp.rb +34 -36
  516. data/lib/fisk/instructions/setns.rb +34 -36
  517. data/lib/fisk/instructions/setnz.rb +34 -36
  518. data/lib/fisk/instructions/seto.rb +34 -36
  519. data/lib/fisk/instructions/setp.rb +34 -36
  520. data/lib/fisk/instructions/setpe.rb +34 -36
  521. data/lib/fisk/instructions/setpo.rb +34 -36
  522. data/lib/fisk/instructions/sets.rb +34 -36
  523. data/lib/fisk/instructions/setz.rb +34 -36
  524. data/lib/fisk/instructions/sfence.rb +14 -15
  525. data/lib/fisk/instructions/sha1msg1.rb +42 -44
  526. data/lib/fisk/instructions/sha1msg2.rb +42 -44
  527. data/lib/fisk/instructions/sha1nexte.rb +42 -44
  528. data/lib/fisk/instructions/sha1rnds4.rb +46 -48
  529. data/lib/fisk/instructions/sha256msg1.rb +42 -44
  530. data/lib/fisk/instructions/sha256msg2.rb +42 -44
  531. data/lib/fisk/instructions/sha256rnds2.rb +44 -46
  532. data/lib/fisk/instructions/shl.rb +389 -413
  533. data/lib/fisk/instructions/shld.rb +247 -259
  534. data/lib/fisk/instructions/shlx.rb +67 -71
  535. data/lib/fisk/instructions/shr.rb +389 -413
  536. data/lib/fisk/instructions/shrd.rb +247 -259
  537. data/lib/fisk/instructions/shrx.rb +67 -71
  538. data/lib/fisk/instructions/shufpd.rb +46 -48
  539. data/lib/fisk/instructions/shufps.rb +44 -46
  540. data/lib/fisk/instructions/sqrtpd.rb +42 -44
  541. data/lib/fisk/instructions/sqrtps.rb +40 -42
  542. data/lib/fisk/instructions/sqrtsd.rb +42 -44
  543. data/lib/fisk/instructions/sqrtss.rb +42 -44
  544. data/lib/fisk/instructions/stc.rb +12 -13
  545. data/lib/fisk/instructions/std.rb +12 -13
  546. data/lib/fisk/instructions/stmxcsr.rb +19 -20
  547. data/lib/fisk/instructions/sub.rb +561 -595
  548. data/lib/fisk/instructions/subpd.rb +42 -44
  549. data/lib/fisk/instructions/subps.rb +40 -42
  550. data/lib/fisk/instructions/subsd.rb +42 -44
  551. data/lib/fisk/instructions/subss.rb +42 -44
  552. data/lib/fisk/instructions/syscall.rb +13 -14
  553. data/lib/fisk/instructions/t1mskc.rb +59 -63
  554. data/lib/fisk/instructions/test.rb +334 -354
  555. data/lib/fisk/instructions/tzcnt.rb +122 -128
  556. data/lib/fisk/instructions/tzmsk.rb +59 -63
  557. data/lib/fisk/instructions/ucomisd.rb +42 -44
  558. data/lib/fisk/instructions/ucomiss.rb +40 -42
  559. data/lib/fisk/instructions/ud2.rb +13 -14
  560. data/lib/fisk/instructions/unpckhpd.rb +42 -44
  561. data/lib/fisk/instructions/unpckhps.rb +40 -42
  562. data/lib/fisk/instructions/unpcklpd.rb +42 -44
  563. data/lib/fisk/instructions/unpcklps.rb +40 -42
  564. data/lib/fisk/instructions/vaddpd.rb +164 -174
  565. data/lib/fisk/instructions/vaddps.rb +164 -174
  566. data/lib/fisk/instructions/vaddsd.rb +68 -72
  567. data/lib/fisk/instructions/vaddss.rb +68 -72
  568. data/lib/fisk/instructions/vaddsubpd.rb +67 -71
  569. data/lib/fisk/instructions/vaddsubps.rb +67 -71
  570. data/lib/fisk/instructions/vaesdec.rb +35 -37
  571. data/lib/fisk/instructions/vaesdeclast.rb +35 -37
  572. data/lib/fisk/instructions/vaesenc.rb +35 -37
  573. data/lib/fisk/instructions/vaesenclast.rb +35 -37
  574. data/lib/fisk/instructions/vaesimc.rb +33 -35
  575. data/lib/fisk/instructions/vaeskeygenassist.rb +37 -39
  576. data/lib/fisk/instructions/valignd.rb +111 -117
  577. data/lib/fisk/instructions/valignq.rb +111 -117
  578. data/lib/fisk/instructions/vandnpd.rb +163 -173
  579. data/lib/fisk/instructions/vandnps.rb +163 -173
  580. data/lib/fisk/instructions/vandpd.rb +163 -173
  581. data/lib/fisk/instructions/vandps.rb +163 -173
  582. data/lib/fisk/instructions/vblendmpd.rb +99 -105
  583. data/lib/fisk/instructions/vblendmps.rb +99 -105
  584. data/lib/fisk/instructions/vblendpd.rb +75 -79
  585. data/lib/fisk/instructions/vblendps.rb +75 -79
  586. data/lib/fisk/instructions/vblendvpd.rb +75 -79
  587. data/lib/fisk/instructions/vblendvps.rb +75 -79
  588. data/lib/fisk/instructions/vbroadcastf128.rb +18 -19
  589. data/lib/fisk/instructions/vbroadcastf32x2.rb +63 -67
  590. data/lib/fisk/instructions/vbroadcastf32x4.rb +33 -35
  591. data/lib/fisk/instructions/vbroadcastf32x8.rb +18 -19
  592. data/lib/fisk/instructions/vbroadcastf64x2.rb +33 -35
  593. data/lib/fisk/instructions/vbroadcastf64x4.rb +18 -19
  594. data/lib/fisk/instructions/vbroadcasti128.rb +18 -19
  595. data/lib/fisk/instructions/vbroadcasti32x2.rb +93 -99
  596. data/lib/fisk/instructions/vbroadcasti32x4.rb +33 -35
  597. data/lib/fisk/instructions/vbroadcasti32x8.rb +18 -19
  598. data/lib/fisk/instructions/vbroadcasti64x2.rb +33 -35
  599. data/lib/fisk/instructions/vbroadcasti64x4.rb +18 -19
  600. data/lib/fisk/instructions/vbroadcastsd.rb +93 -99
  601. data/lib/fisk/instructions/vbroadcastss.rb +123 -131
  602. data/lib/fisk/instructions/vcmppd.rb +184 -194
  603. data/lib/fisk/instructions/vcmpps.rb +184 -194
  604. data/lib/fisk/instructions/vcmpsd.rb +76 -80
  605. data/lib/fisk/instructions/vcmpss.rb +76 -80
  606. data/lib/fisk/instructions/vcomisd.rb +64 -68
  607. data/lib/fisk/instructions/vcomiss.rb +64 -68
  608. data/lib/fisk/instructions/vcompresspd.rb +93 -99
  609. data/lib/fisk/instructions/vcompressps.rb +93 -99
  610. data/lib/fisk/instructions/vcvtdq2pd.rb +153 -163
  611. data/lib/fisk/instructions/vcvtdq2ps.rb +154 -164
  612. data/lib/fisk/instructions/vcvtpd2dq.rb +154 -164
  613. data/lib/fisk/instructions/vcvtpd2ps.rb +154 -164
  614. data/lib/fisk/instructions/vcvtpd2qq.rb +94 -100
  615. data/lib/fisk/instructions/vcvtpd2udq.rb +94 -100
  616. data/lib/fisk/instructions/vcvtpd2uqq.rb +94 -100
  617. data/lib/fisk/instructions/vcvtph2ps.rb +154 -164
  618. data/lib/fisk/instructions/vcvtps2dq.rb +154 -164
  619. data/lib/fisk/instructions/vcvtps2pd.rb +154 -164
  620. data/lib/fisk/instructions/vcvtps2ph.rb +174 -184
  621. data/lib/fisk/instructions/vcvtps2qq.rb +94 -100
  622. data/lib/fisk/instructions/vcvtps2udq.rb +94 -100
  623. data/lib/fisk/instructions/vcvtps2uqq.rb +94 -100
  624. data/lib/fisk/instructions/vcvtqq2pd.rb +94 -100
  625. data/lib/fisk/instructions/vcvtqq2ps.rb +94 -100
  626. data/lib/fisk/instructions/vcvtsd2si.rb +125 -133
  627. data/lib/fisk/instructions/vcvtsd2ss.rb +68 -72
  628. data/lib/fisk/instructions/vcvtsd2usi.rb +65 -69
  629. data/lib/fisk/instructions/vcvtsi2sd.rb +132 -140
  630. data/lib/fisk/instructions/vcvtsi2ss.rb +133 -141
  631. data/lib/fisk/instructions/vcvtss2sd.rb +68 -72
  632. data/lib/fisk/instructions/vcvtss2si.rb +125 -133
  633. data/lib/fisk/instructions/vcvtss2usi.rb +65 -69
  634. data/lib/fisk/instructions/vcvttpd2dq.rb +154 -164
  635. data/lib/fisk/instructions/vcvttpd2qq.rb +94 -100
  636. data/lib/fisk/instructions/vcvttpd2udq.rb +94 -100
  637. data/lib/fisk/instructions/vcvttpd2uqq.rb +94 -100
  638. data/lib/fisk/instructions/vcvttps2dq.rb +154 -164
  639. data/lib/fisk/instructions/vcvttps2qq.rb +94 -100
  640. data/lib/fisk/instructions/vcvttps2udq.rb +94 -100
  641. data/lib/fisk/instructions/vcvttps2uqq.rb +94 -100
  642. data/lib/fisk/instructions/vcvttsd2si.rb +125 -133
  643. data/lib/fisk/instructions/vcvttsd2usi.rb +65 -69
  644. data/lib/fisk/instructions/vcvttss2si.rb +125 -133
  645. data/lib/fisk/instructions/vcvttss2usi.rb +65 -69
  646. data/lib/fisk/instructions/vcvtudq2pd.rb +93 -99
  647. data/lib/fisk/instructions/vcvtudq2ps.rb +94 -100
  648. data/lib/fisk/instructions/vcvtuqq2pd.rb +94 -100
  649. data/lib/fisk/instructions/vcvtuqq2ps.rb +94 -100
  650. data/lib/fisk/instructions/vcvtusi2sd.rb +68 -72
  651. data/lib/fisk/instructions/vcvtusi2ss.rb +69 -73
  652. data/lib/fisk/instructions/vdbpsadbw.rb +111 -117
  653. data/lib/fisk/instructions/vdivpd.rb +164 -174
  654. data/lib/fisk/instructions/vdivps.rb +164 -174
  655. data/lib/fisk/instructions/vdivsd.rb +68 -72
  656. data/lib/fisk/instructions/vdivss.rb +68 -72
  657. data/lib/fisk/instructions/vdppd.rb +39 -41
  658. data/lib/fisk/instructions/vdpps.rb +75 -79
  659. data/lib/fisk/instructions/vexp2pd.rb +34 -36
  660. data/lib/fisk/instructions/vexp2ps.rb +34 -36
  661. data/lib/fisk/instructions/vexpandpd.rb +93 -99
  662. data/lib/fisk/instructions/vexpandps.rb +93 -99
  663. data/lib/fisk/instructions/vextractf128.rb +37 -39
  664. data/lib/fisk/instructions/vextractf32x4.rb +71 -75
  665. data/lib/fisk/instructions/vextractf32x8.rb +37 -39
  666. data/lib/fisk/instructions/vextractf64x2.rb +71 -75
  667. data/lib/fisk/instructions/vextractf64x4.rb +37 -39
  668. data/lib/fisk/instructions/vextracti128.rb +37 -39
  669. data/lib/fisk/instructions/vextracti32x4.rb +71 -75
  670. data/lib/fisk/instructions/vextracti32x8.rb +37 -39
  671. data/lib/fisk/instructions/vextracti64x2.rb +71 -75
  672. data/lib/fisk/instructions/vextracti64x4.rb +37 -39
  673. data/lib/fisk/instructions/vextractps.rb +71 -75
  674. data/lib/fisk/instructions/vfixupimmpd.rb +112 -118
  675. data/lib/fisk/instructions/vfixupimmps.rb +112 -118
  676. data/lib/fisk/instructions/vfixupimmsd.rb +40 -42
  677. data/lib/fisk/instructions/vfixupimmss.rb +40 -42
  678. data/lib/fisk/instructions/vfmadd132pd.rb +164 -174
  679. data/lib/fisk/instructions/vfmadd132ps.rb +164 -174
  680. data/lib/fisk/instructions/vfmadd132sd.rb +68 -72
  681. data/lib/fisk/instructions/vfmadd132ss.rb +68 -72
  682. data/lib/fisk/instructions/vfmadd213pd.rb +164 -174
  683. data/lib/fisk/instructions/vfmadd213ps.rb +164 -174
  684. data/lib/fisk/instructions/vfmadd213sd.rb +68 -72
  685. data/lib/fisk/instructions/vfmadd213ss.rb +68 -72
  686. data/lib/fisk/instructions/vfmadd231pd.rb +164 -174
  687. data/lib/fisk/instructions/vfmadd231ps.rb +164 -174
  688. data/lib/fisk/instructions/vfmadd231sd.rb +68 -72
  689. data/lib/fisk/instructions/vfmadd231ss.rb +68 -72
  690. data/lib/fisk/instructions/vfmaddpd.rb +133 -141
  691. data/lib/fisk/instructions/vfmaddps.rb +133 -141
  692. data/lib/fisk/instructions/vfmaddsd.rb +68 -72
  693. data/lib/fisk/instructions/vfmaddss.rb +68 -72
  694. data/lib/fisk/instructions/vfmaddsub132pd.rb +164 -174
  695. data/lib/fisk/instructions/vfmaddsub132ps.rb +164 -174
  696. data/lib/fisk/instructions/vfmaddsub213pd.rb +164 -174
  697. data/lib/fisk/instructions/vfmaddsub213ps.rb +164 -174
  698. data/lib/fisk/instructions/vfmaddsub231pd.rb +164 -174
  699. data/lib/fisk/instructions/vfmaddsub231ps.rb +164 -174
  700. data/lib/fisk/instructions/vfmaddsubpd.rb +133 -141
  701. data/lib/fisk/instructions/vfmaddsubps.rb +133 -141
  702. data/lib/fisk/instructions/vfmsub132pd.rb +164 -174
  703. data/lib/fisk/instructions/vfmsub132ps.rb +164 -174
  704. data/lib/fisk/instructions/vfmsub132sd.rb +68 -72
  705. data/lib/fisk/instructions/vfmsub132ss.rb +68 -72
  706. data/lib/fisk/instructions/vfmsub213pd.rb +164 -174
  707. data/lib/fisk/instructions/vfmsub213ps.rb +164 -174
  708. data/lib/fisk/instructions/vfmsub213sd.rb +68 -72
  709. data/lib/fisk/instructions/vfmsub213ss.rb +68 -72
  710. data/lib/fisk/instructions/vfmsub231pd.rb +164 -174
  711. data/lib/fisk/instructions/vfmsub231ps.rb +164 -174
  712. data/lib/fisk/instructions/vfmsub231sd.rb +68 -72
  713. data/lib/fisk/instructions/vfmsub231ss.rb +68 -72
  714. data/lib/fisk/instructions/vfmsubadd132pd.rb +164 -174
  715. data/lib/fisk/instructions/vfmsubadd132ps.rb +164 -174
  716. data/lib/fisk/instructions/vfmsubadd213pd.rb +164 -174
  717. data/lib/fisk/instructions/vfmsubadd213ps.rb +164 -174
  718. data/lib/fisk/instructions/vfmsubadd231pd.rb +164 -174
  719. data/lib/fisk/instructions/vfmsubadd231ps.rb +164 -174
  720. data/lib/fisk/instructions/vfmsubaddpd.rb +133 -141
  721. data/lib/fisk/instructions/vfmsubaddps.rb +133 -141
  722. data/lib/fisk/instructions/vfmsubpd.rb +133 -141
  723. data/lib/fisk/instructions/vfmsubps.rb +133 -141
  724. data/lib/fisk/instructions/vfmsubsd.rb +68 -72
  725. data/lib/fisk/instructions/vfmsubss.rb +68 -72
  726. data/lib/fisk/instructions/vfnmadd132pd.rb +164 -174
  727. data/lib/fisk/instructions/vfnmadd132ps.rb +164 -174
  728. data/lib/fisk/instructions/vfnmadd132sd.rb +68 -72
  729. data/lib/fisk/instructions/vfnmadd132ss.rb +68 -72
  730. data/lib/fisk/instructions/vfnmadd213pd.rb +164 -174
  731. data/lib/fisk/instructions/vfnmadd213ps.rb +164 -174
  732. data/lib/fisk/instructions/vfnmadd213sd.rb +68 -72
  733. data/lib/fisk/instructions/vfnmadd213ss.rb +68 -72
  734. data/lib/fisk/instructions/vfnmadd231pd.rb +164 -174
  735. data/lib/fisk/instructions/vfnmadd231ps.rb +164 -174
  736. data/lib/fisk/instructions/vfnmadd231sd.rb +68 -72
  737. data/lib/fisk/instructions/vfnmadd231ss.rb +68 -72
  738. data/lib/fisk/instructions/vfnmaddpd.rb +133 -141
  739. data/lib/fisk/instructions/vfnmaddps.rb +133 -141
  740. data/lib/fisk/instructions/vfnmaddsd.rb +68 -72
  741. data/lib/fisk/instructions/vfnmaddss.rb +68 -72
  742. data/lib/fisk/instructions/vfnmsub132pd.rb +164 -174
  743. data/lib/fisk/instructions/vfnmsub132ps.rb +164 -174
  744. data/lib/fisk/instructions/vfnmsub132sd.rb +68 -72
  745. data/lib/fisk/instructions/vfnmsub132ss.rb +68 -72
  746. data/lib/fisk/instructions/vfnmsub213pd.rb +164 -174
  747. data/lib/fisk/instructions/vfnmsub213ps.rb +164 -174
  748. data/lib/fisk/instructions/vfnmsub213sd.rb +68 -72
  749. data/lib/fisk/instructions/vfnmsub213ss.rb +68 -72
  750. data/lib/fisk/instructions/vfnmsub231pd.rb +164 -174
  751. data/lib/fisk/instructions/vfnmsub231ps.rb +164 -174
  752. data/lib/fisk/instructions/vfnmsub231sd.rb +68 -72
  753. data/lib/fisk/instructions/vfnmsub231ss.rb +68 -72
  754. data/lib/fisk/instructions/vfnmsubpd.rb +133 -141
  755. data/lib/fisk/instructions/vfnmsubps.rb +133 -141
  756. data/lib/fisk/instructions/vfnmsubsd.rb +68 -72
  757. data/lib/fisk/instructions/vfnmsubss.rb +68 -72
  758. data/lib/fisk/instructions/vfpclasspd.rb +105 -111
  759. data/lib/fisk/instructions/vfpclassps.rb +105 -111
  760. data/lib/fisk/instructions/vfpclasssd.rb +37 -39
  761. data/lib/fisk/instructions/vfpclassss.rb +37 -39
  762. data/lib/fisk/instructions/vfrczpd.rb +63 -67
  763. data/lib/fisk/instructions/vfrczps.rb +63 -67
  764. data/lib/fisk/instructions/vfrczsd.rb +33 -35
  765. data/lib/fisk/instructions/vfrczss.rb +33 -35
  766. data/lib/fisk/instructions/vgatherdpd.rb +80 -85
  767. data/lib/fisk/instructions/vgatherdps.rb +80 -85
  768. data/lib/fisk/instructions/vgatherpf0dpd.rb +16 -17
  769. data/lib/fisk/instructions/vgatherpf0dps.rb +16 -17
  770. data/lib/fisk/instructions/vgatherpf0qpd.rb +16 -17
  771. data/lib/fisk/instructions/vgatherpf0qps.rb +16 -17
  772. data/lib/fisk/instructions/vgatherpf1dpd.rb +16 -17
  773. data/lib/fisk/instructions/vgatherpf1dps.rb +16 -17
  774. data/lib/fisk/instructions/vgatherpf1qpd.rb +16 -17
  775. data/lib/fisk/instructions/vgatherpf1qps.rb +16 -17
  776. data/lib/fisk/instructions/vgatherqpd.rb +80 -85
  777. data/lib/fisk/instructions/vgatherqps.rb +80 -85
  778. data/lib/fisk/instructions/vgetexppd.rb +94 -100
  779. data/lib/fisk/instructions/vgetexpps.rb +94 -100
  780. data/lib/fisk/instructions/vgetexpsd.rb +36 -38
  781. data/lib/fisk/instructions/vgetexpss.rb +36 -38
  782. data/lib/fisk/instructions/vgetmantpd.rb +106 -112
  783. data/lib/fisk/instructions/vgetmantps.rb +106 -112
  784. data/lib/fisk/instructions/vgetmantsd.rb +40 -42
  785. data/lib/fisk/instructions/vgetmantss.rb +40 -42
  786. data/lib/fisk/instructions/vhaddpd.rb +67 -71
  787. data/lib/fisk/instructions/vhaddps.rb +67 -71
  788. data/lib/fisk/instructions/vhsubpd.rb +67 -71
  789. data/lib/fisk/instructions/vhsubps.rb +67 -71
  790. data/lib/fisk/instructions/vinsertf128.rb +39 -41
  791. data/lib/fisk/instructions/vinsertf32x4.rb +75 -79
  792. data/lib/fisk/instructions/vinsertf32x8.rb +39 -41
  793. data/lib/fisk/instructions/vinsertf64x2.rb +75 -79
  794. data/lib/fisk/instructions/vinsertf64x4.rb +39 -41
  795. data/lib/fisk/instructions/vinserti128.rb +39 -41
  796. data/lib/fisk/instructions/vinserti32x4.rb +75 -79
  797. data/lib/fisk/instructions/vinserti32x8.rb +39 -41
  798. data/lib/fisk/instructions/vinserti64x2.rb +75 -79
  799. data/lib/fisk/instructions/vinserti64x4.rb +39 -41
  800. data/lib/fisk/instructions/vinsertps.rb +75 -79
  801. data/lib/fisk/instructions/vlddqu.rb +33 -35
  802. data/lib/fisk/instructions/vldmxcsr.rb +16 -17
  803. data/lib/fisk/instructions/vmaskmovdqu.rb +18 -19
  804. data/lib/fisk/instructions/vmaskmovpd.rb +67 -71
  805. data/lib/fisk/instructions/vmaskmovps.rb +67 -71
  806. data/lib/fisk/instructions/vmaxpd.rb +164 -174
  807. data/lib/fisk/instructions/vmaxps.rb +164 -174
  808. data/lib/fisk/instructions/vmaxsd.rb +68 -72
  809. data/lib/fisk/instructions/vmaxss.rb +68 -72
  810. data/lib/fisk/instructions/vminpd.rb +164 -174
  811. data/lib/fisk/instructions/vminps.rb +164 -174
  812. data/lib/fisk/instructions/vminsd.rb +68 -72
  813. data/lib/fisk/instructions/vminss.rb +68 -72
  814. data/lib/fisk/instructions/vmovapd.rb +278 -298
  815. data/lib/fisk/instructions/vmovaps.rb +278 -298
  816. data/lib/fisk/instructions/vmovd.rb +123 -131
  817. data/lib/fisk/instructions/vmovddup.rb +153 -163
  818. data/lib/fisk/instructions/vmovdqa.rb +113 -121
  819. data/lib/fisk/instructions/vmovdqa32.rb +168 -180
  820. data/lib/fisk/instructions/vmovdqa64.rb +168 -180
  821. data/lib/fisk/instructions/vmovdqu.rb +113 -121
  822. data/lib/fisk/instructions/vmovdqu16.rb +168 -180
  823. data/lib/fisk/instructions/vmovdqu32.rb +168 -180
  824. data/lib/fisk/instructions/vmovdqu64.rb +168 -180
  825. data/lib/fisk/instructions/vmovdqu8.rb +168 -180
  826. data/lib/fisk/instructions/vmovhlps.rb +35 -37
  827. data/lib/fisk/instructions/vmovhpd.rb +65 -69
  828. data/lib/fisk/instructions/vmovhps.rb +65 -69
  829. data/lib/fisk/instructions/vmovlhps.rb +35 -37
  830. data/lib/fisk/instructions/vmovlpd.rb +65 -69
  831. data/lib/fisk/instructions/vmovlps.rb +65 -69
  832. data/lib/fisk/instructions/vmovmskpd.rb +33 -35
  833. data/lib/fisk/instructions/vmovmskps.rb +33 -35
  834. data/lib/fisk/instructions/vmovntdq.rb +78 -83
  835. data/lib/fisk/instructions/vmovntdqa.rb +78 -83
  836. data/lib/fisk/instructions/vmovntpd.rb +78 -83
  837. data/lib/fisk/instructions/vmovntps.rb +78 -83
  838. data/lib/fisk/instructions/vmovq.rb +213 -229
  839. data/lib/fisk/instructions/vmovsd.rb +115 -123
  840. data/lib/fisk/instructions/vmovshdup.rb +153 -163
  841. data/lib/fisk/instructions/vmovsldup.rb +153 -163
  842. data/lib/fisk/instructions/vmovss.rb +115 -123
  843. data/lib/fisk/instructions/vmovupd.rb +278 -298
  844. data/lib/fisk/instructions/vmovups.rb +278 -298
  845. data/lib/fisk/instructions/vmpsadbw.rb +75 -79
  846. data/lib/fisk/instructions/vmulpd.rb +164 -174
  847. data/lib/fisk/instructions/vmulps.rb +164 -174
  848. data/lib/fisk/instructions/vmulsd.rb +68 -72
  849. data/lib/fisk/instructions/vmulss.rb +68 -72
  850. data/lib/fisk/instructions/vorpd.rb +163 -173
  851. data/lib/fisk/instructions/vorps.rb +163 -173
  852. data/lib/fisk/instructions/vpabsb.rb +153 -163
  853. data/lib/fisk/instructions/vpabsd.rb +153 -163
  854. data/lib/fisk/instructions/vpabsq.rb +93 -99
  855. data/lib/fisk/instructions/vpabsw.rb +153 -163
  856. data/lib/fisk/instructions/vpackssdw.rb +163 -173
  857. data/lib/fisk/instructions/vpacksswb.rb +163 -173
  858. data/lib/fisk/instructions/vpackusdw.rb +163 -173
  859. data/lib/fisk/instructions/vpackuswb.rb +163 -173
  860. data/lib/fisk/instructions/vpaddb.rb +163 -173
  861. data/lib/fisk/instructions/vpaddd.rb +163 -173
  862. data/lib/fisk/instructions/vpaddq.rb +163 -173
  863. data/lib/fisk/instructions/vpaddsb.rb +163 -173
  864. data/lib/fisk/instructions/vpaddsw.rb +163 -173
  865. data/lib/fisk/instructions/vpaddusb.rb +163 -173
  866. data/lib/fisk/instructions/vpaddusw.rb +163 -173
  867. data/lib/fisk/instructions/vpaddw.rb +163 -173
  868. data/lib/fisk/instructions/vpalignr.rb +183 -193
  869. data/lib/fisk/instructions/vpand.rb +67 -71
  870. data/lib/fisk/instructions/vpandd.rb +99 -105
  871. data/lib/fisk/instructions/vpandn.rb +67 -71
  872. data/lib/fisk/instructions/vpandnd.rb +99 -105
  873. data/lib/fisk/instructions/vpandnq.rb +99 -105
  874. data/lib/fisk/instructions/vpandq.rb +99 -105
  875. data/lib/fisk/instructions/vpavgb.rb +163 -173
  876. data/lib/fisk/instructions/vpavgw.rb +163 -173
  877. data/lib/fisk/instructions/vpblendd.rb +75 -79
  878. data/lib/fisk/instructions/vpblendmb.rb +99 -105
  879. data/lib/fisk/instructions/vpblendmd.rb +99 -105
  880. data/lib/fisk/instructions/vpblendmq.rb +99 -105
  881. data/lib/fisk/instructions/vpblendmw.rb +99 -105
  882. data/lib/fisk/instructions/vpblendvb.rb +75 -79
  883. data/lib/fisk/instructions/vpblendw.rb +75 -79
  884. data/lib/fisk/instructions/vpbroadcastb.rb +198 -211
  885. data/lib/fisk/instructions/vpbroadcastd.rb +198 -211
  886. data/lib/fisk/instructions/vpbroadcastmb2q.rb +48 -51
  887. data/lib/fisk/instructions/vpbroadcastmw2d.rb +48 -51
  888. data/lib/fisk/instructions/vpbroadcastq.rb +198 -211
  889. data/lib/fisk/instructions/vpbroadcastw.rb +198 -211
  890. data/lib/fisk/instructions/vpclmulqdq.rb +39 -41
  891. data/lib/fisk/instructions/vpcmov.rb +133 -141
  892. data/lib/fisk/instructions/vpcmpb.rb +111 -117
  893. data/lib/fisk/instructions/vpcmpd.rb +111 -117
  894. data/lib/fisk/instructions/vpcmpeqb.rb +163 -173
  895. data/lib/fisk/instructions/vpcmpeqd.rb +163 -173
  896. data/lib/fisk/instructions/vpcmpeqq.rb +163 -173
  897. data/lib/fisk/instructions/vpcmpeqw.rb +163 -173
  898. data/lib/fisk/instructions/vpcmpestri.rb +37 -39
  899. data/lib/fisk/instructions/vpcmpestrm.rb +37 -39
  900. data/lib/fisk/instructions/vpcmpgtb.rb +163 -173
  901. data/lib/fisk/instructions/vpcmpgtd.rb +163 -173
  902. data/lib/fisk/instructions/vpcmpgtq.rb +163 -173
  903. data/lib/fisk/instructions/vpcmpgtw.rb +163 -173
  904. data/lib/fisk/instructions/vpcmpistri.rb +37 -39
  905. data/lib/fisk/instructions/vpcmpistrm.rb +37 -39
  906. data/lib/fisk/instructions/vpcmpq.rb +111 -117
  907. data/lib/fisk/instructions/vpcmpub.rb +111 -117
  908. data/lib/fisk/instructions/vpcmpud.rb +111 -117
  909. data/lib/fisk/instructions/vpcmpuq.rb +111 -117
  910. data/lib/fisk/instructions/vpcmpuw.rb +111 -117
  911. data/lib/fisk/instructions/vpcmpw.rb +111 -117
  912. data/lib/fisk/instructions/vpcomb.rb +39 -41
  913. data/lib/fisk/instructions/vpcomd.rb +39 -41
  914. data/lib/fisk/instructions/vpcompressd.rb +93 -99
  915. data/lib/fisk/instructions/vpcompressq.rb +93 -99
  916. data/lib/fisk/instructions/vpcomq.rb +39 -41
  917. data/lib/fisk/instructions/vpcomub.rb +39 -41
  918. data/lib/fisk/instructions/vpcomud.rb +39 -41
  919. data/lib/fisk/instructions/vpcomuq.rb +39 -41
  920. data/lib/fisk/instructions/vpcomuw.rb +39 -41
  921. data/lib/fisk/instructions/vpcomw.rb +39 -41
  922. data/lib/fisk/instructions/vpconflictd.rb +93 -99
  923. data/lib/fisk/instructions/vpconflictq.rb +93 -99
  924. data/lib/fisk/instructions/vperm2f128.rb +39 -41
  925. data/lib/fisk/instructions/vperm2i128.rb +39 -41
  926. data/lib/fisk/instructions/vpermb.rb +99 -105
  927. data/lib/fisk/instructions/vpermd.rb +99 -105
  928. data/lib/fisk/instructions/vpermi2b.rb +99 -105
  929. data/lib/fisk/instructions/vpermi2d.rb +99 -105
  930. data/lib/fisk/instructions/vpermi2pd.rb +99 -105
  931. data/lib/fisk/instructions/vpermi2ps.rb +99 -105
  932. data/lib/fisk/instructions/vpermi2q.rb +99 -105
  933. data/lib/fisk/instructions/vpermi2w.rb +99 -105
  934. data/lib/fisk/instructions/vpermil2pd.rb +139 -147
  935. data/lib/fisk/instructions/vpermil2ps.rb +139 -147
  936. data/lib/fisk/instructions/vpermilpd.rb +333 -353
  937. data/lib/fisk/instructions/vpermilps.rb +333 -353
  938. data/lib/fisk/instructions/vpermpd.rb +169 -179
  939. data/lib/fisk/instructions/vpermps.rb +99 -105
  940. data/lib/fisk/instructions/vpermq.rb +169 -179
  941. data/lib/fisk/instructions/vpermt2b.rb +99 -105
  942. data/lib/fisk/instructions/vpermt2d.rb +99 -105
  943. data/lib/fisk/instructions/vpermt2pd.rb +99 -105
  944. data/lib/fisk/instructions/vpermt2ps.rb +99 -105
  945. data/lib/fisk/instructions/vpermt2q.rb +99 -105
  946. data/lib/fisk/instructions/vpermt2w.rb +99 -105
  947. data/lib/fisk/instructions/vpermw.rb +99 -105
  948. data/lib/fisk/instructions/vpexpandd.rb +93 -99
  949. data/lib/fisk/instructions/vpexpandq.rb +93 -99
  950. data/lib/fisk/instructions/vpextrb.rb +71 -75
  951. data/lib/fisk/instructions/vpextrd.rb +71 -75
  952. data/lib/fisk/instructions/vpextrq.rb +71 -75
  953. data/lib/fisk/instructions/vpextrw.rb +93 -99
  954. data/lib/fisk/instructions/vpgatherdd.rb +80 -85
  955. data/lib/fisk/instructions/vpgatherdq.rb +80 -85
  956. data/lib/fisk/instructions/vpgatherqd.rb +80 -85
  957. data/lib/fisk/instructions/vpgatherqq.rb +80 -85
  958. data/lib/fisk/instructions/vphaddbd.rb +33 -35
  959. data/lib/fisk/instructions/vphaddbq.rb +33 -35
  960. data/lib/fisk/instructions/vphaddbw.rb +33 -35
  961. data/lib/fisk/instructions/vphaddd.rb +67 -71
  962. data/lib/fisk/instructions/vphadddq.rb +33 -35
  963. data/lib/fisk/instructions/vphaddsw.rb +67 -71
  964. data/lib/fisk/instructions/vphaddubd.rb +33 -35
  965. data/lib/fisk/instructions/vphaddubq.rb +33 -35
  966. data/lib/fisk/instructions/vphaddubw.rb +33 -35
  967. data/lib/fisk/instructions/vphaddudq.rb +33 -35
  968. data/lib/fisk/instructions/vphadduwd.rb +33 -35
  969. data/lib/fisk/instructions/vphadduwq.rb +33 -35
  970. data/lib/fisk/instructions/vphaddw.rb +67 -71
  971. data/lib/fisk/instructions/vphaddwd.rb +33 -35
  972. data/lib/fisk/instructions/vphaddwq.rb +33 -35
  973. data/lib/fisk/instructions/vphminposuw.rb +33 -35
  974. data/lib/fisk/instructions/vphsubbw.rb +33 -35
  975. data/lib/fisk/instructions/vphsubd.rb +67 -71
  976. data/lib/fisk/instructions/vphsubdq.rb +33 -35
  977. data/lib/fisk/instructions/vphsubsw.rb +67 -71
  978. data/lib/fisk/instructions/vphsubw.rb +67 -71
  979. data/lib/fisk/instructions/vphsubwd.rb +33 -35
  980. data/lib/fisk/instructions/vpinsrb.rb +75 -79
  981. data/lib/fisk/instructions/vpinsrd.rb +75 -79
  982. data/lib/fisk/instructions/vpinsrq.rb +75 -79
  983. data/lib/fisk/instructions/vpinsrw.rb +75 -79
  984. data/lib/fisk/instructions/vplzcntd.rb +93 -99
  985. data/lib/fisk/instructions/vplzcntq.rb +93 -99
  986. data/lib/fisk/instructions/vpmacsdd.rb +39 -41
  987. data/lib/fisk/instructions/vpmacsdqh.rb +39 -41
  988. data/lib/fisk/instructions/vpmacsdql.rb +39 -41
  989. data/lib/fisk/instructions/vpmacssdd.rb +39 -41
  990. data/lib/fisk/instructions/vpmacssdqh.rb +39 -41
  991. data/lib/fisk/instructions/vpmacssdql.rb +39 -41
  992. data/lib/fisk/instructions/vpmacsswd.rb +39 -41
  993. data/lib/fisk/instructions/vpmacssww.rb +39 -41
  994. data/lib/fisk/instructions/vpmacswd.rb +39 -41
  995. data/lib/fisk/instructions/vpmacsww.rb +39 -41
  996. data/lib/fisk/instructions/vpmadcsswd.rb +39 -41
  997. data/lib/fisk/instructions/vpmadcswd.rb +39 -41
  998. data/lib/fisk/instructions/vpmadd52huq.rb +99 -105
  999. data/lib/fisk/instructions/vpmadd52luq.rb +99 -105
  1000. data/lib/fisk/instructions/vpmaddubsw.rb +163 -173
  1001. data/lib/fisk/instructions/vpmaddwd.rb +163 -173
  1002. data/lib/fisk/instructions/vpmaskmovd.rb +67 -71
  1003. data/lib/fisk/instructions/vpmaskmovq.rb +67 -71
  1004. data/lib/fisk/instructions/vpmaxsb.rb +163 -173
  1005. data/lib/fisk/instructions/vpmaxsd.rb +163 -173
  1006. data/lib/fisk/instructions/vpmaxsq.rb +99 -105
  1007. data/lib/fisk/instructions/vpmaxsw.rb +163 -173
  1008. data/lib/fisk/instructions/vpmaxub.rb +163 -173
  1009. data/lib/fisk/instructions/vpmaxud.rb +163 -173
  1010. data/lib/fisk/instructions/vpmaxuq.rb +99 -105
  1011. data/lib/fisk/instructions/vpmaxuw.rb +163 -173
  1012. data/lib/fisk/instructions/vpminsb.rb +163 -173
  1013. data/lib/fisk/instructions/vpminsd.rb +163 -173
  1014. data/lib/fisk/instructions/vpminsq.rb +99 -105
  1015. data/lib/fisk/instructions/vpminsw.rb +163 -173
  1016. data/lib/fisk/instructions/vpminub.rb +163 -173
  1017. data/lib/fisk/instructions/vpminud.rb +163 -173
  1018. data/lib/fisk/instructions/vpminuq.rb +99 -105
  1019. data/lib/fisk/instructions/vpminuw.rb +163 -173
  1020. data/lib/fisk/instructions/vpmovb2m.rb +48 -51
  1021. data/lib/fisk/instructions/vpmovd2m.rb +48 -51
  1022. data/lib/fisk/instructions/vpmovdb.rb +93 -99
  1023. data/lib/fisk/instructions/vpmovdw.rb +93 -99
  1024. data/lib/fisk/instructions/vpmovm2b.rb +48 -51
  1025. data/lib/fisk/instructions/vpmovm2d.rb +48 -51
  1026. data/lib/fisk/instructions/vpmovm2q.rb +48 -51
  1027. data/lib/fisk/instructions/vpmovm2w.rb +48 -51
  1028. data/lib/fisk/instructions/vpmovmskb.rb +33 -35
  1029. data/lib/fisk/instructions/vpmovq2m.rb +48 -51
  1030. data/lib/fisk/instructions/vpmovqb.rb +93 -99
  1031. data/lib/fisk/instructions/vpmovqd.rb +93 -99
  1032. data/lib/fisk/instructions/vpmovqw.rb +93 -99
  1033. data/lib/fisk/instructions/vpmovsdb.rb +93 -99
  1034. data/lib/fisk/instructions/vpmovsdw.rb +93 -99
  1035. data/lib/fisk/instructions/vpmovsqb.rb +93 -99
  1036. data/lib/fisk/instructions/vpmovsqd.rb +93 -99
  1037. data/lib/fisk/instructions/vpmovsqw.rb +93 -99
  1038. data/lib/fisk/instructions/vpmovswb.rb +93 -99
  1039. data/lib/fisk/instructions/vpmovsxbd.rb +153 -163
  1040. data/lib/fisk/instructions/vpmovsxbq.rb +153 -163
  1041. data/lib/fisk/instructions/vpmovsxbw.rb +153 -163
  1042. data/lib/fisk/instructions/vpmovsxdq.rb +153 -163
  1043. data/lib/fisk/instructions/vpmovsxwd.rb +153 -163
  1044. data/lib/fisk/instructions/vpmovsxwq.rb +153 -163
  1045. data/lib/fisk/instructions/vpmovusdb.rb +93 -99
  1046. data/lib/fisk/instructions/vpmovusdw.rb +93 -99
  1047. data/lib/fisk/instructions/vpmovusqb.rb +93 -99
  1048. data/lib/fisk/instructions/vpmovusqd.rb +93 -99
  1049. data/lib/fisk/instructions/vpmovusqw.rb +93 -99
  1050. data/lib/fisk/instructions/vpmovuswb.rb +93 -99
  1051. data/lib/fisk/instructions/vpmovw2m.rb +48 -51
  1052. data/lib/fisk/instructions/vpmovwb.rb +93 -99
  1053. data/lib/fisk/instructions/vpmovzxbd.rb +153 -163
  1054. data/lib/fisk/instructions/vpmovzxbq.rb +153 -163
  1055. data/lib/fisk/instructions/vpmovzxbw.rb +153 -163
  1056. data/lib/fisk/instructions/vpmovzxdq.rb +153 -163
  1057. data/lib/fisk/instructions/vpmovzxwd.rb +153 -163
  1058. data/lib/fisk/instructions/vpmovzxwq.rb +153 -163
  1059. data/lib/fisk/instructions/vpmuldq.rb +163 -173
  1060. data/lib/fisk/instructions/vpmulhrsw.rb +163 -173
  1061. data/lib/fisk/instructions/vpmulhuw.rb +163 -173
  1062. data/lib/fisk/instructions/vpmulhw.rb +163 -173
  1063. data/lib/fisk/instructions/vpmulld.rb +163 -173
  1064. data/lib/fisk/instructions/vpmullq.rb +99 -105
  1065. data/lib/fisk/instructions/vpmullw.rb +163 -173
  1066. data/lib/fisk/instructions/vpmultishiftqb.rb +99 -105
  1067. data/lib/fisk/instructions/vpmuludq.rb +163 -173
  1068. data/lib/fisk/instructions/vpopcntd.rb +33 -35
  1069. data/lib/fisk/instructions/vpopcntq.rb +33 -35
  1070. data/lib/fisk/instructions/vpor.rb +67 -71
  1071. data/lib/fisk/instructions/vpord.rb +99 -105
  1072. data/lib/fisk/instructions/vporq.rb +99 -105
  1073. data/lib/fisk/instructions/vpperm.rb +68 -72
  1074. data/lib/fisk/instructions/vprold.rb +99 -105
  1075. data/lib/fisk/instructions/vprolq.rb +99 -105
  1076. data/lib/fisk/instructions/vprolvd.rb +99 -105
  1077. data/lib/fisk/instructions/vprolvq.rb +99 -105
  1078. data/lib/fisk/instructions/vprord.rb +99 -105
  1079. data/lib/fisk/instructions/vprorq.rb +99 -105
  1080. data/lib/fisk/instructions/vprorvd.rb +99 -105
  1081. data/lib/fisk/instructions/vprorvq.rb +99 -105
  1082. data/lib/fisk/instructions/vprotb.rb +95 -101
  1083. data/lib/fisk/instructions/vprotd.rb +95 -101
  1084. data/lib/fisk/instructions/vprotq.rb +95 -101
  1085. data/lib/fisk/instructions/vprotw.rb +95 -101
  1086. data/lib/fisk/instructions/vpsadbw.rb +163 -173
  1087. data/lib/fisk/instructions/vpscatterdd.rb +48 -51
  1088. data/lib/fisk/instructions/vpscatterdq.rb +48 -51
  1089. data/lib/fisk/instructions/vpscatterqd.rb +48 -51
  1090. data/lib/fisk/instructions/vpscatterqq.rb +48 -51
  1091. data/lib/fisk/instructions/vpshab.rb +61 -65
  1092. data/lib/fisk/instructions/vpshad.rb +61 -65
  1093. data/lib/fisk/instructions/vpshaq.rb +61 -65
  1094. data/lib/fisk/instructions/vpshaw.rb +61 -65
  1095. data/lib/fisk/instructions/vpshlb.rb +61 -65
  1096. data/lib/fisk/instructions/vpshld.rb +61 -65
  1097. data/lib/fisk/instructions/vpshlq.rb +61 -65
  1098. data/lib/fisk/instructions/vpshlw.rb +61 -65
  1099. data/lib/fisk/instructions/vpshufb.rb +163 -173
  1100. data/lib/fisk/instructions/vpshufd.rb +173 -183
  1101. data/lib/fisk/instructions/vpshufhw.rb +173 -183
  1102. data/lib/fisk/instructions/vpshuflw.rb +173 -183
  1103. data/lib/fisk/instructions/vpsignb.rb +67 -71
  1104. data/lib/fisk/instructions/vpsignd.rb +67 -71
  1105. data/lib/fisk/instructions/vpsignw.rb +67 -71
  1106. data/lib/fisk/instructions/vpslld.rb +291 -309
  1107. data/lib/fisk/instructions/vpslldq.rb +131 -139
  1108. data/lib/fisk/instructions/vpsllq.rb +291 -309
  1109. data/lib/fisk/instructions/vpsllvd.rb +163 -173
  1110. data/lib/fisk/instructions/vpsllvq.rb +163 -173
  1111. data/lib/fisk/instructions/vpsllvw.rb +99 -105
  1112. data/lib/fisk/instructions/vpsllw.rb +291 -309
  1113. data/lib/fisk/instructions/vpsrad.rb +291 -309
  1114. data/lib/fisk/instructions/vpsraq.rb +195 -207
  1115. data/lib/fisk/instructions/vpsravd.rb +163 -173
  1116. data/lib/fisk/instructions/vpsravq.rb +99 -105
  1117. data/lib/fisk/instructions/vpsravw.rb +99 -105
  1118. data/lib/fisk/instructions/vpsraw.rb +291 -309
  1119. data/lib/fisk/instructions/vpsrld.rb +291 -309
  1120. data/lib/fisk/instructions/vpsrldq.rb +131 -139
  1121. data/lib/fisk/instructions/vpsrlq.rb +291 -309
  1122. data/lib/fisk/instructions/vpsrlvd.rb +163 -173
  1123. data/lib/fisk/instructions/vpsrlvq.rb +163 -173
  1124. data/lib/fisk/instructions/vpsrlvw.rb +99 -105
  1125. data/lib/fisk/instructions/vpsrlw.rb +291 -309
  1126. data/lib/fisk/instructions/vpsubb.rb +163 -173
  1127. data/lib/fisk/instructions/vpsubd.rb +163 -173
  1128. data/lib/fisk/instructions/vpsubq.rb +163 -173
  1129. data/lib/fisk/instructions/vpsubsb.rb +163 -173
  1130. data/lib/fisk/instructions/vpsubsw.rb +163 -173
  1131. data/lib/fisk/instructions/vpsubusb.rb +163 -173
  1132. data/lib/fisk/instructions/vpsubusw.rb +163 -173
  1133. data/lib/fisk/instructions/vpsubw.rb +163 -173
  1134. data/lib/fisk/instructions/vpternlogd.rb +111 -117
  1135. data/lib/fisk/instructions/vpternlogq.rb +111 -117
  1136. data/lib/fisk/instructions/vptest.rb +63 -67
  1137. data/lib/fisk/instructions/vptestmb.rb +99 -105
  1138. data/lib/fisk/instructions/vptestmd.rb +99 -105
  1139. data/lib/fisk/instructions/vptestmq.rb +99 -105
  1140. data/lib/fisk/instructions/vptestmw.rb +99 -105
  1141. data/lib/fisk/instructions/vptestnmb.rb +99 -105
  1142. data/lib/fisk/instructions/vptestnmd.rb +99 -105
  1143. data/lib/fisk/instructions/vptestnmq.rb +99 -105
  1144. data/lib/fisk/instructions/vptestnmw.rb +99 -105
  1145. data/lib/fisk/instructions/vpunpckhbw.rb +163 -173
  1146. data/lib/fisk/instructions/vpunpckhdq.rb +163 -173
  1147. data/lib/fisk/instructions/vpunpckhqdq.rb +163 -173
  1148. data/lib/fisk/instructions/vpunpckhwd.rb +163 -173
  1149. data/lib/fisk/instructions/vpunpcklbw.rb +163 -173
  1150. data/lib/fisk/instructions/vpunpckldq.rb +163 -173
  1151. data/lib/fisk/instructions/vpunpcklqdq.rb +163 -173
  1152. data/lib/fisk/instructions/vpunpcklwd.rb +163 -173
  1153. data/lib/fisk/instructions/vpxor.rb +67 -71
  1154. data/lib/fisk/instructions/vpxord.rb +99 -105
  1155. data/lib/fisk/instructions/vpxorq.rb +99 -105
  1156. data/lib/fisk/instructions/vrangepd.rb +112 -118
  1157. data/lib/fisk/instructions/vrangeps.rb +112 -118
  1158. data/lib/fisk/instructions/vrangesd.rb +40 -42
  1159. data/lib/fisk/instructions/vrangess.rb +40 -42
  1160. data/lib/fisk/instructions/vrcp14pd.rb +93 -99
  1161. data/lib/fisk/instructions/vrcp14ps.rb +93 -99
  1162. data/lib/fisk/instructions/vrcp14sd.rb +35 -37
  1163. data/lib/fisk/instructions/vrcp14ss.rb +35 -37
  1164. data/lib/fisk/instructions/vrcp28pd.rb +34 -36
  1165. data/lib/fisk/instructions/vrcp28ps.rb +34 -36
  1166. data/lib/fisk/instructions/vrcp28sd.rb +36 -38
  1167. data/lib/fisk/instructions/vrcp28ss.rb +36 -38
  1168. data/lib/fisk/instructions/vrcpps.rb +63 -67
  1169. data/lib/fisk/instructions/vrcpss.rb +35 -37
  1170. data/lib/fisk/instructions/vreducepd.rb +105 -111
  1171. data/lib/fisk/instructions/vreduceps.rb +105 -111
  1172. data/lib/fisk/instructions/vreducesd.rb +39 -41
  1173. data/lib/fisk/instructions/vreducess.rb +39 -41
  1174. data/lib/fisk/instructions/vrndscalepd.rb +106 -112
  1175. data/lib/fisk/instructions/vrndscaleps.rb +106 -112
  1176. data/lib/fisk/instructions/vrndscalesd.rb +40 -42
  1177. data/lib/fisk/instructions/vrndscaless.rb +40 -42
  1178. data/lib/fisk/instructions/vroundpd.rb +71 -75
  1179. data/lib/fisk/instructions/vroundps.rb +71 -75
  1180. data/lib/fisk/instructions/vroundsd.rb +39 -41
  1181. data/lib/fisk/instructions/vroundss.rb +39 -41
  1182. data/lib/fisk/instructions/vrsqrt14pd.rb +93 -99
  1183. data/lib/fisk/instructions/vrsqrt14ps.rb +93 -99
  1184. data/lib/fisk/instructions/vrsqrt14sd.rb +35 -37
  1185. data/lib/fisk/instructions/vrsqrt14ss.rb +35 -37
  1186. data/lib/fisk/instructions/vrsqrt28pd.rb +34 -36
  1187. data/lib/fisk/instructions/vrsqrt28ps.rb +34 -36
  1188. data/lib/fisk/instructions/vrsqrt28sd.rb +36 -38
  1189. data/lib/fisk/instructions/vrsqrt28ss.rb +36 -38
  1190. data/lib/fisk/instructions/vrsqrtps.rb +63 -67
  1191. data/lib/fisk/instructions/vrsqrtss.rb +35 -37
  1192. data/lib/fisk/instructions/vscalefpd.rb +100 -106
  1193. data/lib/fisk/instructions/vscalefps.rb +100 -106
  1194. data/lib/fisk/instructions/vscalefsd.rb +36 -38
  1195. data/lib/fisk/instructions/vscalefss.rb +36 -38
  1196. data/lib/fisk/instructions/vscatterdpd.rb +48 -51
  1197. data/lib/fisk/instructions/vscatterdps.rb +48 -51
  1198. data/lib/fisk/instructions/vscatterpf0dpd.rb +16 -17
  1199. data/lib/fisk/instructions/vscatterpf0dps.rb +16 -17
  1200. data/lib/fisk/instructions/vscatterpf0qpd.rb +16 -17
  1201. data/lib/fisk/instructions/vscatterpf0qps.rb +16 -17
  1202. data/lib/fisk/instructions/vscatterpf1dpd.rb +16 -17
  1203. data/lib/fisk/instructions/vscatterpf1dps.rb +16 -17
  1204. data/lib/fisk/instructions/vscatterpf1qpd.rb +16 -17
  1205. data/lib/fisk/instructions/vscatterpf1qps.rb +16 -17
  1206. data/lib/fisk/instructions/vscatterqpd.rb +48 -51
  1207. data/lib/fisk/instructions/vscatterqps.rb +48 -51
  1208. data/lib/fisk/instructions/vshuff32x4.rb +75 -79
  1209. data/lib/fisk/instructions/vshuff64x2.rb +75 -79
  1210. data/lib/fisk/instructions/vshufi32x4.rb +75 -79
  1211. data/lib/fisk/instructions/vshufi64x2.rb +75 -79
  1212. data/lib/fisk/instructions/vshufpd.rb +183 -193
  1213. data/lib/fisk/instructions/vshufps.rb +183 -193
  1214. data/lib/fisk/instructions/vsqrtpd.rb +154 -164
  1215. data/lib/fisk/instructions/vsqrtps.rb +154 -164
  1216. data/lib/fisk/instructions/vsqrtsd.rb +68 -72
  1217. data/lib/fisk/instructions/vsqrtss.rb +68 -72
  1218. data/lib/fisk/instructions/vstmxcsr.rb +16 -17
  1219. data/lib/fisk/instructions/vsubpd.rb +164 -174
  1220. data/lib/fisk/instructions/vsubps.rb +164 -174
  1221. data/lib/fisk/instructions/vsubsd.rb +68 -72
  1222. data/lib/fisk/instructions/vsubss.rb +68 -72
  1223. data/lib/fisk/instructions/vtestpd.rb +63 -67
  1224. data/lib/fisk/instructions/vtestps.rb +63 -67
  1225. data/lib/fisk/instructions/vucomisd.rb +64 -68
  1226. data/lib/fisk/instructions/vucomiss.rb +64 -68
  1227. data/lib/fisk/instructions/vunpckhpd.rb +163 -173
  1228. data/lib/fisk/instructions/vunpckhps.rb +163 -173
  1229. data/lib/fisk/instructions/vunpcklpd.rb +163 -173
  1230. data/lib/fisk/instructions/vunpcklps.rb +163 -173
  1231. data/lib/fisk/instructions/vxorpd.rb +163 -173
  1232. data/lib/fisk/instructions/vxorps.rb +163 -173
  1233. data/lib/fisk/instructions/vzeroall.rb +13 -14
  1234. data/lib/fisk/instructions/vzeroupper.rb +13 -14
  1235. data/lib/fisk/instructions/xadd.rb +153 -161
  1236. data/lib/fisk/instructions/xchg.rb +355 -377
  1237. data/lib/fisk/instructions/xgetbv.rb +14 -15
  1238. data/lib/fisk/instructions/xlatb.rb +23 -25
  1239. data/lib/fisk/instructions/xor.rb +561 -595
  1240. data/lib/fisk/instructions/xorpd.rb +42 -44
  1241. data/lib/fisk/instructions/xorps.rb +40 -42
  1242. data/lib/fisk/instructions.rb +30 -8
  1243. data/lib/fisk/version.rb +3 -0
  1244. data/lib/fisk.rb +706 -120
  1245. data/test/helper.rb +17 -0
  1246. data/test/test_cfg.rb +245 -0
  1247. data/test/test_fisk.rb +480 -4
  1248. data/test/test_fisk_written_size.rb +26 -0
  1249. data/test/test_performance_check.rb +32 -0
  1250. data/test/test_register_allocation.rb +220 -0
  1251. data/test/test_run_fisk.rb +148 -6
  1252. metadata +72 -3
data/lib/fisk.rb CHANGED
@@ -1,34 +1,198 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "stringio"
4
+ require "set"
5
+
4
6
  require "fisk/instructions"
7
+ require "fisk/basic_block"
8
+ require "fisk/errors"
9
+ require "fisk/version"
5
10
 
6
11
  class Fisk
7
- class Operand < Struct.new(:value)
8
- def type; value; end
9
- def works? type; self.type == type; end
10
- def unknown_label?; false; end
12
+ module OperandPredicates
13
+ def unresolved?; false; end
14
+ def register?; false; end
15
+ def temp_register?; false; end
11
16
  def extended_register?; false; end
12
- def m64?; false; end
17
+ def memory?; false; end
18
+ def rip?; false; end
19
+ def immediate?; false; end
20
+ def absolute_location?; false; end
21
+ end
22
+
23
+ module OperandSize
24
+ def compute_size type
25
+ return 128 if type.start_with?('xmm')
26
+
27
+ bits = type[/^r(\d+)$/, 1]&.to_i
28
+
29
+ if bits.nil?
30
+ raise ArgumentError, "Unexpected register type (#{type}); 'r<bits>' expected"
31
+ elsif bits % 8 != 0
32
+ raise ArgumentError, "Unexpected register size (#{bits}); multiple of 8 expected"
33
+ else
34
+ bits
35
+ end
36
+ end
37
+ end
38
+
39
+ class Operand
40
+ include OperandPredicates
41
+
42
+ def works? op
43
+ self.type == op.type
44
+ end
45
+
46
+ def rex_value
47
+ value >> 3
48
+ end
49
+
50
+ def op_value
51
+ value
52
+ end
53
+ end
54
+
55
+ class ValueOperand < Operand
56
+ attr_reader :value
57
+ alias :type :value
58
+
59
+ def initialize value
60
+ @value = value
61
+ end
13
62
  end
14
63
 
15
64
  module Registers
16
65
  class Register < Operand
17
- attr_reader :name, :type
66
+ include OperandSize
67
+
68
+ attr_reader :name, :type, :value, :size
18
69
 
19
70
  def initialize name, type, value
20
71
  @name = name
21
72
  @type = type
22
- super(value)
73
+ @value = value
74
+ @size = compute_size(type)
23
75
  end
24
76
 
25
- def works? type
77
+ def works? op
78
+ type = op.type
26
79
  type == self.name || type == self.type
27
80
  end
28
81
 
29
- def extended_register?; value > 7; end
82
+ def op_value
83
+ value
84
+ end
85
+
86
+ def extended_register?
87
+ @value > 7 || EXTENDED_R8.include?(self)
88
+ end
89
+
90
+ def register?; true; end
91
+
92
+ def to_register
93
+ self
94
+ end
95
+ end
96
+
97
+ class Rip < Operand
98
+ attr_accessor :displacement
99
+
100
+ def initialize displacement
101
+ @displacement = displacement
102
+ end
103
+
104
+ def works? op
105
+ type = op.type
106
+ type == "m64" || type == "m"
107
+ end
108
+
109
+ def unresolved?
110
+ @displacement.is_a?(Fisk::UnknownLabel)
111
+ end
112
+
113
+ def memory?; true; end
114
+ def rip?; true; end
115
+
116
+ def rex_value
117
+ 0x0
118
+ end
119
+
120
+ def op_value
121
+ 0x0
122
+ end
123
+ end
124
+
125
+ class Temp < Operand
126
+ include OperandSize
127
+
128
+ attr_reader :name, :type, :size
129
+ attr_accessor :register, :start_point, :end_point
130
+
131
+ def initialize name, type
132
+ @name = name
133
+ @type = type
134
+ @start_point = nil
135
+ @end_point = nil
136
+ @size = compute_size(type)
137
+ end
138
+
139
+ def temp_register?; true; end
140
+ def register?; true; end
141
+
142
+ def op_value
143
+ reg.op_value
144
+ end
145
+
146
+ def extended_register?
147
+ reg.extended_register?
148
+ end
149
+
150
+ def rex_value
151
+ reg.rex_value
152
+ end
153
+
154
+ def value
155
+ reg.value
156
+ end
157
+
158
+ def to_register
159
+ self
160
+ end
161
+
162
+ def reg
163
+ unless @register
164
+ raise Errors::UnassignedRegister, "Temporary register #{name} hasn't been assigned a real register"
165
+ end
166
+
167
+ @register
168
+ end
30
169
  end
31
170
 
171
+ AL = Register.new "al", "r8", 0
172
+ CL = Register.new "cl", "r8", 1
173
+ DL = Register.new "dl", "r8", 2
174
+ BL = Register.new "bl", "r8", 3
175
+
176
+ SPL = Register.new "spl", "r8", 4
177
+ BPL = Register.new "bpl", "r8", 5
178
+ SIL = Register.new "sil", "r8", 6
179
+ DIL = Register.new "dil", "r8", 7
180
+ EXTENDED_R8 = [SPL, BPL, SIL, DIL]
181
+
182
+ AH = Register.new "ah", "r8", 4
183
+ CH = Register.new "ch", "r8", 5
184
+ DH = Register.new "dh", "r8", 6
185
+ BH = Register.new "bh", "r8", 7
186
+
187
+ AX = Register.new "ax", "r16", 0
188
+ CX = Register.new "cx", "r16", 1
189
+ DX = Register.new "dx", "r16", 2
190
+ BX = Register.new "bx", "r16", 3
191
+ SP = Register.new "sp", "r16", 4
192
+ BP = Register.new "bp", "r16", 5
193
+ SI = Register.new "si", "r16", 6
194
+ DI = Register.new "di", "r16", 7
195
+
32
196
  EAX = Register.new "eax", "r32", 0
33
197
  ECX = Register.new "ecx", "r32", 1
34
198
  EDX = Register.new "edx", "r32", 2
@@ -49,117 +213,175 @@ class Fisk
49
213
  8.times do |i|
50
214
  i += 8
51
215
  const_set "R#{i}", Register.new("r#{i}", "r64", i)
216
+ const_set "R#{i}D", Register.new("r#{i}d", "r32", i)
217
+ const_set "R#{i}W", Register.new("r#{i}w", "r16", i)
218
+ const_set "R#{i}B", Register.new("r#{i}b", "r8", i)
52
219
  end
53
- end
54
220
 
221
+ # List of *caller* saved registers for the C calling convention
222
+ CALLER_SAVED = [ RDI, RSI, RDX, RCX, R8, R9, R10, R11 ]
223
+
224
+ # List of *callee* saved registers for the C calling convention
225
+ CALLEE_SAVED = [ RBX, RSP, RBP, R12, R13, R14, R15 ]
226
+ end
55
227
 
56
- class M64 < Operand
57
- attr_reader :displacement
228
+ class Memory < Operand
229
+ attr_reader :register, :displacement
58
230
 
59
231
  def initialize register, displacement
60
- super(register.value)
61
232
  @register = register
62
233
  @displacement = displacement
63
234
  end
64
235
 
65
- def type
66
- "m64"
236
+ def extended_register?
237
+ @register.extended_register?
238
+ end
239
+
240
+ def value
241
+ @register.value
67
242
  end
68
243
 
69
- def m64?; true; end
244
+ def + displacement
245
+ self.class.new(register, self.displacement + displacement)
246
+ end
247
+
248
+ def memory?; true; end
249
+
250
+ def rex_value
251
+ @register.rex_value
252
+ end
70
253
  end
71
254
 
72
- def m64 x, displacement = 0
73
- M64.new x, displacement
255
+ [8, 16, 32, 64].each do |size|
256
+ class_eval <<~eostr, __FILE__, __LINE__ + 1
257
+ class M#{size} < Memory
258
+ def type
259
+ "m#{size}"
260
+ end
261
+
262
+ def size; #{size}; end
263
+ end
264
+
265
+ def m#{size} val, displacement = 0; M#{size}.new(val, displacement); end
266
+ eostr
74
267
  end
75
268
 
76
- class Imm8 < Operand
269
+ class M < Memory
77
270
  def type
78
- "imm8"
271
+ "m"
79
272
  end
80
273
  end
81
274
 
82
- class Imm32 < Operand
83
- def type
84
- "imm32"
85
- end
275
+ def rip displacement = 0
276
+ Registers::Rip.new(displacement)
86
277
  end
87
278
 
88
- class Imm64 < Operand
89
- def type
90
- "imm64"
279
+ def m x, displacement = 0
280
+ M.new x, displacement
281
+ end
282
+
283
+ class ImmediateOperand < ValueOperand
284
+ def immediate?; true; end
285
+
286
+ def works? insn_op
287
+ insn_op.immediate? && size <= insn_op.size
91
288
  end
92
289
  end
93
290
 
94
- class Rel8 < Operand
291
+ # Define all immediate value methods of different sizes
292
+ [8, 16, 32, 64].each do |size|
293
+ class_eval <<~eostr, __FILE__, __LINE__ + 1
294
+ class Imm#{size} < ImmediateOperand
295
+ def type
296
+ "imm#{size}"
297
+ end
298
+
299
+ def size; #{size}; end
300
+ end
301
+
302
+ def imm#{size} val; Imm#{size}.new(val.to_i); end
303
+ eostr
304
+ end
305
+
306
+ class Relative < ValueOperand; end
307
+
308
+ class Rel8 < Relative
95
309
  def type
96
310
  "rel8"
97
311
  end
98
312
  end
99
313
 
100
- class Rel32 < Operand
314
+ class Rel32 < Relative
101
315
  def type
102
316
  "rel32"
103
317
  end
104
318
  end
105
319
 
106
- class MOffs64 < Operand
320
+ class MOffs64 < ValueOperand
107
321
  def type
108
322
  "moffs64"
109
323
  end
110
324
  end
111
325
 
112
- class Lit < Operand
326
+ class Lit < ValueOperand
113
327
  def type
114
328
  value.to_s
115
329
  end
116
330
  end
117
331
 
118
- attr_reader :position
332
+ class UnknownLabel < Operand
333
+ attr_reader :name
119
334
 
120
- def initialize
121
- @instructions = []
122
- @labels = {}
123
- @position = 0
124
- end
335
+ def initialize name
336
+ @name = name
337
+ end
125
338
 
126
- class UnknownLabel < Struct.new(:name)
127
- def works? type
339
+ def works? op
340
+ type = op.type
128
341
  type == "rel32"
129
342
  end
130
343
 
131
- def unknown_label?; true; end
344
+ def unresolved?; true; end
345
+ end
132
346
 
133
- def value
134
- label = assembler.label_for(name)
135
- label.position - (insn.position + insn.bytesize)
136
- end
347
+ module InstructionPredicates
348
+ def retry?; false; end
349
+ def label?; false; end
350
+ def jump?; false; end
351
+ def has_temp_registers?; false; end
352
+ def comment?; false; end
353
+ def lazy?; false; end
137
354
  end
138
355
 
139
356
  class Label < Struct.new(:name)
140
- def label?; true; end
141
- end
357
+ include InstructionPredicates
142
358
 
143
- def label name
144
- UnknownLabel.new(name)
359
+ def label?; true; end
145
360
  end
146
361
 
147
- def make_label name
148
- @instructions << Label.new(name)
149
- end
362
+ class Comment < Struct.new(:message)
363
+ include InstructionPredicates
150
364
 
151
- Registers.constants.grep(/^[A-Z0-9]*$/).each do |const|
152
- val = Registers.const_get const
153
- define_method(const.downcase) { val }
365
+ def comment?; true; end
154
366
  end
155
367
 
156
368
  class Instruction
369
+ include InstructionPredicates
370
+
157
371
  def initialize insn, form, operands
158
372
  @insn = insn
159
373
  @form = form
160
374
  @operands = operands
161
375
  end
162
376
 
377
+ def has_temp_registers?
378
+ @operands.any?(&:temp_register?)
379
+ end
380
+
381
+ def temp_registers
382
+ @operands.find_all(&:temp_register?)
383
+ end
384
+
163
385
  def encodings
164
386
  @form.encodings
165
387
  end
@@ -167,60 +389,140 @@ class Fisk
167
389
  def encode buffer, labels
168
390
  encoding = @form.encodings.first
169
391
  encoding.encode buffer, @operands
392
+ end
393
+ end
394
+
395
+ class UnresolvedRIPInstruction
396
+ include InstructionPredicates
397
+
398
+ def initialize insn, form, operands
399
+ @insn = insn
400
+ @form = form
401
+ @operands = operands
402
+ @retry = false
403
+ @saved_pos = 0
404
+ end
405
+
406
+ def retry?; true; end
407
+
408
+ def encode buffer, labels
409
+ # Use dummy values for any unresolvable operands
410
+ operands = @operands.map do |op|
411
+ if op.rip? && op.unresolved?
412
+ # Try resolving the operands
413
+ if labels.key?(op.displacement.name)
414
+ Registers::Rip.new labels[op.displacement.name] - @saved_pos
415
+ else
416
+ Registers::Rip.new 0x0CAFE
417
+ end
418
+ else
419
+ op
420
+ end
421
+ end
422
+
423
+ @form.encodings.first.encode buffer, operands
424
+ @saved_pos = buffer.pos
425
+ end
426
+ end
427
+
428
+ class AbsoluteJumpInstruction
429
+ include InstructionPredicates
430
+
431
+ def initialize insn, form, operand
432
+ @insn = insn
433
+ @form = form
434
+ @operand = operand
435
+ @must_retry = false
436
+ end
437
+
438
+ def jump?
170
439
  true
171
440
  end
172
441
 
173
- def bytesize
174
- @form.encodings.first.bytesize
442
+ def target
443
+ @operand.name
444
+ end
445
+
446
+ def encode buffer, labels
447
+ form = find_form "rel32"
448
+ encoding = form.encodings.first
449
+ operand_klass = Rel32
450
+
451
+ pos = buffer.pos
452
+ rel_jump = 0xCAFE
453
+ 2.times do
454
+ buffer.seek pos, IO::SEEK_SET
455
+ encoding.encode buffer, [operand_klass.new(rel_jump)]
456
+ rel_jump = @operand.value - buffer.address
457
+ end
175
458
  end
176
459
 
177
- def label?; false; end
460
+ private
461
+
462
+ def find_form form_type
463
+ @insn.forms.find { |form| form.operands.first.type == form_type }
464
+ end
178
465
  end
179
466
 
180
- class UnresolvedInstruction
467
+ class UnresolvedJumpInstruction
468
+ include InstructionPredicates
469
+
181
470
  def initialize insn, form, operand
182
- @insn = insn
183
- @form = form
184
- @operand = operand
185
- @saved_pos = nil
471
+ @insn = insn
472
+ @form = form
473
+ @operand = operand
474
+ @must_retry = false
475
+ end
476
+
477
+ def jump?
478
+ true
479
+ end
480
+
481
+ def target
482
+ @operand.name
483
+ end
484
+
485
+ def retry?
486
+ true
186
487
  end
187
488
 
188
489
  def encode buffer, labels
189
490
  # Estimate by using a rel32 offset
190
- form = find_form "rel32"
191
- encoding = form.encodings.first
192
- operand_klass = Rel32
193
-
194
- if labels.key? @operand.name
195
- if @saved_pos
196
- # Only use rel32 if we saved the position
197
- buffer.seek @saved_pos, IO::SEEK_SET
198
- else
199
- estimated_offset = labels[@operand.name] - (buffer.pos + encoding.bytesize)
491
+ form = find_form "rel32"
492
+ encoding = form.encodings.first
493
+ operand_klass = Rel32
494
+
495
+ if labels.key? target
496
+ unless @must_retry
497
+ estimated_offset = labels[target] - (buffer.pos + 6) # 6 seems like a good length
200
498
 
201
499
  if estimated_offset >= -128 && estimated_offset <= 127
202
500
  # fits in a rel8
203
- operand_klass = Rel8
204
- form = find_form "rel8"
205
- encoding = form.encodings.first
501
+ operand_klass = Rel8
502
+ form = find_form "rel8"
503
+ encoding = form.encodings.first
206
504
  end
207
505
  end
208
506
 
209
- jump_len = -(buffer.pos + encoding.bytesize - labels[@operand.name])
507
+ # We don't know what the size of the jump will be, so just write
508
+ # it out with some dummy data and keep track of the buffer position.
509
+ # Calculate the real jump offset, then rewind and patch the jump with
510
+ # the right location. 😩
511
+ pos = buffer.pos
512
+ encoding.encode buffer, [operand_klass.new(0xFE)]
513
+ jump_len = -(buffer.pos - labels[target])
514
+ buffer.seek pos, IO::SEEK_SET
210
515
  encoding.encode buffer, [operand_klass.new(jump_len)]
211
- true
212
516
  else
213
- # We've hit a label that doesn't exist yet
214
- # Save the buffer position so we can seek back to it later
215
- @saved_pos = buffer.pos
216
- # Write 5 bytes to reserve our spot
217
- encoding.bytesize.times { buffer.putc 0 }
218
- false
517
+ if @must_retry
518
+ # We retried once, but the label wasn't defined
519
+ raise Errors::MissingLabel, "Label `#{target}` was used, but not defined"
520
+ end
521
+ @must_retry = true
522
+ encoding.encode buffer, [operand_klass.new(0x0CAFE)]
219
523
  end
220
524
  end
221
525
 
222
- def label?; false; end
223
-
224
526
  private
225
527
 
226
528
  def find_form form_type
@@ -228,22 +530,210 @@ class Fisk
228
530
  end
229
531
  end
230
532
 
533
+ # params:
534
+ # :check_performance: Raise a SuboptimalPerformance error on write if suboptimal
535
+ # instructions are detected.
536
+ #
537
+ def initialize check_performance: false
538
+ @instructions = []
539
+ @labels = {}
540
+ @check_performance = check_performance
541
+ @performance_warnings = []
542
+ # A set of temp registers recorded as we see them (not at allocation time)
543
+ @temp_registers = Set.new
544
+ yield self if block_given?
545
+ end
546
+
547
+ # Mark a temporary register as "done being used" at this point in the
548
+ # instructions. Using the register after passing the register to this
549
+ # method results in undefined behavior.
550
+ def release_register reg
551
+ if reg.end_point
552
+ raise Errors::AlreadyReleasedError, "register #{reg.name} already released at #{reg.end_point}"
553
+ end
554
+
555
+ reg.end_point = (@instructions.length - 1)
556
+ end
557
+
558
+ # Releases all registers that haven't already been released
559
+ def release_all_registers
560
+ @temp_registers.each do |reg|
561
+ next if reg.end_point
562
+ release_register reg
563
+ end
564
+ end
565
+
566
+ # Return a list of basic blocks for the instructions
567
+ def basic_blocks
568
+ cfg.blocks
569
+ end
570
+
571
+ # Return a cfg for these instructions. The CFG includes connected basic
572
+ # blocks as well as any temporary registers
573
+ def cfg
574
+ CFG.build @instructions
575
+ end
576
+
577
+ # Create a label to be used with jump instructions. For example:
578
+ #
579
+ # fisk.jmp(fisk.label(:foo))
580
+ # fisk.int(lit(3))
581
+ # fisk.put_label(:foo)
582
+ #
583
+ def label name
584
+ UnknownLabel.new(name)
585
+ end
586
+
587
+ Lazy = Struct.new(:block) do # :nodoc:
588
+ include InstructionPredicates
589
+
590
+ def lazy?; true; end
591
+
592
+ def encode buffer, labels
593
+ block.call buffer.pos
594
+ end
595
+ end
596
+
597
+ # Record a block that will be called during instruction encoding. The block
598
+ # will be yielded the current position of the buffer.
599
+ #
600
+ # For example:
601
+ #
602
+ # patch_position = nil
603
+ #
604
+ # fisk.nop
605
+ # fisk.lazy { |pos| patch_location = pos }
606
+ # fisk.jmp(fisk.label(:foo))
607
+ # fisk.lazy { |_|
608
+ # fisk.mov(fisk.r8, fisk.imm64(patch_location))
609
+ # }
610
+ # fisk.write_to(buf)
611
+ #
612
+ # The first lazy block will be yielded the position of the buffer immediately
613
+ # after encoding the `nop` instruction and before encoding the `jmp`
614
+ # instruction. The second lazy block will be yielded to after the `jmp`
615
+ # instruction has been encoded. This gives you a chance to write the buffer
616
+ # position from certain points in to your assembly
617
+ def lazy &block
618
+ @instructions << Lazy.new(block)
619
+ self
620
+ end
621
+
622
+ # Insert a label named +name+ at the current position in the instructions.
623
+ def put_label name
624
+ if @labels.key? name
625
+ raise Errors::LabelAlreadyDefined, "Label `#{name}` is already defined"
626
+ end
627
+ @labels[name] = nil
628
+ @instructions << Label.new(name)
629
+ self
630
+ end
631
+ alias :make_label :put_label
632
+
633
+ # Insert a comment at the current position in the instructions.
634
+ def comment message
635
+ @instructions << Comment.new(message)
636
+ self
637
+ end
638
+
639
+ # Allocate and return a new register. These registers will be replaced with
640
+ # real registers when `assign_registers` is called.
641
+ def register name = "temp"
642
+ Registers::Temp.new name, "r64"
643
+ end
644
+
645
+ # Allocate a register and yield it to the block. The register will be
646
+ # automatically released after the block is finished.
647
+ def with_register name = "temp"
648
+ reg = register(name)
649
+ yield reg
650
+ release_register reg
651
+ end
652
+
653
+ # Assign registers to any temporary registers. Only registers in +list+
654
+ # will be used when selecting register assignments
655
+ def assign_registers list, local: false
656
+ temp_registers = @temp_registers
657
+
658
+ # This mutates the temp registers, setting their end_point based on
659
+ # the CFG
660
+ self.cfg unless local
661
+
662
+ temp_registers.each do |reg|
663
+ unless reg.end_point
664
+ raise Errors::UnreleasedRegisterError, "Register #{reg.name} hasn't been released"
665
+ end
666
+ end
667
+
668
+ temp_registers = temp_registers.sort_by(&:start_point)
669
+
670
+ active = []
671
+ free_registers = list.reverse
672
+ register_count = list.length
673
+
674
+ temp_registers.each do |temp_reg|
675
+ # expire old intervals
676
+ active, dead = active.sort_by(&:end_point).partition do |j|
677
+ j.end_point >= temp_reg.start_point
678
+ end
679
+
680
+ # Add unused registers back to the free register list
681
+ dead.each { |tr| free_registers << tr.register }
682
+
683
+ if active.length == register_count
684
+ raise NotImplementedError, "Register spilled"
685
+ end
686
+
687
+ temp_reg.register = free_registers.pop
688
+ active << temp_reg
689
+ end
690
+ end
691
+
692
+ Registers.constants.grep(/^[A-Z0-9]*$/).each do |const|
693
+ val = Registers.const_get const
694
+ define_method(const.downcase) { val }
695
+ end
696
+
231
697
  include Fisk::Instructions::DSLMethods
232
698
 
233
699
  def moffs64 val
234
700
  MOffs64.new val
235
701
  end
236
702
 
237
- def imm8 val
238
- Imm8.new val
239
- end
240
-
241
- def imm32 val
242
- Imm32.new val
703
+ # Create a signed immediate value of the right width
704
+ def imm val
705
+ val = val.to_i
706
+
707
+ if val >= -0x7F - 1 && val <= 0x7F
708
+ imm8 val
709
+ elsif val >= -0x7FFF - 1 && val <= 0x7FFF
710
+ imm16 val
711
+ elsif val >= -0x7FFFFFFF - 1 && val <= 0x7FFFFFFF
712
+ imm32 val
713
+ elsif val >= -0x7FFFFFFFFFFFFFFF - 1 && val <= 0x7FFFFFFFFFFFFFFF
714
+ imm64 val
715
+ else
716
+ raise ArgumentError, "#{val} is larger than a 64 bit int"
717
+ end
243
718
  end
244
719
 
245
- def imm64 val
246
- Imm64.new val
720
+ # Create an unsigned immediate value of the right width
721
+ def uimm val
722
+ val = val.to_i
723
+
724
+ if val < 0
725
+ raise ArgumentError, "#{val} is negative"
726
+ elsif val <= 0xFF
727
+ imm8 val
728
+ elsif val <= 0xFFFF
729
+ imm16 val
730
+ elsif val <= 0xFFFFFFFF
731
+ imm32 val
732
+ elsif val <= 0xFFFFFFFFFFFFFFFF
733
+ imm64 val
734
+ else
735
+ raise ArgumentError, "#{val} is too large for a 64 bit int"
736
+ end
247
737
  end
248
738
 
249
739
  def rel8 val
@@ -254,75 +744,171 @@ class Fisk
254
744
  Rel32.new val
255
745
  end
256
746
 
747
+ class AbsoluteLocation < Rel32
748
+ def absolute_location?; true; end
749
+ end
750
+
751
+ # Creates an "absolute" location. Use this for JUMP instructions where you
752
+ # know the absolute location but want a relative location calculated later.
753
+ #
754
+ # For example:
755
+ #
756
+ # fisk.jmp fisk.absolute(0xCAFE)
757
+ #
758
+ # The emitted JMP instruction will use a calculated relative address (this is
759
+ # because x64 doesn't have a jump to absolute position).
760
+ def absolute val
761
+ AbsoluteLocation.new val
762
+ end
763
+
257
764
  def lit val
258
- # to_s because we're getting the value from JSON as a string
259
765
  Lit.new val
260
766
  end
261
767
 
262
- def asm buf = StringIO.new(''.b), &block
263
- @position = 0
768
+ # Instance eval's a given block and writes encoded instructions to +buf+.
769
+ # For example:
770
+ #
771
+ # fisk = Fisk.new
772
+ # fisk.asm do
773
+ # mov r9, imm64(32)
774
+ # end
775
+ #
776
+ def asm buf = StringIO.new(''.b), metadata: {}, &block
264
777
  instance_eval(&block)
265
- write_to_buffer buf
778
+ write_to buf, metadata: metadata
266
779
  buf
267
780
  end
268
781
 
269
- def to_binary
782
+ # Encodes all instructions and returns a binary string with the encoded
783
+ # instructions.
784
+ def to_binary(metadata: {})
270
785
  io = StringIO.new ''.b
271
- write_to_buffer io
786
+ write_to io, metadata: metadata
272
787
  io.string
273
788
  end
274
789
 
275
- private
790
+ RetryRequest = Struct.new(:insn, :io_seek_pos)
276
791
 
277
- def write_to_buffer buffer
792
+ # Encode all instructions and write them to +buffer+. +buffer+ should be an
793
+ # IO object.
794
+ # If the performance check is enabled, a runtime error is raised if suboptimal
795
+ # instructions are found.
796
+ def write_to buffer, metadata: {}
278
797
  labels = {}
798
+ comments = {}
279
799
  unresolved = []
280
- @instructions.each do |insn|
800
+ instructions = @instructions.dup
801
+ backup = @instructions.dup
802
+ @instructions.clear
803
+
804
+ while insn = instructions.shift
281
805
  if insn.label?
282
806
  labels[insn.name] = buffer.pos
807
+ elsif insn.comment?
808
+ comments.update({buffer.pos => insn.message}) { |_, *lines| lines.join($/) }
809
+ elsif insn.lazy?
810
+ write_instruction insn, buffer, labels
811
+ instructions.unshift(*@instructions)
812
+ @instructions.clear
283
813
  else
284
- unless insn.encode buffer, labels
285
- unresolved << insn
814
+ if insn.retry?
815
+ retry_req = RetryRequest.new(insn, buffer.pos)
816
+ unresolved << retry_req
286
817
  end
818
+
819
+ write_instruction insn, buffer, labels
287
820
  end
288
821
  end
289
822
 
290
- return if unresolved.empty?
823
+ metadata[:comments] = comments
824
+ @instructions = backup
825
+
826
+ if !unresolved.empty?
827
+ pos = buffer.pos
828
+ unresolved.each do |req|
829
+ insn = req.insn
830
+ buffer.seek req.io_seek_pos, IO::SEEK_SET
831
+ write_instruction insn, buffer, labels
832
+ end
833
+ buffer.seek pos, IO::SEEK_SET
834
+ end
291
835
 
292
- pos = buffer.pos
293
- unresolved.each do |insn|
294
- insn.encode buffer, labels
836
+ if !@performance_warnings.empty?
837
+ raise Errors::SuboptimalPerformance.new(@performance_warnings)
295
838
  end
296
- buffer.seek pos, IO::SEEK_SET
839
+
840
+ buffer
297
841
  end
298
842
 
843
+ # If the performance check is enabled, warnings are added to @performance_warnings.
299
844
  def gen_with_insn insns, params
300
845
  forms = insns.forms.find_all do |insn|
301
846
  if insn.operands.length == params.length
302
847
  params.zip(insn.operands).all? { |want_op, have_op|
303
- want_op.works?(have_op.type)
848
+ want_op.works?(have_op)
304
849
  }
305
850
  else
306
851
  false
307
852
  end
308
853
  end
309
854
 
310
- raise NotImplementedError, "couldn't find instruction #{name}" if forms.length == 0
855
+ if forms.length == 0
856
+ valid_forms = insns.forms.map { |form|
857
+ " #{insns.name} #{form.operands.map(&:type).join(", ")}"
858
+ }.join "\n"
859
+ msg = <<~eostr
860
+ Couldn't find instruction #{insns.name} #{params.map(&:type).join(", ")}
861
+ Valid forms:
862
+ #{valid_forms}
863
+ eostr
864
+ raise Errors::InvalidInstructionError, msg
865
+ end
866
+
867
+ form = forms.first
311
868
 
312
869
  insn = nil
313
870
 
314
- form = forms.first
871
+ params.each do |param|
872
+ if param.unresolved?
873
+ if insns.name =~ /^J/ # I hope all jump instructions start with J!
874
+ insn = UnresolvedJumpInstruction.new(insns, form, params.first)
875
+ else
876
+ # If it's not a jump instruction, assume unresolved RIP relative 😬
877
+ insn = UnresolvedRIPInstruction.new(insns, form, params)
878
+ end
879
+ end
880
+
881
+ if param.absolute_location? && insns.name =~ /^(?:J|CALL)/
882
+ insn = AbsoluteJumpInstruction.new(insns, form, params.first)
883
+ end
884
+
885
+ if param.temp_register?
886
+ if param.end_point
887
+ raise Errors::UseAfterInvalidationError, "Register #{param.name} used after release"
888
+ end
889
+ @temp_registers << param
890
+
891
+ param.start_point ||= @instructions.length
892
+ end
893
+ end
894
+
895
+ if insn.nil?
896
+ insn = Instruction.new(insns, form, params)
897
+
898
+ if @check_performance
899
+ warning = insns.check_performance(params)
900
+ @performance_warnings << warning if warning
901
+ end
902
+ end
315
903
 
316
- insn = if params.any?(&:unknown_label?)
317
- if params.length > 1
318
- raise ArgumentError, "labels only work with single param jump instructions"
319
- end
320
- UnresolvedInstruction.new(insns, form, params.first)
321
- else
322
- Instruction.new(insns, form, params)
323
- end
324
904
  @instructions << insn
325
905
 
326
906
  self
327
907
  end
908
+
909
+ private
910
+
911
+ def write_instruction insn, buffer, labels
912
+ insn.encode buffer, labels
913
+ end
328
914
  end