SoftCPU.h 58 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202
  1. /*
  2. * Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include "Region.h"
  8. #include "ValueWithShadow.h"
  9. #include <LibX86/Instruction.h>
  10. #include <LibX86/Interpreter.h>
  11. namespace UserspaceEmulator {
  12. class Emulator;
  13. class Region;
  14. union PartAddressableRegister {
  15. struct {
  16. u32 full_u32;
  17. };
  18. struct {
  19. u16 low_u16;
  20. u16 high_u16;
  21. };
  22. struct {
  23. u8 low_u8;
  24. u8 high_u8;
  25. u16 also_high_u16;
  26. };
  27. };
  28. class SoftCPU final
  29. : public X86::Interpreter
  30. , public X86::InstructionStream {
  31. public:
  32. using ValueWithShadowType8 = ValueWithShadow<u8>;
  33. using ValueWithShadowType16 = ValueWithShadow<u16>;
  34. using ValueWithShadowType32 = ValueWithShadow<u32>;
  35. using ValueWithShadowType64 = ValueWithShadow<u64>;
  36. using ValueWithShadowType128 = ValueWithShadow<u128>;
  37. using ValueWithShadowType256 = ValueWithShadow<u256>;
  38. explicit SoftCPU(Emulator&);
  39. void dump() const;
  40. u32 base_eip() const { return m_base_eip; }
  41. void save_base_eip() { m_base_eip = m_eip; }
  42. u32 eip() const { return m_eip; }
  43. void set_eip(u32 eip)
  44. {
  45. m_eip = eip;
  46. }
  47. struct Flags {
  48. enum Flag {
  49. CF = 0x0001, // 0b0000'0000'0000'0001
  50. PF = 0x0004, // 0b0000'0000'0000'0100
  51. AF = 0x0010, // 0b0000'0000'0001'0000
  52. ZF = 0x0040, // 0b0000'0000'0100'0000
  53. SF = 0x0080, // 0b0000'0000'1000'0000
  54. TF = 0x0100, // 0b0000'0001'0000'0000
  55. IF = 0x0200, // 0b0000'0010'0000'0000
  56. DF = 0x0400, // 0b0000'0100'0000'0000
  57. OF = 0x0800, // 0b0000'1000'0000'0000
  58. };
  59. };
  60. void push32(ValueWithShadow<u32>);
  61. ValueWithShadow<u32> pop32();
  62. void push16(ValueWithShadow<u16>);
  63. ValueWithShadow<u16> pop16();
  64. void push_string(const StringView&);
  65. void push_buffer(const u8* data, size_t);
  66. u16 segment(X86::SegmentRegister seg) const { return m_segment[(int)seg]; }
  67. u16& segment(X86::SegmentRegister seg) { return m_segment[(int)seg]; }
  68. ValueAndShadowReference<u8> gpr8(X86::RegisterIndex8 reg)
  69. {
  70. switch (reg) {
  71. case X86::RegisterAL:
  72. return { m_gpr[X86::RegisterEAX].low_u8, m_gpr_shadow[X86::RegisterEAX].low_u8 };
  73. case X86::RegisterAH:
  74. return { m_gpr[X86::RegisterEAX].high_u8, m_gpr_shadow[X86::RegisterEAX].high_u8 };
  75. case X86::RegisterBL:
  76. return { m_gpr[X86::RegisterEBX].low_u8, m_gpr_shadow[X86::RegisterEBX].low_u8 };
  77. case X86::RegisterBH:
  78. return { m_gpr[X86::RegisterEBX].high_u8, m_gpr_shadow[X86::RegisterEBX].high_u8 };
  79. case X86::RegisterCL:
  80. return { m_gpr[X86::RegisterECX].low_u8, m_gpr_shadow[X86::RegisterECX].low_u8 };
  81. case X86::RegisterCH:
  82. return { m_gpr[X86::RegisterECX].high_u8, m_gpr_shadow[X86::RegisterECX].high_u8 };
  83. case X86::RegisterDL:
  84. return { m_gpr[X86::RegisterEDX].low_u8, m_gpr_shadow[X86::RegisterEDX].low_u8 };
  85. case X86::RegisterDH:
  86. return { m_gpr[X86::RegisterEDX].high_u8, m_gpr_shadow[X86::RegisterEDX].high_u8 };
  87. }
  88. VERIFY_NOT_REACHED();
  89. }
  90. ValueWithShadow<u8> const_gpr8(X86::RegisterIndex8 reg) const
  91. {
  92. switch (reg) {
  93. case X86::RegisterAL:
  94. return { m_gpr[X86::RegisterEAX].low_u8, m_gpr_shadow[X86::RegisterEAX].low_u8 };
  95. case X86::RegisterAH:
  96. return { m_gpr[X86::RegisterEAX].high_u8, m_gpr_shadow[X86::RegisterEAX].high_u8 };
  97. case X86::RegisterBL:
  98. return { m_gpr[X86::RegisterEBX].low_u8, m_gpr_shadow[X86::RegisterEBX].low_u8 };
  99. case X86::RegisterBH:
  100. return { m_gpr[X86::RegisterEBX].high_u8, m_gpr_shadow[X86::RegisterEBX].high_u8 };
  101. case X86::RegisterCL:
  102. return { m_gpr[X86::RegisterECX].low_u8, m_gpr_shadow[X86::RegisterECX].low_u8 };
  103. case X86::RegisterCH:
  104. return { m_gpr[X86::RegisterECX].high_u8, m_gpr_shadow[X86::RegisterECX].high_u8 };
  105. case X86::RegisterDL:
  106. return { m_gpr[X86::RegisterEDX].low_u8, m_gpr_shadow[X86::RegisterEDX].low_u8 };
  107. case X86::RegisterDH:
  108. return { m_gpr[X86::RegisterEDX].high_u8, m_gpr_shadow[X86::RegisterEDX].high_u8 };
  109. }
  110. VERIFY_NOT_REACHED();
  111. }
  112. ValueWithShadow<u16> const_gpr16(X86::RegisterIndex16 reg) const
  113. {
  114. return { m_gpr[reg].low_u16, m_gpr_shadow[reg].low_u16 };
  115. }
  116. ValueAndShadowReference<u16> gpr16(X86::RegisterIndex16 reg)
  117. {
  118. return { m_gpr[reg].low_u16, m_gpr_shadow[reg].low_u16 };
  119. }
  120. ValueWithShadow<u32> const_gpr32(X86::RegisterIndex32 reg) const
  121. {
  122. return { m_gpr[reg].full_u32, m_gpr_shadow[reg].full_u32 };
  123. }
  124. ValueAndShadowReference<u32> gpr32(X86::RegisterIndex32 reg)
  125. {
  126. return { m_gpr[reg].full_u32, m_gpr_shadow[reg].full_u32 };
  127. }
  128. template<typename T>
  129. ValueWithShadow<T> const_gpr(unsigned register_index) const
  130. {
  131. if constexpr (sizeof(T) == 1)
  132. return const_gpr8((X86::RegisterIndex8)register_index);
  133. if constexpr (sizeof(T) == 2)
  134. return const_gpr16((X86::RegisterIndex16)register_index);
  135. if constexpr (sizeof(T) == 4)
  136. return const_gpr32((X86::RegisterIndex32)register_index);
  137. }
  138. template<typename T>
  139. ValueAndShadowReference<T> gpr(unsigned register_index)
  140. {
  141. if constexpr (sizeof(T) == 1)
  142. return gpr8((X86::RegisterIndex8)register_index);
  143. if constexpr (sizeof(T) == 2)
  144. return gpr16((X86::RegisterIndex16)register_index);
  145. if constexpr (sizeof(T) == 4)
  146. return gpr32((X86::RegisterIndex32)register_index);
  147. }
  148. ValueWithShadow<u32> source_index(bool a32) const
  149. {
  150. if (a32)
  151. return esi();
  152. return { si().value(), (u32)si().shadow() & 0xffff };
  153. }
  154. ValueWithShadow<u32> destination_index(bool a32) const
  155. {
  156. if (a32)
  157. return edi();
  158. return { di().value(), (u32)di().shadow() & 0xffff };
  159. }
  160. ValueWithShadow<u32> loop_index(bool a32) const
  161. {
  162. if (a32)
  163. return ecx();
  164. return { cx().value(), (u32)cx().shadow() & 0xffff };
  165. }
  166. bool decrement_loop_index(bool a32)
  167. {
  168. if (a32) {
  169. set_ecx({ ecx().value() - 1, ecx().shadow() });
  170. return ecx().value() == 0;
  171. }
  172. set_cx(ValueWithShadow<u16>(cx().value() - 1, cx().shadow()));
  173. return cx().value() == 0;
  174. }
  175. ALWAYS_INLINE void step_source_index(bool a32, u32 step)
  176. {
  177. if (a32) {
  178. if (df())
  179. set_esi({ esi().value() - step, esi().shadow() });
  180. else
  181. set_esi({ esi().value() + step, esi().shadow() });
  182. } else {
  183. if (df())
  184. set_si(ValueWithShadow<u16>(si().value() - step, si().shadow()));
  185. else
  186. set_si(ValueWithShadow<u16>(si().value() + step, si().shadow()));
  187. }
  188. }
  189. ALWAYS_INLINE void step_destination_index(bool a32, u32 step)
  190. {
  191. if (a32) {
  192. if (df())
  193. set_edi({ edi().value() - step, edi().shadow() });
  194. else
  195. set_edi({ edi().value() + step, edi().shadow() });
  196. } else {
  197. if (df())
  198. set_di(ValueWithShadow<u16>(di().value() - step, di().shadow()));
  199. else
  200. set_di(ValueWithShadow<u16>(di().value() + step, di().shadow()));
  201. }
  202. }
  203. u32 eflags() const { return m_eflags; }
  204. void set_eflags(ValueWithShadow<u32> eflags)
  205. {
  206. m_eflags = eflags.value();
  207. m_flags_tainted = eflags.is_uninitialized();
  208. }
  209. ValueWithShadow<u32> eax() const { return const_gpr32(X86::RegisterEAX); }
  210. ValueWithShadow<u32> ebx() const { return const_gpr32(X86::RegisterEBX); }
  211. ValueWithShadow<u32> ecx() const { return const_gpr32(X86::RegisterECX); }
  212. ValueWithShadow<u32> edx() const { return const_gpr32(X86::RegisterEDX); }
  213. ValueWithShadow<u32> esp() const { return const_gpr32(X86::RegisterESP); }
  214. ValueWithShadow<u32> ebp() const { return const_gpr32(X86::RegisterEBP); }
  215. ValueWithShadow<u32> esi() const { return const_gpr32(X86::RegisterESI); }
  216. ValueWithShadow<u32> edi() const { return const_gpr32(X86::RegisterEDI); }
  217. ValueWithShadow<u16> ax() const { return const_gpr16(X86::RegisterAX); }
  218. ValueWithShadow<u16> bx() const { return const_gpr16(X86::RegisterBX); }
  219. ValueWithShadow<u16> cx() const { return const_gpr16(X86::RegisterCX); }
  220. ValueWithShadow<u16> dx() const { return const_gpr16(X86::RegisterDX); }
  221. ValueWithShadow<u16> sp() const { return const_gpr16(X86::RegisterSP); }
  222. ValueWithShadow<u16> bp() const { return const_gpr16(X86::RegisterBP); }
  223. ValueWithShadow<u16> si() const { return const_gpr16(X86::RegisterSI); }
  224. ValueWithShadow<u16> di() const { return const_gpr16(X86::RegisterDI); }
  225. ValueWithShadow<u8> al() const { return const_gpr8(X86::RegisterAL); }
  226. ValueWithShadow<u8> ah() const { return const_gpr8(X86::RegisterAH); }
  227. ValueWithShadow<u8> bl() const { return const_gpr8(X86::RegisterBL); }
  228. ValueWithShadow<u8> bh() const { return const_gpr8(X86::RegisterBH); }
  229. ValueWithShadow<u8> cl() const { return const_gpr8(X86::RegisterCL); }
  230. ValueWithShadow<u8> ch() const { return const_gpr8(X86::RegisterCH); }
  231. ValueWithShadow<u8> dl() const { return const_gpr8(X86::RegisterDL); }
  232. ValueWithShadow<u8> dh() const { return const_gpr8(X86::RegisterDH); }
  233. void set_eax(ValueWithShadow<u32> value) { gpr32(X86::RegisterEAX) = value; }
  234. void set_ebx(ValueWithShadow<u32> value) { gpr32(X86::RegisterEBX) = value; }
  235. void set_ecx(ValueWithShadow<u32> value) { gpr32(X86::RegisterECX) = value; }
  236. void set_edx(ValueWithShadow<u32> value) { gpr32(X86::RegisterEDX) = value; }
  237. void set_esp(ValueWithShadow<u32> value) { gpr32(X86::RegisterESP) = value; }
  238. void set_ebp(ValueWithShadow<u32> value) { gpr32(X86::RegisterEBP) = value; }
  239. void set_esi(ValueWithShadow<u32> value) { gpr32(X86::RegisterESI) = value; }
  240. void set_edi(ValueWithShadow<u32> value) { gpr32(X86::RegisterEDI) = value; }
  241. void set_ax(ValueWithShadow<u16> value) { gpr16(X86::RegisterAX) = value; }
  242. void set_bx(ValueWithShadow<u16> value) { gpr16(X86::RegisterBX) = value; }
  243. void set_cx(ValueWithShadow<u16> value) { gpr16(X86::RegisterCX) = value; }
  244. void set_dx(ValueWithShadow<u16> value) { gpr16(X86::RegisterDX) = value; }
  245. void set_sp(ValueWithShadow<u16> value) { gpr16(X86::RegisterSP) = value; }
  246. void set_bp(ValueWithShadow<u16> value) { gpr16(X86::RegisterBP) = value; }
  247. void set_si(ValueWithShadow<u16> value) { gpr16(X86::RegisterSI) = value; }
  248. void set_di(ValueWithShadow<u16> value) { gpr16(X86::RegisterDI) = value; }
  249. void set_al(ValueWithShadow<u8> value) { gpr8(X86::RegisterAL) = value; }
  250. void set_ah(ValueWithShadow<u8> value) { gpr8(X86::RegisterAH) = value; }
  251. void set_bl(ValueWithShadow<u8> value) { gpr8(X86::RegisterBL) = value; }
  252. void set_bh(ValueWithShadow<u8> value) { gpr8(X86::RegisterBH) = value; }
  253. void set_cl(ValueWithShadow<u8> value) { gpr8(X86::RegisterCL) = value; }
  254. void set_ch(ValueWithShadow<u8> value) { gpr8(X86::RegisterCH) = value; }
  255. void set_dl(ValueWithShadow<u8> value) { gpr8(X86::RegisterDL) = value; }
  256. void set_dh(ValueWithShadow<u8> value) { gpr8(X86::RegisterDH) = value; }
  257. bool of() const { return m_eflags & Flags::OF; }
  258. bool sf() const { return m_eflags & Flags::SF; }
  259. bool zf() const { return m_eflags & Flags::ZF; }
  260. bool af() const { return m_eflags & Flags::AF; }
  261. bool pf() const { return m_eflags & Flags::PF; }
  262. bool cf() const { return m_eflags & Flags::CF; }
  263. bool df() const { return m_eflags & Flags::DF; }
  264. void set_flag(Flags::Flag flag, bool value)
  265. {
  266. if (value)
  267. m_eflags |= flag;
  268. else
  269. m_eflags &= ~flag;
  270. }
  271. void set_of(bool value) { set_flag(Flags::OF, value); }
  272. void set_sf(bool value) { set_flag(Flags::SF, value); }
  273. void set_zf(bool value) { set_flag(Flags::ZF, value); }
  274. void set_af(bool value) { set_flag(Flags::AF, value); }
  275. void set_pf(bool value) { set_flag(Flags::PF, value); }
  276. void set_cf(bool value) { set_flag(Flags::CF, value); }
  277. void set_df(bool value) { set_flag(Flags::DF, value); }
  278. void set_flags_with_mask(u32 new_flags, u32 mask)
  279. {
  280. m_eflags &= ~mask;
  281. m_eflags |= new_flags & mask;
  282. }
  283. void set_flags_oszapc(u32 new_flags)
  284. {
  285. set_flags_with_mask(new_flags, Flags::OF | Flags::SF | Flags::ZF | Flags::AF | Flags::PF | Flags::CF);
  286. }
  287. void set_flags_oszap(u32 new_flags)
  288. {
  289. set_flags_with_mask(new_flags, Flags::OF | Flags::SF | Flags::ZF | Flags::AF | Flags::PF);
  290. }
  291. void set_flags_oszpc(u32 new_flags)
  292. {
  293. set_flags_with_mask(new_flags, Flags::OF | Flags::SF | Flags::ZF | Flags::PF | Flags::CF);
  294. }
  295. void set_flags_oc(u32 new_flags)
  296. {
  297. set_flags_with_mask(new_flags, Flags::OF | Flags::CF);
  298. }
  299. u16 cs() const { return m_segment[(int)X86::SegmentRegister::CS]; }
  300. u16 ds() const { return m_segment[(int)X86::SegmentRegister::DS]; }
  301. u16 es() const { return m_segment[(int)X86::SegmentRegister::ES]; }
  302. u16 ss() const { return m_segment[(int)X86::SegmentRegister::SS]; }
  303. ValueWithShadow<u8> read_memory8(X86::LogicalAddress);
  304. ValueWithShadow<u16> read_memory16(X86::LogicalAddress);
  305. ValueWithShadow<u32> read_memory32(X86::LogicalAddress);
  306. ValueWithShadow<u64> read_memory64(X86::LogicalAddress);
  307. ValueWithShadow<u128> read_memory128(X86::LogicalAddress);
  308. ValueWithShadow<u256> read_memory256(X86::LogicalAddress);
  309. template<typename T>
  310. ValueWithShadow<T> read_memory(X86::LogicalAddress address)
  311. {
  312. if constexpr (sizeof(T) == 1)
  313. return read_memory8(address);
  314. if constexpr (sizeof(T) == 2)
  315. return read_memory16(address);
  316. if constexpr (sizeof(T) == 4)
  317. return read_memory32(address);
  318. if constexpr (sizeof(T) == 8)
  319. return read_memory64(address);
  320. if constexpr (sizeof(T) == 16)
  321. return read_memory128(address);
  322. if constexpr (sizeof(T) == 32)
  323. return read_memory256(address);
  324. }
  325. void write_memory8(X86::LogicalAddress, ValueWithShadow<u8>);
  326. void write_memory16(X86::LogicalAddress, ValueWithShadow<u16>);
  327. void write_memory32(X86::LogicalAddress, ValueWithShadow<u32>);
  328. void write_memory64(X86::LogicalAddress, ValueWithShadow<u64>);
  329. void write_memory128(X86::LogicalAddress, ValueWithShadow<u128>);
  330. void write_memory256(X86::LogicalAddress, ValueWithShadow<u256>);
  331. template<typename T>
  332. void write_memory(X86::LogicalAddress address, ValueWithShadow<T> data)
  333. {
  334. if constexpr (sizeof(T) == 1)
  335. return write_memory8(address, data);
  336. if constexpr (sizeof(T) == 2)
  337. return write_memory16(address, data);
  338. if constexpr (sizeof(T) == 4)
  339. return write_memory32(address, data);
  340. if constexpr (sizeof(T) == 8)
  341. return write_memory64(address, data);
  342. if constexpr (sizeof(T) == 16)
  343. return write_memory128(address, data);
  344. if constexpr (sizeof(T) == 32)
  345. return write_memory256(address, data);
  346. }
  347. bool evaluate_condition(u8 condition) const
  348. {
  349. switch (condition) {
  350. case 0:
  351. return of(); // O
  352. case 1:
  353. return !of(); // NO
  354. case 2:
  355. return cf(); // B, C, NAE
  356. case 3:
  357. return !cf(); // NB, NC, AE
  358. case 4:
  359. return zf(); // E, Z
  360. case 5:
  361. return !zf(); // NE, NZ
  362. case 6:
  363. return (cf() | zf()); // BE, NA
  364. case 7:
  365. return !(cf() | zf()); // NBE, A
  366. case 8:
  367. return sf(); // S
  368. case 9:
  369. return !sf(); // NS
  370. case 10:
  371. return pf(); // P, PE
  372. case 11:
  373. return !pf(); // NP, PO
  374. case 12:
  375. return sf() ^ of(); // L, NGE
  376. case 13:
  377. return !(sf() ^ of()); // NL, GE
  378. case 14:
  379. return (sf() ^ of()) | zf(); // LE, NG
  380. case 15:
  381. return !((sf() ^ of()) | zf()); // NLE, G
  382. default:
  383. VERIFY_NOT_REACHED();
  384. }
  385. return 0;
  386. }
  387. template<bool check_zf, typename Callback>
  388. void do_once_or_repeat(const X86::Instruction& insn, Callback);
  389. template<typename A>
  390. void taint_flags_from(const A& a)
  391. {
  392. m_flags_tainted = a.is_uninitialized();
  393. }
  394. template<typename A, typename B>
  395. void taint_flags_from(const A& a, const B& b)
  396. {
  397. m_flags_tainted = a.is_uninitialized() || b.is_uninitialized();
  398. }
  399. template<typename A, typename B, typename C>
  400. void taint_flags_from(const A& a, const B& b, const C& c)
  401. {
  402. m_flags_tainted = a.is_uninitialized() || b.is_uninitialized() || c.is_uninitialized();
  403. }
  404. void warn_if_flags_tainted(const char* message) const;
  405. // ^X86::InstructionStream
  406. virtual bool can_read() override { return false; }
  407. virtual u8 read8() override;
  408. virtual u16 read16() override;
  409. virtual u32 read32() override;
  410. virtual u64 read64() override;
  411. private:
  412. // ^X86::Interpreter
  413. virtual void AAA(const X86::Instruction&) override;
  414. virtual void AAD(const X86::Instruction&) override;
  415. virtual void AAM(const X86::Instruction&) override;
  416. virtual void AAS(const X86::Instruction&) override;
  417. virtual void ADC_AL_imm8(const X86::Instruction&) override;
  418. virtual void ADC_AX_imm16(const X86::Instruction&) override;
  419. virtual void ADC_EAX_imm32(const X86::Instruction&) override;
  420. virtual void ADC_RM16_imm16(const X86::Instruction&) override;
  421. virtual void ADC_RM16_imm8(const X86::Instruction&) override;
  422. virtual void ADC_RM16_reg16(const X86::Instruction&) override;
  423. virtual void ADC_RM32_imm32(const X86::Instruction&) override;
  424. virtual void ADC_RM32_imm8(const X86::Instruction&) override;
  425. virtual void ADC_RM32_reg32(const X86::Instruction&) override;
  426. virtual void ADC_RM8_imm8(const X86::Instruction&) override;
  427. virtual void ADC_RM8_reg8(const X86::Instruction&) override;
  428. virtual void ADC_reg16_RM16(const X86::Instruction&) override;
  429. virtual void ADC_reg32_RM32(const X86::Instruction&) override;
  430. virtual void ADC_reg8_RM8(const X86::Instruction&) override;
  431. virtual void ADD_AL_imm8(const X86::Instruction&) override;
  432. virtual void ADD_AX_imm16(const X86::Instruction&) override;
  433. virtual void ADD_EAX_imm32(const X86::Instruction&) override;
  434. virtual void ADD_RM16_imm16(const X86::Instruction&) override;
  435. virtual void ADD_RM16_imm8(const X86::Instruction&) override;
  436. virtual void ADD_RM16_reg16(const X86::Instruction&) override;
  437. virtual void ADD_RM32_imm32(const X86::Instruction&) override;
  438. virtual void ADD_RM32_imm8(const X86::Instruction&) override;
  439. virtual void ADD_RM32_reg32(const X86::Instruction&) override;
  440. virtual void ADD_RM8_imm8(const X86::Instruction&) override;
  441. virtual void ADD_RM8_reg8(const X86::Instruction&) override;
  442. virtual void ADD_reg16_RM16(const X86::Instruction&) override;
  443. virtual void ADD_reg32_RM32(const X86::Instruction&) override;
  444. virtual void ADD_reg8_RM8(const X86::Instruction&) override;
  445. virtual void AND_AL_imm8(const X86::Instruction&) override;
  446. virtual void AND_AX_imm16(const X86::Instruction&) override;
  447. virtual void AND_EAX_imm32(const X86::Instruction&) override;
  448. virtual void AND_RM16_imm16(const X86::Instruction&) override;
  449. virtual void AND_RM16_imm8(const X86::Instruction&) override;
  450. virtual void AND_RM16_reg16(const X86::Instruction&) override;
  451. virtual void AND_RM32_imm32(const X86::Instruction&) override;
  452. virtual void AND_RM32_imm8(const X86::Instruction&) override;
  453. virtual void AND_RM32_reg32(const X86::Instruction&) override;
  454. virtual void AND_RM8_imm8(const X86::Instruction&) override;
  455. virtual void AND_RM8_reg8(const X86::Instruction&) override;
  456. virtual void AND_reg16_RM16(const X86::Instruction&) override;
  457. virtual void AND_reg32_RM32(const X86::Instruction&) override;
  458. virtual void AND_reg8_RM8(const X86::Instruction&) override;
  459. virtual void ARPL(const X86::Instruction&) override;
  460. virtual void BOUND(const X86::Instruction&) override;
  461. virtual void BSF_reg16_RM16(const X86::Instruction&) override;
  462. virtual void BSF_reg32_RM32(const X86::Instruction&) override;
  463. virtual void BSR_reg16_RM16(const X86::Instruction&) override;
  464. virtual void BSR_reg32_RM32(const X86::Instruction&) override;
  465. virtual void BSWAP_reg32(const X86::Instruction&) override;
  466. virtual void BTC_RM16_imm8(const X86::Instruction&) override;
  467. virtual void BTC_RM16_reg16(const X86::Instruction&) override;
  468. virtual void BTC_RM32_imm8(const X86::Instruction&) override;
  469. virtual void BTC_RM32_reg32(const X86::Instruction&) override;
  470. virtual void BTR_RM16_imm8(const X86::Instruction&) override;
  471. virtual void BTR_RM16_reg16(const X86::Instruction&) override;
  472. virtual void BTR_RM32_imm8(const X86::Instruction&) override;
  473. virtual void BTR_RM32_reg32(const X86::Instruction&) override;
  474. virtual void BTS_RM16_imm8(const X86::Instruction&) override;
  475. virtual void BTS_RM16_reg16(const X86::Instruction&) override;
  476. virtual void BTS_RM32_imm8(const X86::Instruction&) override;
  477. virtual void BTS_RM32_reg32(const X86::Instruction&) override;
  478. virtual void BT_RM16_imm8(const X86::Instruction&) override;
  479. virtual void BT_RM16_reg16(const X86::Instruction&) override;
  480. virtual void BT_RM32_imm8(const X86::Instruction&) override;
  481. virtual void BT_RM32_reg32(const X86::Instruction&) override;
  482. virtual void CALL_FAR_mem16(const X86::Instruction&) override;
  483. virtual void CALL_FAR_mem32(const X86::Instruction&) override;
  484. virtual void CALL_RM16(const X86::Instruction&) override;
  485. virtual void CALL_RM32(const X86::Instruction&) override;
  486. virtual void CALL_imm16(const X86::Instruction&) override;
  487. virtual void CALL_imm16_imm16(const X86::Instruction&) override;
  488. virtual void CALL_imm16_imm32(const X86::Instruction&) override;
  489. virtual void CALL_imm32(const X86::Instruction&) override;
  490. virtual void CBW(const X86::Instruction&) override;
  491. virtual void CDQ(const X86::Instruction&) override;
  492. virtual void CLC(const X86::Instruction&) override;
  493. virtual void CLD(const X86::Instruction&) override;
  494. virtual void CLI(const X86::Instruction&) override;
  495. virtual void CLTS(const X86::Instruction&) override;
  496. virtual void CMC(const X86::Instruction&) override;
  497. virtual void CMOVcc_reg16_RM16(const X86::Instruction&) override;
  498. virtual void CMOVcc_reg32_RM32(const X86::Instruction&) override;
  499. virtual void CMPSB(const X86::Instruction&) override;
  500. virtual void CMPSD(const X86::Instruction&) override;
  501. virtual void CMPSW(const X86::Instruction&) override;
  502. virtual void CMPXCHG_RM16_reg16(const X86::Instruction&) override;
  503. virtual void CMPXCHG_RM32_reg32(const X86::Instruction&) override;
  504. virtual void CMPXCHG_RM8_reg8(const X86::Instruction&) override;
  505. virtual void CMP_AL_imm8(const X86::Instruction&) override;
  506. virtual void CMP_AX_imm16(const X86::Instruction&) override;
  507. virtual void CMP_EAX_imm32(const X86::Instruction&) override;
  508. virtual void CMP_RM16_imm16(const X86::Instruction&) override;
  509. virtual void CMP_RM16_imm8(const X86::Instruction&) override;
  510. virtual void CMP_RM16_reg16(const X86::Instruction&) override;
  511. virtual void CMP_RM32_imm32(const X86::Instruction&) override;
  512. virtual void CMP_RM32_imm8(const X86::Instruction&) override;
  513. virtual void CMP_RM32_reg32(const X86::Instruction&) override;
  514. virtual void CMP_RM8_imm8(const X86::Instruction&) override;
  515. virtual void CMP_RM8_reg8(const X86::Instruction&) override;
  516. virtual void CMP_reg16_RM16(const X86::Instruction&) override;
  517. virtual void CMP_reg32_RM32(const X86::Instruction&) override;
  518. virtual void CMP_reg8_RM8(const X86::Instruction&) override;
  519. virtual void CPUID(const X86::Instruction&) override;
  520. virtual void CWD(const X86::Instruction&) override;
  521. virtual void CWDE(const X86::Instruction&) override;
  522. virtual void DAA(const X86::Instruction&) override;
  523. virtual void DAS(const X86::Instruction&) override;
  524. virtual void DEC_RM16(const X86::Instruction&) override;
  525. virtual void DEC_RM32(const X86::Instruction&) override;
  526. virtual void DEC_RM8(const X86::Instruction&) override;
  527. virtual void DEC_reg16(const X86::Instruction&) override;
  528. virtual void DEC_reg32(const X86::Instruction&) override;
  529. virtual void DIV_RM16(const X86::Instruction&) override;
  530. virtual void DIV_RM32(const X86::Instruction&) override;
  531. virtual void DIV_RM8(const X86::Instruction&) override;
  532. virtual void ENTER16(const X86::Instruction&) override;
  533. virtual void ENTER32(const X86::Instruction&) override;
  534. virtual void ESCAPE(const X86::Instruction&) override;
  535. virtual void FADD_RM32(const X86::Instruction&) override;
  536. virtual void FMUL_RM32(const X86::Instruction&) override;
  537. virtual void FCOM_RM32(const X86::Instruction&) override;
  538. virtual void FCOMP_RM32(const X86::Instruction&) override;
  539. virtual void FSUB_RM32(const X86::Instruction&) override;
  540. virtual void FSUBR_RM32(const X86::Instruction&) override;
  541. virtual void FDIV_RM32(const X86::Instruction&) override;
  542. virtual void FDIVR_RM32(const X86::Instruction&) override;
  543. virtual void FLD_RM32(const X86::Instruction&) override;
  544. virtual void FXCH(const X86::Instruction&) override;
  545. virtual void FST_RM32(const X86::Instruction&) override;
  546. virtual void FNOP(const X86::Instruction&) override;
  547. virtual void FSTP_RM32(const X86::Instruction&) override;
  548. virtual void FLDENV(const X86::Instruction&) override;
  549. virtual void FCHS(const X86::Instruction&) override;
  550. virtual void FABS(const X86::Instruction&) override;
  551. virtual void FTST(const X86::Instruction&) override;
  552. virtual void FXAM(const X86::Instruction&) override;
  553. virtual void FLDCW(const X86::Instruction&) override;
  554. virtual void FLD1(const X86::Instruction&) override;
  555. virtual void FLDL2T(const X86::Instruction&) override;
  556. virtual void FLDL2E(const X86::Instruction&) override;
  557. virtual void FLDPI(const X86::Instruction&) override;
  558. virtual void FLDLG2(const X86::Instruction&) override;
  559. virtual void FLDLN2(const X86::Instruction&) override;
  560. virtual void FLDZ(const X86::Instruction&) override;
  561. virtual void FNSTENV(const X86::Instruction&) override;
  562. virtual void F2XM1(const X86::Instruction&) override;
  563. virtual void FYL2X(const X86::Instruction&) override;
  564. virtual void FPTAN(const X86::Instruction&) override;
  565. virtual void FPATAN(const X86::Instruction&) override;
  566. virtual void FXTRACT(const X86::Instruction&) override;
  567. virtual void FPREM1(const X86::Instruction&) override;
  568. virtual void FDECSTP(const X86::Instruction&) override;
  569. virtual void FINCSTP(const X86::Instruction&) override;
  570. virtual void FNSTCW(const X86::Instruction&) override;
  571. virtual void FPREM(const X86::Instruction&) override;
  572. virtual void FYL2XP1(const X86::Instruction&) override;
  573. virtual void FSQRT(const X86::Instruction&) override;
  574. virtual void FSINCOS(const X86::Instruction&) override;
  575. virtual void FRNDINT(const X86::Instruction&) override;
  576. virtual void FSCALE(const X86::Instruction&) override;
  577. virtual void FSIN(const X86::Instruction&) override;
  578. virtual void FCOS(const X86::Instruction&) override;
  579. virtual void FIADD_RM32(const X86::Instruction&) override;
  580. virtual void FCMOVB(const X86::Instruction&) override;
  581. virtual void FIMUL_RM32(const X86::Instruction&) override;
  582. virtual void FCMOVE(const X86::Instruction&) override;
  583. virtual void FICOM_RM32(const X86::Instruction&) override;
  584. virtual void FCMOVBE(const X86::Instruction&) override;
  585. virtual void FICOMP_RM32(const X86::Instruction&) override;
  586. virtual void FCMOVU(const X86::Instruction&) override;
  587. virtual void FISUB_RM32(const X86::Instruction&) override;
  588. virtual void FISUBR_RM32(const X86::Instruction&) override;
  589. virtual void FUCOMPP(const X86::Instruction&) override;
  590. virtual void FIDIV_RM32(const X86::Instruction&) override;
  591. virtual void FIDIVR_RM32(const X86::Instruction&) override;
  592. virtual void FILD_RM32(const X86::Instruction&) override;
  593. virtual void FCMOVNB(const X86::Instruction&) override;
  594. virtual void FISTTP_RM32(const X86::Instruction&) override;
  595. virtual void FCMOVNE(const X86::Instruction&) override;
  596. virtual void FIST_RM32(const X86::Instruction&) override;
  597. virtual void FCMOVNBE(const X86::Instruction&) override;
  598. virtual void FISTP_RM32(const X86::Instruction&) override;
  599. virtual void FCMOVNU(const X86::Instruction&) override;
  600. virtual void FNENI(const X86::Instruction&) override;
  601. virtual void FNDISI(const X86::Instruction&) override;
  602. virtual void FNCLEX(const X86::Instruction&) override;
  603. virtual void FNINIT(const X86::Instruction&) override;
  604. virtual void FNSETPM(const X86::Instruction&) override;
  605. virtual void FLD_RM80(const X86::Instruction&) override;
  606. virtual void FUCOMI(const X86::Instruction&) override;
  607. virtual void FCOMI(const X86::Instruction&) override;
  608. virtual void FSTP_RM80(const X86::Instruction&) override;
  609. virtual void FADD_RM64(const X86::Instruction&) override;
  610. virtual void FMUL_RM64(const X86::Instruction&) override;
  611. virtual void FCOM_RM64(const X86::Instruction&) override;
  612. virtual void FCOMP_RM64(const X86::Instruction&) override;
  613. virtual void FSUB_RM64(const X86::Instruction&) override;
  614. virtual void FSUBR_RM64(const X86::Instruction&) override;
  615. virtual void FDIV_RM64(const X86::Instruction&) override;
  616. virtual void FDIVR_RM64(const X86::Instruction&) override;
  617. virtual void FLD_RM64(const X86::Instruction&) override;
  618. virtual void FFREE(const X86::Instruction&) override;
  619. virtual void FISTTP_RM64(const X86::Instruction&) override;
  620. virtual void FST_RM64(const X86::Instruction&) override;
  621. virtual void FSTP_RM64(const X86::Instruction&) override;
  622. virtual void FRSTOR(const X86::Instruction&) override;
  623. virtual void FUCOM(const X86::Instruction&) override;
  624. virtual void FUCOMP(const X86::Instruction&) override;
  625. virtual void FNSAVE(const X86::Instruction&) override;
  626. virtual void FNSTSW(const X86::Instruction&) override;
  627. virtual void FIADD_RM16(const X86::Instruction&) override;
  628. virtual void FADDP(const X86::Instruction&) override;
  629. virtual void FIMUL_RM16(const X86::Instruction&) override;
  630. virtual void FMULP(const X86::Instruction&) override;
  631. virtual void FICOM_RM16(const X86::Instruction&) override;
  632. virtual void FICOMP_RM16(const X86::Instruction&) override;
  633. virtual void FCOMPP(const X86::Instruction&) override;
  634. virtual void FISUB_RM16(const X86::Instruction&) override;
  635. virtual void FSUBRP(const X86::Instruction&) override;
  636. virtual void FISUBR_RM16(const X86::Instruction&) override;
  637. virtual void FSUBP(const X86::Instruction&) override;
  638. virtual void FIDIV_RM16(const X86::Instruction&) override;
  639. virtual void FDIVRP(const X86::Instruction&) override;
  640. virtual void FIDIVR_RM16(const X86::Instruction&) override;
  641. virtual void FDIVP(const X86::Instruction&) override;
  642. virtual void FILD_RM16(const X86::Instruction&) override;
  643. virtual void FFREEP(const X86::Instruction&) override;
  644. virtual void FISTTP_RM16(const X86::Instruction&) override;
  645. virtual void FIST_RM16(const X86::Instruction&) override;
  646. virtual void FISTP_RM16(const X86::Instruction&) override;
  647. virtual void FBLD_M80(const X86::Instruction&) override;
  648. virtual void FNSTSW_AX(const X86::Instruction&) override;
  649. virtual void FILD_RM64(const X86::Instruction&) override;
  650. virtual void FUCOMIP(const X86::Instruction&) override;
  651. virtual void FBSTP_M80(const X86::Instruction&) override;
  652. virtual void FCOMIP(const X86::Instruction&) override;
  653. virtual void FISTP_RM64(const X86::Instruction&) override;
  654. virtual void HLT(const X86::Instruction&) override;
  655. virtual void IDIV_RM16(const X86::Instruction&) override;
  656. virtual void IDIV_RM32(const X86::Instruction&) override;
  657. virtual void IDIV_RM8(const X86::Instruction&) override;
  658. virtual void IMUL_RM16(const X86::Instruction&) override;
  659. virtual void IMUL_RM32(const X86::Instruction&) override;
  660. virtual void IMUL_RM8(const X86::Instruction&) override;
  661. virtual void IMUL_reg16_RM16(const X86::Instruction&) override;
  662. virtual void IMUL_reg16_RM16_imm16(const X86::Instruction&) override;
  663. virtual void IMUL_reg16_RM16_imm8(const X86::Instruction&) override;
  664. virtual void IMUL_reg32_RM32(const X86::Instruction&) override;
  665. virtual void IMUL_reg32_RM32_imm32(const X86::Instruction&) override;
  666. virtual void IMUL_reg32_RM32_imm8(const X86::Instruction&) override;
  667. virtual void INC_RM16(const X86::Instruction&) override;
  668. virtual void INC_RM32(const X86::Instruction&) override;
  669. virtual void INC_RM8(const X86::Instruction&) override;
  670. virtual void INC_reg16(const X86::Instruction&) override;
  671. virtual void INC_reg32(const X86::Instruction&) override;
  672. virtual void INSB(const X86::Instruction&) override;
  673. virtual void INSD(const X86::Instruction&) override;
  674. virtual void INSW(const X86::Instruction&) override;
  675. virtual void INT3(const X86::Instruction&) override;
  676. virtual void INTO(const X86::Instruction&) override;
  677. virtual void INT_imm8(const X86::Instruction&) override;
  678. virtual void INVLPG(const X86::Instruction&) override;
  679. virtual void IN_AL_DX(const X86::Instruction&) override;
  680. virtual void IN_AL_imm8(const X86::Instruction&) override;
  681. virtual void IN_AX_DX(const X86::Instruction&) override;
  682. virtual void IN_AX_imm8(const X86::Instruction&) override;
  683. virtual void IN_EAX_DX(const X86::Instruction&) override;
  684. virtual void IN_EAX_imm8(const X86::Instruction&) override;
  685. virtual void IRET(const X86::Instruction&) override;
  686. virtual void JCXZ_imm8(const X86::Instruction&) override;
  687. virtual void JMP_FAR_mem16(const X86::Instruction&) override;
  688. virtual void JMP_FAR_mem32(const X86::Instruction&) override;
  689. virtual void JMP_RM16(const X86::Instruction&) override;
  690. virtual void JMP_RM32(const X86::Instruction&) override;
  691. virtual void JMP_imm16(const X86::Instruction&) override;
  692. virtual void JMP_imm16_imm16(const X86::Instruction&) override;
  693. virtual void JMP_imm16_imm32(const X86::Instruction&) override;
  694. virtual void JMP_imm32(const X86::Instruction&) override;
  695. virtual void JMP_short_imm8(const X86::Instruction&) override;
  696. virtual void Jcc_NEAR_imm(const X86::Instruction&) override;
  697. virtual void Jcc_imm8(const X86::Instruction&) override;
  698. virtual void LAHF(const X86::Instruction&) override;
  699. virtual void LAR_reg16_RM16(const X86::Instruction&) override;
  700. virtual void LAR_reg32_RM32(const X86::Instruction&) override;
  701. virtual void LDS_reg16_mem16(const X86::Instruction&) override;
  702. virtual void LDS_reg32_mem32(const X86::Instruction&) override;
  703. virtual void LEAVE16(const X86::Instruction&) override;
  704. virtual void LEAVE32(const X86::Instruction&) override;
  705. virtual void LEA_reg16_mem16(const X86::Instruction&) override;
  706. virtual void LEA_reg32_mem32(const X86::Instruction&) override;
  707. virtual void LES_reg16_mem16(const X86::Instruction&) override;
  708. virtual void LES_reg32_mem32(const X86::Instruction&) override;
  709. virtual void LFS_reg16_mem16(const X86::Instruction&) override;
  710. virtual void LFS_reg32_mem32(const X86::Instruction&) override;
  711. virtual void LGDT(const X86::Instruction&) override;
  712. virtual void LGS_reg16_mem16(const X86::Instruction&) override;
  713. virtual void LGS_reg32_mem32(const X86::Instruction&) override;
  714. virtual void LIDT(const X86::Instruction&) override;
  715. virtual void LLDT_RM16(const X86::Instruction&) override;
  716. virtual void LMSW_RM16(const X86::Instruction&) override;
  717. virtual void LODSB(const X86::Instruction&) override;
  718. virtual void LODSD(const X86::Instruction&) override;
  719. virtual void LODSW(const X86::Instruction&) override;
  720. virtual void LOOPNZ_imm8(const X86::Instruction&) override;
  721. virtual void LOOPZ_imm8(const X86::Instruction&) override;
  722. virtual void LOOP_imm8(const X86::Instruction&) override;
  723. virtual void LSL_reg16_RM16(const X86::Instruction&) override;
  724. virtual void LSL_reg32_RM32(const X86::Instruction&) override;
  725. virtual void LSS_reg16_mem16(const X86::Instruction&) override;
  726. virtual void LSS_reg32_mem32(const X86::Instruction&) override;
  727. virtual void LTR_RM16(const X86::Instruction&) override;
  728. virtual void MOVSB(const X86::Instruction&) override;
  729. virtual void MOVSD(const X86::Instruction&) override;
  730. virtual void MOVSW(const X86::Instruction&) override;
  731. virtual void MOVSX_reg16_RM8(const X86::Instruction&) override;
  732. virtual void MOVSX_reg32_RM16(const X86::Instruction&) override;
  733. virtual void MOVSX_reg32_RM8(const X86::Instruction&) override;
  734. virtual void MOVZX_reg16_RM8(const X86::Instruction&) override;
  735. virtual void MOVZX_reg32_RM16(const X86::Instruction&) override;
  736. virtual void MOVZX_reg32_RM8(const X86::Instruction&) override;
  737. virtual void MOV_AL_moff8(const X86::Instruction&) override;
  738. virtual void MOV_AX_moff16(const X86::Instruction&) override;
  739. virtual void MOV_CR_reg32(const X86::Instruction&) override;
  740. virtual void MOV_DR_reg32(const X86::Instruction&) override;
  741. virtual void MOV_EAX_moff32(const X86::Instruction&) override;
  742. virtual void MOV_RM16_imm16(const X86::Instruction&) override;
  743. virtual void MOV_RM16_reg16(const X86::Instruction&) override;
  744. virtual void MOV_RM16_seg(const X86::Instruction&) override;
  745. virtual void MOV_RM32_imm32(const X86::Instruction&) override;
  746. virtual void MOV_RM32_reg32(const X86::Instruction&) override;
  747. virtual void MOV_RM8_imm8(const X86::Instruction&) override;
  748. virtual void MOV_RM8_reg8(const X86::Instruction&) override;
  749. virtual void MOV_moff16_AX(const X86::Instruction&) override;
  750. virtual void MOV_moff32_EAX(const X86::Instruction&) override;
  751. virtual void MOV_moff8_AL(const X86::Instruction&) override;
  752. virtual void MOV_reg16_RM16(const X86::Instruction&) override;
  753. virtual void MOV_reg16_imm16(const X86::Instruction&) override;
  754. virtual void MOV_reg32_CR(const X86::Instruction&) override;
  755. virtual void MOV_reg32_DR(const X86::Instruction&) override;
  756. virtual void MOV_reg32_RM32(const X86::Instruction&) override;
  757. virtual void MOV_reg32_imm32(const X86::Instruction&) override;
  758. virtual void MOV_reg8_RM8(const X86::Instruction&) override;
  759. virtual void MOV_reg8_imm8(const X86::Instruction&) override;
  760. virtual void MOV_seg_RM16(const X86::Instruction&) override;
  761. virtual void MOV_seg_RM32(const X86::Instruction&) override;
  762. virtual void MUL_RM16(const X86::Instruction&) override;
  763. virtual void MUL_RM32(const X86::Instruction&) override;
  764. virtual void MUL_RM8(const X86::Instruction&) override;
  765. virtual void NEG_RM16(const X86::Instruction&) override;
  766. virtual void NEG_RM32(const X86::Instruction&) override;
  767. virtual void NEG_RM8(const X86::Instruction&) override;
  768. virtual void NOP(const X86::Instruction&) override;
  769. virtual void NOT_RM16(const X86::Instruction&) override;
  770. virtual void NOT_RM32(const X86::Instruction&) override;
  771. virtual void NOT_RM8(const X86::Instruction&) override;
  772. virtual void OR_AL_imm8(const X86::Instruction&) override;
  773. virtual void OR_AX_imm16(const X86::Instruction&) override;
  774. virtual void OR_EAX_imm32(const X86::Instruction&) override;
  775. virtual void OR_RM16_imm16(const X86::Instruction&) override;
  776. virtual void OR_RM16_imm8(const X86::Instruction&) override;
  777. virtual void OR_RM16_reg16(const X86::Instruction&) override;
  778. virtual void OR_RM32_imm32(const X86::Instruction&) override;
  779. virtual void OR_RM32_imm8(const X86::Instruction&) override;
  780. virtual void OR_RM32_reg32(const X86::Instruction&) override;
  781. virtual void OR_RM8_imm8(const X86::Instruction&) override;
  782. virtual void OR_RM8_reg8(const X86::Instruction&) override;
  783. virtual void OR_reg16_RM16(const X86::Instruction&) override;
  784. virtual void OR_reg32_RM32(const X86::Instruction&) override;
  785. virtual void OR_reg8_RM8(const X86::Instruction&) override;
  786. virtual void OUTSB(const X86::Instruction&) override;
  787. virtual void OUTSD(const X86::Instruction&) override;
  788. virtual void OUTSW(const X86::Instruction&) override;
  789. virtual void OUT_DX_AL(const X86::Instruction&) override;
  790. virtual void OUT_DX_AX(const X86::Instruction&) override;
  791. virtual void OUT_DX_EAX(const X86::Instruction&) override;
  792. virtual void OUT_imm8_AL(const X86::Instruction&) override;
  793. virtual void OUT_imm8_AX(const X86::Instruction&) override;
  794. virtual void OUT_imm8_EAX(const X86::Instruction&) override;
  795. virtual void PADDB_mm1_mm2m64(const X86::Instruction&) override;
  796. virtual void PADDW_mm1_mm2m64(const X86::Instruction&) override;
  797. virtual void PADDD_mm1_mm2m64(const X86::Instruction&) override;
  798. virtual void POPA(const X86::Instruction&) override;
  799. virtual void POPAD(const X86::Instruction&) override;
  800. virtual void POPF(const X86::Instruction&) override;
  801. virtual void POPFD(const X86::Instruction&) override;
  802. virtual void POP_DS(const X86::Instruction&) override;
  803. virtual void POP_ES(const X86::Instruction&) override;
  804. virtual void POP_FS(const X86::Instruction&) override;
  805. virtual void POP_GS(const X86::Instruction&) override;
  806. virtual void POP_RM16(const X86::Instruction&) override;
  807. virtual void POP_RM32(const X86::Instruction&) override;
  808. virtual void POP_SS(const X86::Instruction&) override;
  809. virtual void POP_reg16(const X86::Instruction&) override;
  810. virtual void POP_reg32(const X86::Instruction&) override;
  811. virtual void PUSHA(const X86::Instruction&) override;
  812. virtual void PUSHAD(const X86::Instruction&) override;
  813. virtual void PUSHF(const X86::Instruction&) override;
  814. virtual void PUSHFD(const X86::Instruction&) override;
  815. virtual void PUSH_CS(const X86::Instruction&) override;
  816. virtual void PUSH_DS(const X86::Instruction&) override;
  817. virtual void PUSH_ES(const X86::Instruction&) override;
  818. virtual void PUSH_FS(const X86::Instruction&) override;
  819. virtual void PUSH_GS(const X86::Instruction&) override;
  820. virtual void PUSH_RM16(const X86::Instruction&) override;
  821. virtual void PUSH_RM32(const X86::Instruction&) override;
  822. virtual void PUSH_SP_8086_80186(const X86::Instruction&) override;
  823. virtual void PUSH_SS(const X86::Instruction&) override;
  824. virtual void PUSH_imm16(const X86::Instruction&) override;
  825. virtual void PUSH_imm32(const X86::Instruction&) override;
  826. virtual void PUSH_imm8(const X86::Instruction&) override;
  827. virtual void PUSH_reg16(const X86::Instruction&) override;
  828. virtual void PUSH_reg32(const X86::Instruction&) override;
  829. virtual void RCL_RM16_1(const X86::Instruction&) override;
  830. virtual void RCL_RM16_CL(const X86::Instruction&) override;
  831. virtual void RCL_RM16_imm8(const X86::Instruction&) override;
  832. virtual void RCL_RM32_1(const X86::Instruction&) override;
  833. virtual void RCL_RM32_CL(const X86::Instruction&) override;
  834. virtual void RCL_RM32_imm8(const X86::Instruction&) override;
  835. virtual void RCL_RM8_1(const X86::Instruction&) override;
  836. virtual void RCL_RM8_CL(const X86::Instruction&) override;
  837. virtual void RCL_RM8_imm8(const X86::Instruction&) override;
  838. virtual void RCR_RM16_1(const X86::Instruction&) override;
  839. virtual void RCR_RM16_CL(const X86::Instruction&) override;
  840. virtual void RCR_RM16_imm8(const X86::Instruction&) override;
  841. virtual void RCR_RM32_1(const X86::Instruction&) override;
  842. virtual void RCR_RM32_CL(const X86::Instruction&) override;
  843. virtual void RCR_RM32_imm8(const X86::Instruction&) override;
  844. virtual void RCR_RM8_1(const X86::Instruction&) override;
  845. virtual void RCR_RM8_CL(const X86::Instruction&) override;
  846. virtual void RCR_RM8_imm8(const X86::Instruction&) override;
  847. virtual void RDTSC(const X86::Instruction&) override;
  848. virtual void RET(const X86::Instruction&) override;
  849. virtual void RETF(const X86::Instruction&) override;
  850. virtual void RETF_imm16(const X86::Instruction&) override;
  851. virtual void RET_imm16(const X86::Instruction&) override;
  852. virtual void ROL_RM16_1(const X86::Instruction&) override;
  853. virtual void ROL_RM16_CL(const X86::Instruction&) override;
  854. virtual void ROL_RM16_imm8(const X86::Instruction&) override;
  855. virtual void ROL_RM32_1(const X86::Instruction&) override;
  856. virtual void ROL_RM32_CL(const X86::Instruction&) override;
  857. virtual void ROL_RM32_imm8(const X86::Instruction&) override;
  858. virtual void ROL_RM8_1(const X86::Instruction&) override;
  859. virtual void ROL_RM8_CL(const X86::Instruction&) override;
  860. virtual void ROL_RM8_imm8(const X86::Instruction&) override;
  861. virtual void ROR_RM16_1(const X86::Instruction&) override;
  862. virtual void ROR_RM16_CL(const X86::Instruction&) override;
  863. virtual void ROR_RM16_imm8(const X86::Instruction&) override;
  864. virtual void ROR_RM32_1(const X86::Instruction&) override;
  865. virtual void ROR_RM32_CL(const X86::Instruction&) override;
  866. virtual void ROR_RM32_imm8(const X86::Instruction&) override;
  867. virtual void ROR_RM8_1(const X86::Instruction&) override;
  868. virtual void ROR_RM8_CL(const X86::Instruction&) override;
  869. virtual void ROR_RM8_imm8(const X86::Instruction&) override;
  870. virtual void SAHF(const X86::Instruction&) override;
  871. virtual void SALC(const X86::Instruction&) override;
  872. virtual void SAR_RM16_1(const X86::Instruction&) override;
  873. virtual void SAR_RM16_CL(const X86::Instruction&) override;
  874. virtual void SAR_RM16_imm8(const X86::Instruction&) override;
  875. virtual void SAR_RM32_1(const X86::Instruction&) override;
  876. virtual void SAR_RM32_CL(const X86::Instruction&) override;
  877. virtual void SAR_RM32_imm8(const X86::Instruction&) override;
  878. virtual void SAR_RM8_1(const X86::Instruction&) override;
  879. virtual void SAR_RM8_CL(const X86::Instruction&) override;
  880. virtual void SAR_RM8_imm8(const X86::Instruction&) override;
  881. virtual void SBB_AL_imm8(const X86::Instruction&) override;
  882. virtual void SBB_AX_imm16(const X86::Instruction&) override;
  883. virtual void SBB_EAX_imm32(const X86::Instruction&) override;
  884. virtual void SBB_RM16_imm16(const X86::Instruction&) override;
  885. virtual void SBB_RM16_imm8(const X86::Instruction&) override;
  886. virtual void SBB_RM16_reg16(const X86::Instruction&) override;
  887. virtual void SBB_RM32_imm32(const X86::Instruction&) override;
  888. virtual void SBB_RM32_imm8(const X86::Instruction&) override;
  889. virtual void SBB_RM32_reg32(const X86::Instruction&) override;
  890. virtual void SBB_RM8_imm8(const X86::Instruction&) override;
  891. virtual void SBB_RM8_reg8(const X86::Instruction&) override;
  892. virtual void SBB_reg16_RM16(const X86::Instruction&) override;
  893. virtual void SBB_reg32_RM32(const X86::Instruction&) override;
  894. virtual void SBB_reg8_RM8(const X86::Instruction&) override;
  895. virtual void SCASB(const X86::Instruction&) override;
  896. virtual void SCASD(const X86::Instruction&) override;
  897. virtual void SCASW(const X86::Instruction&) override;
  898. virtual void SETcc_RM8(const X86::Instruction&) override;
  899. virtual void SGDT(const X86::Instruction&) override;
  900. virtual void SHLD_RM16_reg16_CL(const X86::Instruction&) override;
  901. virtual void SHLD_RM16_reg16_imm8(const X86::Instruction&) override;
  902. virtual void SHLD_RM32_reg32_CL(const X86::Instruction&) override;
  903. virtual void SHLD_RM32_reg32_imm8(const X86::Instruction&) override;
  904. virtual void SHL_RM16_1(const X86::Instruction&) override;
  905. virtual void SHL_RM16_CL(const X86::Instruction&) override;
  906. virtual void SHL_RM16_imm8(const X86::Instruction&) override;
  907. virtual void SHL_RM32_1(const X86::Instruction&) override;
  908. virtual void SHL_RM32_CL(const X86::Instruction&) override;
  909. virtual void SHL_RM32_imm8(const X86::Instruction&) override;
  910. virtual void SHL_RM8_1(const X86::Instruction&) override;
  911. virtual void SHL_RM8_CL(const X86::Instruction&) override;
  912. virtual void SHL_RM8_imm8(const X86::Instruction&) override;
  913. virtual void SHRD_RM16_reg16_CL(const X86::Instruction&) override;
  914. virtual void SHRD_RM16_reg16_imm8(const X86::Instruction&) override;
  915. virtual void SHRD_RM32_reg32_CL(const X86::Instruction&) override;
  916. virtual void SHRD_RM32_reg32_imm8(const X86::Instruction&) override;
  917. virtual void SHR_RM16_1(const X86::Instruction&) override;
  918. virtual void SHR_RM16_CL(const X86::Instruction&) override;
  919. virtual void SHR_RM16_imm8(const X86::Instruction&) override;
  920. virtual void SHR_RM32_1(const X86::Instruction&) override;
  921. virtual void SHR_RM32_CL(const X86::Instruction&) override;
  922. virtual void SHR_RM32_imm8(const X86::Instruction&) override;
  923. virtual void SHR_RM8_1(const X86::Instruction&) override;
  924. virtual void SHR_RM8_CL(const X86::Instruction&) override;
  925. virtual void SHR_RM8_imm8(const X86::Instruction&) override;
  926. virtual void SIDT(const X86::Instruction&) override;
  927. virtual void SLDT_RM16(const X86::Instruction&) override;
  928. virtual void SMSW_RM16(const X86::Instruction&) override;
  929. virtual void STC(const X86::Instruction&) override;
  930. virtual void STD(const X86::Instruction&) override;
  931. virtual void STI(const X86::Instruction&) override;
  932. virtual void STOSB(const X86::Instruction&) override;
  933. virtual void STOSD(const X86::Instruction&) override;
  934. virtual void STOSW(const X86::Instruction&) override;
  935. virtual void STR_RM16(const X86::Instruction&) override;
  936. virtual void SUB_AL_imm8(const X86::Instruction&) override;
  937. virtual void SUB_AX_imm16(const X86::Instruction&) override;
  938. virtual void SUB_EAX_imm32(const X86::Instruction&) override;
  939. virtual void SUB_RM16_imm16(const X86::Instruction&) override;
  940. virtual void SUB_RM16_imm8(const X86::Instruction&) override;
  941. virtual void SUB_RM16_reg16(const X86::Instruction&) override;
  942. virtual void SUB_RM32_imm32(const X86::Instruction&) override;
  943. virtual void SUB_RM32_imm8(const X86::Instruction&) override;
  944. virtual void SUB_RM32_reg32(const X86::Instruction&) override;
  945. virtual void SUB_RM8_imm8(const X86::Instruction&) override;
  946. virtual void SUB_RM8_reg8(const X86::Instruction&) override;
  947. virtual void SUB_reg16_RM16(const X86::Instruction&) override;
  948. virtual void SUB_reg32_RM32(const X86::Instruction&) override;
  949. virtual void SUB_reg8_RM8(const X86::Instruction&) override;
  950. virtual void TEST_AL_imm8(const X86::Instruction&) override;
  951. virtual void TEST_AX_imm16(const X86::Instruction&) override;
  952. virtual void TEST_EAX_imm32(const X86::Instruction&) override;
  953. virtual void TEST_RM16_imm16(const X86::Instruction&) override;
  954. virtual void TEST_RM16_reg16(const X86::Instruction&) override;
  955. virtual void TEST_RM32_imm32(const X86::Instruction&) override;
  956. virtual void TEST_RM32_reg32(const X86::Instruction&) override;
  957. virtual void TEST_RM8_imm8(const X86::Instruction&) override;
  958. virtual void TEST_RM8_reg8(const X86::Instruction&) override;
  959. virtual void UD0(const X86::Instruction&) override;
  960. virtual void UD1(const X86::Instruction&) override;
  961. virtual void UD2(const X86::Instruction&) override;
  962. virtual void VERR_RM16(const X86::Instruction&) override;
  963. virtual void VERW_RM16(const X86::Instruction&) override;
  964. virtual void WAIT(const X86::Instruction&) override;
  965. virtual void WBINVD(const X86::Instruction&) override;
  966. virtual void XADD_RM16_reg16(const X86::Instruction&) override;
  967. virtual void XADD_RM32_reg32(const X86::Instruction&) override;
  968. virtual void XADD_RM8_reg8(const X86::Instruction&) override;
  969. virtual void XCHG_AX_reg16(const X86::Instruction&) override;
  970. virtual void XCHG_EAX_reg32(const X86::Instruction&) override;
  971. virtual void XCHG_reg16_RM16(const X86::Instruction&) override;
  972. virtual void XCHG_reg32_RM32(const X86::Instruction&) override;
  973. virtual void XCHG_reg8_RM8(const X86::Instruction&) override;
  974. virtual void XLAT(const X86::Instruction&) override;
  975. virtual void XOR_AL_imm8(const X86::Instruction&) override;
  976. virtual void XOR_AX_imm16(const X86::Instruction&) override;
  977. virtual void XOR_EAX_imm32(const X86::Instruction&) override;
  978. virtual void XOR_RM16_imm16(const X86::Instruction&) override;
  979. virtual void XOR_RM16_imm8(const X86::Instruction&) override;
  980. virtual void XOR_RM16_reg16(const X86::Instruction&) override;
  981. virtual void XOR_RM32_imm32(const X86::Instruction&) override;
  982. virtual void XOR_RM32_imm8(const X86::Instruction&) override;
  983. virtual void XOR_RM32_reg32(const X86::Instruction&) override;
  984. virtual void XOR_RM8_imm8(const X86::Instruction&) override;
  985. virtual void XOR_RM8_reg8(const X86::Instruction&) override;
  986. virtual void XOR_reg16_RM16(const X86::Instruction&) override;
  987. virtual void XOR_reg32_RM32(const X86::Instruction&) override;
  988. virtual void XOR_reg8_RM8(const X86::Instruction&) override;
  989. virtual void MOVQ_mm1_mm2m64(const X86::Instruction&) override;
  990. virtual void EMMS(const X86::Instruction&) override;
  991. virtual void MOVQ_mm1_m64_mm2(const X86::Instruction&) override;
  992. virtual void wrap_0xC0(const X86::Instruction&) override;
  993. virtual void wrap_0xC1_16(const X86::Instruction&) override;
  994. virtual void wrap_0xC1_32(const X86::Instruction&) override;
  995. virtual void wrap_0xD0(const X86::Instruction&) override;
  996. virtual void wrap_0xD1_16(const X86::Instruction&) override;
  997. virtual void wrap_0xD1_32(const X86::Instruction&) override;
  998. virtual void wrap_0xD2(const X86::Instruction&) override;
  999. virtual void wrap_0xD3_16(const X86::Instruction&) override;
  1000. virtual void wrap_0xD3_32(const X86::Instruction&) override;
  1001. template<bool update_dest, bool is_or, typename Op>
  1002. void generic_AL_imm8(Op, const X86::Instruction&);
  1003. template<bool update_dest, bool is_or, typename Op>
  1004. void generic_AX_imm16(Op, const X86::Instruction&);
  1005. template<bool update_dest, bool is_or, typename Op>
  1006. void generic_EAX_imm32(Op, const X86::Instruction&);
  1007. template<bool update_dest, bool is_or, typename Op>
  1008. void generic_RM16_imm16(Op, const X86::Instruction&);
  1009. template<bool update_dest, bool is_or, typename Op>
  1010. void generic_RM16_imm8(Op, const X86::Instruction&);
  1011. template<bool update_dest, typename Op>
  1012. void generic_RM16_unsigned_imm8(Op, const X86::Instruction&);
  1013. template<bool update_dest, bool is_zero_idiom_if_both_operands_same, typename Op>
  1014. void generic_RM16_reg16(Op, const X86::Instruction&);
  1015. template<bool update_dest, bool is_or, typename Op>
  1016. void generic_RM32_imm32(Op, const X86::Instruction&);
  1017. template<bool update_dest, bool is_or, typename Op>
  1018. void generic_RM32_imm8(Op, const X86::Instruction&);
  1019. template<bool update_dest, typename Op>
  1020. void generic_RM32_unsigned_imm8(Op, const X86::Instruction&);
  1021. template<bool update_dest, bool is_zero_idiom_if_both_operands_same, typename Op>
  1022. void generic_RM32_reg32(Op, const X86::Instruction&);
  1023. template<bool update_dest, bool is_or, typename Op>
  1024. void generic_RM8_imm8(Op, const X86::Instruction&);
  1025. template<bool update_dest, bool is_zero_idiom_if_both_operands_same, typename Op>
  1026. void generic_RM8_reg8(Op, const X86::Instruction&);
  1027. template<bool update_dest, bool is_zero_idiom_if_both_operands_same, typename Op>
  1028. void generic_reg16_RM16(Op, const X86::Instruction&);
  1029. template<bool update_dest, bool is_zero_idiom_if_both_operands_same, typename Op>
  1030. void generic_reg32_RM32(Op, const X86::Instruction&);
  1031. template<bool update_dest, bool is_zero_idiom_if_both_operands_same, typename Op>
  1032. void generic_reg8_RM8(Op, const X86::Instruction&);
  1033. template<typename Op>
  1034. void generic_RM8_1(Op, const X86::Instruction&);
  1035. template<typename Op>
  1036. void generic_RM8_CL(Op, const X86::Instruction&);
  1037. template<typename Op>
  1038. void generic_RM16_1(Op, const X86::Instruction&);
  1039. template<typename Op>
  1040. void generic_RM16_CL(Op, const X86::Instruction&);
  1041. template<typename Op>
  1042. void generic_RM32_1(Op, const X86::Instruction&);
  1043. template<typename Op>
  1044. void generic_RM32_CL(Op, const X86::Instruction&);
  1045. void update_code_cache();
  1046. private:
  1047. Emulator& m_emulator;
  1048. PartAddressableRegister m_gpr[8];
  1049. PartAddressableRegister m_gpr_shadow[8];
  1050. u16 m_segment[8] { 0 };
  1051. u32 m_eflags { 0 };
  1052. bool m_flags_tainted { false };
  1053. u32 m_eip { 0 };
  1054. u32 m_base_eip { 0 };
  1055. long double m_fpu[8];
  1056. // FIXME: Shadow for m_fpu.
  1057. // FIXME: Use bits 11 to 13 in the FPU status word for this.
  1058. int m_fpu_top { -1 };
  1059. void fpu_push(long double n)
  1060. {
  1061. ++m_fpu_top;
  1062. fpu_set(0, n);
  1063. }
  1064. long double fpu_pop()
  1065. {
  1066. auto n = fpu_get(0);
  1067. m_fpu_top--;
  1068. return n;
  1069. }
  1070. long double fpu_get(int i)
  1071. {
  1072. VERIFY(i >= 0 && i <= m_fpu_top);
  1073. return m_fpu[m_fpu_top - i];
  1074. }
  1075. void fpu_set(int i, long double n)
  1076. {
  1077. VERIFY(i >= 0 && i <= m_fpu_top);
  1078. m_fpu[m_fpu_top - i] = n;
  1079. }
  1080. // FIXME: Or just something like m_flags_tainted?
  1081. ValueWithShadow<u16> m_fpu_cw { 0, 0 };
  1082. // FIXME: Make FPU/MMX memory its own struct
  1083. // FIXME: FPU Status word
  1084. // FIXME: FPU Tag Word
  1085. // FIXME: FPU Data Pointer
  1086. // FIXME: FPU Instruction Pointer ?
  1087. // FIXME: FPU Last OP Code ?
  1088. Region* m_cached_code_region { nullptr };
  1089. u8* m_cached_code_base_ptr { nullptr };
  1090. };
  1091. ALWAYS_INLINE u8 SoftCPU::read8()
  1092. {
  1093. if (!m_cached_code_region || !m_cached_code_region->contains(m_eip))
  1094. update_code_cache();
  1095. u8 value = m_cached_code_base_ptr[m_eip - m_cached_code_region->base()];
  1096. m_eip += 1;
  1097. return value;
  1098. }
  1099. ALWAYS_INLINE u16 SoftCPU::read16()
  1100. {
  1101. if (!m_cached_code_region || !m_cached_code_region->contains(m_eip))
  1102. update_code_cache();
  1103. u16 value = *reinterpret_cast<const u16*>(&m_cached_code_base_ptr[m_eip - m_cached_code_region->base()]);
  1104. m_eip += 2;
  1105. return value;
  1106. }
  1107. ALWAYS_INLINE u32 SoftCPU::read32()
  1108. {
  1109. if (!m_cached_code_region || !m_cached_code_region->contains(m_eip))
  1110. update_code_cache();
  1111. u32 value = *reinterpret_cast<const u32*>(&m_cached_code_base_ptr[m_eip - m_cached_code_region->base()]);
  1112. m_eip += 4;
  1113. return value;
  1114. }
  1115. ALWAYS_INLINE u64 SoftCPU::read64()
  1116. {
  1117. if (!m_cached_code_region || !m_cached_code_region->contains(m_eip))
  1118. update_code_cache();
  1119. auto value = *reinterpret_cast<const u64*>(&m_cached_code_base_ptr[m_eip - m_cached_code_region->base()]);
  1120. m_eip += 8;
  1121. return value;
  1122. }
  1123. }