jit_instructions.rs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396
  1. #![allow(non_snake_case)]
  2. use codegen;
  3. use cpu_context::CpuContext;
  4. use global_pointers;
  5. use jit::JitContext;
  6. use jit::{GEN_LOCAL_SCRATCH0, GEN_LOCAL_SCRATCH1};
  7. use prefix::SEG_PREFIX_ZERO;
  8. use prefix::{PREFIX_66, PREFIX_67, PREFIX_F2, PREFIX_F3};
  9. use regs::{AX, BP, BX, CX, DI, DX, SI, SP};
  10. use regs::{CS, DS, ES, FS, GS, SS};
  11. use regs::{EAX, EBP, EBX, ECX, EDI, EDX, ESI, ESP};
  12. use wasmgen::module_init::WasmBuilder;
  13. use wasmgen::wasm_util;
  14. pub fn jit_instruction(cpu: &mut CpuContext, builder: &mut WasmBuilder, instr_flags: &mut u32) {
  15. cpu.prefixes = 0;
  16. let ctx = &mut JitContext { cpu, builder };
  17. ::gen::jit::jit(
  18. ctx.cpu.read_imm8() as u32 | (ctx.cpu.osize_32() as u32) << 8,
  19. ctx,
  20. instr_flags,
  21. );
  22. }
  23. pub fn jit_handle_prefix(ctx: &mut JitContext, instr_flags: &mut u32) {
  24. // TODO: Could avoid repeatedly generating prefix updates
  25. let prefixes = ctx.cpu.prefixes;
  26. codegen::gen_add_prefix_bits(ctx, prefixes);
  27. ::gen::jit::jit(
  28. ctx.cpu.read_imm8() as u32 | (ctx.cpu.osize_32() as u32) << 8,
  29. ctx,
  30. instr_flags,
  31. );
  32. codegen::gen_clear_prefixes(ctx);
  33. }
  34. pub fn jit_handle_segment_prefix(segment: u32, ctx: &mut JitContext, instr_flags: &mut u32) {
  35. assert!(segment <= 5);
  36. ctx.cpu.prefixes |= segment + 1;
  37. jit_handle_prefix(ctx, instr_flags)
  38. }
  39. pub fn instr16_0F_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  40. ::gen::jit0f_16::jit(ctx.cpu.read_imm8(), ctx, instr_flags)
  41. }
  42. pub fn instr32_0F_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  43. ::gen::jit0f_32::jit(ctx.cpu.read_imm8(), ctx, instr_flags)
  44. }
  45. pub fn instr_26_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  46. jit_handle_segment_prefix(ES, ctx, instr_flags)
  47. }
  48. pub fn instr_2E_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  49. jit_handle_segment_prefix(CS, ctx, instr_flags)
  50. }
  51. pub fn instr_36_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  52. jit_handle_segment_prefix(SS, ctx, instr_flags)
  53. }
  54. pub fn instr_3E_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  55. jit_handle_segment_prefix(DS, ctx, instr_flags)
  56. }
  57. pub fn instr_64_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  58. jit_handle_segment_prefix(FS, ctx, instr_flags)
  59. }
  60. pub fn instr_65_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  61. jit_handle_segment_prefix(GS, ctx, instr_flags)
  62. }
  63. pub fn instr_66_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  64. ctx.cpu.prefixes |= PREFIX_66;
  65. jit_handle_prefix(ctx, instr_flags)
  66. }
  67. pub fn instr_67_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  68. ctx.cpu.prefixes |= PREFIX_67;
  69. jit_handle_prefix(ctx, instr_flags)
  70. }
  71. pub fn instr_F0_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  72. // lock: Ignore
  73. jit_handle_prefix(ctx, instr_flags)
  74. }
  75. pub fn instr_F2_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  76. ctx.cpu.prefixes |= PREFIX_F2;
  77. jit_handle_prefix(ctx, instr_flags)
  78. }
  79. pub fn instr_F3_jit(ctx: &mut JitContext, instr_flags: &mut u32) {
  80. ctx.cpu.prefixes |= PREFIX_F3;
  81. jit_handle_prefix(ctx, instr_flags)
  82. }
  83. fn push16_reg_jit(ctx: &mut JitContext, r: u32) {
  84. let name = if ctx.cpu.ssize_32() {
  85. "push16_ss32"
  86. }
  87. else {
  88. "push16_ss16"
  89. };
  90. codegen::gen_fn1_reg16(ctx, name, r);
  91. }
  92. fn push32_reg_jit(ctx: &mut JitContext, r: u32) {
  93. let name = if ctx.cpu.ssize_32() {
  94. "push32_ss32"
  95. }
  96. else {
  97. "push32_ss16"
  98. };
  99. codegen::gen_fn1_reg32(ctx, name, r);
  100. }
  101. fn push16_imm_jit(ctx: &mut JitContext, imm: u32) {
  102. let name = if ctx.cpu.ssize_32() {
  103. "push16_ss32"
  104. }
  105. else {
  106. "push16_ss16"
  107. };
  108. codegen::gen_fn1_const(ctx, name, imm)
  109. }
  110. fn push32_imm_jit(ctx: &mut JitContext, imm: u32) {
  111. let name = if ctx.cpu.ssize_32() {
  112. "push32_ss32"
  113. }
  114. else {
  115. "push32_ss16"
  116. };
  117. codegen::gen_fn1_const(ctx, name, imm)
  118. }
  119. fn push16_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
  120. codegen::gen_modrm_resolve(ctx, modrm_byte);
  121. let name = if ctx.cpu.ssize_32() {
  122. "push16_ss32_mem"
  123. }
  124. else {
  125. "push16_ss16_mem"
  126. };
  127. codegen::gen_modrm_fn0(ctx, name)
  128. }
  129. fn push32_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
  130. codegen::gen_modrm_resolve(ctx, modrm_byte);
  131. let name = if ctx.cpu.ssize_32() {
  132. "push32_ss32_mem"
  133. }
  134. else {
  135. "push32_ss16_mem"
  136. };
  137. codegen::gen_modrm_fn0(ctx, name)
  138. }
  139. fn pop16_reg_jit(ctx: &mut JitContext, reg: u32) {
  140. if ctx.cpu.ssize_32() {
  141. codegen::gen_set_reg16_fn0(ctx, "pop16_ss32", reg);
  142. }
  143. else {
  144. codegen::gen_set_reg16_fn0(ctx, "pop16_ss16", reg);
  145. }
  146. }
  147. fn pop32_reg_jit(ctx: &mut JitContext, reg: u32) {
  148. if ctx.cpu.ssize_32() {
  149. codegen::gen_set_reg32s_fn0(ctx, "pop32s_ss32", reg);
  150. }
  151. else {
  152. codegen::gen_set_reg32s_fn0(ctx, "pop32s_ss16", reg);
  153. }
  154. }
  155. pub fn instr16_50_jit(ctx: &mut JitContext) { push16_reg_jit(ctx, AX); }
  156. pub fn instr32_50_jit(ctx: &mut JitContext) { push32_reg_jit(ctx, EAX); }
  157. pub fn instr16_51_jit(ctx: &mut JitContext) { push16_reg_jit(ctx, CX); }
  158. pub fn instr32_51_jit(ctx: &mut JitContext) { push32_reg_jit(ctx, ECX); }
  159. pub fn instr16_52_jit(ctx: &mut JitContext) { push16_reg_jit(ctx, DX); }
  160. pub fn instr32_52_jit(ctx: &mut JitContext) { push32_reg_jit(ctx, EDX); }
  161. pub fn instr16_53_jit(ctx: &mut JitContext) { push16_reg_jit(ctx, BX); }
  162. pub fn instr32_53_jit(ctx: &mut JitContext) { push32_reg_jit(ctx, EBX); }
  163. pub fn instr16_54_jit(ctx: &mut JitContext) { push16_reg_jit(ctx, SP); }
  164. pub fn instr32_54_jit(ctx: &mut JitContext) { push32_reg_jit(ctx, ESP); }
  165. pub fn instr16_55_jit(ctx: &mut JitContext) { push16_reg_jit(ctx, BP); }
  166. pub fn instr32_55_jit(ctx: &mut JitContext) { push32_reg_jit(ctx, EBP); }
  167. pub fn instr16_56_jit(ctx: &mut JitContext) { push16_reg_jit(ctx, SI); }
  168. pub fn instr32_56_jit(ctx: &mut JitContext) { push32_reg_jit(ctx, ESI); }
  169. pub fn instr16_57_jit(ctx: &mut JitContext) { push16_reg_jit(ctx, DI); }
  170. pub fn instr32_57_jit(ctx: &mut JitContext) { push32_reg_jit(ctx, EDI); }
  171. pub fn instr16_58_jit(ctx: &mut JitContext) { pop16_reg_jit(ctx, AX); }
  172. pub fn instr32_58_jit(ctx: &mut JitContext) { pop32_reg_jit(ctx, EAX); }
  173. pub fn instr16_59_jit(ctx: &mut JitContext) { pop16_reg_jit(ctx, CX); }
  174. pub fn instr32_59_jit(ctx: &mut JitContext) { pop32_reg_jit(ctx, ECX); }
  175. pub fn instr16_5A_jit(ctx: &mut JitContext) { pop16_reg_jit(ctx, DX); }
  176. pub fn instr32_5A_jit(ctx: &mut JitContext) { pop32_reg_jit(ctx, EDX); }
  177. pub fn instr16_5B_jit(ctx: &mut JitContext) { pop16_reg_jit(ctx, BX); }
  178. pub fn instr32_5B_jit(ctx: &mut JitContext) { pop32_reg_jit(ctx, EBX); }
  179. // hole for pop esp
  180. pub fn instr16_5D_jit(ctx: &mut JitContext) { pop16_reg_jit(ctx, BP); }
  181. pub fn instr32_5D_jit(ctx: &mut JitContext) { pop32_reg_jit(ctx, EBP); }
  182. pub fn instr16_5E_jit(ctx: &mut JitContext) { pop16_reg_jit(ctx, SI); }
  183. pub fn instr32_5E_jit(ctx: &mut JitContext) { pop32_reg_jit(ctx, ESI); }
  184. pub fn instr16_5F_jit(ctx: &mut JitContext) { pop16_reg_jit(ctx, DI); }
  185. pub fn instr32_5F_jit(ctx: &mut JitContext) { pop32_reg_jit(ctx, EDI); }
  186. pub fn instr16_68_jit(ctx: &mut JitContext, imm16: u32) { push16_imm_jit(ctx, imm16) }
  187. pub fn instr32_68_jit(ctx: &mut JitContext, imm32: u32) { push32_imm_jit(ctx, imm32) }
  188. pub fn instr16_6A_jit(ctx: &mut JitContext, imm16: u32) { push16_imm_jit(ctx, imm16) }
  189. pub fn instr32_6A_jit(ctx: &mut JitContext, imm32: u32) { push32_imm_jit(ctx, imm32) }
  190. // Code for conditional jumps is generated automatically by the basic block codegen
  191. pub fn instr16_70_jit(_ctx: &mut JitContext, _imm: u32) {}
  192. pub fn instr32_70_jit(_ctx: &mut JitContext, _imm: u32) {}
  193. pub fn instr16_71_jit(_ctx: &mut JitContext, _imm: u32) {}
  194. pub fn instr32_71_jit(_ctx: &mut JitContext, _imm: u32) {}
  195. pub fn instr16_72_jit(_ctx: &mut JitContext, _imm: u32) {}
  196. pub fn instr32_72_jit(_ctx: &mut JitContext, _imm: u32) {}
  197. pub fn instr16_73_jit(_ctx: &mut JitContext, _imm: u32) {}
  198. pub fn instr32_73_jit(_ctx: &mut JitContext, _imm: u32) {}
  199. pub fn instr16_74_jit(_ctx: &mut JitContext, _imm: u32) {}
  200. pub fn instr32_74_jit(_ctx: &mut JitContext, _imm: u32) {}
  201. pub fn instr16_75_jit(_ctx: &mut JitContext, _imm: u32) {}
  202. pub fn instr32_75_jit(_ctx: &mut JitContext, _imm: u32) {}
  203. pub fn instr16_76_jit(_ctx: &mut JitContext, _imm: u32) {}
  204. pub fn instr32_76_jit(_ctx: &mut JitContext, _imm: u32) {}
  205. pub fn instr16_77_jit(_ctx: &mut JitContext, _imm: u32) {}
  206. pub fn instr32_77_jit(_ctx: &mut JitContext, _imm: u32) {}
  207. pub fn instr16_78_jit(_ctx: &mut JitContext, _imm: u32) {}
  208. pub fn instr32_78_jit(_ctx: &mut JitContext, _imm: u32) {}
  209. pub fn instr16_79_jit(_ctx: &mut JitContext, _imm: u32) {}
  210. pub fn instr32_79_jit(_ctx: &mut JitContext, _imm: u32) {}
  211. pub fn instr16_7A_jit(_ctx: &mut JitContext, _imm: u32) {}
  212. pub fn instr32_7A_jit(_ctx: &mut JitContext, _imm: u32) {}
  213. pub fn instr16_7B_jit(_ctx: &mut JitContext, _imm: u32) {}
  214. pub fn instr32_7B_jit(_ctx: &mut JitContext, _imm: u32) {}
  215. pub fn instr16_7C_jit(_ctx: &mut JitContext, _imm: u32) {}
  216. pub fn instr32_7C_jit(_ctx: &mut JitContext, _imm: u32) {}
  217. pub fn instr16_7D_jit(_ctx: &mut JitContext, _imm: u32) {}
  218. pub fn instr32_7D_jit(_ctx: &mut JitContext, _imm: u32) {}
  219. pub fn instr16_7E_jit(_ctx: &mut JitContext, _imm: u32) {}
  220. pub fn instr32_7E_jit(_ctx: &mut JitContext, _imm: u32) {}
  221. pub fn instr16_7F_jit(_ctx: &mut JitContext, _imm: u32) {}
  222. pub fn instr32_7F_jit(_ctx: &mut JitContext, _imm: u32) {}
  223. pub fn instr16_89_mem_jit(ctx: &mut JitContext, modrm_byte: u8, r: u32) {
  224. // TODO: Inlining
  225. codegen::gen_modrm_resolve(ctx, modrm_byte);
  226. codegen::gen_modrm_fn1(ctx, "instr16_89_mem", r);
  227. }
  228. pub fn instr16_89_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
  229. codegen::gen_set_reg16_r(ctx, r1, r2);
  230. }
  231. pub fn instr32_89_mem_jit(ctx: &mut JitContext, modrm_byte: u8, r: u32) {
  232. // Pseudo: safe_write32(modrm_resolve(modrm_byte), reg32s[r]);
  233. let address_local = GEN_LOCAL_SCRATCH0;
  234. let value_local = GEN_LOCAL_SCRATCH1;
  235. codegen::gen_modrm_resolve(ctx, modrm_byte);
  236. wasm_util::set_local(&mut ctx.builder.instruction_body, address_local);
  237. wasm_util::push_i32(
  238. &mut ctx.builder.instruction_body,
  239. global_pointers::get_reg32_offset(r) as i32,
  240. );
  241. wasm_util::load_aligned_i32_from_stack(&mut ctx.builder.instruction_body, 0);
  242. wasm_util::set_local(&mut ctx.builder.instruction_body, value_local);
  243. codegen::gen_safe_write32(ctx, address_local, value_local);
  244. }
  245. pub fn instr32_89_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
  246. codegen::gen_set_reg32_r(ctx, r1, r2);
  247. }
  248. pub fn instr16_8B_mem_jit(ctx: &mut JitContext, modrm_byte: u8, r: u32) {
  249. // TODO: Inlining
  250. codegen::gen_modrm_resolve(ctx, modrm_byte);
  251. codegen::gen_modrm_fn1(ctx, "instr16_8B_mem", r);
  252. }
  253. pub fn instr16_8B_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
  254. codegen::gen_set_reg16_r(ctx, r2, r1);
  255. }
  256. pub fn instr32_8B_mem_jit(ctx: &mut JitContext, modrm_byte: u8, r: u32) {
  257. // Pseudo: reg32s[r] = safe_read32s(modrm_resolve(modrm_byte));
  258. wasm_util::push_i32(
  259. &mut ctx.builder.instruction_body,
  260. global_pointers::get_reg32_offset(r) as i32,
  261. );
  262. codegen::gen_modrm_resolve(ctx, modrm_byte);
  263. codegen::gen_safe_read32(ctx);
  264. wasm_util::store_aligned_i32(&mut ctx.builder.instruction_body);
  265. }
  266. pub fn instr32_8B_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
  267. codegen::gen_set_reg32_r(ctx, r2, r1);
  268. }
  269. pub fn instr16_8D_mem_jit(ctx: &mut JitContext, modrm_byte: u8, reg: u32) {
  270. let loc = global_pointers::get_reg16_offset(reg);
  271. wasm_util::push_i32(&mut ctx.builder.instruction_body, loc as i32);
  272. ctx.cpu.prefixes |= SEG_PREFIX_ZERO;
  273. codegen::gen_modrm_resolve(ctx, modrm_byte);
  274. wasm_util::store_aligned_u16(&mut ctx.builder.instruction_body);
  275. }
  276. pub fn instr32_8D_mem_jit(ctx: &mut JitContext, modrm_byte: u8, reg: u32) {
  277. let loc = global_pointers::get_reg32_offset(reg);
  278. wasm_util::push_i32(&mut ctx.builder.instruction_body, loc as i32);
  279. ctx.cpu.prefixes |= SEG_PREFIX_ZERO;
  280. codegen::gen_modrm_resolve(ctx, modrm_byte);
  281. wasm_util::store_aligned_i32(&mut ctx.builder.instruction_body);
  282. }
  283. pub fn instr16_8D_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
  284. codegen::gen_fn2_const(ctx, "instr16_8D_reg", r1, r2);
  285. }
  286. pub fn instr32_8D_reg_jit(ctx: &mut JitContext, r1: u32, r2: u32) {
  287. codegen::gen_fn2_const(ctx, "instr32_8D_reg", r1, r2);
  288. }
  289. pub fn instr16_8F_0_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
  290. codegen::gen_fn0_const(ctx, "instr16_8F_0_mem_pre");
  291. codegen::gen_modrm_resolve(ctx, modrm_byte);
  292. codegen::gen_modrm_fn0(ctx, "instr16_8F_0_mem");
  293. }
  294. pub fn instr16_8F_0_reg_jit(ctx: &mut JitContext, r: u32) {
  295. codegen::gen_fn1_const(ctx, "instr16_8F_0_reg", r);
  296. }
  297. pub fn instr32_8F_0_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
  298. codegen::gen_fn0_const(ctx, "instr32_8F_0_mem_pre");
  299. codegen::gen_modrm_resolve(ctx, modrm_byte);
  300. codegen::gen_modrm_fn0(ctx, "instr32_8F_0_mem");
  301. }
  302. pub fn instr32_8F_0_reg_jit(ctx: &mut JitContext, r: u32) {
  303. codegen::gen_fn1_const(ctx, "instr32_8F_0_reg", r);
  304. }
  305. pub fn instr16_E8_jit(ctx: &mut JitContext, imm: u32) {
  306. codegen::gen_fn1_const(ctx, "instr16_E8", imm);
  307. }
  308. pub fn instr32_E8_jit(ctx: &mut JitContext, imm: u32) {
  309. codegen::gen_fn1_const(ctx, "instr32_E8", imm);
  310. }
  311. pub fn instr16_E9_jit(ctx: &mut JitContext, imm: u32) {
  312. codegen::gen_fn1_const(ctx, "instr16_E9", imm);
  313. }
  314. pub fn instr32_E9_jit(ctx: &mut JitContext, imm: u32) {
  315. codegen::gen_fn1_const(ctx, "instr32_E9", imm);
  316. }
  317. pub fn instr16_EB_jit(ctx: &mut JitContext, imm: u32) {
  318. codegen::gen_fn1_const(ctx, "instr16_EB", imm);
  319. }
  320. pub fn instr32_EB_jit(ctx: &mut JitContext, imm: u32) {
  321. codegen::gen_fn1_const(ctx, "instr32_EB", imm);
  322. }
  323. pub fn instr16_FF_6_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
  324. push16_mem_jit(ctx, modrm_byte)
  325. }
  326. pub fn instr16_FF_6_reg_jit(ctx: &mut JitContext, r: u32) { push16_reg_jit(ctx, r) }
  327. pub fn instr32_FF_6_mem_jit(ctx: &mut JitContext, modrm_byte: u8) {
  328. push32_mem_jit(ctx, modrm_byte)
  329. }
  330. pub fn instr32_FF_6_reg_jit(ctx: &mut JitContext, r: u32) { push32_reg_jit(ctx, r) }
  331. // Code for conditional jumps is generated automatically by the basic block codegen
  332. pub fn instr16_0F80_jit(_ctx: &mut JitContext, _imm: u32) {}
  333. pub fn instr16_0F81_jit(_ctx: &mut JitContext, _imm: u32) {}
  334. pub fn instr16_0F82_jit(_ctx: &mut JitContext, _imm: u32) {}
  335. pub fn instr16_0F83_jit(_ctx: &mut JitContext, _imm: u32) {}
  336. pub fn instr16_0F84_jit(_ctx: &mut JitContext, _imm: u32) {}
  337. pub fn instr16_0F85_jit(_ctx: &mut JitContext, _imm: u32) {}
  338. pub fn instr16_0F86_jit(_ctx: &mut JitContext, _imm: u32) {}
  339. pub fn instr16_0F87_jit(_ctx: &mut JitContext, _imm: u32) {}
  340. pub fn instr16_0F88_jit(_ctx: &mut JitContext, _imm: u32) {}
  341. pub fn instr16_0F89_jit(_ctx: &mut JitContext, _imm: u32) {}
  342. pub fn instr16_0F8A_jit(_ctx: &mut JitContext, _imm: u32) {}
  343. pub fn instr16_0F8B_jit(_ctx: &mut JitContext, _imm: u32) {}
  344. pub fn instr16_0F8C_jit(_ctx: &mut JitContext, _imm: u32) {}
  345. pub fn instr16_0F8D_jit(_ctx: &mut JitContext, _imm: u32) {}
  346. pub fn instr16_0F8E_jit(_ctx: &mut JitContext, _imm: u32) {}
  347. pub fn instr16_0F8F_jit(_ctx: &mut JitContext, _imm: u32) {}
  348. pub fn instr32_0F80_jit(_ctx: &mut JitContext, _imm: u32) {}
  349. pub fn instr32_0F81_jit(_ctx: &mut JitContext, _imm: u32) {}
  350. pub fn instr32_0F82_jit(_ctx: &mut JitContext, _imm: u32) {}
  351. pub fn instr32_0F83_jit(_ctx: &mut JitContext, _imm: u32) {}
  352. pub fn instr32_0F84_jit(_ctx: &mut JitContext, _imm: u32) {}
  353. pub fn instr32_0F85_jit(_ctx: &mut JitContext, _imm: u32) {}
  354. pub fn instr32_0F86_jit(_ctx: &mut JitContext, _imm: u32) {}
  355. pub fn instr32_0F87_jit(_ctx: &mut JitContext, _imm: u32) {}
  356. pub fn instr32_0F88_jit(_ctx: &mut JitContext, _imm: u32) {}
  357. pub fn instr32_0F89_jit(_ctx: &mut JitContext, _imm: u32) {}
  358. pub fn instr32_0F8A_jit(_ctx: &mut JitContext, _imm: u32) {}
  359. pub fn instr32_0F8B_jit(_ctx: &mut JitContext, _imm: u32) {}
  360. pub fn instr32_0F8C_jit(_ctx: &mut JitContext, _imm: u32) {}
  361. pub fn instr32_0F8D_jit(_ctx: &mut JitContext, _imm: u32) {}
  362. pub fn instr32_0F8E_jit(_ctx: &mut JitContext, _imm: u32) {}
  363. pub fn instr32_0F8F_jit(_ctx: &mut JitContext, _imm: u32) {}