@aptre/v86 0.5.0

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 (111) hide show
  1. package/LICENSE +22 -0
  2. package/LICENSE.MIT +22 -0
  3. package/Readme.md +237 -0
  4. package/dist/v86.browser.js +26666 -0
  5. package/dist/v86.browser.js.map +7 -0
  6. package/dist/v86.js +26632 -0
  7. package/dist/v86.js.map +7 -0
  8. package/gen/generate_analyzer.ts +512 -0
  9. package/gen/generate_interpreter.ts +522 -0
  10. package/gen/generate_jit.ts +624 -0
  11. package/gen/rust_ast.ts +107 -0
  12. package/gen/util.ts +35 -0
  13. package/gen/x86_table.ts +1836 -0
  14. package/lib/9p.ts +1547 -0
  15. package/lib/filesystem.ts +1879 -0
  16. package/lib/marshall.ts +168 -0
  17. package/lib/softfloat/softfloat.c +32501 -0
  18. package/lib/zstd/zstddeclib.c +13520 -0
  19. package/package.json +75 -0
  20. package/src/acpi.ts +267 -0
  21. package/src/browser/dummy_screen.ts +106 -0
  22. package/src/browser/fake_network.ts +1771 -0
  23. package/src/browser/fetch_network.ts +361 -0
  24. package/src/browser/filestorage.ts +124 -0
  25. package/src/browser/inbrowser_network.ts +57 -0
  26. package/src/browser/keyboard.ts +564 -0
  27. package/src/browser/main.ts +3415 -0
  28. package/src/browser/mouse.ts +255 -0
  29. package/src/browser/network.ts +142 -0
  30. package/src/browser/print_stats.ts +336 -0
  31. package/src/browser/screen.ts +978 -0
  32. package/src/browser/serial.ts +316 -0
  33. package/src/browser/speaker.ts +1223 -0
  34. package/src/browser/starter.ts +1688 -0
  35. package/src/browser/wisp_network.ts +332 -0
  36. package/src/browser/worker_bus.ts +64 -0
  37. package/src/buffer.ts +652 -0
  38. package/src/bus.ts +78 -0
  39. package/src/const.ts +128 -0
  40. package/src/cpu.ts +2891 -0
  41. package/src/dma.ts +474 -0
  42. package/src/elf.ts +251 -0
  43. package/src/floppy.ts +1778 -0
  44. package/src/ide.ts +3455 -0
  45. package/src/io.ts +504 -0
  46. package/src/iso9660.ts +317 -0
  47. package/src/kernel.ts +250 -0
  48. package/src/lib.ts +645 -0
  49. package/src/log.ts +149 -0
  50. package/src/main.ts +199 -0
  51. package/src/ne2k.ts +1589 -0
  52. package/src/pci.ts +815 -0
  53. package/src/pit.ts +406 -0
  54. package/src/ps2.ts +820 -0
  55. package/src/rtc.ts +537 -0
  56. package/src/rust/analysis.rs +101 -0
  57. package/src/rust/codegen.rs +2660 -0
  58. package/src/rust/config.rs +3 -0
  59. package/src/rust/control_flow.rs +425 -0
  60. package/src/rust/cpu/apic.rs +658 -0
  61. package/src/rust/cpu/arith.rs +1207 -0
  62. package/src/rust/cpu/call_indirect.rs +2 -0
  63. package/src/rust/cpu/cpu.rs +4501 -0
  64. package/src/rust/cpu/fpu.rs +923 -0
  65. package/src/rust/cpu/global_pointers.rs +112 -0
  66. package/src/rust/cpu/instructions.rs +2486 -0
  67. package/src/rust/cpu/instructions_0f.rs +5261 -0
  68. package/src/rust/cpu/ioapic.rs +316 -0
  69. package/src/rust/cpu/memory.rs +351 -0
  70. package/src/rust/cpu/misc_instr.rs +613 -0
  71. package/src/rust/cpu/mod.rs +16 -0
  72. package/src/rust/cpu/modrm.rs +133 -0
  73. package/src/rust/cpu/pic.rs +402 -0
  74. package/src/rust/cpu/sse_instr.rs +361 -0
  75. package/src/rust/cpu/string.rs +701 -0
  76. package/src/rust/cpu/vga.rs +175 -0
  77. package/src/rust/cpu_context.rs +69 -0
  78. package/src/rust/dbg.rs +98 -0
  79. package/src/rust/gen/analyzer.rs +3807 -0
  80. package/src/rust/gen/analyzer0f.rs +3992 -0
  81. package/src/rust/gen/interpreter.rs +4447 -0
  82. package/src/rust/gen/interpreter0f.rs +5404 -0
  83. package/src/rust/gen/jit.rs +5080 -0
  84. package/src/rust/gen/jit0f.rs +5547 -0
  85. package/src/rust/gen/mod.rs +14 -0
  86. package/src/rust/jit.rs +2443 -0
  87. package/src/rust/jit_instructions.rs +7881 -0
  88. package/src/rust/js_api.rs +6 -0
  89. package/src/rust/leb.rs +46 -0
  90. package/src/rust/lib.rs +29 -0
  91. package/src/rust/modrm.rs +330 -0
  92. package/src/rust/opstats.rs +249 -0
  93. package/src/rust/page.rs +15 -0
  94. package/src/rust/paging.rs +25 -0
  95. package/src/rust/prefix.rs +15 -0
  96. package/src/rust/profiler.rs +155 -0
  97. package/src/rust/regs.rs +38 -0
  98. package/src/rust/softfloat.rs +286 -0
  99. package/src/rust/state_flags.rs +27 -0
  100. package/src/rust/wasmgen/mod.rs +2 -0
  101. package/src/rust/wasmgen/wasm_builder.rs +1047 -0
  102. package/src/rust/wasmgen/wasm_opcodes.rs +221 -0
  103. package/src/rust/zstd.rs +105 -0
  104. package/src/sb16.ts +1928 -0
  105. package/src/state.ts +359 -0
  106. package/src/uart.ts +472 -0
  107. package/src/vga.ts +2791 -0
  108. package/src/virtio.ts +1756 -0
  109. package/src/virtio_balloon.ts +273 -0
  110. package/src/virtio_console.ts +372 -0
  111. package/src/virtio_net.ts +326 -0
@@ -0,0 +1,4447 @@
1
+ #![cfg_attr(rustfmt, rustfmt_skip)]
2
+ use crate::cpu::cpu::{after_block_boundary, modrm_resolve};
3
+ use crate::cpu::cpu::{read_imm8, read_imm8s, read_imm16, read_imm32s, read_moffs};
4
+ use crate::cpu::cpu::{task_switch_test, trigger_ud};
5
+ use crate::cpu::instructions;
6
+ use crate::cpu::global_pointers::{instruction_pointer, prefixes};
7
+ use crate::prefix;
8
+ pub unsafe fn run(opcode: u32) {
9
+ match opcode {
10
+ 0x00 | 0x100 => {
11
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
12
+ if modrm_byte < 0xC0 {
13
+ instructions::instr_00_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
14
+ }
15
+ else {
16
+ instructions::instr_00_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
17
+ }
18
+ },
19
+ 0x01 => {
20
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
21
+ if modrm_byte < 0xC0 {
22
+ instructions::instr16_01_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
23
+ }
24
+ else {
25
+ instructions::instr16_01_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
26
+ }
27
+ },
28
+ 0x101 => {
29
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
30
+ if modrm_byte < 0xC0 {
31
+ instructions::instr32_01_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
32
+ }
33
+ else {
34
+ instructions::instr32_01_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
35
+ }
36
+ },
37
+ 0x02 | 0x102 => {
38
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
39
+ if modrm_byte < 0xC0 {
40
+ instructions::instr_02_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
41
+ }
42
+ else {
43
+ instructions::instr_02_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
44
+ }
45
+ },
46
+ 0x03 => {
47
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
48
+ if modrm_byte < 0xC0 {
49
+ instructions::instr16_03_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
50
+ }
51
+ else {
52
+ instructions::instr16_03_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
53
+ }
54
+ },
55
+ 0x103 => {
56
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
57
+ if modrm_byte < 0xC0 {
58
+ instructions::instr32_03_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
59
+ }
60
+ else {
61
+ instructions::instr32_03_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
62
+ }
63
+ },
64
+ 0x04 | 0x104 => {
65
+ instructions::instr_04(match read_imm8() { Ok(o) => o, Err(()) => return });
66
+ },
67
+ 0x05 => {
68
+ instructions::instr16_05(match read_imm16() { Ok(o) => o, Err(()) => return });
69
+ },
70
+ 0x105 => {
71
+ instructions::instr32_05(match read_imm32s() { Ok(o) => o, Err(()) => return });
72
+ },
73
+ 0x06 => {
74
+ instructions::instr16_06();
75
+ },
76
+ 0x106 => {
77
+ instructions::instr32_06();
78
+ },
79
+ 0x07 => {
80
+ instructions::instr16_07();
81
+ after_block_boundary();
82
+ },
83
+ 0x107 => {
84
+ instructions::instr32_07();
85
+ after_block_boundary();
86
+ },
87
+ 0x08 | 0x108 => {
88
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
89
+ if modrm_byte < 0xC0 {
90
+ instructions::instr_08_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
91
+ }
92
+ else {
93
+ instructions::instr_08_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
94
+ }
95
+ },
96
+ 0x09 => {
97
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
98
+ if modrm_byte < 0xC0 {
99
+ instructions::instr16_09_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
100
+ }
101
+ else {
102
+ instructions::instr16_09_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
103
+ }
104
+ },
105
+ 0x109 => {
106
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
107
+ if modrm_byte < 0xC0 {
108
+ instructions::instr32_09_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
109
+ }
110
+ else {
111
+ instructions::instr32_09_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
112
+ }
113
+ },
114
+ 0x0A | 0x10A => {
115
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
116
+ if modrm_byte < 0xC0 {
117
+ instructions::instr_0A_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
118
+ }
119
+ else {
120
+ instructions::instr_0A_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
121
+ }
122
+ },
123
+ 0x0B => {
124
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
125
+ if modrm_byte < 0xC0 {
126
+ instructions::instr16_0B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
127
+ }
128
+ else {
129
+ instructions::instr16_0B_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
130
+ }
131
+ },
132
+ 0x10B => {
133
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
134
+ if modrm_byte < 0xC0 {
135
+ instructions::instr32_0B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
136
+ }
137
+ else {
138
+ instructions::instr32_0B_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
139
+ }
140
+ },
141
+ 0x0C | 0x10C => {
142
+ instructions::instr_0C(match read_imm8() { Ok(o) => o, Err(()) => return });
143
+ },
144
+ 0x0D => {
145
+ instructions::instr16_0D(match read_imm16() { Ok(o) => o, Err(()) => return });
146
+ },
147
+ 0x10D => {
148
+ instructions::instr32_0D(match read_imm32s() { Ok(o) => o, Err(()) => return });
149
+ },
150
+ 0x0E => {
151
+ instructions::instr16_0E();
152
+ },
153
+ 0x10E => {
154
+ instructions::instr32_0E();
155
+ },
156
+ 0x0F => {
157
+ instructions::instr16_0F();
158
+ },
159
+ 0x10F => {
160
+ instructions::instr32_0F();
161
+ },
162
+ 0x10 | 0x110 => {
163
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
164
+ if modrm_byte < 0xC0 {
165
+ instructions::instr_10_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
166
+ }
167
+ else {
168
+ instructions::instr_10_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
169
+ }
170
+ },
171
+ 0x11 => {
172
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
173
+ if modrm_byte < 0xC0 {
174
+ instructions::instr16_11_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
175
+ }
176
+ else {
177
+ instructions::instr16_11_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
178
+ }
179
+ },
180
+ 0x111 => {
181
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
182
+ if modrm_byte < 0xC0 {
183
+ instructions::instr32_11_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
184
+ }
185
+ else {
186
+ instructions::instr32_11_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
187
+ }
188
+ },
189
+ 0x12 | 0x112 => {
190
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
191
+ if modrm_byte < 0xC0 {
192
+ instructions::instr_12_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
193
+ }
194
+ else {
195
+ instructions::instr_12_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
196
+ }
197
+ },
198
+ 0x13 => {
199
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
200
+ if modrm_byte < 0xC0 {
201
+ instructions::instr16_13_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
202
+ }
203
+ else {
204
+ instructions::instr16_13_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
205
+ }
206
+ },
207
+ 0x113 => {
208
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
209
+ if modrm_byte < 0xC0 {
210
+ instructions::instr32_13_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
211
+ }
212
+ else {
213
+ instructions::instr32_13_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
214
+ }
215
+ },
216
+ 0x14 | 0x114 => {
217
+ instructions::instr_14(match read_imm8() { Ok(o) => o, Err(()) => return });
218
+ },
219
+ 0x15 => {
220
+ instructions::instr16_15(match read_imm16() { Ok(o) => o, Err(()) => return });
221
+ },
222
+ 0x115 => {
223
+ instructions::instr32_15(match read_imm32s() { Ok(o) => o, Err(()) => return });
224
+ },
225
+ 0x16 => {
226
+ instructions::instr16_16();
227
+ },
228
+ 0x116 => {
229
+ instructions::instr32_16();
230
+ },
231
+ 0x17 => {
232
+ instructions::instr16_17();
233
+ after_block_boundary();
234
+ },
235
+ 0x117 => {
236
+ instructions::instr32_17();
237
+ after_block_boundary();
238
+ },
239
+ 0x18 | 0x118 => {
240
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
241
+ if modrm_byte < 0xC0 {
242
+ instructions::instr_18_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
243
+ }
244
+ else {
245
+ instructions::instr_18_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
246
+ }
247
+ },
248
+ 0x19 => {
249
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
250
+ if modrm_byte < 0xC0 {
251
+ instructions::instr16_19_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
252
+ }
253
+ else {
254
+ instructions::instr16_19_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
255
+ }
256
+ },
257
+ 0x119 => {
258
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
259
+ if modrm_byte < 0xC0 {
260
+ instructions::instr32_19_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
261
+ }
262
+ else {
263
+ instructions::instr32_19_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
264
+ }
265
+ },
266
+ 0x1A | 0x11A => {
267
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
268
+ if modrm_byte < 0xC0 {
269
+ instructions::instr_1A_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
270
+ }
271
+ else {
272
+ instructions::instr_1A_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
273
+ }
274
+ },
275
+ 0x1B => {
276
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
277
+ if modrm_byte < 0xC0 {
278
+ instructions::instr16_1B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
279
+ }
280
+ else {
281
+ instructions::instr16_1B_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
282
+ }
283
+ },
284
+ 0x11B => {
285
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
286
+ if modrm_byte < 0xC0 {
287
+ instructions::instr32_1B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
288
+ }
289
+ else {
290
+ instructions::instr32_1B_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
291
+ }
292
+ },
293
+ 0x1C | 0x11C => {
294
+ instructions::instr_1C(match read_imm8() { Ok(o) => o, Err(()) => return });
295
+ },
296
+ 0x1D => {
297
+ instructions::instr16_1D(match read_imm16() { Ok(o) => o, Err(()) => return });
298
+ },
299
+ 0x11D => {
300
+ instructions::instr32_1D(match read_imm32s() { Ok(o) => o, Err(()) => return });
301
+ },
302
+ 0x1E => {
303
+ instructions::instr16_1E();
304
+ },
305
+ 0x11E => {
306
+ instructions::instr32_1E();
307
+ },
308
+ 0x1F => {
309
+ instructions::instr16_1F();
310
+ after_block_boundary();
311
+ },
312
+ 0x11F => {
313
+ instructions::instr32_1F();
314
+ after_block_boundary();
315
+ },
316
+ 0x20 | 0x120 => {
317
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
318
+ if modrm_byte < 0xC0 {
319
+ instructions::instr_20_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
320
+ }
321
+ else {
322
+ instructions::instr_20_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
323
+ }
324
+ },
325
+ 0x21 => {
326
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
327
+ if modrm_byte < 0xC0 {
328
+ instructions::instr16_21_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
329
+ }
330
+ else {
331
+ instructions::instr16_21_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
332
+ }
333
+ },
334
+ 0x121 => {
335
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
336
+ if modrm_byte < 0xC0 {
337
+ instructions::instr32_21_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
338
+ }
339
+ else {
340
+ instructions::instr32_21_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
341
+ }
342
+ },
343
+ 0x22 | 0x122 => {
344
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
345
+ if modrm_byte < 0xC0 {
346
+ instructions::instr_22_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
347
+ }
348
+ else {
349
+ instructions::instr_22_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
350
+ }
351
+ },
352
+ 0x23 => {
353
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
354
+ if modrm_byte < 0xC0 {
355
+ instructions::instr16_23_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
356
+ }
357
+ else {
358
+ instructions::instr16_23_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
359
+ }
360
+ },
361
+ 0x123 => {
362
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
363
+ if modrm_byte < 0xC0 {
364
+ instructions::instr32_23_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
365
+ }
366
+ else {
367
+ instructions::instr32_23_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
368
+ }
369
+ },
370
+ 0x24 | 0x124 => {
371
+ instructions::instr_24(match read_imm8() { Ok(o) => o, Err(()) => return });
372
+ },
373
+ 0x25 => {
374
+ instructions::instr16_25(match read_imm16() { Ok(o) => o, Err(()) => return });
375
+ },
376
+ 0x125 => {
377
+ instructions::instr32_25(match read_imm32s() { Ok(o) => o, Err(()) => return });
378
+ },
379
+ 0x26 | 0x126 => {
380
+ instructions::instr_26();
381
+ },
382
+ 0x27 | 0x127 => {
383
+ instructions::instr_27();
384
+ },
385
+ 0x28 | 0x128 => {
386
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
387
+ if modrm_byte < 0xC0 {
388
+ instructions::instr_28_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
389
+ }
390
+ else {
391
+ instructions::instr_28_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
392
+ }
393
+ },
394
+ 0x29 => {
395
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
396
+ if modrm_byte < 0xC0 {
397
+ instructions::instr16_29_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
398
+ }
399
+ else {
400
+ instructions::instr16_29_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
401
+ }
402
+ },
403
+ 0x129 => {
404
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
405
+ if modrm_byte < 0xC0 {
406
+ instructions::instr32_29_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
407
+ }
408
+ else {
409
+ instructions::instr32_29_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
410
+ }
411
+ },
412
+ 0x2A | 0x12A => {
413
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
414
+ if modrm_byte < 0xC0 {
415
+ instructions::instr_2A_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
416
+ }
417
+ else {
418
+ instructions::instr_2A_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
419
+ }
420
+ },
421
+ 0x2B => {
422
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
423
+ if modrm_byte < 0xC0 {
424
+ instructions::instr16_2B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
425
+ }
426
+ else {
427
+ instructions::instr16_2B_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
428
+ }
429
+ },
430
+ 0x12B => {
431
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
432
+ if modrm_byte < 0xC0 {
433
+ instructions::instr32_2B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
434
+ }
435
+ else {
436
+ instructions::instr32_2B_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
437
+ }
438
+ },
439
+ 0x2C | 0x12C => {
440
+ instructions::instr_2C(match read_imm8() { Ok(o) => o, Err(()) => return });
441
+ },
442
+ 0x2D => {
443
+ instructions::instr16_2D(match read_imm16() { Ok(o) => o, Err(()) => return });
444
+ },
445
+ 0x12D => {
446
+ instructions::instr32_2D(match read_imm32s() { Ok(o) => o, Err(()) => return });
447
+ },
448
+ 0x2E | 0x12E => {
449
+ instructions::instr_2E();
450
+ },
451
+ 0x2F | 0x12F => {
452
+ instructions::instr_2F();
453
+ },
454
+ 0x30 | 0x130 => {
455
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
456
+ if modrm_byte < 0xC0 {
457
+ instructions::instr_30_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
458
+ }
459
+ else {
460
+ instructions::instr_30_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
461
+ }
462
+ },
463
+ 0x31 => {
464
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
465
+ if modrm_byte < 0xC0 {
466
+ instructions::instr16_31_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
467
+ }
468
+ else {
469
+ instructions::instr16_31_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
470
+ }
471
+ },
472
+ 0x131 => {
473
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
474
+ if modrm_byte < 0xC0 {
475
+ instructions::instr32_31_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
476
+ }
477
+ else {
478
+ instructions::instr32_31_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
479
+ }
480
+ },
481
+ 0x32 | 0x132 => {
482
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
483
+ if modrm_byte < 0xC0 {
484
+ instructions::instr_32_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
485
+ }
486
+ else {
487
+ instructions::instr_32_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
488
+ }
489
+ },
490
+ 0x33 => {
491
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
492
+ if modrm_byte < 0xC0 {
493
+ instructions::instr16_33_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
494
+ }
495
+ else {
496
+ instructions::instr16_33_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
497
+ }
498
+ },
499
+ 0x133 => {
500
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
501
+ if modrm_byte < 0xC0 {
502
+ instructions::instr32_33_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
503
+ }
504
+ else {
505
+ instructions::instr32_33_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
506
+ }
507
+ },
508
+ 0x34 | 0x134 => {
509
+ instructions::instr_34(match read_imm8() { Ok(o) => o, Err(()) => return });
510
+ },
511
+ 0x35 => {
512
+ instructions::instr16_35(match read_imm16() { Ok(o) => o, Err(()) => return });
513
+ },
514
+ 0x135 => {
515
+ instructions::instr32_35(match read_imm32s() { Ok(o) => o, Err(()) => return });
516
+ },
517
+ 0x36 | 0x136 => {
518
+ instructions::instr_36();
519
+ },
520
+ 0x37 | 0x137 => {
521
+ instructions::instr_37();
522
+ },
523
+ 0x38 | 0x138 => {
524
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
525
+ if modrm_byte < 0xC0 {
526
+ instructions::instr_38_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
527
+ }
528
+ else {
529
+ instructions::instr_38_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
530
+ }
531
+ },
532
+ 0x39 => {
533
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
534
+ if modrm_byte < 0xC0 {
535
+ instructions::instr16_39_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
536
+ }
537
+ else {
538
+ instructions::instr16_39_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
539
+ }
540
+ },
541
+ 0x139 => {
542
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
543
+ if modrm_byte < 0xC0 {
544
+ instructions::instr32_39_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
545
+ }
546
+ else {
547
+ instructions::instr32_39_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
548
+ }
549
+ },
550
+ 0x3A | 0x13A => {
551
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
552
+ if modrm_byte < 0xC0 {
553
+ instructions::instr_3A_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
554
+ }
555
+ else {
556
+ instructions::instr_3A_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
557
+ }
558
+ },
559
+ 0x3B => {
560
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
561
+ if modrm_byte < 0xC0 {
562
+ instructions::instr16_3B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
563
+ }
564
+ else {
565
+ instructions::instr16_3B_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
566
+ }
567
+ },
568
+ 0x13B => {
569
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
570
+ if modrm_byte < 0xC0 {
571
+ instructions::instr32_3B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
572
+ }
573
+ else {
574
+ instructions::instr32_3B_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
575
+ }
576
+ },
577
+ 0x3C | 0x13C => {
578
+ instructions::instr_3C(match read_imm8() { Ok(o) => o, Err(()) => return });
579
+ },
580
+ 0x3D => {
581
+ instructions::instr16_3D(match read_imm16() { Ok(o) => o, Err(()) => return });
582
+ },
583
+ 0x13D => {
584
+ instructions::instr32_3D(match read_imm32s() { Ok(o) => o, Err(()) => return });
585
+ },
586
+ 0x3E | 0x13E => {
587
+ instructions::instr_3E();
588
+ },
589
+ 0x3F | 0x13F => {
590
+ instructions::instr_3F();
591
+ },
592
+ 0x40 => {
593
+ instructions::instr16_40();
594
+ },
595
+ 0x140 => {
596
+ instructions::instr32_40();
597
+ },
598
+ 0x41 => {
599
+ instructions::instr16_41();
600
+ },
601
+ 0x141 => {
602
+ instructions::instr32_41();
603
+ },
604
+ 0x42 => {
605
+ instructions::instr16_42();
606
+ },
607
+ 0x142 => {
608
+ instructions::instr32_42();
609
+ },
610
+ 0x43 => {
611
+ instructions::instr16_43();
612
+ },
613
+ 0x143 => {
614
+ instructions::instr32_43();
615
+ },
616
+ 0x44 => {
617
+ instructions::instr16_44();
618
+ },
619
+ 0x144 => {
620
+ instructions::instr32_44();
621
+ },
622
+ 0x45 => {
623
+ instructions::instr16_45();
624
+ },
625
+ 0x145 => {
626
+ instructions::instr32_45();
627
+ },
628
+ 0x46 => {
629
+ instructions::instr16_46();
630
+ },
631
+ 0x146 => {
632
+ instructions::instr32_46();
633
+ },
634
+ 0x47 => {
635
+ instructions::instr16_47();
636
+ },
637
+ 0x147 => {
638
+ instructions::instr32_47();
639
+ },
640
+ 0x48 => {
641
+ instructions::instr16_48();
642
+ },
643
+ 0x148 => {
644
+ instructions::instr32_48();
645
+ },
646
+ 0x49 => {
647
+ instructions::instr16_49();
648
+ },
649
+ 0x149 => {
650
+ instructions::instr32_49();
651
+ },
652
+ 0x4A => {
653
+ instructions::instr16_4A();
654
+ },
655
+ 0x14A => {
656
+ instructions::instr32_4A();
657
+ },
658
+ 0x4B => {
659
+ instructions::instr16_4B();
660
+ },
661
+ 0x14B => {
662
+ instructions::instr32_4B();
663
+ },
664
+ 0x4C => {
665
+ instructions::instr16_4C();
666
+ },
667
+ 0x14C => {
668
+ instructions::instr32_4C();
669
+ },
670
+ 0x4D => {
671
+ instructions::instr16_4D();
672
+ },
673
+ 0x14D => {
674
+ instructions::instr32_4D();
675
+ },
676
+ 0x4E => {
677
+ instructions::instr16_4E();
678
+ },
679
+ 0x14E => {
680
+ instructions::instr32_4E();
681
+ },
682
+ 0x4F => {
683
+ instructions::instr16_4F();
684
+ },
685
+ 0x14F => {
686
+ instructions::instr32_4F();
687
+ },
688
+ 0x50 => {
689
+ instructions::instr16_50();
690
+ },
691
+ 0x150 => {
692
+ instructions::instr32_50();
693
+ },
694
+ 0x51 => {
695
+ instructions::instr16_51();
696
+ },
697
+ 0x151 => {
698
+ instructions::instr32_51();
699
+ },
700
+ 0x52 => {
701
+ instructions::instr16_52();
702
+ },
703
+ 0x152 => {
704
+ instructions::instr32_52();
705
+ },
706
+ 0x53 => {
707
+ instructions::instr16_53();
708
+ },
709
+ 0x153 => {
710
+ instructions::instr32_53();
711
+ },
712
+ 0x54 => {
713
+ instructions::instr16_54();
714
+ },
715
+ 0x154 => {
716
+ instructions::instr32_54();
717
+ },
718
+ 0x55 => {
719
+ instructions::instr16_55();
720
+ },
721
+ 0x155 => {
722
+ instructions::instr32_55();
723
+ },
724
+ 0x56 => {
725
+ instructions::instr16_56();
726
+ },
727
+ 0x156 => {
728
+ instructions::instr32_56();
729
+ },
730
+ 0x57 => {
731
+ instructions::instr16_57();
732
+ },
733
+ 0x157 => {
734
+ instructions::instr32_57();
735
+ },
736
+ 0x58 => {
737
+ instructions::instr16_58();
738
+ },
739
+ 0x158 => {
740
+ instructions::instr32_58();
741
+ },
742
+ 0x59 => {
743
+ instructions::instr16_59();
744
+ },
745
+ 0x159 => {
746
+ instructions::instr32_59();
747
+ },
748
+ 0x5A => {
749
+ instructions::instr16_5A();
750
+ },
751
+ 0x15A => {
752
+ instructions::instr32_5A();
753
+ },
754
+ 0x5B => {
755
+ instructions::instr16_5B();
756
+ },
757
+ 0x15B => {
758
+ instructions::instr32_5B();
759
+ },
760
+ 0x5C => {
761
+ instructions::instr16_5C();
762
+ },
763
+ 0x15C => {
764
+ instructions::instr32_5C();
765
+ },
766
+ 0x5D => {
767
+ instructions::instr16_5D();
768
+ },
769
+ 0x15D => {
770
+ instructions::instr32_5D();
771
+ },
772
+ 0x5E => {
773
+ instructions::instr16_5E();
774
+ },
775
+ 0x15E => {
776
+ instructions::instr32_5E();
777
+ },
778
+ 0x5F => {
779
+ instructions::instr16_5F();
780
+ },
781
+ 0x15F => {
782
+ instructions::instr32_5F();
783
+ },
784
+ 0x60 => {
785
+ instructions::instr16_60();
786
+ after_block_boundary();
787
+ },
788
+ 0x160 => {
789
+ instructions::instr32_60();
790
+ after_block_boundary();
791
+ },
792
+ 0x61 => {
793
+ instructions::instr16_61();
794
+ after_block_boundary();
795
+ },
796
+ 0x161 => {
797
+ instructions::instr32_61();
798
+ after_block_boundary();
799
+ },
800
+ 0x62 | 0x162 => {
801
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
802
+ if modrm_byte < 0xC0 {
803
+ instructions::instr_62_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
804
+ }
805
+ else {
806
+ instructions::instr_62_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
807
+ }
808
+ after_block_boundary();
809
+ },
810
+ 0x63 | 0x163 => {
811
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
812
+ if modrm_byte < 0xC0 {
813
+ instructions::instr_63_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
814
+ }
815
+ else {
816
+ instructions::instr_63_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
817
+ }
818
+ after_block_boundary();
819
+ },
820
+ 0x64 | 0x164 => {
821
+ instructions::instr_64();
822
+ },
823
+ 0x65 | 0x165 => {
824
+ instructions::instr_65();
825
+ },
826
+ 0x66 | 0x166 => {
827
+ instructions::instr_66();
828
+ },
829
+ 0x67 | 0x167 => {
830
+ instructions::instr_67();
831
+ },
832
+ 0x68 => {
833
+ instructions::instr16_68(match read_imm16() { Ok(o) => o, Err(()) => return });
834
+ },
835
+ 0x168 => {
836
+ instructions::instr32_68(match read_imm32s() { Ok(o) => o, Err(()) => return });
837
+ },
838
+ 0x69 => {
839
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
840
+ if modrm_byte < 0xC0 {
841
+ instructions::instr16_69_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
842
+ }
843
+ else {
844
+ instructions::instr16_69_reg(modrm_byte & 7, modrm_byte >> 3 & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
845
+ }
846
+ },
847
+ 0x169 => {
848
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
849
+ if modrm_byte < 0xC0 {
850
+ instructions::instr32_69_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
851
+ }
852
+ else {
853
+ instructions::instr32_69_reg(modrm_byte & 7, modrm_byte >> 3 & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
854
+ }
855
+ },
856
+ 0x6A => {
857
+ instructions::instr16_6A(match read_imm8s() { Ok(o) => o, Err(()) => return });
858
+ },
859
+ 0x16A => {
860
+ instructions::instr32_6A(match read_imm8s() { Ok(o) => o, Err(()) => return });
861
+ },
862
+ 0x6B => {
863
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
864
+ if modrm_byte < 0xC0 {
865
+ instructions::instr16_6B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
866
+ }
867
+ else {
868
+ instructions::instr16_6B_reg(modrm_byte & 7, modrm_byte >> 3 & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
869
+ }
870
+ },
871
+ 0x16B => {
872
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
873
+ if modrm_byte < 0xC0 {
874
+ instructions::instr32_6B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
875
+ }
876
+ else {
877
+ instructions::instr32_6B_reg(modrm_byte & 7, modrm_byte >> 3 & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
878
+ }
879
+ },
880
+ 0x6C | 0x16C => {
881
+ let prefixes_ = *prefixes;
882
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
883
+ instructions::instr_F26C();
884
+ after_block_boundary();
885
+ }
886
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
887
+ instructions::instr_F36C();
888
+ after_block_boundary();
889
+ }
890
+ else {
891
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
892
+ instructions::instr_6C();
893
+ after_block_boundary();
894
+ }
895
+ },
896
+ 0x6D => {
897
+ let prefixes_ = *prefixes;
898
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
899
+ instructions::instr16_F26D();
900
+ after_block_boundary();
901
+ }
902
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
903
+ instructions::instr16_F36D();
904
+ after_block_boundary();
905
+ }
906
+ else {
907
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
908
+ instructions::instr16_6D();
909
+ after_block_boundary();
910
+ }
911
+ },
912
+ 0x16D => {
913
+ let prefixes_ = *prefixes;
914
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
915
+ instructions::instr32_F26D();
916
+ after_block_boundary();
917
+ }
918
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
919
+ instructions::instr32_F36D();
920
+ after_block_boundary();
921
+ }
922
+ else {
923
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
924
+ instructions::instr32_6D();
925
+ after_block_boundary();
926
+ }
927
+ },
928
+ 0x6E | 0x16E => {
929
+ let prefixes_ = *prefixes;
930
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
931
+ instructions::instr_F26E();
932
+ after_block_boundary();
933
+ }
934
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
935
+ instructions::instr_F36E();
936
+ after_block_boundary();
937
+ }
938
+ else {
939
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
940
+ instructions::instr_6E();
941
+ after_block_boundary();
942
+ }
943
+ },
944
+ 0x6F => {
945
+ let prefixes_ = *prefixes;
946
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
947
+ instructions::instr16_F26F();
948
+ after_block_boundary();
949
+ }
950
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
951
+ instructions::instr16_F36F();
952
+ after_block_boundary();
953
+ }
954
+ else {
955
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
956
+ instructions::instr16_6F();
957
+ after_block_boundary();
958
+ }
959
+ },
960
+ 0x16F => {
961
+ let prefixes_ = *prefixes;
962
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
963
+ instructions::instr32_F26F();
964
+ after_block_boundary();
965
+ }
966
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
967
+ instructions::instr32_F36F();
968
+ after_block_boundary();
969
+ }
970
+ else {
971
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
972
+ instructions::instr32_6F();
973
+ after_block_boundary();
974
+ }
975
+ },
976
+ 0x70 => {
977
+ instructions::instr16_70(match read_imm8s() { Ok(o) => o, Err(()) => return });
978
+ },
979
+ 0x170 => {
980
+ instructions::instr32_70(match read_imm8s() { Ok(o) => o, Err(()) => return });
981
+ },
982
+ 0x71 => {
983
+ instructions::instr16_71(match read_imm8s() { Ok(o) => o, Err(()) => return });
984
+ },
985
+ 0x171 => {
986
+ instructions::instr32_71(match read_imm8s() { Ok(o) => o, Err(()) => return });
987
+ },
988
+ 0x72 => {
989
+ instructions::instr16_72(match read_imm8s() { Ok(o) => o, Err(()) => return });
990
+ },
991
+ 0x172 => {
992
+ instructions::instr32_72(match read_imm8s() { Ok(o) => o, Err(()) => return });
993
+ },
994
+ 0x73 => {
995
+ instructions::instr16_73(match read_imm8s() { Ok(o) => o, Err(()) => return });
996
+ },
997
+ 0x173 => {
998
+ instructions::instr32_73(match read_imm8s() { Ok(o) => o, Err(()) => return });
999
+ },
1000
+ 0x74 => {
1001
+ instructions::instr16_74(match read_imm8s() { Ok(o) => o, Err(()) => return });
1002
+ },
1003
+ 0x174 => {
1004
+ instructions::instr32_74(match read_imm8s() { Ok(o) => o, Err(()) => return });
1005
+ },
1006
+ 0x75 => {
1007
+ instructions::instr16_75(match read_imm8s() { Ok(o) => o, Err(()) => return });
1008
+ },
1009
+ 0x175 => {
1010
+ instructions::instr32_75(match read_imm8s() { Ok(o) => o, Err(()) => return });
1011
+ },
1012
+ 0x76 => {
1013
+ instructions::instr16_76(match read_imm8s() { Ok(o) => o, Err(()) => return });
1014
+ },
1015
+ 0x176 => {
1016
+ instructions::instr32_76(match read_imm8s() { Ok(o) => o, Err(()) => return });
1017
+ },
1018
+ 0x77 => {
1019
+ instructions::instr16_77(match read_imm8s() { Ok(o) => o, Err(()) => return });
1020
+ },
1021
+ 0x177 => {
1022
+ instructions::instr32_77(match read_imm8s() { Ok(o) => o, Err(()) => return });
1023
+ },
1024
+ 0x78 => {
1025
+ instructions::instr16_78(match read_imm8s() { Ok(o) => o, Err(()) => return });
1026
+ },
1027
+ 0x178 => {
1028
+ instructions::instr32_78(match read_imm8s() { Ok(o) => o, Err(()) => return });
1029
+ },
1030
+ 0x79 => {
1031
+ instructions::instr16_79(match read_imm8s() { Ok(o) => o, Err(()) => return });
1032
+ },
1033
+ 0x179 => {
1034
+ instructions::instr32_79(match read_imm8s() { Ok(o) => o, Err(()) => return });
1035
+ },
1036
+ 0x7A => {
1037
+ instructions::instr16_7A(match read_imm8s() { Ok(o) => o, Err(()) => return });
1038
+ },
1039
+ 0x17A => {
1040
+ instructions::instr32_7A(match read_imm8s() { Ok(o) => o, Err(()) => return });
1041
+ },
1042
+ 0x7B => {
1043
+ instructions::instr16_7B(match read_imm8s() { Ok(o) => o, Err(()) => return });
1044
+ },
1045
+ 0x17B => {
1046
+ instructions::instr32_7B(match read_imm8s() { Ok(o) => o, Err(()) => return });
1047
+ },
1048
+ 0x7C => {
1049
+ instructions::instr16_7C(match read_imm8s() { Ok(o) => o, Err(()) => return });
1050
+ },
1051
+ 0x17C => {
1052
+ instructions::instr32_7C(match read_imm8s() { Ok(o) => o, Err(()) => return });
1053
+ },
1054
+ 0x7D => {
1055
+ instructions::instr16_7D(match read_imm8s() { Ok(o) => o, Err(()) => return });
1056
+ },
1057
+ 0x17D => {
1058
+ instructions::instr32_7D(match read_imm8s() { Ok(o) => o, Err(()) => return });
1059
+ },
1060
+ 0x7E => {
1061
+ instructions::instr16_7E(match read_imm8s() { Ok(o) => o, Err(()) => return });
1062
+ },
1063
+ 0x17E => {
1064
+ instructions::instr32_7E(match read_imm8s() { Ok(o) => o, Err(()) => return });
1065
+ },
1066
+ 0x7F => {
1067
+ instructions::instr16_7F(match read_imm8s() { Ok(o) => o, Err(()) => return });
1068
+ },
1069
+ 0x17F => {
1070
+ instructions::instr32_7F(match read_imm8s() { Ok(o) => o, Err(()) => return });
1071
+ },
1072
+ 0x80 | 0x180 => {
1073
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1074
+ match modrm_byte >> 3 & 7 {
1075
+ 0 => {
1076
+ if modrm_byte < 0xC0 {
1077
+ instructions::instr_80_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1078
+ }
1079
+ else {
1080
+ instructions::instr_80_0_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1081
+ }
1082
+ },
1083
+ 1 => {
1084
+ if modrm_byte < 0xC0 {
1085
+ instructions::instr_80_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1086
+ }
1087
+ else {
1088
+ instructions::instr_80_1_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1089
+ }
1090
+ },
1091
+ 2 => {
1092
+ if modrm_byte < 0xC0 {
1093
+ instructions::instr_80_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1094
+ }
1095
+ else {
1096
+ instructions::instr_80_2_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1097
+ }
1098
+ },
1099
+ 3 => {
1100
+ if modrm_byte < 0xC0 {
1101
+ instructions::instr_80_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1102
+ }
1103
+ else {
1104
+ instructions::instr_80_3_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1105
+ }
1106
+ },
1107
+ 4 => {
1108
+ if modrm_byte < 0xC0 {
1109
+ instructions::instr_80_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1110
+ }
1111
+ else {
1112
+ instructions::instr_80_4_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1113
+ }
1114
+ },
1115
+ 5 => {
1116
+ if modrm_byte < 0xC0 {
1117
+ instructions::instr_80_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1118
+ }
1119
+ else {
1120
+ instructions::instr_80_5_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1121
+ }
1122
+ },
1123
+ 6 => {
1124
+ if modrm_byte < 0xC0 {
1125
+ instructions::instr_80_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1126
+ }
1127
+ else {
1128
+ instructions::instr_80_6_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1129
+ }
1130
+ },
1131
+ 7 => {
1132
+ if modrm_byte < 0xC0 {
1133
+ instructions::instr_80_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1134
+ }
1135
+ else {
1136
+ instructions::instr_80_7_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1137
+ }
1138
+ },
1139
+ x => {
1140
+ dbg_log!("#ud 80/{} at {:x}", x, *instruction_pointer);
1141
+ trigger_ud();
1142
+ }
1143
+ }
1144
+ },
1145
+ 0x81 => {
1146
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1147
+ match modrm_byte >> 3 & 7 {
1148
+ 0 => {
1149
+ if modrm_byte < 0xC0 {
1150
+ instructions::instr16_81_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
1151
+ }
1152
+ else {
1153
+ instructions::instr16_81_0_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
1154
+ }
1155
+ },
1156
+ 1 => {
1157
+ if modrm_byte < 0xC0 {
1158
+ instructions::instr16_81_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
1159
+ }
1160
+ else {
1161
+ instructions::instr16_81_1_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
1162
+ }
1163
+ },
1164
+ 2 => {
1165
+ if modrm_byte < 0xC0 {
1166
+ instructions::instr16_81_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
1167
+ }
1168
+ else {
1169
+ instructions::instr16_81_2_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
1170
+ }
1171
+ },
1172
+ 3 => {
1173
+ if modrm_byte < 0xC0 {
1174
+ instructions::instr16_81_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
1175
+ }
1176
+ else {
1177
+ instructions::instr16_81_3_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
1178
+ }
1179
+ },
1180
+ 4 => {
1181
+ if modrm_byte < 0xC0 {
1182
+ instructions::instr16_81_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
1183
+ }
1184
+ else {
1185
+ instructions::instr16_81_4_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
1186
+ }
1187
+ },
1188
+ 5 => {
1189
+ if modrm_byte < 0xC0 {
1190
+ instructions::instr16_81_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
1191
+ }
1192
+ else {
1193
+ instructions::instr16_81_5_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
1194
+ }
1195
+ },
1196
+ 6 => {
1197
+ if modrm_byte < 0xC0 {
1198
+ instructions::instr16_81_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
1199
+ }
1200
+ else {
1201
+ instructions::instr16_81_6_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
1202
+ }
1203
+ },
1204
+ 7 => {
1205
+ if modrm_byte < 0xC0 {
1206
+ instructions::instr16_81_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
1207
+ }
1208
+ else {
1209
+ instructions::instr16_81_7_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
1210
+ }
1211
+ },
1212
+ x => {
1213
+ dbg_log!("#ud 81/{} at {:x}", x, *instruction_pointer);
1214
+ trigger_ud();
1215
+ }
1216
+ }
1217
+ },
1218
+ 0x181 => {
1219
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1220
+ match modrm_byte >> 3 & 7 {
1221
+ 0 => {
1222
+ if modrm_byte < 0xC0 {
1223
+ instructions::instr32_81_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
1224
+ }
1225
+ else {
1226
+ instructions::instr32_81_0_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
1227
+ }
1228
+ },
1229
+ 1 => {
1230
+ if modrm_byte < 0xC0 {
1231
+ instructions::instr32_81_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
1232
+ }
1233
+ else {
1234
+ instructions::instr32_81_1_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
1235
+ }
1236
+ },
1237
+ 2 => {
1238
+ if modrm_byte < 0xC0 {
1239
+ instructions::instr32_81_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
1240
+ }
1241
+ else {
1242
+ instructions::instr32_81_2_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
1243
+ }
1244
+ },
1245
+ 3 => {
1246
+ if modrm_byte < 0xC0 {
1247
+ instructions::instr32_81_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
1248
+ }
1249
+ else {
1250
+ instructions::instr32_81_3_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
1251
+ }
1252
+ },
1253
+ 4 => {
1254
+ if modrm_byte < 0xC0 {
1255
+ instructions::instr32_81_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
1256
+ }
1257
+ else {
1258
+ instructions::instr32_81_4_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
1259
+ }
1260
+ },
1261
+ 5 => {
1262
+ if modrm_byte < 0xC0 {
1263
+ instructions::instr32_81_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
1264
+ }
1265
+ else {
1266
+ instructions::instr32_81_5_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
1267
+ }
1268
+ },
1269
+ 6 => {
1270
+ if modrm_byte < 0xC0 {
1271
+ instructions::instr32_81_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
1272
+ }
1273
+ else {
1274
+ instructions::instr32_81_6_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
1275
+ }
1276
+ },
1277
+ 7 => {
1278
+ if modrm_byte < 0xC0 {
1279
+ instructions::instr32_81_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
1280
+ }
1281
+ else {
1282
+ instructions::instr32_81_7_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
1283
+ }
1284
+ },
1285
+ x => {
1286
+ dbg_log!("#ud 81/{} at {:x}", x, *instruction_pointer);
1287
+ trigger_ud();
1288
+ }
1289
+ }
1290
+ },
1291
+ 0x82 | 0x182 => {
1292
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1293
+ match modrm_byte >> 3 & 7 {
1294
+ 0 => {
1295
+ if modrm_byte < 0xC0 {
1296
+ instructions::instr_82_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1297
+ }
1298
+ else {
1299
+ instructions::instr_82_0_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1300
+ }
1301
+ },
1302
+ 1 => {
1303
+ if modrm_byte < 0xC0 {
1304
+ instructions::instr_82_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1305
+ }
1306
+ else {
1307
+ instructions::instr_82_1_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1308
+ }
1309
+ },
1310
+ 2 => {
1311
+ if modrm_byte < 0xC0 {
1312
+ instructions::instr_82_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1313
+ }
1314
+ else {
1315
+ instructions::instr_82_2_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1316
+ }
1317
+ },
1318
+ 3 => {
1319
+ if modrm_byte < 0xC0 {
1320
+ instructions::instr_82_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1321
+ }
1322
+ else {
1323
+ instructions::instr_82_3_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1324
+ }
1325
+ },
1326
+ 4 => {
1327
+ if modrm_byte < 0xC0 {
1328
+ instructions::instr_82_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1329
+ }
1330
+ else {
1331
+ instructions::instr_82_4_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1332
+ }
1333
+ },
1334
+ 5 => {
1335
+ if modrm_byte < 0xC0 {
1336
+ instructions::instr_82_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1337
+ }
1338
+ else {
1339
+ instructions::instr_82_5_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1340
+ }
1341
+ },
1342
+ 6 => {
1343
+ if modrm_byte < 0xC0 {
1344
+ instructions::instr_82_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1345
+ }
1346
+ else {
1347
+ instructions::instr_82_6_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1348
+ }
1349
+ },
1350
+ 7 => {
1351
+ if modrm_byte < 0xC0 {
1352
+ instructions::instr_82_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
1353
+ }
1354
+ else {
1355
+ instructions::instr_82_7_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
1356
+ }
1357
+ },
1358
+ x => {
1359
+ dbg_log!("#ud 82/{} at {:x}", x, *instruction_pointer);
1360
+ trigger_ud();
1361
+ }
1362
+ }
1363
+ },
1364
+ 0x83 => {
1365
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1366
+ match modrm_byte >> 3 & 7 {
1367
+ 0 => {
1368
+ if modrm_byte < 0xC0 {
1369
+ instructions::instr16_83_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1370
+ }
1371
+ else {
1372
+ instructions::instr16_83_0_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1373
+ }
1374
+ },
1375
+ 1 => {
1376
+ if modrm_byte < 0xC0 {
1377
+ instructions::instr16_83_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1378
+ }
1379
+ else {
1380
+ instructions::instr16_83_1_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1381
+ }
1382
+ },
1383
+ 2 => {
1384
+ if modrm_byte < 0xC0 {
1385
+ instructions::instr16_83_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1386
+ }
1387
+ else {
1388
+ instructions::instr16_83_2_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1389
+ }
1390
+ },
1391
+ 3 => {
1392
+ if modrm_byte < 0xC0 {
1393
+ instructions::instr16_83_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1394
+ }
1395
+ else {
1396
+ instructions::instr16_83_3_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1397
+ }
1398
+ },
1399
+ 4 => {
1400
+ if modrm_byte < 0xC0 {
1401
+ instructions::instr16_83_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1402
+ }
1403
+ else {
1404
+ instructions::instr16_83_4_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1405
+ }
1406
+ },
1407
+ 5 => {
1408
+ if modrm_byte < 0xC0 {
1409
+ instructions::instr16_83_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1410
+ }
1411
+ else {
1412
+ instructions::instr16_83_5_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1413
+ }
1414
+ },
1415
+ 6 => {
1416
+ if modrm_byte < 0xC0 {
1417
+ instructions::instr16_83_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1418
+ }
1419
+ else {
1420
+ instructions::instr16_83_6_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1421
+ }
1422
+ },
1423
+ 7 => {
1424
+ if modrm_byte < 0xC0 {
1425
+ instructions::instr16_83_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1426
+ }
1427
+ else {
1428
+ instructions::instr16_83_7_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1429
+ }
1430
+ },
1431
+ x => {
1432
+ dbg_log!("#ud 83/{} at {:x}", x, *instruction_pointer);
1433
+ trigger_ud();
1434
+ }
1435
+ }
1436
+ },
1437
+ 0x183 => {
1438
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1439
+ match modrm_byte >> 3 & 7 {
1440
+ 0 => {
1441
+ if modrm_byte < 0xC0 {
1442
+ instructions::instr32_83_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1443
+ }
1444
+ else {
1445
+ instructions::instr32_83_0_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1446
+ }
1447
+ },
1448
+ 1 => {
1449
+ if modrm_byte < 0xC0 {
1450
+ instructions::instr32_83_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1451
+ }
1452
+ else {
1453
+ instructions::instr32_83_1_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1454
+ }
1455
+ },
1456
+ 2 => {
1457
+ if modrm_byte < 0xC0 {
1458
+ instructions::instr32_83_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1459
+ }
1460
+ else {
1461
+ instructions::instr32_83_2_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1462
+ }
1463
+ },
1464
+ 3 => {
1465
+ if modrm_byte < 0xC0 {
1466
+ instructions::instr32_83_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1467
+ }
1468
+ else {
1469
+ instructions::instr32_83_3_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1470
+ }
1471
+ },
1472
+ 4 => {
1473
+ if modrm_byte < 0xC0 {
1474
+ instructions::instr32_83_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1475
+ }
1476
+ else {
1477
+ instructions::instr32_83_4_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1478
+ }
1479
+ },
1480
+ 5 => {
1481
+ if modrm_byte < 0xC0 {
1482
+ instructions::instr32_83_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1483
+ }
1484
+ else {
1485
+ instructions::instr32_83_5_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1486
+ }
1487
+ },
1488
+ 6 => {
1489
+ if modrm_byte < 0xC0 {
1490
+ instructions::instr32_83_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1491
+ }
1492
+ else {
1493
+ instructions::instr32_83_6_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1494
+ }
1495
+ },
1496
+ 7 => {
1497
+ if modrm_byte < 0xC0 {
1498
+ instructions::instr32_83_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8s() { Ok(o) => o, Err(()) => return });
1499
+ }
1500
+ else {
1501
+ instructions::instr32_83_7_reg(modrm_byte & 7, match read_imm8s() { Ok(o) => o, Err(()) => return });
1502
+ }
1503
+ },
1504
+ x => {
1505
+ dbg_log!("#ud 83/{} at {:x}", x, *instruction_pointer);
1506
+ trigger_ud();
1507
+ }
1508
+ }
1509
+ },
1510
+ 0x84 | 0x184 => {
1511
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1512
+ if modrm_byte < 0xC0 {
1513
+ instructions::instr_84_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1514
+ }
1515
+ else {
1516
+ instructions::instr_84_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1517
+ }
1518
+ },
1519
+ 0x85 => {
1520
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1521
+ if modrm_byte < 0xC0 {
1522
+ instructions::instr16_85_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1523
+ }
1524
+ else {
1525
+ instructions::instr16_85_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1526
+ }
1527
+ },
1528
+ 0x185 => {
1529
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1530
+ if modrm_byte < 0xC0 {
1531
+ instructions::instr32_85_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1532
+ }
1533
+ else {
1534
+ instructions::instr32_85_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1535
+ }
1536
+ },
1537
+ 0x86 | 0x186 => {
1538
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1539
+ if modrm_byte < 0xC0 {
1540
+ instructions::instr_86_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1541
+ }
1542
+ else {
1543
+ instructions::instr_86_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1544
+ }
1545
+ },
1546
+ 0x87 => {
1547
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1548
+ if modrm_byte < 0xC0 {
1549
+ instructions::instr16_87_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1550
+ }
1551
+ else {
1552
+ instructions::instr16_87_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1553
+ }
1554
+ },
1555
+ 0x187 => {
1556
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1557
+ if modrm_byte < 0xC0 {
1558
+ instructions::instr32_87_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1559
+ }
1560
+ else {
1561
+ instructions::instr32_87_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1562
+ }
1563
+ },
1564
+ 0x88 | 0x188 => {
1565
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1566
+ if modrm_byte < 0xC0 {
1567
+ instructions::instr_88_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1568
+ }
1569
+ else {
1570
+ instructions::instr_88_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1571
+ }
1572
+ },
1573
+ 0x89 => {
1574
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1575
+ if modrm_byte < 0xC0 {
1576
+ instructions::instr16_89_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1577
+ }
1578
+ else {
1579
+ instructions::instr16_89_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1580
+ }
1581
+ },
1582
+ 0x189 => {
1583
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1584
+ if modrm_byte < 0xC0 {
1585
+ instructions::instr32_89_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1586
+ }
1587
+ else {
1588
+ instructions::instr32_89_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1589
+ }
1590
+ },
1591
+ 0x8A | 0x18A => {
1592
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1593
+ if modrm_byte < 0xC0 {
1594
+ instructions::instr_8A_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1595
+ }
1596
+ else {
1597
+ instructions::instr_8A_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1598
+ }
1599
+ },
1600
+ 0x8B => {
1601
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1602
+ if modrm_byte < 0xC0 {
1603
+ instructions::instr16_8B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1604
+ }
1605
+ else {
1606
+ instructions::instr16_8B_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1607
+ }
1608
+ },
1609
+ 0x18B => {
1610
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1611
+ if modrm_byte < 0xC0 {
1612
+ instructions::instr32_8B_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1613
+ }
1614
+ else {
1615
+ instructions::instr32_8B_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1616
+ }
1617
+ },
1618
+ 0x8C => {
1619
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1620
+ if modrm_byte < 0xC0 {
1621
+ instructions::instr16_8C_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1622
+ }
1623
+ else {
1624
+ instructions::instr16_8C_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1625
+ }
1626
+ },
1627
+ 0x18C => {
1628
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1629
+ if modrm_byte < 0xC0 {
1630
+ instructions::instr32_8C_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1631
+ }
1632
+ else {
1633
+ instructions::instr32_8C_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1634
+ }
1635
+ },
1636
+ 0x8D => {
1637
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1638
+ if modrm_byte < 0xC0 {
1639
+ instructions::instr16_8D_mem(modrm_byte, modrm_byte >> 3 & 7);
1640
+ }
1641
+ else {
1642
+ instructions::instr16_8D_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1643
+ }
1644
+ },
1645
+ 0x18D => {
1646
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1647
+ if modrm_byte < 0xC0 {
1648
+ instructions::instr32_8D_mem(modrm_byte, modrm_byte >> 3 & 7);
1649
+ }
1650
+ else {
1651
+ instructions::instr32_8D_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1652
+ }
1653
+ },
1654
+ 0x8E | 0x18E => {
1655
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1656
+ if modrm_byte < 0xC0 {
1657
+ instructions::instr_8E_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
1658
+ }
1659
+ else {
1660
+ instructions::instr_8E_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
1661
+ }
1662
+ after_block_boundary();
1663
+ },
1664
+ 0x8F => {
1665
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1666
+ match modrm_byte >> 3 & 7 {
1667
+ 0 => {
1668
+ if modrm_byte < 0xC0 {
1669
+ instructions::instr16_8F_0_mem(modrm_byte);
1670
+ }
1671
+ else {
1672
+ instructions::instr16_8F_0_reg(modrm_byte & 7);
1673
+ }
1674
+ after_block_boundary();
1675
+ },
1676
+ x => {
1677
+ dbg_log!("#ud 8F/{} at {:x}", x, *instruction_pointer);
1678
+ trigger_ud();
1679
+ }
1680
+ }
1681
+ },
1682
+ 0x18F => {
1683
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
1684
+ match modrm_byte >> 3 & 7 {
1685
+ 0 => {
1686
+ if modrm_byte < 0xC0 {
1687
+ instructions::instr32_8F_0_mem(modrm_byte);
1688
+ }
1689
+ else {
1690
+ instructions::instr32_8F_0_reg(modrm_byte & 7);
1691
+ }
1692
+ after_block_boundary();
1693
+ },
1694
+ x => {
1695
+ dbg_log!("#ud 8F/{} at {:x}", x, *instruction_pointer);
1696
+ trigger_ud();
1697
+ }
1698
+ }
1699
+ },
1700
+ 0x90 | 0x190 => {
1701
+ instructions::instr_90();
1702
+ },
1703
+ 0x91 => {
1704
+ instructions::instr16_91();
1705
+ },
1706
+ 0x191 => {
1707
+ instructions::instr32_91();
1708
+ },
1709
+ 0x92 => {
1710
+ instructions::instr16_92();
1711
+ },
1712
+ 0x192 => {
1713
+ instructions::instr32_92();
1714
+ },
1715
+ 0x93 => {
1716
+ instructions::instr16_93();
1717
+ },
1718
+ 0x193 => {
1719
+ instructions::instr32_93();
1720
+ },
1721
+ 0x94 => {
1722
+ instructions::instr16_94();
1723
+ },
1724
+ 0x194 => {
1725
+ instructions::instr32_94();
1726
+ },
1727
+ 0x95 => {
1728
+ instructions::instr16_95();
1729
+ },
1730
+ 0x195 => {
1731
+ instructions::instr32_95();
1732
+ },
1733
+ 0x96 => {
1734
+ instructions::instr16_96();
1735
+ },
1736
+ 0x196 => {
1737
+ instructions::instr32_96();
1738
+ },
1739
+ 0x97 => {
1740
+ instructions::instr16_97();
1741
+ },
1742
+ 0x197 => {
1743
+ instructions::instr32_97();
1744
+ },
1745
+ 0x98 => {
1746
+ instructions::instr16_98();
1747
+ },
1748
+ 0x198 => {
1749
+ instructions::instr32_98();
1750
+ },
1751
+ 0x99 => {
1752
+ instructions::instr16_99();
1753
+ },
1754
+ 0x199 => {
1755
+ instructions::instr32_99();
1756
+ },
1757
+ 0x9A => {
1758
+ instructions::instr16_9A(match read_imm16() { Ok(o) => o, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
1759
+ after_block_boundary();
1760
+ },
1761
+ 0x19A => {
1762
+ instructions::instr32_9A(match read_imm32s() { Ok(o) => o, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
1763
+ after_block_boundary();
1764
+ },
1765
+ 0x9B | 0x19B => {
1766
+ instructions::instr_9B();
1767
+ after_block_boundary();
1768
+ },
1769
+ 0x9C => {
1770
+ instructions::instr16_9C();
1771
+ },
1772
+ 0x19C => {
1773
+ instructions::instr32_9C();
1774
+ },
1775
+ 0x9D => {
1776
+ instructions::instr16_9D();
1777
+ },
1778
+ 0x19D => {
1779
+ instructions::instr32_9D();
1780
+ },
1781
+ 0x9E | 0x19E => {
1782
+ instructions::instr_9E();
1783
+ },
1784
+ 0x9F | 0x19F => {
1785
+ instructions::instr_9F();
1786
+ },
1787
+ 0xA0 | 0x1A0 => {
1788
+ instructions::instr_A0(match read_moffs() { Ok(o) => o, Err(()) => return });
1789
+ },
1790
+ 0xA1 => {
1791
+ instructions::instr16_A1(match read_moffs() { Ok(o) => o, Err(()) => return });
1792
+ },
1793
+ 0x1A1 => {
1794
+ instructions::instr32_A1(match read_moffs() { Ok(o) => o, Err(()) => return });
1795
+ },
1796
+ 0xA2 | 0x1A2 => {
1797
+ instructions::instr_A2(match read_moffs() { Ok(o) => o, Err(()) => return });
1798
+ },
1799
+ 0xA3 => {
1800
+ instructions::instr16_A3(match read_moffs() { Ok(o) => o, Err(()) => return });
1801
+ },
1802
+ 0x1A3 => {
1803
+ instructions::instr32_A3(match read_moffs() { Ok(o) => o, Err(()) => return });
1804
+ },
1805
+ 0xA4 | 0x1A4 => {
1806
+ let prefixes_ = *prefixes;
1807
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1808
+ instructions::instr_F2A4();
1809
+ after_block_boundary();
1810
+ }
1811
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1812
+ instructions::instr_F3A4();
1813
+ after_block_boundary();
1814
+ }
1815
+ else {
1816
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1817
+ instructions::instr_A4();
1818
+ }
1819
+ },
1820
+ 0xA5 => {
1821
+ let prefixes_ = *prefixes;
1822
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1823
+ instructions::instr16_F2A5();
1824
+ after_block_boundary();
1825
+ }
1826
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1827
+ instructions::instr16_F3A5();
1828
+ after_block_boundary();
1829
+ }
1830
+ else {
1831
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1832
+ instructions::instr16_A5();
1833
+ }
1834
+ },
1835
+ 0x1A5 => {
1836
+ let prefixes_ = *prefixes;
1837
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1838
+ instructions::instr32_F2A5();
1839
+ after_block_boundary();
1840
+ }
1841
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1842
+ instructions::instr32_F3A5();
1843
+ after_block_boundary();
1844
+ }
1845
+ else {
1846
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1847
+ instructions::instr32_A5();
1848
+ }
1849
+ },
1850
+ 0xA6 | 0x1A6 => {
1851
+ let prefixes_ = *prefixes;
1852
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1853
+ instructions::instr_F2A6();
1854
+ after_block_boundary();
1855
+ }
1856
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1857
+ instructions::instr_F3A6();
1858
+ after_block_boundary();
1859
+ }
1860
+ else {
1861
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1862
+ instructions::instr_A6();
1863
+ after_block_boundary();
1864
+ }
1865
+ },
1866
+ 0xA7 => {
1867
+ let prefixes_ = *prefixes;
1868
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1869
+ instructions::instr16_F2A7();
1870
+ after_block_boundary();
1871
+ }
1872
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1873
+ instructions::instr16_F3A7();
1874
+ after_block_boundary();
1875
+ }
1876
+ else {
1877
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1878
+ instructions::instr16_A7();
1879
+ after_block_boundary();
1880
+ }
1881
+ },
1882
+ 0x1A7 => {
1883
+ let prefixes_ = *prefixes;
1884
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1885
+ instructions::instr32_F2A7();
1886
+ after_block_boundary();
1887
+ }
1888
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1889
+ instructions::instr32_F3A7();
1890
+ after_block_boundary();
1891
+ }
1892
+ else {
1893
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1894
+ instructions::instr32_A7();
1895
+ after_block_boundary();
1896
+ }
1897
+ },
1898
+ 0xA8 | 0x1A8 => {
1899
+ instructions::instr_A8(match read_imm8() { Ok(o) => o, Err(()) => return });
1900
+ },
1901
+ 0xA9 => {
1902
+ instructions::instr16_A9(match read_imm16() { Ok(o) => o, Err(()) => return });
1903
+ },
1904
+ 0x1A9 => {
1905
+ instructions::instr32_A9(match read_imm32s() { Ok(o) => o, Err(()) => return });
1906
+ },
1907
+ 0xAA | 0x1AA => {
1908
+ let prefixes_ = *prefixes;
1909
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1910
+ instructions::instr_F2AA();
1911
+ after_block_boundary();
1912
+ }
1913
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1914
+ instructions::instr_F3AA();
1915
+ after_block_boundary();
1916
+ }
1917
+ else {
1918
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1919
+ instructions::instr_AA();
1920
+ }
1921
+ },
1922
+ 0xAB => {
1923
+ let prefixes_ = *prefixes;
1924
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1925
+ instructions::instr16_F2AB();
1926
+ after_block_boundary();
1927
+ }
1928
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1929
+ instructions::instr16_F3AB();
1930
+ after_block_boundary();
1931
+ }
1932
+ else {
1933
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1934
+ instructions::instr16_AB();
1935
+ }
1936
+ },
1937
+ 0x1AB => {
1938
+ let prefixes_ = *prefixes;
1939
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1940
+ instructions::instr32_F2AB();
1941
+ after_block_boundary();
1942
+ }
1943
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1944
+ instructions::instr32_F3AB();
1945
+ after_block_boundary();
1946
+ }
1947
+ else {
1948
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1949
+ instructions::instr32_AB();
1950
+ }
1951
+ },
1952
+ 0xAC | 0x1AC => {
1953
+ let prefixes_ = *prefixes;
1954
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1955
+ instructions::instr_F2AC();
1956
+ after_block_boundary();
1957
+ }
1958
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1959
+ instructions::instr_F3AC();
1960
+ after_block_boundary();
1961
+ }
1962
+ else {
1963
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1964
+ instructions::instr_AC();
1965
+ }
1966
+ },
1967
+ 0xAD => {
1968
+ let prefixes_ = *prefixes;
1969
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1970
+ instructions::instr16_F2AD();
1971
+ after_block_boundary();
1972
+ }
1973
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1974
+ instructions::instr16_F3AD();
1975
+ after_block_boundary();
1976
+ }
1977
+ else {
1978
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1979
+ instructions::instr16_AD();
1980
+ }
1981
+ },
1982
+ 0x1AD => {
1983
+ let prefixes_ = *prefixes;
1984
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
1985
+ instructions::instr32_F2AD();
1986
+ after_block_boundary();
1987
+ }
1988
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
1989
+ instructions::instr32_F3AD();
1990
+ after_block_boundary();
1991
+ }
1992
+ else {
1993
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
1994
+ instructions::instr32_AD();
1995
+ }
1996
+ },
1997
+ 0xAE | 0x1AE => {
1998
+ let prefixes_ = *prefixes;
1999
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
2000
+ instructions::instr_F2AE();
2001
+ after_block_boundary();
2002
+ }
2003
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
2004
+ instructions::instr_F3AE();
2005
+ after_block_boundary();
2006
+ }
2007
+ else {
2008
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
2009
+ instructions::instr_AE();
2010
+ }
2011
+ },
2012
+ 0xAF => {
2013
+ let prefixes_ = *prefixes;
2014
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
2015
+ instructions::instr16_F2AF();
2016
+ after_block_boundary();
2017
+ }
2018
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
2019
+ instructions::instr16_F3AF();
2020
+ after_block_boundary();
2021
+ }
2022
+ else {
2023
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
2024
+ instructions::instr16_AF();
2025
+ }
2026
+ },
2027
+ 0x1AF => {
2028
+ let prefixes_ = *prefixes;
2029
+ if prefixes_ & prefix::PREFIX_F2 != 0 {
2030
+ instructions::instr32_F2AF();
2031
+ after_block_boundary();
2032
+ }
2033
+ else if prefixes_ & prefix::PREFIX_F3 != 0 {
2034
+ instructions::instr32_F3AF();
2035
+ after_block_boundary();
2036
+ }
2037
+ else {
2038
+ dbg_assert!((prefixes_ & (prefix::PREFIX_F2 | prefix::PREFIX_F3)) == 0);
2039
+ instructions::instr32_AF();
2040
+ }
2041
+ },
2042
+ 0xB0 | 0x1B0 => {
2043
+ instructions::instr_B0(match read_imm8() { Ok(o) => o, Err(()) => return });
2044
+ },
2045
+ 0xB1 | 0x1B1 => {
2046
+ instructions::instr_B1(match read_imm8() { Ok(o) => o, Err(()) => return });
2047
+ },
2048
+ 0xB2 | 0x1B2 => {
2049
+ instructions::instr_B2(match read_imm8() { Ok(o) => o, Err(()) => return });
2050
+ },
2051
+ 0xB3 | 0x1B3 => {
2052
+ instructions::instr_B3(match read_imm8() { Ok(o) => o, Err(()) => return });
2053
+ },
2054
+ 0xB4 | 0x1B4 => {
2055
+ instructions::instr_B4(match read_imm8() { Ok(o) => o, Err(()) => return });
2056
+ },
2057
+ 0xB5 | 0x1B5 => {
2058
+ instructions::instr_B5(match read_imm8() { Ok(o) => o, Err(()) => return });
2059
+ },
2060
+ 0xB6 | 0x1B6 => {
2061
+ instructions::instr_B6(match read_imm8() { Ok(o) => o, Err(()) => return });
2062
+ },
2063
+ 0xB7 | 0x1B7 => {
2064
+ instructions::instr_B7(match read_imm8() { Ok(o) => o, Err(()) => return });
2065
+ },
2066
+ 0xB8 => {
2067
+ instructions::instr16_B8(match read_imm16() { Ok(o) => o, Err(()) => return });
2068
+ },
2069
+ 0x1B8 => {
2070
+ instructions::instr32_B8(match read_imm32s() { Ok(o) => o, Err(()) => return });
2071
+ },
2072
+ 0xB9 => {
2073
+ instructions::instr16_B9(match read_imm16() { Ok(o) => o, Err(()) => return });
2074
+ },
2075
+ 0x1B9 => {
2076
+ instructions::instr32_B9(match read_imm32s() { Ok(o) => o, Err(()) => return });
2077
+ },
2078
+ 0xBA => {
2079
+ instructions::instr16_BA(match read_imm16() { Ok(o) => o, Err(()) => return });
2080
+ },
2081
+ 0x1BA => {
2082
+ instructions::instr32_BA(match read_imm32s() { Ok(o) => o, Err(()) => return });
2083
+ },
2084
+ 0xBB => {
2085
+ instructions::instr16_BB(match read_imm16() { Ok(o) => o, Err(()) => return });
2086
+ },
2087
+ 0x1BB => {
2088
+ instructions::instr32_BB(match read_imm32s() { Ok(o) => o, Err(()) => return });
2089
+ },
2090
+ 0xBC => {
2091
+ instructions::instr16_BC(match read_imm16() { Ok(o) => o, Err(()) => return });
2092
+ },
2093
+ 0x1BC => {
2094
+ instructions::instr32_BC(match read_imm32s() { Ok(o) => o, Err(()) => return });
2095
+ },
2096
+ 0xBD => {
2097
+ instructions::instr16_BD(match read_imm16() { Ok(o) => o, Err(()) => return });
2098
+ },
2099
+ 0x1BD => {
2100
+ instructions::instr32_BD(match read_imm32s() { Ok(o) => o, Err(()) => return });
2101
+ },
2102
+ 0xBE => {
2103
+ instructions::instr16_BE(match read_imm16() { Ok(o) => o, Err(()) => return });
2104
+ },
2105
+ 0x1BE => {
2106
+ instructions::instr32_BE(match read_imm32s() { Ok(o) => o, Err(()) => return });
2107
+ },
2108
+ 0xBF => {
2109
+ instructions::instr16_BF(match read_imm16() { Ok(o) => o, Err(()) => return });
2110
+ },
2111
+ 0x1BF => {
2112
+ instructions::instr32_BF(match read_imm32s() { Ok(o) => o, Err(()) => return });
2113
+ },
2114
+ 0xC0 | 0x1C0 => {
2115
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2116
+ match modrm_byte >> 3 & 7 {
2117
+ 0 => {
2118
+ if modrm_byte < 0xC0 {
2119
+ instructions::instr_C0_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2120
+ }
2121
+ else {
2122
+ instructions::instr_C0_0_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2123
+ }
2124
+ },
2125
+ 1 => {
2126
+ if modrm_byte < 0xC0 {
2127
+ instructions::instr_C0_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2128
+ }
2129
+ else {
2130
+ instructions::instr_C0_1_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2131
+ }
2132
+ },
2133
+ 2 => {
2134
+ if modrm_byte < 0xC0 {
2135
+ instructions::instr_C0_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2136
+ }
2137
+ else {
2138
+ instructions::instr_C0_2_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2139
+ }
2140
+ },
2141
+ 3 => {
2142
+ if modrm_byte < 0xC0 {
2143
+ instructions::instr_C0_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2144
+ }
2145
+ else {
2146
+ instructions::instr_C0_3_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2147
+ }
2148
+ },
2149
+ 4 => {
2150
+ if modrm_byte < 0xC0 {
2151
+ instructions::instr_C0_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2152
+ }
2153
+ else {
2154
+ instructions::instr_C0_4_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2155
+ }
2156
+ },
2157
+ 5 => {
2158
+ if modrm_byte < 0xC0 {
2159
+ instructions::instr_C0_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2160
+ }
2161
+ else {
2162
+ instructions::instr_C0_5_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2163
+ }
2164
+ },
2165
+ 6 => {
2166
+ if modrm_byte < 0xC0 {
2167
+ instructions::instr_C0_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2168
+ }
2169
+ else {
2170
+ instructions::instr_C0_6_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2171
+ }
2172
+ },
2173
+ 7 => {
2174
+ if modrm_byte < 0xC0 {
2175
+ instructions::instr_C0_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2176
+ }
2177
+ else {
2178
+ instructions::instr_C0_7_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2179
+ }
2180
+ },
2181
+ x => {
2182
+ dbg_log!("#ud C0/{} at {:x}", x, *instruction_pointer);
2183
+ trigger_ud();
2184
+ }
2185
+ }
2186
+ },
2187
+ 0xC1 => {
2188
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2189
+ match modrm_byte >> 3 & 7 {
2190
+ 0 => {
2191
+ if modrm_byte < 0xC0 {
2192
+ instructions::instr16_C1_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2193
+ }
2194
+ else {
2195
+ instructions::instr16_C1_0_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2196
+ }
2197
+ },
2198
+ 1 => {
2199
+ if modrm_byte < 0xC0 {
2200
+ instructions::instr16_C1_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2201
+ }
2202
+ else {
2203
+ instructions::instr16_C1_1_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2204
+ }
2205
+ },
2206
+ 2 => {
2207
+ if modrm_byte < 0xC0 {
2208
+ instructions::instr16_C1_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2209
+ }
2210
+ else {
2211
+ instructions::instr16_C1_2_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2212
+ }
2213
+ },
2214
+ 3 => {
2215
+ if modrm_byte < 0xC0 {
2216
+ instructions::instr16_C1_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2217
+ }
2218
+ else {
2219
+ instructions::instr16_C1_3_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2220
+ }
2221
+ },
2222
+ 4 => {
2223
+ if modrm_byte < 0xC0 {
2224
+ instructions::instr16_C1_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2225
+ }
2226
+ else {
2227
+ instructions::instr16_C1_4_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2228
+ }
2229
+ },
2230
+ 5 => {
2231
+ if modrm_byte < 0xC0 {
2232
+ instructions::instr16_C1_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2233
+ }
2234
+ else {
2235
+ instructions::instr16_C1_5_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2236
+ }
2237
+ },
2238
+ 6 => {
2239
+ if modrm_byte < 0xC0 {
2240
+ instructions::instr16_C1_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2241
+ }
2242
+ else {
2243
+ instructions::instr16_C1_6_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2244
+ }
2245
+ },
2246
+ 7 => {
2247
+ if modrm_byte < 0xC0 {
2248
+ instructions::instr16_C1_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2249
+ }
2250
+ else {
2251
+ instructions::instr16_C1_7_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2252
+ }
2253
+ },
2254
+ x => {
2255
+ dbg_log!("#ud C1/{} at {:x}", x, *instruction_pointer);
2256
+ trigger_ud();
2257
+ }
2258
+ }
2259
+ },
2260
+ 0x1C1 => {
2261
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2262
+ match modrm_byte >> 3 & 7 {
2263
+ 0 => {
2264
+ if modrm_byte < 0xC0 {
2265
+ instructions::instr32_C1_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2266
+ }
2267
+ else {
2268
+ instructions::instr32_C1_0_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2269
+ }
2270
+ },
2271
+ 1 => {
2272
+ if modrm_byte < 0xC0 {
2273
+ instructions::instr32_C1_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2274
+ }
2275
+ else {
2276
+ instructions::instr32_C1_1_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2277
+ }
2278
+ },
2279
+ 2 => {
2280
+ if modrm_byte < 0xC0 {
2281
+ instructions::instr32_C1_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2282
+ }
2283
+ else {
2284
+ instructions::instr32_C1_2_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2285
+ }
2286
+ },
2287
+ 3 => {
2288
+ if modrm_byte < 0xC0 {
2289
+ instructions::instr32_C1_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2290
+ }
2291
+ else {
2292
+ instructions::instr32_C1_3_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2293
+ }
2294
+ },
2295
+ 4 => {
2296
+ if modrm_byte < 0xC0 {
2297
+ instructions::instr32_C1_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2298
+ }
2299
+ else {
2300
+ instructions::instr32_C1_4_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2301
+ }
2302
+ },
2303
+ 5 => {
2304
+ if modrm_byte < 0xC0 {
2305
+ instructions::instr32_C1_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2306
+ }
2307
+ else {
2308
+ instructions::instr32_C1_5_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2309
+ }
2310
+ },
2311
+ 6 => {
2312
+ if modrm_byte < 0xC0 {
2313
+ instructions::instr32_C1_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2314
+ }
2315
+ else {
2316
+ instructions::instr32_C1_6_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2317
+ }
2318
+ },
2319
+ 7 => {
2320
+ if modrm_byte < 0xC0 {
2321
+ instructions::instr32_C1_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2322
+ }
2323
+ else {
2324
+ instructions::instr32_C1_7_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2325
+ }
2326
+ },
2327
+ x => {
2328
+ dbg_log!("#ud C1/{} at {:x}", x, *instruction_pointer);
2329
+ trigger_ud();
2330
+ }
2331
+ }
2332
+ },
2333
+ 0xC2 => {
2334
+ instructions::instr16_C2(match read_imm16() { Ok(o) => o, Err(()) => return });
2335
+ after_block_boundary();
2336
+ },
2337
+ 0x1C2 => {
2338
+ instructions::instr32_C2(match read_imm16() { Ok(o) => o, Err(()) => return });
2339
+ after_block_boundary();
2340
+ },
2341
+ 0xC3 => {
2342
+ instructions::instr16_C3();
2343
+ after_block_boundary();
2344
+ },
2345
+ 0x1C3 => {
2346
+ instructions::instr32_C3();
2347
+ after_block_boundary();
2348
+ },
2349
+ 0xC4 => {
2350
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2351
+ if modrm_byte < 0xC0 {
2352
+ instructions::instr16_C4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
2353
+ }
2354
+ else {
2355
+ instructions::instr16_C4_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
2356
+ }
2357
+ after_block_boundary();
2358
+ },
2359
+ 0x1C4 => {
2360
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2361
+ if modrm_byte < 0xC0 {
2362
+ instructions::instr32_C4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
2363
+ }
2364
+ else {
2365
+ instructions::instr32_C4_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
2366
+ }
2367
+ after_block_boundary();
2368
+ },
2369
+ 0xC5 => {
2370
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2371
+ if modrm_byte < 0xC0 {
2372
+ instructions::instr16_C5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
2373
+ }
2374
+ else {
2375
+ instructions::instr16_C5_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
2376
+ }
2377
+ after_block_boundary();
2378
+ },
2379
+ 0x1C5 => {
2380
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2381
+ if modrm_byte < 0xC0 {
2382
+ instructions::instr32_C5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, modrm_byte >> 3 & 7);
2383
+ }
2384
+ else {
2385
+ instructions::instr32_C5_reg(modrm_byte & 7, modrm_byte >> 3 & 7);
2386
+ }
2387
+ after_block_boundary();
2388
+ },
2389
+ 0xC6 | 0x1C6 => {
2390
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2391
+ match modrm_byte >> 3 & 7 {
2392
+ 0 => {
2393
+ if modrm_byte < 0xC0 {
2394
+ instructions::instr_C6_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2395
+ }
2396
+ else {
2397
+ instructions::instr_C6_0_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
2398
+ }
2399
+ },
2400
+ x => {
2401
+ dbg_log!("#ud C6/{} at {:x}", x, *instruction_pointer);
2402
+ trigger_ud();
2403
+ }
2404
+ }
2405
+ },
2406
+ 0xC7 => {
2407
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2408
+ match modrm_byte >> 3 & 7 {
2409
+ 0 => {
2410
+ if modrm_byte < 0xC0 {
2411
+ instructions::instr16_C7_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
2412
+ }
2413
+ else {
2414
+ instructions::instr16_C7_0_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
2415
+ }
2416
+ },
2417
+ x => {
2418
+ dbg_log!("#ud C7/{} at {:x}", x, *instruction_pointer);
2419
+ trigger_ud();
2420
+ }
2421
+ }
2422
+ },
2423
+ 0x1C7 => {
2424
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2425
+ match modrm_byte >> 3 & 7 {
2426
+ 0 => {
2427
+ if modrm_byte < 0xC0 {
2428
+ instructions::instr32_C7_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
2429
+ }
2430
+ else {
2431
+ instructions::instr32_C7_0_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
2432
+ }
2433
+ },
2434
+ x => {
2435
+ dbg_log!("#ud C7/{} at {:x}", x, *instruction_pointer);
2436
+ trigger_ud();
2437
+ }
2438
+ }
2439
+ },
2440
+ 0xC8 => {
2441
+ instructions::instr16_C8(match read_imm16() { Ok(o) => o, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2442
+ after_block_boundary();
2443
+ },
2444
+ 0x1C8 => {
2445
+ instructions::instr32_C8(match read_imm16() { Ok(o) => o, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
2446
+ after_block_boundary();
2447
+ },
2448
+ 0xC9 => {
2449
+ instructions::instr16_C9();
2450
+ },
2451
+ 0x1C9 => {
2452
+ instructions::instr32_C9();
2453
+ },
2454
+ 0xCA => {
2455
+ instructions::instr16_CA(match read_imm16() { Ok(o) => o, Err(()) => return });
2456
+ after_block_boundary();
2457
+ },
2458
+ 0x1CA => {
2459
+ instructions::instr32_CA(match read_imm16() { Ok(o) => o, Err(()) => return });
2460
+ after_block_boundary();
2461
+ },
2462
+ 0xCB => {
2463
+ instructions::instr16_CB();
2464
+ after_block_boundary();
2465
+ },
2466
+ 0x1CB => {
2467
+ instructions::instr32_CB();
2468
+ after_block_boundary();
2469
+ },
2470
+ 0xCC | 0x1CC => {
2471
+ instructions::instr_CC();
2472
+ after_block_boundary();
2473
+ },
2474
+ 0xCD | 0x1CD => {
2475
+ instructions::instr_CD(match read_imm8() { Ok(o) => o, Err(()) => return });
2476
+ after_block_boundary();
2477
+ },
2478
+ 0xCE | 0x1CE => {
2479
+ instructions::instr_CE();
2480
+ after_block_boundary();
2481
+ },
2482
+ 0xCF => {
2483
+ instructions::instr16_CF();
2484
+ after_block_boundary();
2485
+ },
2486
+ 0x1CF => {
2487
+ instructions::instr32_CF();
2488
+ after_block_boundary();
2489
+ },
2490
+ 0xD0 | 0x1D0 => {
2491
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2492
+ match modrm_byte >> 3 & 7 {
2493
+ 0 => {
2494
+ if modrm_byte < 0xC0 {
2495
+ instructions::instr_D0_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2496
+ }
2497
+ else {
2498
+ instructions::instr_D0_0_reg(modrm_byte & 7);
2499
+ }
2500
+ },
2501
+ 1 => {
2502
+ if modrm_byte < 0xC0 {
2503
+ instructions::instr_D0_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2504
+ }
2505
+ else {
2506
+ instructions::instr_D0_1_reg(modrm_byte & 7);
2507
+ }
2508
+ },
2509
+ 2 => {
2510
+ if modrm_byte < 0xC0 {
2511
+ instructions::instr_D0_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2512
+ }
2513
+ else {
2514
+ instructions::instr_D0_2_reg(modrm_byte & 7);
2515
+ }
2516
+ },
2517
+ 3 => {
2518
+ if modrm_byte < 0xC0 {
2519
+ instructions::instr_D0_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2520
+ }
2521
+ else {
2522
+ instructions::instr_D0_3_reg(modrm_byte & 7);
2523
+ }
2524
+ },
2525
+ 4 => {
2526
+ if modrm_byte < 0xC0 {
2527
+ instructions::instr_D0_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2528
+ }
2529
+ else {
2530
+ instructions::instr_D0_4_reg(modrm_byte & 7);
2531
+ }
2532
+ },
2533
+ 5 => {
2534
+ if modrm_byte < 0xC0 {
2535
+ instructions::instr_D0_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2536
+ }
2537
+ else {
2538
+ instructions::instr_D0_5_reg(modrm_byte & 7);
2539
+ }
2540
+ },
2541
+ 6 => {
2542
+ if modrm_byte < 0xC0 {
2543
+ instructions::instr_D0_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2544
+ }
2545
+ else {
2546
+ instructions::instr_D0_6_reg(modrm_byte & 7);
2547
+ }
2548
+ },
2549
+ 7 => {
2550
+ if modrm_byte < 0xC0 {
2551
+ instructions::instr_D0_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2552
+ }
2553
+ else {
2554
+ instructions::instr_D0_7_reg(modrm_byte & 7);
2555
+ }
2556
+ },
2557
+ x => {
2558
+ dbg_log!("#ud D0/{} at {:x}", x, *instruction_pointer);
2559
+ trigger_ud();
2560
+ }
2561
+ }
2562
+ },
2563
+ 0xD1 => {
2564
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2565
+ match modrm_byte >> 3 & 7 {
2566
+ 0 => {
2567
+ if modrm_byte < 0xC0 {
2568
+ instructions::instr16_D1_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2569
+ }
2570
+ else {
2571
+ instructions::instr16_D1_0_reg(modrm_byte & 7);
2572
+ }
2573
+ },
2574
+ 1 => {
2575
+ if modrm_byte < 0xC0 {
2576
+ instructions::instr16_D1_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2577
+ }
2578
+ else {
2579
+ instructions::instr16_D1_1_reg(modrm_byte & 7);
2580
+ }
2581
+ },
2582
+ 2 => {
2583
+ if modrm_byte < 0xC0 {
2584
+ instructions::instr16_D1_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2585
+ }
2586
+ else {
2587
+ instructions::instr16_D1_2_reg(modrm_byte & 7);
2588
+ }
2589
+ },
2590
+ 3 => {
2591
+ if modrm_byte < 0xC0 {
2592
+ instructions::instr16_D1_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2593
+ }
2594
+ else {
2595
+ instructions::instr16_D1_3_reg(modrm_byte & 7);
2596
+ }
2597
+ },
2598
+ 4 => {
2599
+ if modrm_byte < 0xC0 {
2600
+ instructions::instr16_D1_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2601
+ }
2602
+ else {
2603
+ instructions::instr16_D1_4_reg(modrm_byte & 7);
2604
+ }
2605
+ },
2606
+ 5 => {
2607
+ if modrm_byte < 0xC0 {
2608
+ instructions::instr16_D1_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2609
+ }
2610
+ else {
2611
+ instructions::instr16_D1_5_reg(modrm_byte & 7);
2612
+ }
2613
+ },
2614
+ 6 => {
2615
+ if modrm_byte < 0xC0 {
2616
+ instructions::instr16_D1_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2617
+ }
2618
+ else {
2619
+ instructions::instr16_D1_6_reg(modrm_byte & 7);
2620
+ }
2621
+ },
2622
+ 7 => {
2623
+ if modrm_byte < 0xC0 {
2624
+ instructions::instr16_D1_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2625
+ }
2626
+ else {
2627
+ instructions::instr16_D1_7_reg(modrm_byte & 7);
2628
+ }
2629
+ },
2630
+ x => {
2631
+ dbg_log!("#ud D1/{} at {:x}", x, *instruction_pointer);
2632
+ trigger_ud();
2633
+ }
2634
+ }
2635
+ },
2636
+ 0x1D1 => {
2637
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2638
+ match modrm_byte >> 3 & 7 {
2639
+ 0 => {
2640
+ if modrm_byte < 0xC0 {
2641
+ instructions::instr32_D1_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2642
+ }
2643
+ else {
2644
+ instructions::instr32_D1_0_reg(modrm_byte & 7);
2645
+ }
2646
+ },
2647
+ 1 => {
2648
+ if modrm_byte < 0xC0 {
2649
+ instructions::instr32_D1_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2650
+ }
2651
+ else {
2652
+ instructions::instr32_D1_1_reg(modrm_byte & 7);
2653
+ }
2654
+ },
2655
+ 2 => {
2656
+ if modrm_byte < 0xC0 {
2657
+ instructions::instr32_D1_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2658
+ }
2659
+ else {
2660
+ instructions::instr32_D1_2_reg(modrm_byte & 7);
2661
+ }
2662
+ },
2663
+ 3 => {
2664
+ if modrm_byte < 0xC0 {
2665
+ instructions::instr32_D1_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2666
+ }
2667
+ else {
2668
+ instructions::instr32_D1_3_reg(modrm_byte & 7);
2669
+ }
2670
+ },
2671
+ 4 => {
2672
+ if modrm_byte < 0xC0 {
2673
+ instructions::instr32_D1_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2674
+ }
2675
+ else {
2676
+ instructions::instr32_D1_4_reg(modrm_byte & 7);
2677
+ }
2678
+ },
2679
+ 5 => {
2680
+ if modrm_byte < 0xC0 {
2681
+ instructions::instr32_D1_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2682
+ }
2683
+ else {
2684
+ instructions::instr32_D1_5_reg(modrm_byte & 7);
2685
+ }
2686
+ },
2687
+ 6 => {
2688
+ if modrm_byte < 0xC0 {
2689
+ instructions::instr32_D1_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2690
+ }
2691
+ else {
2692
+ instructions::instr32_D1_6_reg(modrm_byte & 7);
2693
+ }
2694
+ },
2695
+ 7 => {
2696
+ if modrm_byte < 0xC0 {
2697
+ instructions::instr32_D1_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2698
+ }
2699
+ else {
2700
+ instructions::instr32_D1_7_reg(modrm_byte & 7);
2701
+ }
2702
+ },
2703
+ x => {
2704
+ dbg_log!("#ud D1/{} at {:x}", x, *instruction_pointer);
2705
+ trigger_ud();
2706
+ }
2707
+ }
2708
+ },
2709
+ 0xD2 | 0x1D2 => {
2710
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2711
+ match modrm_byte >> 3 & 7 {
2712
+ 0 => {
2713
+ if modrm_byte < 0xC0 {
2714
+ instructions::instr_D2_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2715
+ }
2716
+ else {
2717
+ instructions::instr_D2_0_reg(modrm_byte & 7);
2718
+ }
2719
+ },
2720
+ 1 => {
2721
+ if modrm_byte < 0xC0 {
2722
+ instructions::instr_D2_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2723
+ }
2724
+ else {
2725
+ instructions::instr_D2_1_reg(modrm_byte & 7);
2726
+ }
2727
+ },
2728
+ 2 => {
2729
+ if modrm_byte < 0xC0 {
2730
+ instructions::instr_D2_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2731
+ }
2732
+ else {
2733
+ instructions::instr_D2_2_reg(modrm_byte & 7);
2734
+ }
2735
+ },
2736
+ 3 => {
2737
+ if modrm_byte < 0xC0 {
2738
+ instructions::instr_D2_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2739
+ }
2740
+ else {
2741
+ instructions::instr_D2_3_reg(modrm_byte & 7);
2742
+ }
2743
+ },
2744
+ 4 => {
2745
+ if modrm_byte < 0xC0 {
2746
+ instructions::instr_D2_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2747
+ }
2748
+ else {
2749
+ instructions::instr_D2_4_reg(modrm_byte & 7);
2750
+ }
2751
+ },
2752
+ 5 => {
2753
+ if modrm_byte < 0xC0 {
2754
+ instructions::instr_D2_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2755
+ }
2756
+ else {
2757
+ instructions::instr_D2_5_reg(modrm_byte & 7);
2758
+ }
2759
+ },
2760
+ 6 => {
2761
+ if modrm_byte < 0xC0 {
2762
+ instructions::instr_D2_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2763
+ }
2764
+ else {
2765
+ instructions::instr_D2_6_reg(modrm_byte & 7);
2766
+ }
2767
+ },
2768
+ 7 => {
2769
+ if modrm_byte < 0xC0 {
2770
+ instructions::instr_D2_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2771
+ }
2772
+ else {
2773
+ instructions::instr_D2_7_reg(modrm_byte & 7);
2774
+ }
2775
+ },
2776
+ x => {
2777
+ dbg_log!("#ud D2/{} at {:x}", x, *instruction_pointer);
2778
+ trigger_ud();
2779
+ }
2780
+ }
2781
+ },
2782
+ 0xD3 => {
2783
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2784
+ match modrm_byte >> 3 & 7 {
2785
+ 0 => {
2786
+ if modrm_byte < 0xC0 {
2787
+ instructions::instr16_D3_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2788
+ }
2789
+ else {
2790
+ instructions::instr16_D3_0_reg(modrm_byte & 7);
2791
+ }
2792
+ },
2793
+ 1 => {
2794
+ if modrm_byte < 0xC0 {
2795
+ instructions::instr16_D3_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2796
+ }
2797
+ else {
2798
+ instructions::instr16_D3_1_reg(modrm_byte & 7);
2799
+ }
2800
+ },
2801
+ 2 => {
2802
+ if modrm_byte < 0xC0 {
2803
+ instructions::instr16_D3_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2804
+ }
2805
+ else {
2806
+ instructions::instr16_D3_2_reg(modrm_byte & 7);
2807
+ }
2808
+ },
2809
+ 3 => {
2810
+ if modrm_byte < 0xC0 {
2811
+ instructions::instr16_D3_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2812
+ }
2813
+ else {
2814
+ instructions::instr16_D3_3_reg(modrm_byte & 7);
2815
+ }
2816
+ },
2817
+ 4 => {
2818
+ if modrm_byte < 0xC0 {
2819
+ instructions::instr16_D3_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2820
+ }
2821
+ else {
2822
+ instructions::instr16_D3_4_reg(modrm_byte & 7);
2823
+ }
2824
+ },
2825
+ 5 => {
2826
+ if modrm_byte < 0xC0 {
2827
+ instructions::instr16_D3_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2828
+ }
2829
+ else {
2830
+ instructions::instr16_D3_5_reg(modrm_byte & 7);
2831
+ }
2832
+ },
2833
+ 6 => {
2834
+ if modrm_byte < 0xC0 {
2835
+ instructions::instr16_D3_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2836
+ }
2837
+ else {
2838
+ instructions::instr16_D3_6_reg(modrm_byte & 7);
2839
+ }
2840
+ },
2841
+ 7 => {
2842
+ if modrm_byte < 0xC0 {
2843
+ instructions::instr16_D3_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2844
+ }
2845
+ else {
2846
+ instructions::instr16_D3_7_reg(modrm_byte & 7);
2847
+ }
2848
+ },
2849
+ x => {
2850
+ dbg_log!("#ud D3/{} at {:x}", x, *instruction_pointer);
2851
+ trigger_ud();
2852
+ }
2853
+ }
2854
+ },
2855
+ 0x1D3 => {
2856
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2857
+ match modrm_byte >> 3 & 7 {
2858
+ 0 => {
2859
+ if modrm_byte < 0xC0 {
2860
+ instructions::instr32_D3_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2861
+ }
2862
+ else {
2863
+ instructions::instr32_D3_0_reg(modrm_byte & 7);
2864
+ }
2865
+ },
2866
+ 1 => {
2867
+ if modrm_byte < 0xC0 {
2868
+ instructions::instr32_D3_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2869
+ }
2870
+ else {
2871
+ instructions::instr32_D3_1_reg(modrm_byte & 7);
2872
+ }
2873
+ },
2874
+ 2 => {
2875
+ if modrm_byte < 0xC0 {
2876
+ instructions::instr32_D3_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2877
+ }
2878
+ else {
2879
+ instructions::instr32_D3_2_reg(modrm_byte & 7);
2880
+ }
2881
+ },
2882
+ 3 => {
2883
+ if modrm_byte < 0xC0 {
2884
+ instructions::instr32_D3_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2885
+ }
2886
+ else {
2887
+ instructions::instr32_D3_3_reg(modrm_byte & 7);
2888
+ }
2889
+ },
2890
+ 4 => {
2891
+ if modrm_byte < 0xC0 {
2892
+ instructions::instr32_D3_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2893
+ }
2894
+ else {
2895
+ instructions::instr32_D3_4_reg(modrm_byte & 7);
2896
+ }
2897
+ },
2898
+ 5 => {
2899
+ if modrm_byte < 0xC0 {
2900
+ instructions::instr32_D3_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2901
+ }
2902
+ else {
2903
+ instructions::instr32_D3_5_reg(modrm_byte & 7);
2904
+ }
2905
+ },
2906
+ 6 => {
2907
+ if modrm_byte < 0xC0 {
2908
+ instructions::instr32_D3_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2909
+ }
2910
+ else {
2911
+ instructions::instr32_D3_6_reg(modrm_byte & 7);
2912
+ }
2913
+ },
2914
+ 7 => {
2915
+ if modrm_byte < 0xC0 {
2916
+ instructions::instr32_D3_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2917
+ }
2918
+ else {
2919
+ instructions::instr32_D3_7_reg(modrm_byte & 7);
2920
+ }
2921
+ },
2922
+ x => {
2923
+ dbg_log!("#ud D3/{} at {:x}", x, *instruction_pointer);
2924
+ trigger_ud();
2925
+ }
2926
+ }
2927
+ },
2928
+ 0xD4 | 0x1D4 => {
2929
+ instructions::instr_D4(match read_imm8() { Ok(o) => o, Err(()) => return });
2930
+ after_block_boundary();
2931
+ },
2932
+ 0xD5 | 0x1D5 => {
2933
+ instructions::instr_D5(match read_imm8() { Ok(o) => o, Err(()) => return });
2934
+ },
2935
+ 0xD6 | 0x1D6 => {
2936
+ instructions::instr_D6();
2937
+ },
2938
+ 0xD7 | 0x1D7 => {
2939
+ instructions::instr_D7();
2940
+ },
2941
+ 0xD8 | 0x1D8 => {
2942
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
2943
+ match modrm_byte >> 3 & 7 {
2944
+ 0 => {
2945
+ if !task_switch_test() {
2946
+ return;
2947
+ }
2948
+ if modrm_byte < 0xC0 {
2949
+ instructions::instr_D8_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2950
+ }
2951
+ else {
2952
+ instructions::instr_D8_0_reg(modrm_byte & 7);
2953
+ }
2954
+ },
2955
+ 1 => {
2956
+ if !task_switch_test() {
2957
+ return;
2958
+ }
2959
+ if modrm_byte < 0xC0 {
2960
+ instructions::instr_D8_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2961
+ }
2962
+ else {
2963
+ instructions::instr_D8_1_reg(modrm_byte & 7);
2964
+ }
2965
+ },
2966
+ 2 => {
2967
+ if !task_switch_test() {
2968
+ return;
2969
+ }
2970
+ if modrm_byte < 0xC0 {
2971
+ instructions::instr_D8_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2972
+ }
2973
+ else {
2974
+ instructions::instr_D8_2_reg(modrm_byte & 7);
2975
+ }
2976
+ },
2977
+ 3 => {
2978
+ if !task_switch_test() {
2979
+ return;
2980
+ }
2981
+ if modrm_byte < 0xC0 {
2982
+ instructions::instr_D8_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2983
+ }
2984
+ else {
2985
+ instructions::instr_D8_3_reg(modrm_byte & 7);
2986
+ }
2987
+ },
2988
+ 4 => {
2989
+ if !task_switch_test() {
2990
+ return;
2991
+ }
2992
+ if modrm_byte < 0xC0 {
2993
+ instructions::instr_D8_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
2994
+ }
2995
+ else {
2996
+ instructions::instr_D8_4_reg(modrm_byte & 7);
2997
+ }
2998
+ },
2999
+ 5 => {
3000
+ if !task_switch_test() {
3001
+ return;
3002
+ }
3003
+ if modrm_byte < 0xC0 {
3004
+ instructions::instr_D8_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3005
+ }
3006
+ else {
3007
+ instructions::instr_D8_5_reg(modrm_byte & 7);
3008
+ }
3009
+ },
3010
+ 6 => {
3011
+ if !task_switch_test() {
3012
+ return;
3013
+ }
3014
+ if modrm_byte < 0xC0 {
3015
+ instructions::instr_D8_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3016
+ }
3017
+ else {
3018
+ instructions::instr_D8_6_reg(modrm_byte & 7);
3019
+ }
3020
+ },
3021
+ 7 => {
3022
+ if !task_switch_test() {
3023
+ return;
3024
+ }
3025
+ if modrm_byte < 0xC0 {
3026
+ instructions::instr_D8_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3027
+ }
3028
+ else {
3029
+ instructions::instr_D8_7_reg(modrm_byte & 7);
3030
+ }
3031
+ },
3032
+ x => {
3033
+ dbg_log!("#ud D8/{} at {:x}", x, *instruction_pointer);
3034
+ trigger_ud();
3035
+ }
3036
+ }
3037
+ },
3038
+ 0xD9 => {
3039
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
3040
+ match modrm_byte >> 3 & 7 {
3041
+ 0 => {
3042
+ if !task_switch_test() {
3043
+ return;
3044
+ }
3045
+ if modrm_byte < 0xC0 {
3046
+ instructions::instr16_D9_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3047
+ }
3048
+ else {
3049
+ instructions::instr16_D9_0_reg(modrm_byte & 7);
3050
+ }
3051
+ },
3052
+ 1 => {
3053
+ if !task_switch_test() {
3054
+ return;
3055
+ }
3056
+ if modrm_byte < 0xC0 {
3057
+ instructions::instr16_D9_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3058
+ }
3059
+ else {
3060
+ instructions::instr16_D9_1_reg(modrm_byte & 7);
3061
+ }
3062
+ },
3063
+ 2 => {
3064
+ if !task_switch_test() {
3065
+ return;
3066
+ }
3067
+ if modrm_byte < 0xC0 {
3068
+ instructions::instr16_D9_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3069
+ }
3070
+ else {
3071
+ instructions::instr16_D9_2_reg(modrm_byte & 7);
3072
+ }
3073
+ },
3074
+ 3 => {
3075
+ if !task_switch_test() {
3076
+ return;
3077
+ }
3078
+ if modrm_byte < 0xC0 {
3079
+ instructions::instr16_D9_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3080
+ }
3081
+ else {
3082
+ instructions::instr16_D9_3_reg(modrm_byte & 7);
3083
+ }
3084
+ },
3085
+ 4 => {
3086
+ if !task_switch_test() {
3087
+ return;
3088
+ }
3089
+ if modrm_byte < 0xC0 {
3090
+ instructions::instr16_D9_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3091
+ }
3092
+ else {
3093
+ instructions::instr16_D9_4_reg(modrm_byte & 7);
3094
+ }
3095
+ },
3096
+ 5 => {
3097
+ if !task_switch_test() {
3098
+ return;
3099
+ }
3100
+ if modrm_byte < 0xC0 {
3101
+ instructions::instr16_D9_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3102
+ }
3103
+ else {
3104
+ instructions::instr16_D9_5_reg(modrm_byte & 7);
3105
+ }
3106
+ },
3107
+ 6 => {
3108
+ if !task_switch_test() {
3109
+ return;
3110
+ }
3111
+ if modrm_byte < 0xC0 {
3112
+ instructions::instr16_D9_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3113
+ }
3114
+ else {
3115
+ instructions::instr16_D9_6_reg(modrm_byte & 7);
3116
+ }
3117
+ },
3118
+ 7 => {
3119
+ if !task_switch_test() {
3120
+ return;
3121
+ }
3122
+ if modrm_byte < 0xC0 {
3123
+ instructions::instr16_D9_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3124
+ }
3125
+ else {
3126
+ instructions::instr16_D9_7_reg(modrm_byte & 7);
3127
+ }
3128
+ },
3129
+ x => {
3130
+ dbg_log!("#ud D9/{} at {:x}", x, *instruction_pointer);
3131
+ trigger_ud();
3132
+ }
3133
+ }
3134
+ },
3135
+ 0x1D9 => {
3136
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
3137
+ match modrm_byte >> 3 & 7 {
3138
+ 0 => {
3139
+ if !task_switch_test() {
3140
+ return;
3141
+ }
3142
+ if modrm_byte < 0xC0 {
3143
+ instructions::instr32_D9_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3144
+ }
3145
+ else {
3146
+ instructions::instr32_D9_0_reg(modrm_byte & 7);
3147
+ }
3148
+ },
3149
+ 1 => {
3150
+ if !task_switch_test() {
3151
+ return;
3152
+ }
3153
+ if modrm_byte < 0xC0 {
3154
+ instructions::instr32_D9_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3155
+ }
3156
+ else {
3157
+ instructions::instr32_D9_1_reg(modrm_byte & 7);
3158
+ }
3159
+ },
3160
+ 2 => {
3161
+ if !task_switch_test() {
3162
+ return;
3163
+ }
3164
+ if modrm_byte < 0xC0 {
3165
+ instructions::instr32_D9_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3166
+ }
3167
+ else {
3168
+ instructions::instr32_D9_2_reg(modrm_byte & 7);
3169
+ }
3170
+ },
3171
+ 3 => {
3172
+ if !task_switch_test() {
3173
+ return;
3174
+ }
3175
+ if modrm_byte < 0xC0 {
3176
+ instructions::instr32_D9_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3177
+ }
3178
+ else {
3179
+ instructions::instr32_D9_3_reg(modrm_byte & 7);
3180
+ }
3181
+ },
3182
+ 4 => {
3183
+ if !task_switch_test() {
3184
+ return;
3185
+ }
3186
+ if modrm_byte < 0xC0 {
3187
+ instructions::instr32_D9_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3188
+ }
3189
+ else {
3190
+ instructions::instr32_D9_4_reg(modrm_byte & 7);
3191
+ }
3192
+ },
3193
+ 5 => {
3194
+ if !task_switch_test() {
3195
+ return;
3196
+ }
3197
+ if modrm_byte < 0xC0 {
3198
+ instructions::instr32_D9_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3199
+ }
3200
+ else {
3201
+ instructions::instr32_D9_5_reg(modrm_byte & 7);
3202
+ }
3203
+ },
3204
+ 6 => {
3205
+ if !task_switch_test() {
3206
+ return;
3207
+ }
3208
+ if modrm_byte < 0xC0 {
3209
+ instructions::instr32_D9_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3210
+ }
3211
+ else {
3212
+ instructions::instr32_D9_6_reg(modrm_byte & 7);
3213
+ }
3214
+ },
3215
+ 7 => {
3216
+ if !task_switch_test() {
3217
+ return;
3218
+ }
3219
+ if modrm_byte < 0xC0 {
3220
+ instructions::instr32_D9_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3221
+ }
3222
+ else {
3223
+ instructions::instr32_D9_7_reg(modrm_byte & 7);
3224
+ }
3225
+ },
3226
+ x => {
3227
+ dbg_log!("#ud D9/{} at {:x}", x, *instruction_pointer);
3228
+ trigger_ud();
3229
+ }
3230
+ }
3231
+ },
3232
+ 0xDA | 0x1DA => {
3233
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
3234
+ match modrm_byte >> 3 & 7 {
3235
+ 0 => {
3236
+ if !task_switch_test() {
3237
+ return;
3238
+ }
3239
+ if modrm_byte < 0xC0 {
3240
+ instructions::instr_DA_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3241
+ }
3242
+ else {
3243
+ instructions::instr_DA_0_reg(modrm_byte & 7);
3244
+ }
3245
+ },
3246
+ 1 => {
3247
+ if !task_switch_test() {
3248
+ return;
3249
+ }
3250
+ if modrm_byte < 0xC0 {
3251
+ instructions::instr_DA_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3252
+ }
3253
+ else {
3254
+ instructions::instr_DA_1_reg(modrm_byte & 7);
3255
+ }
3256
+ },
3257
+ 2 => {
3258
+ if !task_switch_test() {
3259
+ return;
3260
+ }
3261
+ if modrm_byte < 0xC0 {
3262
+ instructions::instr_DA_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3263
+ }
3264
+ else {
3265
+ instructions::instr_DA_2_reg(modrm_byte & 7);
3266
+ }
3267
+ },
3268
+ 3 => {
3269
+ if !task_switch_test() {
3270
+ return;
3271
+ }
3272
+ if modrm_byte < 0xC0 {
3273
+ instructions::instr_DA_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3274
+ }
3275
+ else {
3276
+ instructions::instr_DA_3_reg(modrm_byte & 7);
3277
+ }
3278
+ },
3279
+ 4 => {
3280
+ if !task_switch_test() {
3281
+ return;
3282
+ }
3283
+ if modrm_byte < 0xC0 {
3284
+ instructions::instr_DA_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3285
+ }
3286
+ else {
3287
+ instructions::instr_DA_4_reg(modrm_byte & 7);
3288
+ }
3289
+ },
3290
+ 5 => {
3291
+ if !task_switch_test() {
3292
+ return;
3293
+ }
3294
+ if modrm_byte < 0xC0 {
3295
+ instructions::instr_DA_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3296
+ }
3297
+ else {
3298
+ instructions::instr_DA_5_reg(modrm_byte & 7);
3299
+ }
3300
+ },
3301
+ 6 => {
3302
+ if !task_switch_test() {
3303
+ return;
3304
+ }
3305
+ if modrm_byte < 0xC0 {
3306
+ instructions::instr_DA_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3307
+ }
3308
+ else {
3309
+ instructions::instr_DA_6_reg(modrm_byte & 7);
3310
+ }
3311
+ },
3312
+ 7 => {
3313
+ if !task_switch_test() {
3314
+ return;
3315
+ }
3316
+ if modrm_byte < 0xC0 {
3317
+ instructions::instr_DA_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3318
+ }
3319
+ else {
3320
+ instructions::instr_DA_7_reg(modrm_byte & 7);
3321
+ }
3322
+ },
3323
+ x => {
3324
+ dbg_log!("#ud DA/{} at {:x}", x, *instruction_pointer);
3325
+ trigger_ud();
3326
+ }
3327
+ }
3328
+ },
3329
+ 0xDB | 0x1DB => {
3330
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
3331
+ match modrm_byte >> 3 & 7 {
3332
+ 0 => {
3333
+ if !task_switch_test() {
3334
+ return;
3335
+ }
3336
+ if modrm_byte < 0xC0 {
3337
+ instructions::instr_DB_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3338
+ }
3339
+ else {
3340
+ instructions::instr_DB_0_reg(modrm_byte & 7);
3341
+ }
3342
+ },
3343
+ 1 => {
3344
+ if !task_switch_test() {
3345
+ return;
3346
+ }
3347
+ if modrm_byte < 0xC0 {
3348
+ instructions::instr_DB_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3349
+ }
3350
+ else {
3351
+ instructions::instr_DB_1_reg(modrm_byte & 7);
3352
+ }
3353
+ },
3354
+ 2 => {
3355
+ if !task_switch_test() {
3356
+ return;
3357
+ }
3358
+ if modrm_byte < 0xC0 {
3359
+ instructions::instr_DB_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3360
+ }
3361
+ else {
3362
+ instructions::instr_DB_2_reg(modrm_byte & 7);
3363
+ }
3364
+ },
3365
+ 3 => {
3366
+ if !task_switch_test() {
3367
+ return;
3368
+ }
3369
+ if modrm_byte < 0xC0 {
3370
+ instructions::instr_DB_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3371
+ }
3372
+ else {
3373
+ instructions::instr_DB_3_reg(modrm_byte & 7);
3374
+ }
3375
+ },
3376
+ 4 => {
3377
+ if !task_switch_test() {
3378
+ return;
3379
+ }
3380
+ if modrm_byte < 0xC0 {
3381
+ instructions::instr_DB_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3382
+ }
3383
+ else {
3384
+ instructions::instr_DB_4_reg(modrm_byte & 7);
3385
+ }
3386
+ after_block_boundary();
3387
+ },
3388
+ 5 => {
3389
+ if !task_switch_test() {
3390
+ return;
3391
+ }
3392
+ if modrm_byte < 0xC0 {
3393
+ instructions::instr_DB_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3394
+ }
3395
+ else {
3396
+ instructions::instr_DB_5_reg(modrm_byte & 7);
3397
+ }
3398
+ },
3399
+ 6 => {
3400
+ if !task_switch_test() {
3401
+ return;
3402
+ }
3403
+ if modrm_byte < 0xC0 {
3404
+ instructions::instr_DB_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3405
+ }
3406
+ else {
3407
+ instructions::instr_DB_6_reg(modrm_byte & 7);
3408
+ }
3409
+ },
3410
+ 7 => {
3411
+ if !task_switch_test() {
3412
+ return;
3413
+ }
3414
+ if modrm_byte < 0xC0 {
3415
+ instructions::instr_DB_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3416
+ }
3417
+ else {
3418
+ instructions::instr_DB_7_reg(modrm_byte & 7);
3419
+ }
3420
+ after_block_boundary();
3421
+ },
3422
+ x => {
3423
+ dbg_log!("#ud DB/{} at {:x}", x, *instruction_pointer);
3424
+ trigger_ud();
3425
+ }
3426
+ }
3427
+ },
3428
+ 0xDC | 0x1DC => {
3429
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
3430
+ match modrm_byte >> 3 & 7 {
3431
+ 0 => {
3432
+ if !task_switch_test() {
3433
+ return;
3434
+ }
3435
+ if modrm_byte < 0xC0 {
3436
+ instructions::instr_DC_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3437
+ }
3438
+ else {
3439
+ instructions::instr_DC_0_reg(modrm_byte & 7);
3440
+ }
3441
+ },
3442
+ 1 => {
3443
+ if !task_switch_test() {
3444
+ return;
3445
+ }
3446
+ if modrm_byte < 0xC0 {
3447
+ instructions::instr_DC_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3448
+ }
3449
+ else {
3450
+ instructions::instr_DC_1_reg(modrm_byte & 7);
3451
+ }
3452
+ },
3453
+ 2 => {
3454
+ if !task_switch_test() {
3455
+ return;
3456
+ }
3457
+ if modrm_byte < 0xC0 {
3458
+ instructions::instr_DC_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3459
+ }
3460
+ else {
3461
+ instructions::instr_DC_2_reg(modrm_byte & 7);
3462
+ }
3463
+ },
3464
+ 3 => {
3465
+ if !task_switch_test() {
3466
+ return;
3467
+ }
3468
+ if modrm_byte < 0xC0 {
3469
+ instructions::instr_DC_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3470
+ }
3471
+ else {
3472
+ instructions::instr_DC_3_reg(modrm_byte & 7);
3473
+ }
3474
+ },
3475
+ 4 => {
3476
+ if !task_switch_test() {
3477
+ return;
3478
+ }
3479
+ if modrm_byte < 0xC0 {
3480
+ instructions::instr_DC_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3481
+ }
3482
+ else {
3483
+ instructions::instr_DC_4_reg(modrm_byte & 7);
3484
+ }
3485
+ },
3486
+ 5 => {
3487
+ if !task_switch_test() {
3488
+ return;
3489
+ }
3490
+ if modrm_byte < 0xC0 {
3491
+ instructions::instr_DC_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3492
+ }
3493
+ else {
3494
+ instructions::instr_DC_5_reg(modrm_byte & 7);
3495
+ }
3496
+ },
3497
+ 6 => {
3498
+ if !task_switch_test() {
3499
+ return;
3500
+ }
3501
+ if modrm_byte < 0xC0 {
3502
+ instructions::instr_DC_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3503
+ }
3504
+ else {
3505
+ instructions::instr_DC_6_reg(modrm_byte & 7);
3506
+ }
3507
+ },
3508
+ 7 => {
3509
+ if !task_switch_test() {
3510
+ return;
3511
+ }
3512
+ if modrm_byte < 0xC0 {
3513
+ instructions::instr_DC_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3514
+ }
3515
+ else {
3516
+ instructions::instr_DC_7_reg(modrm_byte & 7);
3517
+ }
3518
+ },
3519
+ x => {
3520
+ dbg_log!("#ud DC/{} at {:x}", x, *instruction_pointer);
3521
+ trigger_ud();
3522
+ }
3523
+ }
3524
+ },
3525
+ 0xDD => {
3526
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
3527
+ match modrm_byte >> 3 & 7 {
3528
+ 0 => {
3529
+ if !task_switch_test() {
3530
+ return;
3531
+ }
3532
+ if modrm_byte < 0xC0 {
3533
+ instructions::instr16_DD_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3534
+ }
3535
+ else {
3536
+ instructions::instr16_DD_0_reg(modrm_byte & 7);
3537
+ }
3538
+ },
3539
+ 1 => {
3540
+ if !task_switch_test() {
3541
+ return;
3542
+ }
3543
+ if modrm_byte < 0xC0 {
3544
+ instructions::instr16_DD_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3545
+ }
3546
+ else {
3547
+ instructions::instr16_DD_1_reg(modrm_byte & 7);
3548
+ }
3549
+ },
3550
+ 2 => {
3551
+ if !task_switch_test() {
3552
+ return;
3553
+ }
3554
+ if modrm_byte < 0xC0 {
3555
+ instructions::instr16_DD_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3556
+ }
3557
+ else {
3558
+ instructions::instr16_DD_2_reg(modrm_byte & 7);
3559
+ }
3560
+ },
3561
+ 3 => {
3562
+ if !task_switch_test() {
3563
+ return;
3564
+ }
3565
+ if modrm_byte < 0xC0 {
3566
+ instructions::instr16_DD_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3567
+ }
3568
+ else {
3569
+ instructions::instr16_DD_3_reg(modrm_byte & 7);
3570
+ }
3571
+ },
3572
+ 4 => {
3573
+ if !task_switch_test() {
3574
+ return;
3575
+ }
3576
+ if modrm_byte < 0xC0 {
3577
+ instructions::instr16_DD_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3578
+ }
3579
+ else {
3580
+ instructions::instr16_DD_4_reg(modrm_byte & 7);
3581
+ }
3582
+ after_block_boundary();
3583
+ },
3584
+ 5 => {
3585
+ if !task_switch_test() {
3586
+ return;
3587
+ }
3588
+ if modrm_byte < 0xC0 {
3589
+ instructions::instr16_DD_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3590
+ }
3591
+ else {
3592
+ instructions::instr16_DD_5_reg(modrm_byte & 7);
3593
+ }
3594
+ },
3595
+ 6 => {
3596
+ if !task_switch_test() {
3597
+ return;
3598
+ }
3599
+ if modrm_byte < 0xC0 {
3600
+ instructions::instr16_DD_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3601
+ }
3602
+ else {
3603
+ instructions::instr16_DD_6_reg(modrm_byte & 7);
3604
+ }
3605
+ after_block_boundary();
3606
+ },
3607
+ 7 => {
3608
+ if !task_switch_test() {
3609
+ return;
3610
+ }
3611
+ if modrm_byte < 0xC0 {
3612
+ instructions::instr16_DD_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3613
+ }
3614
+ else {
3615
+ instructions::instr16_DD_7_reg(modrm_byte & 7);
3616
+ }
3617
+ after_block_boundary();
3618
+ },
3619
+ x => {
3620
+ dbg_log!("#ud DD/{} at {:x}", x, *instruction_pointer);
3621
+ trigger_ud();
3622
+ }
3623
+ }
3624
+ },
3625
+ 0x1DD => {
3626
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
3627
+ match modrm_byte >> 3 & 7 {
3628
+ 0 => {
3629
+ if !task_switch_test() {
3630
+ return;
3631
+ }
3632
+ if modrm_byte < 0xC0 {
3633
+ instructions::instr32_DD_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3634
+ }
3635
+ else {
3636
+ instructions::instr32_DD_0_reg(modrm_byte & 7);
3637
+ }
3638
+ },
3639
+ 1 => {
3640
+ if !task_switch_test() {
3641
+ return;
3642
+ }
3643
+ if modrm_byte < 0xC0 {
3644
+ instructions::instr32_DD_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3645
+ }
3646
+ else {
3647
+ instructions::instr32_DD_1_reg(modrm_byte & 7);
3648
+ }
3649
+ },
3650
+ 2 => {
3651
+ if !task_switch_test() {
3652
+ return;
3653
+ }
3654
+ if modrm_byte < 0xC0 {
3655
+ instructions::instr32_DD_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3656
+ }
3657
+ else {
3658
+ instructions::instr32_DD_2_reg(modrm_byte & 7);
3659
+ }
3660
+ },
3661
+ 3 => {
3662
+ if !task_switch_test() {
3663
+ return;
3664
+ }
3665
+ if modrm_byte < 0xC0 {
3666
+ instructions::instr32_DD_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3667
+ }
3668
+ else {
3669
+ instructions::instr32_DD_3_reg(modrm_byte & 7);
3670
+ }
3671
+ },
3672
+ 4 => {
3673
+ if !task_switch_test() {
3674
+ return;
3675
+ }
3676
+ if modrm_byte < 0xC0 {
3677
+ instructions::instr32_DD_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3678
+ }
3679
+ else {
3680
+ instructions::instr32_DD_4_reg(modrm_byte & 7);
3681
+ }
3682
+ after_block_boundary();
3683
+ },
3684
+ 5 => {
3685
+ if !task_switch_test() {
3686
+ return;
3687
+ }
3688
+ if modrm_byte < 0xC0 {
3689
+ instructions::instr32_DD_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3690
+ }
3691
+ else {
3692
+ instructions::instr32_DD_5_reg(modrm_byte & 7);
3693
+ }
3694
+ },
3695
+ 6 => {
3696
+ if !task_switch_test() {
3697
+ return;
3698
+ }
3699
+ if modrm_byte < 0xC0 {
3700
+ instructions::instr32_DD_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3701
+ }
3702
+ else {
3703
+ instructions::instr32_DD_6_reg(modrm_byte & 7);
3704
+ }
3705
+ after_block_boundary();
3706
+ },
3707
+ 7 => {
3708
+ if !task_switch_test() {
3709
+ return;
3710
+ }
3711
+ if modrm_byte < 0xC0 {
3712
+ instructions::instr32_DD_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3713
+ }
3714
+ else {
3715
+ instructions::instr32_DD_7_reg(modrm_byte & 7);
3716
+ }
3717
+ after_block_boundary();
3718
+ },
3719
+ x => {
3720
+ dbg_log!("#ud DD/{} at {:x}", x, *instruction_pointer);
3721
+ trigger_ud();
3722
+ }
3723
+ }
3724
+ },
3725
+ 0xDE | 0x1DE => {
3726
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
3727
+ match modrm_byte >> 3 & 7 {
3728
+ 0 => {
3729
+ if !task_switch_test() {
3730
+ return;
3731
+ }
3732
+ if modrm_byte < 0xC0 {
3733
+ instructions::instr_DE_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3734
+ }
3735
+ else {
3736
+ instructions::instr_DE_0_reg(modrm_byte & 7);
3737
+ }
3738
+ },
3739
+ 1 => {
3740
+ if !task_switch_test() {
3741
+ return;
3742
+ }
3743
+ if modrm_byte < 0xC0 {
3744
+ instructions::instr_DE_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3745
+ }
3746
+ else {
3747
+ instructions::instr_DE_1_reg(modrm_byte & 7);
3748
+ }
3749
+ },
3750
+ 2 => {
3751
+ if !task_switch_test() {
3752
+ return;
3753
+ }
3754
+ if modrm_byte < 0xC0 {
3755
+ instructions::instr_DE_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3756
+ }
3757
+ else {
3758
+ instructions::instr_DE_2_reg(modrm_byte & 7);
3759
+ }
3760
+ },
3761
+ 3 => {
3762
+ if !task_switch_test() {
3763
+ return;
3764
+ }
3765
+ if modrm_byte < 0xC0 {
3766
+ instructions::instr_DE_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3767
+ }
3768
+ else {
3769
+ instructions::instr_DE_3_reg(modrm_byte & 7);
3770
+ }
3771
+ },
3772
+ 4 => {
3773
+ if !task_switch_test() {
3774
+ return;
3775
+ }
3776
+ if modrm_byte < 0xC0 {
3777
+ instructions::instr_DE_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3778
+ }
3779
+ else {
3780
+ instructions::instr_DE_4_reg(modrm_byte & 7);
3781
+ }
3782
+ },
3783
+ 5 => {
3784
+ if !task_switch_test() {
3785
+ return;
3786
+ }
3787
+ if modrm_byte < 0xC0 {
3788
+ instructions::instr_DE_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3789
+ }
3790
+ else {
3791
+ instructions::instr_DE_5_reg(modrm_byte & 7);
3792
+ }
3793
+ },
3794
+ 6 => {
3795
+ if !task_switch_test() {
3796
+ return;
3797
+ }
3798
+ if modrm_byte < 0xC0 {
3799
+ instructions::instr_DE_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3800
+ }
3801
+ else {
3802
+ instructions::instr_DE_6_reg(modrm_byte & 7);
3803
+ }
3804
+ },
3805
+ 7 => {
3806
+ if !task_switch_test() {
3807
+ return;
3808
+ }
3809
+ if modrm_byte < 0xC0 {
3810
+ instructions::instr_DE_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3811
+ }
3812
+ else {
3813
+ instructions::instr_DE_7_reg(modrm_byte & 7);
3814
+ }
3815
+ },
3816
+ x => {
3817
+ dbg_log!("#ud DE/{} at {:x}", x, *instruction_pointer);
3818
+ trigger_ud();
3819
+ }
3820
+ }
3821
+ },
3822
+ 0xDF | 0x1DF => {
3823
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
3824
+ match modrm_byte >> 3 & 7 {
3825
+ 0 => {
3826
+ if !task_switch_test() {
3827
+ return;
3828
+ }
3829
+ if modrm_byte < 0xC0 {
3830
+ instructions::instr_DF_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3831
+ }
3832
+ else {
3833
+ instructions::instr_DF_0_reg(modrm_byte & 7);
3834
+ }
3835
+ after_block_boundary();
3836
+ },
3837
+ 1 => {
3838
+ if !task_switch_test() {
3839
+ return;
3840
+ }
3841
+ if modrm_byte < 0xC0 {
3842
+ instructions::instr_DF_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3843
+ }
3844
+ else {
3845
+ instructions::instr_DF_1_reg(modrm_byte & 7);
3846
+ }
3847
+ },
3848
+ 2 => {
3849
+ if !task_switch_test() {
3850
+ return;
3851
+ }
3852
+ if modrm_byte < 0xC0 {
3853
+ instructions::instr_DF_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3854
+ }
3855
+ else {
3856
+ instructions::instr_DF_2_reg(modrm_byte & 7);
3857
+ }
3858
+ },
3859
+ 3 => {
3860
+ if !task_switch_test() {
3861
+ return;
3862
+ }
3863
+ if modrm_byte < 0xC0 {
3864
+ instructions::instr_DF_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3865
+ }
3866
+ else {
3867
+ instructions::instr_DF_3_reg(modrm_byte & 7);
3868
+ }
3869
+ },
3870
+ 4 => {
3871
+ if !task_switch_test() {
3872
+ return;
3873
+ }
3874
+ if modrm_byte < 0xC0 {
3875
+ instructions::instr_DF_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3876
+ }
3877
+ else {
3878
+ instructions::instr_DF_4_reg(modrm_byte & 7);
3879
+ }
3880
+ },
3881
+ 5 => {
3882
+ if !task_switch_test() {
3883
+ return;
3884
+ }
3885
+ if modrm_byte < 0xC0 {
3886
+ instructions::instr_DF_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3887
+ }
3888
+ else {
3889
+ instructions::instr_DF_5_reg(modrm_byte & 7);
3890
+ }
3891
+ },
3892
+ 6 => {
3893
+ if !task_switch_test() {
3894
+ return;
3895
+ }
3896
+ if modrm_byte < 0xC0 {
3897
+ instructions::instr_DF_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3898
+ }
3899
+ else {
3900
+ instructions::instr_DF_6_reg(modrm_byte & 7);
3901
+ }
3902
+ },
3903
+ 7 => {
3904
+ if !task_switch_test() {
3905
+ return;
3906
+ }
3907
+ if modrm_byte < 0xC0 {
3908
+ instructions::instr_DF_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
3909
+ }
3910
+ else {
3911
+ instructions::instr_DF_7_reg(modrm_byte & 7);
3912
+ }
3913
+ },
3914
+ x => {
3915
+ dbg_log!("#ud DF/{} at {:x}", x, *instruction_pointer);
3916
+ trigger_ud();
3917
+ }
3918
+ }
3919
+ },
3920
+ 0xE0 => {
3921
+ instructions::instr16_E0(match read_imm8s() { Ok(o) => o, Err(()) => return });
3922
+ },
3923
+ 0x1E0 => {
3924
+ instructions::instr32_E0(match read_imm8s() { Ok(o) => o, Err(()) => return });
3925
+ },
3926
+ 0xE1 => {
3927
+ instructions::instr16_E1(match read_imm8s() { Ok(o) => o, Err(()) => return });
3928
+ },
3929
+ 0x1E1 => {
3930
+ instructions::instr32_E1(match read_imm8s() { Ok(o) => o, Err(()) => return });
3931
+ },
3932
+ 0xE2 => {
3933
+ instructions::instr16_E2(match read_imm8s() { Ok(o) => o, Err(()) => return });
3934
+ },
3935
+ 0x1E2 => {
3936
+ instructions::instr32_E2(match read_imm8s() { Ok(o) => o, Err(()) => return });
3937
+ },
3938
+ 0xE3 => {
3939
+ instructions::instr16_E3(match read_imm8s() { Ok(o) => o, Err(()) => return });
3940
+ },
3941
+ 0x1E3 => {
3942
+ instructions::instr32_E3(match read_imm8s() { Ok(o) => o, Err(()) => return });
3943
+ },
3944
+ 0xE4 | 0x1E4 => {
3945
+ instructions::instr_E4(match read_imm8() { Ok(o) => o, Err(()) => return });
3946
+ after_block_boundary();
3947
+ },
3948
+ 0xE5 => {
3949
+ instructions::instr16_E5(match read_imm8() { Ok(o) => o, Err(()) => return });
3950
+ after_block_boundary();
3951
+ },
3952
+ 0x1E5 => {
3953
+ instructions::instr32_E5(match read_imm8() { Ok(o) => o, Err(()) => return });
3954
+ after_block_boundary();
3955
+ },
3956
+ 0xE6 | 0x1E6 => {
3957
+ instructions::instr_E6(match read_imm8() { Ok(o) => o, Err(()) => return });
3958
+ after_block_boundary();
3959
+ },
3960
+ 0xE7 => {
3961
+ instructions::instr16_E7(match read_imm8() { Ok(o) => o, Err(()) => return });
3962
+ after_block_boundary();
3963
+ },
3964
+ 0x1E7 => {
3965
+ instructions::instr32_E7(match read_imm8() { Ok(o) => o, Err(()) => return });
3966
+ after_block_boundary();
3967
+ },
3968
+ 0xE8 => {
3969
+ instructions::instr16_E8(match read_imm16() { Ok(o) => o, Err(()) => return });
3970
+ after_block_boundary();
3971
+ },
3972
+ 0x1E8 => {
3973
+ instructions::instr32_E8(match read_imm32s() { Ok(o) => o, Err(()) => return });
3974
+ after_block_boundary();
3975
+ },
3976
+ 0xE9 => {
3977
+ instructions::instr16_E9(match read_imm16() { Ok(o) => o, Err(()) => return });
3978
+ },
3979
+ 0x1E9 => {
3980
+ instructions::instr32_E9(match read_imm32s() { Ok(o) => o, Err(()) => return });
3981
+ },
3982
+ 0xEA => {
3983
+ instructions::instr16_EA(match read_imm16() { Ok(o) => o, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
3984
+ after_block_boundary();
3985
+ },
3986
+ 0x1EA => {
3987
+ instructions::instr32_EA(match read_imm32s() { Ok(o) => o, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
3988
+ after_block_boundary();
3989
+ },
3990
+ 0xEB => {
3991
+ instructions::instr16_EB(match read_imm8s() { Ok(o) => o, Err(()) => return });
3992
+ },
3993
+ 0x1EB => {
3994
+ instructions::instr32_EB(match read_imm8s() { Ok(o) => o, Err(()) => return });
3995
+ },
3996
+ 0xEC | 0x1EC => {
3997
+ instructions::instr_EC();
3998
+ after_block_boundary();
3999
+ },
4000
+ 0xED => {
4001
+ instructions::instr16_ED();
4002
+ after_block_boundary();
4003
+ },
4004
+ 0x1ED => {
4005
+ instructions::instr32_ED();
4006
+ after_block_boundary();
4007
+ },
4008
+ 0xEE | 0x1EE => {
4009
+ instructions::instr_EE();
4010
+ after_block_boundary();
4011
+ },
4012
+ 0xEF => {
4013
+ instructions::instr16_EF();
4014
+ after_block_boundary();
4015
+ },
4016
+ 0x1EF => {
4017
+ instructions::instr32_EF();
4018
+ after_block_boundary();
4019
+ },
4020
+ 0xF0 | 0x1F0 => {
4021
+ instructions::instr_F0();
4022
+ },
4023
+ 0xF1 | 0x1F1 => {
4024
+ instructions::instr_F1();
4025
+ },
4026
+ 0xF2 | 0x1F2 => {
4027
+ instructions::instr_F2();
4028
+ },
4029
+ 0xF3 | 0x1F3 => {
4030
+ instructions::instr_F3();
4031
+ },
4032
+ 0xF4 | 0x1F4 => {
4033
+ instructions::instr_F4();
4034
+ after_block_boundary();
4035
+ },
4036
+ 0xF5 | 0x1F5 => {
4037
+ instructions::instr_F5();
4038
+ },
4039
+ 0xF6 | 0x1F6 => {
4040
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
4041
+ match modrm_byte >> 3 & 7 {
4042
+ 0 => {
4043
+ if modrm_byte < 0xC0 {
4044
+ instructions::instr_F6_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
4045
+ }
4046
+ else {
4047
+ instructions::instr_F6_0_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
4048
+ }
4049
+ },
4050
+ 1 => {
4051
+ if modrm_byte < 0xC0 {
4052
+ instructions::instr_F6_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm8() { Ok(o) => o, Err(()) => return });
4053
+ }
4054
+ else {
4055
+ instructions::instr_F6_1_reg(modrm_byte & 7, match read_imm8() { Ok(o) => o, Err(()) => return });
4056
+ }
4057
+ },
4058
+ 2 => {
4059
+ if modrm_byte < 0xC0 {
4060
+ instructions::instr_F6_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4061
+ }
4062
+ else {
4063
+ instructions::instr_F6_2_reg(modrm_byte & 7);
4064
+ }
4065
+ },
4066
+ 3 => {
4067
+ if modrm_byte < 0xC0 {
4068
+ instructions::instr_F6_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4069
+ }
4070
+ else {
4071
+ instructions::instr_F6_3_reg(modrm_byte & 7);
4072
+ }
4073
+ },
4074
+ 4 => {
4075
+ if modrm_byte < 0xC0 {
4076
+ instructions::instr_F6_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4077
+ }
4078
+ else {
4079
+ instructions::instr_F6_4_reg(modrm_byte & 7);
4080
+ }
4081
+ after_block_boundary();
4082
+ },
4083
+ 5 => {
4084
+ if modrm_byte < 0xC0 {
4085
+ instructions::instr_F6_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4086
+ }
4087
+ else {
4088
+ instructions::instr_F6_5_reg(modrm_byte & 7);
4089
+ }
4090
+ after_block_boundary();
4091
+ },
4092
+ 6 => {
4093
+ if modrm_byte < 0xC0 {
4094
+ instructions::instr_F6_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4095
+ }
4096
+ else {
4097
+ instructions::instr_F6_6_reg(modrm_byte & 7);
4098
+ }
4099
+ after_block_boundary();
4100
+ },
4101
+ 7 => {
4102
+ if modrm_byte < 0xC0 {
4103
+ instructions::instr_F6_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4104
+ }
4105
+ else {
4106
+ instructions::instr_F6_7_reg(modrm_byte & 7);
4107
+ }
4108
+ after_block_boundary();
4109
+ },
4110
+ x => {
4111
+ dbg_log!("#ud F6/{} at {:x}", x, *instruction_pointer);
4112
+ trigger_ud();
4113
+ }
4114
+ }
4115
+ },
4116
+ 0xF7 => {
4117
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
4118
+ match modrm_byte >> 3 & 7 {
4119
+ 0 => {
4120
+ if modrm_byte < 0xC0 {
4121
+ instructions::instr16_F7_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
4122
+ }
4123
+ else {
4124
+ instructions::instr16_F7_0_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
4125
+ }
4126
+ },
4127
+ 1 => {
4128
+ if modrm_byte < 0xC0 {
4129
+ instructions::instr16_F7_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm16() { Ok(o) => o, Err(()) => return });
4130
+ }
4131
+ else {
4132
+ instructions::instr16_F7_1_reg(modrm_byte & 7, match read_imm16() { Ok(o) => o, Err(()) => return });
4133
+ }
4134
+ },
4135
+ 2 => {
4136
+ if modrm_byte < 0xC0 {
4137
+ instructions::instr16_F7_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4138
+ }
4139
+ else {
4140
+ instructions::instr16_F7_2_reg(modrm_byte & 7);
4141
+ }
4142
+ },
4143
+ 3 => {
4144
+ if modrm_byte < 0xC0 {
4145
+ instructions::instr16_F7_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4146
+ }
4147
+ else {
4148
+ instructions::instr16_F7_3_reg(modrm_byte & 7);
4149
+ }
4150
+ },
4151
+ 4 => {
4152
+ if modrm_byte < 0xC0 {
4153
+ instructions::instr16_F7_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4154
+ }
4155
+ else {
4156
+ instructions::instr16_F7_4_reg(modrm_byte & 7);
4157
+ }
4158
+ },
4159
+ 5 => {
4160
+ if modrm_byte < 0xC0 {
4161
+ instructions::instr16_F7_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4162
+ }
4163
+ else {
4164
+ instructions::instr16_F7_5_reg(modrm_byte & 7);
4165
+ }
4166
+ },
4167
+ 6 => {
4168
+ if modrm_byte < 0xC0 {
4169
+ instructions::instr16_F7_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4170
+ }
4171
+ else {
4172
+ instructions::instr16_F7_6_reg(modrm_byte & 7);
4173
+ }
4174
+ },
4175
+ 7 => {
4176
+ if modrm_byte < 0xC0 {
4177
+ instructions::instr16_F7_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4178
+ }
4179
+ else {
4180
+ instructions::instr16_F7_7_reg(modrm_byte & 7);
4181
+ }
4182
+ },
4183
+ x => {
4184
+ dbg_log!("#ud F7/{} at {:x}", x, *instruction_pointer);
4185
+ trigger_ud();
4186
+ }
4187
+ }
4188
+ },
4189
+ 0x1F7 => {
4190
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
4191
+ match modrm_byte >> 3 & 7 {
4192
+ 0 => {
4193
+ if modrm_byte < 0xC0 {
4194
+ instructions::instr32_F7_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
4195
+ }
4196
+ else {
4197
+ instructions::instr32_F7_0_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
4198
+ }
4199
+ },
4200
+ 1 => {
4201
+ if modrm_byte < 0xC0 {
4202
+ instructions::instr32_F7_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return }, match read_imm32s() { Ok(o) => o, Err(()) => return });
4203
+ }
4204
+ else {
4205
+ instructions::instr32_F7_1_reg(modrm_byte & 7, match read_imm32s() { Ok(o) => o, Err(()) => return });
4206
+ }
4207
+ },
4208
+ 2 => {
4209
+ if modrm_byte < 0xC0 {
4210
+ instructions::instr32_F7_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4211
+ }
4212
+ else {
4213
+ instructions::instr32_F7_2_reg(modrm_byte & 7);
4214
+ }
4215
+ },
4216
+ 3 => {
4217
+ if modrm_byte < 0xC0 {
4218
+ instructions::instr32_F7_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4219
+ }
4220
+ else {
4221
+ instructions::instr32_F7_3_reg(modrm_byte & 7);
4222
+ }
4223
+ },
4224
+ 4 => {
4225
+ if modrm_byte < 0xC0 {
4226
+ instructions::instr32_F7_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4227
+ }
4228
+ else {
4229
+ instructions::instr32_F7_4_reg(modrm_byte & 7);
4230
+ }
4231
+ },
4232
+ 5 => {
4233
+ if modrm_byte < 0xC0 {
4234
+ instructions::instr32_F7_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4235
+ }
4236
+ else {
4237
+ instructions::instr32_F7_5_reg(modrm_byte & 7);
4238
+ }
4239
+ },
4240
+ 6 => {
4241
+ if modrm_byte < 0xC0 {
4242
+ instructions::instr32_F7_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4243
+ }
4244
+ else {
4245
+ instructions::instr32_F7_6_reg(modrm_byte & 7);
4246
+ }
4247
+ },
4248
+ 7 => {
4249
+ if modrm_byte < 0xC0 {
4250
+ instructions::instr32_F7_7_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4251
+ }
4252
+ else {
4253
+ instructions::instr32_F7_7_reg(modrm_byte & 7);
4254
+ }
4255
+ },
4256
+ x => {
4257
+ dbg_log!("#ud F7/{} at {:x}", x, *instruction_pointer);
4258
+ trigger_ud();
4259
+ }
4260
+ }
4261
+ },
4262
+ 0xF8 | 0x1F8 => {
4263
+ instructions::instr_F8();
4264
+ },
4265
+ 0xF9 | 0x1F9 => {
4266
+ instructions::instr_F9();
4267
+ },
4268
+ 0xFA | 0x1FA => {
4269
+ instructions::instr_FA();
4270
+ },
4271
+ 0xFB | 0x1FB => {
4272
+ instructions::instr_FB();
4273
+ },
4274
+ 0xFC | 0x1FC => {
4275
+ instructions::instr_FC();
4276
+ },
4277
+ 0xFD | 0x1FD => {
4278
+ instructions::instr_FD();
4279
+ },
4280
+ 0xFE | 0x1FE => {
4281
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
4282
+ match modrm_byte >> 3 & 7 {
4283
+ 0 => {
4284
+ if modrm_byte < 0xC0 {
4285
+ instructions::instr_FE_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4286
+ }
4287
+ else {
4288
+ instructions::instr_FE_0_reg(modrm_byte & 7);
4289
+ }
4290
+ },
4291
+ 1 => {
4292
+ if modrm_byte < 0xC0 {
4293
+ instructions::instr_FE_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4294
+ }
4295
+ else {
4296
+ instructions::instr_FE_1_reg(modrm_byte & 7);
4297
+ }
4298
+ },
4299
+ x => {
4300
+ dbg_log!("#ud FE/{} at {:x}", x, *instruction_pointer);
4301
+ trigger_ud();
4302
+ }
4303
+ }
4304
+ },
4305
+ 0xFF => {
4306
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
4307
+ match modrm_byte >> 3 & 7 {
4308
+ 0 => {
4309
+ if modrm_byte < 0xC0 {
4310
+ instructions::instr16_FF_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4311
+ }
4312
+ else {
4313
+ instructions::instr16_FF_0_reg(modrm_byte & 7);
4314
+ }
4315
+ },
4316
+ 1 => {
4317
+ if modrm_byte < 0xC0 {
4318
+ instructions::instr16_FF_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4319
+ }
4320
+ else {
4321
+ instructions::instr16_FF_1_reg(modrm_byte & 7);
4322
+ }
4323
+ },
4324
+ 2 => {
4325
+ if modrm_byte < 0xC0 {
4326
+ instructions::instr16_FF_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4327
+ }
4328
+ else {
4329
+ instructions::instr16_FF_2_reg(modrm_byte & 7);
4330
+ }
4331
+ after_block_boundary();
4332
+ },
4333
+ 3 => {
4334
+ if modrm_byte < 0xC0 {
4335
+ instructions::instr16_FF_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4336
+ }
4337
+ else {
4338
+ instructions::instr16_FF_3_reg(modrm_byte & 7);
4339
+ }
4340
+ after_block_boundary();
4341
+ },
4342
+ 4 => {
4343
+ if modrm_byte < 0xC0 {
4344
+ instructions::instr16_FF_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4345
+ }
4346
+ else {
4347
+ instructions::instr16_FF_4_reg(modrm_byte & 7);
4348
+ }
4349
+ after_block_boundary();
4350
+ },
4351
+ 5 => {
4352
+ if modrm_byte < 0xC0 {
4353
+ instructions::instr16_FF_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4354
+ }
4355
+ else {
4356
+ instructions::instr16_FF_5_reg(modrm_byte & 7);
4357
+ }
4358
+ after_block_boundary();
4359
+ },
4360
+ 6 => {
4361
+ if modrm_byte < 0xC0 {
4362
+ instructions::instr16_FF_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4363
+ }
4364
+ else {
4365
+ instructions::instr16_FF_6_reg(modrm_byte & 7);
4366
+ }
4367
+ },
4368
+ x => {
4369
+ dbg_log!("#ud FF/{} at {:x}", x, *instruction_pointer);
4370
+ trigger_ud();
4371
+ }
4372
+ }
4373
+ },
4374
+ 0x1FF => {
4375
+ let modrm_byte = match read_imm8() { Ok(o) => o, Err(()) => return };
4376
+ match modrm_byte >> 3 & 7 {
4377
+ 0 => {
4378
+ if modrm_byte < 0xC0 {
4379
+ instructions::instr32_FF_0_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4380
+ }
4381
+ else {
4382
+ instructions::instr32_FF_0_reg(modrm_byte & 7);
4383
+ }
4384
+ },
4385
+ 1 => {
4386
+ if modrm_byte < 0xC0 {
4387
+ instructions::instr32_FF_1_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4388
+ }
4389
+ else {
4390
+ instructions::instr32_FF_1_reg(modrm_byte & 7);
4391
+ }
4392
+ },
4393
+ 2 => {
4394
+ if modrm_byte < 0xC0 {
4395
+ instructions::instr32_FF_2_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4396
+ }
4397
+ else {
4398
+ instructions::instr32_FF_2_reg(modrm_byte & 7);
4399
+ }
4400
+ after_block_boundary();
4401
+ },
4402
+ 3 => {
4403
+ if modrm_byte < 0xC0 {
4404
+ instructions::instr32_FF_3_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4405
+ }
4406
+ else {
4407
+ instructions::instr32_FF_3_reg(modrm_byte & 7);
4408
+ }
4409
+ after_block_boundary();
4410
+ },
4411
+ 4 => {
4412
+ if modrm_byte < 0xC0 {
4413
+ instructions::instr32_FF_4_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4414
+ }
4415
+ else {
4416
+ instructions::instr32_FF_4_reg(modrm_byte & 7);
4417
+ }
4418
+ after_block_boundary();
4419
+ },
4420
+ 5 => {
4421
+ if modrm_byte < 0xC0 {
4422
+ instructions::instr32_FF_5_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4423
+ }
4424
+ else {
4425
+ instructions::instr32_FF_5_reg(modrm_byte & 7);
4426
+ }
4427
+ after_block_boundary();
4428
+ },
4429
+ 6 => {
4430
+ if modrm_byte < 0xC0 {
4431
+ instructions::instr32_FF_6_mem(match modrm_resolve(modrm_byte) { Ok(a) => a, Err(()) => return });
4432
+ }
4433
+ else {
4434
+ instructions::instr32_FF_6_reg(modrm_byte & 7);
4435
+ }
4436
+ },
4437
+ x => {
4438
+ dbg_log!("#ud FF/{} at {:x}", x, *instruction_pointer);
4439
+ trigger_ud();
4440
+ }
4441
+ }
4442
+ },
4443
+ _ => {
4444
+ assert!(false);
4445
+ }
4446
+ }
4447
+ }