1 // license:BSD-3-Clause
2 // copyright-holders:Ville Linde, Barry Rodewald, Carl, Philip Bennett
3 #ifndef MAME_CPU_I386_I386_H
4 #define MAME_CPU_I386_I386_H
5 
6 #pragma once
7 
8 // SoftFloat 2 lacks an include guard
9 #ifndef softfloat_h
10 #define softfloat_h 1
11 #include "softfloat/milieu.h"
12 #include "softfloat/softfloat.h"
13 #endif
14 
15 #include "divtlb.h"
16 
17 #include "i386dasm.h"
18 
19 #define INPUT_LINE_A20      1
20 #define INPUT_LINE_SMI      2
21 
22 
23 // mingw has this defined for 32-bit compiles
24 #undef i386
25 
26 #define X86_NUM_CPUS        4
27 
28 class i386_device : public cpu_device, public device_vtlb_interface, public i386_disassembler::config
29 {
30 public:
31 	// construction/destruction
32 	i386_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
33 
34 	// configuration helpers
smiact()35 	auto smiact() { return m_smiact.bind(); }
ferr()36 	auto ferr() { return m_ferr_handler.bind(); }
37 
38 	uint64_t debug_segbase(int params, const uint64_t *param);
39 	uint64_t debug_seglimit(int params, const uint64_t *param);
40 	uint64_t debug_segofftovirt(int params, const uint64_t *param);
41 	uint64_t debug_virttophys(int params, const uint64_t *param);
42 	uint64_t debug_cacheflush(int params, const uint64_t *param);
43 
44 protected:
45 	i386_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock, int program_data_width, int program_addr_width, int io_data_width);
46 
47 	// device-level overrides
48 	virtual void device_start() override;
49 	virtual void device_reset() override;
50 	virtual void device_debug_setup() override;
51 
52 	// device_execute_interface overrides
execute_min_cycles()53 	virtual uint32_t execute_min_cycles() const noexcept override { return 1; }
execute_max_cycles()54 	virtual uint32_t execute_max_cycles() const noexcept override { return 40; }
execute_input_lines()55 	virtual uint32_t execute_input_lines() const noexcept override { return 32; }
execute_input_edge_triggered(int inputnum)56 	virtual bool execute_input_edge_triggered(int inputnum) const noexcept override { return inputnum == INPUT_LINE_NMI; }
57 	virtual void execute_run() override;
58 	virtual void execute_set_input(int inputnum, int state) override;
59 
60 	// device_memory_interface overrides
61 	virtual space_config_vector memory_space_config() const override;
62 	virtual bool memory_translate(int spacenum, int intention, offs_t &address) override;
63 
64 	// device_state_interface overrides
65 	virtual void state_import(const device_state_entry &entry) override;
66 	virtual void state_export(const device_state_entry &entry) override;
67 	virtual void state_string_export(const device_state_entry &entry, std::string &str) const override;
68 
69 	// device_disasm_interface overrides
70 	virtual std::unique_ptr<util::disasm_interface> create_disassembler() override;
71 	virtual int get_mode() const override;
72 
73 	// cpu-specific system management mode routines
74 	virtual void enter_smm();
75 	virtual void leave_smm();
76 
77 	// routines for opcodes whose operation can vary between cpu models
78 	// default implementations usually just log an error message
79 	virtual void opcode_cpuid();
80 	virtual uint64_t opcode_rdmsr(bool &valid_msr);
81 	virtual void opcode_wrmsr(uint64_t data, bool &valid_msr);
opcode_invd()82 	virtual void opcode_invd() { cache_invalidate(); }
opcode_wbinvd()83 	virtual void opcode_wbinvd() { cache_writeback(); cache_invalidate(); }
84 
85 	// routines for the cache
86 	// default implementation assumes there is no cache
cache_writeback()87 	virtual void cache_writeback() {}
cache_invalidate()88 	virtual void cache_invalidate() {}
cache_clean()89 	virtual void cache_clean() {}
90 
91 	// routine to access memory
mem_pr8(offs_t address)92 	virtual u8 mem_pr8(offs_t address) { return macache32.read_byte(address); }
mem_pr16(offs_t address)93 	virtual u16 mem_pr16(offs_t address) { return macache32.read_word(address); }
mem_pr32(offs_t address)94 	virtual u32 mem_pr32(offs_t address) { return macache32.read_dword(address); }
95 
96 	address_space_config m_program_config;
97 	address_space_config m_io_config;
98 
99 	std::unique_ptr<uint8_t[]> cycle_table_rm[X86_NUM_CPUS];
100 	std::unique_ptr<uint8_t[]> cycle_table_pm[X86_NUM_CPUS];
101 
102 
103 	union I386_GPR {
104 		uint32_t d[8];
105 		uint16_t w[16];
106 		uint8_t b[32];
107 	};
108 
109 	struct I386_SREG {
110 		uint16_t selector;
111 		uint16_t flags;
112 		uint32_t base;
113 		uint32_t limit;
114 		int d;      // Operand size
115 		bool valid;
116 	};
117 
118 	struct I386_SYS_TABLE {
119 		uint32_t base;
120 		uint16_t limit;
121 	};
122 
123 	struct I386_SEG_DESC {
124 		uint16_t segment;
125 		uint16_t flags;
126 		uint32_t base;
127 		uint32_t limit;
128 	};
129 
130 	union XMM_REG {
131 		uint8_t  b[16];
132 		uint16_t w[8];
133 		uint32_t d[4];
134 		uint64_t q[2];
135 		int8_t   c[16];
136 		int16_t  s[8];
137 		int32_t  i[4];
138 		int64_t  l[2];
139 		float  f[4];
140 		double  f64[2];
141 	};
142 
143 	union MMX_REG {
144 		uint32_t d[2];
145 		int32_t  i[2];
146 		uint16_t w[4];
147 		int16_t  s[4];
148 		uint8_t  b[8];
149 		int8_t   c[8];
150 		float  f[2];
151 		uint64_t q;
152 		int64_t  l;
153 	};
154 
155 	struct I386_CALL_GATE
156 	{
157 		uint16_t segment;
158 		uint16_t selector;
159 		uint32_t offset;
160 		uint8_t ar;  // access rights
161 		uint8_t dpl;
162 		uint8_t dword_count;
163 		uint8_t present;
164 	};
165 
166 	enum FEATURE_FLAGS : uint32_t {
167 		// returned in the EDX register
168 		FF_PBE = (u32)1 << 31, // Pend. Brk. EN.
169 		FF_TM = 1 << 29,       // Thermal Monitor
170 		FF_HTT = 1 << 28,      // Multi-threading
171 		FF_SS = 1 << 27,       // Self Snoop
172 		FF_SSE2 = 1 << 26,     // SSE2 Extensions
173 		FF_SSE = 1 << 25,      // SSE Extensions
174 		FF_FXSR = 1 << 24,     // FXSAVE/FXRSTOR
175 		FF_MMX = 1 << 23,      // MMX Technology
176 		FF_ACPI = 1 << 22,     // Thermal Monitor and Clock Ctrl
177 		FF_DS = 1 << 21,       // Debug Store
178 		FF_CLFSH = 1 << 19,    // CLFLUSH instruction
179 		FF_PSN = 1 << 18,      // Processor Serial Number
180 		FF_PSE36 = 1 << 17,    // 36 Bit Page Size Extension
181 		FF_PAT = 1 << 16,      // Page Attribute Table
182 		FF_CMOV = 1 << 15,     // Conditional Move/Compare Instruction
183 		FF_MCA = 1 << 14,      // Machine Check Architecture
184 		FF_PGE = 1 << 13,      // PTE Global Bit
185 		FF_MTRR = 1 << 12,     // Memory Type Range Registers
186 		FF_SEP = 1 << 11,      // SYSENTER and SYSEXIT
187 		FF_APIC = 1 << 9,      // APIC on Chip
188 		FF_CX8 = 1 << 8,       // CMPXCHG8B Inst.
189 		FF_MCE = 1 << 7,       // Machine Check Exception
190 		FF_PAE = 1 << 6,       // Physical Address Extensions
191 		FF_MSR = 1 << 5,       // RDMSR and WRMSR Support
192 		FF_TSC = 1 << 4,       // Time Stamp Counter
193 		FF_PSE = 1 << 3,       // Page Size Extensions
194 		FF_DE = 1 << 2,        // Debugging Extensions
195 		FF_VME = 1 << 1,       // Virtual-8086 Mode Enhancement
196 		FF_FPU = 1 << 0,       // x87 FPU on Chip
197 		// retuned in the ECX register
198 		FF_RDRAND = 1 << 30,
199 		FF_F16C = 1 << 29,
200 		FF_AVX = 1 << 28,
201 		FF_OSXSAVE = 1 << 27,
202 		FF_XSAVE = 1 << 26,
203 		FF_AES = 1 << 25,
204 		FF_TSCD = 1 << 24,     // Deadline
205 		FF_POPCNT = 1 << 23,
206 		FF_MOVBE = 1 << 22,
207 		FF_x2APIC = 1 << 21,
208 		FF_SSE4_2 = 1 << 20,   // SSE4.2
209 		FF_SSE4_1 = 1 << 19,   // SSE4.1
210 		FF_DCA = 1 << 18,      // Direct Cache Access
211 		FF_PCID = 1 << 17,     // Process-context Identifiers
212 		FF_PDCM = 1 << 15,     // Perf/Debug Capability MSR
213 		FF_xTPR = 1 << 14,     // Update Control
214 		FF_CMPXCHG16B = 1 << 13,
215 		FF_FMA = 1 << 12,      // Fused Multiply Add
216 		FF_SDBG = 1 << 11,
217 		FF_CNXT_ID = 1 << 10,  // L1 Context ID
218 		FF_SSSE3 = 1 << 9,     // SSSE3 Extensions
219 		FF_TM2 = 1 << 8,       // Thermal Monitor 2
220 		FF_EIST = 1 << 7,      // Enhanced Intel SpeedStep Technology
221 		FF_SMX = 1 << 6,       // Safer Mode Extensions
222 		FF_VMX = 1 << 5,       // Virtual Machine Extensions
223 		FF_DS_CPL = 1 << 4,    // CPL Qualified Debug Store
224 		FF_MONITOR = 1 << 3,   // MONITOR/MWAIT
225 		FF_DTES64 = 1 << 2,    // 64 Bit DS Area
226 		FF_PCLMULQDQ = 1 << 1, // Carryless Multiplication
227 		FF_SSE3 = 1 << 0,      // SSE3 Extensions
228 	};
229 
230 	typedef void (i386_device::*i386_modrm_func)(uint8_t modrm);
231 	typedef void (i386_device::*i386_op_func)();
232 	struct X86_OPCODE {
233 		uint8_t opcode;
234 		uint32_t flags;
235 		i386_op_func handler16;
236 		i386_op_func handler32;
237 		bool lockable;
238 	};
239 	static const X86_OPCODE s_x86_opcode_table[];
240 
241 	I386_GPR m_reg;
242 	I386_SREG m_sreg[6];
243 	uint32_t m_eip;
244 	uint32_t m_pc;
245 	uint32_t m_prev_eip;
246 	uint32_t m_eflags;
247 	uint32_t m_eflags_mask;
248 	uint8_t m_CF;
249 	uint8_t m_DF;
250 	uint8_t m_SF;
251 	uint8_t m_OF;
252 	uint8_t m_ZF;
253 	uint8_t m_PF;
254 	uint8_t m_AF;
255 	uint8_t m_IF;
256 	uint8_t m_TF;
257 	uint8_t m_IOP1;
258 	uint8_t m_IOP2;
259 	uint8_t m_NT;
260 	uint8_t m_RF;
261 	uint8_t m_VM;
262 	uint8_t m_AC;
263 	uint8_t m_VIF;
264 	uint8_t m_VIP;
265 	uint8_t m_ID;
266 
267 	uint8_t m_CPL;  // current privilege level
268 
269 	bool m_auto_clear_RF;
270 	uint8_t m_performed_intersegment_jump;
271 	uint8_t m_delayed_interrupt_enable;
272 
273 	uint32_t m_cr[5];       // Control registers
274 	uint32_t m_dr[8];       // Debug registers
275 	uint32_t m_tr[8];       // Test registers
276 
277 	memory_passthrough_handler* m_dr_breakpoints[4];
278 	int m_notifier;
279 
280 	//386 Debug Register change handlers.
281 	inline void dri_changed();
282 	inline void dr7_changed(uint32_t old_val, uint32_t new_val);
283 
284 	I386_SYS_TABLE m_gdtr;    // Global Descriptor Table Register
285 	I386_SYS_TABLE m_idtr;    // Interrupt Descriptor Table Register
286 	I386_SEG_DESC m_task;     // Task register
287 	I386_SEG_DESC m_ldtr;     // Local Descriptor Table Register
288 
289 	uint8_t m_ext;  // external interrupt
290 
291 	int m_halted;
292 
293 	int m_operand_size;
294 	int m_xmm_operand_size;
295 	int m_address_size;
296 	int m_operand_prefix;
297 	int m_address_prefix;
298 
299 	int m_segment_prefix;
300 	int m_segment_override;
301 
302 	int m_cycles;
303 	int m_base_cycles;
304 	uint8_t m_opcode;
305 
306 	uint8_t m_irq_state;
307 	address_space *m_program;
308 	address_space *m_io;
309 	uint32_t m_a20_mask;
310 	memory_access<32, 1, 0, ENDIANNESS_LITTLE>::cache macache16;
311 	memory_access<32, 2, 0, ENDIANNESS_LITTLE>::cache macache32;
312 
313 	int m_cpuid_max_input_value_eax; // Highest CPUID standard function available
314 	uint32_t m_cpuid_id0, m_cpuid_id1, m_cpuid_id2;
315 	uint32_t m_cpu_version;
316 	uint32_t m_feature_flags;
317 	uint64_t m_tsc;
318 	uint64_t m_perfctr[2];
319 
320 	// FPU
321 	floatx80 m_x87_reg[8];
322 
323 	uint16_t m_x87_cw;
324 	uint16_t m_x87_sw;
325 	uint16_t m_x87_tw;
326 	uint16_t m_x87_ds;
327 	uint32_t m_x87_data_ptr;
328 	uint16_t m_x87_cs;
329 	uint32_t m_x87_inst_ptr;
330 	uint16_t m_x87_opcode;
331 
332 	i386_modrm_func m_opcode_table_x87_d8[256];
333 	i386_modrm_func m_opcode_table_x87_d9[256];
334 	i386_modrm_func m_opcode_table_x87_da[256];
335 	i386_modrm_func m_opcode_table_x87_db[256];
336 	i386_modrm_func m_opcode_table_x87_dc[256];
337 	i386_modrm_func m_opcode_table_x87_dd[256];
338 	i386_modrm_func m_opcode_table_x87_de[256];
339 	i386_modrm_func m_opcode_table_x87_df[256];
340 
341 	// SSE
342 	XMM_REG m_sse_reg[8];
343 	uint32_t m_mxcsr;
344 
345 	i386_op_func m_opcode_table1_16[256];
346 	i386_op_func m_opcode_table1_32[256];
347 	i386_op_func m_opcode_table2_16[256];
348 	i386_op_func m_opcode_table2_32[256];
349 	i386_op_func m_opcode_table338_16[256];
350 	i386_op_func m_opcode_table338_32[256];
351 	i386_op_func m_opcode_table33a_16[256];
352 	i386_op_func m_opcode_table33a_32[256];
353 	i386_op_func m_opcode_table366_16[256];
354 	i386_op_func m_opcode_table366_32[256];
355 	i386_op_func m_opcode_table3f2_16[256];
356 	i386_op_func m_opcode_table3f2_32[256];
357 	i386_op_func m_opcode_table3f3_16[256];
358 	i386_op_func m_opcode_table3f3_32[256];
359 	i386_op_func m_opcode_table46638_16[256];
360 	i386_op_func m_opcode_table46638_32[256];
361 	i386_op_func m_opcode_table4f238_16[256];
362 	i386_op_func m_opcode_table4f238_32[256];
363 	i386_op_func m_opcode_table4f338_16[256];
364 	i386_op_func m_opcode_table4f338_32[256];
365 	i386_op_func m_opcode_table4663a_16[256];
366 	i386_op_func m_opcode_table4663a_32[256];
367 	i386_op_func m_opcode_table4f23a_16[256];
368 	i386_op_func m_opcode_table4f23a_32[256];
369 
370 	bool m_lock_table[2][256];
371 
372 	uint8_t *m_cycle_table_pm;
373 	uint8_t *m_cycle_table_rm;
374 
375 	bool m_smm;
376 	bool m_smi;
377 	bool m_smi_latched;
378 	bool m_nmi_masked;
379 	bool m_nmi_latched;
380 	uint32_t m_smbase;
381 	devcb_write_line m_smiact;
382 	devcb_write_line m_ferr_handler;
383 	bool m_lock;
384 
385 	// bytes in current opcode, debug only
386 	uint8_t m_opcode_bytes[16];
387 	uint32_t m_opcode_pc;
388 	int m_opcode_bytes_length;
389 
390 	uint64_t m_debugger_temp;
391 
392 	void register_state_i386();
393 	void register_state_i386_x87();
394 	void register_state_i386_x87_xmm();
395 	uint32_t i386_translate(int segment, uint32_t ip, int rwn);
396 	inline vtlb_entry get_permissions(uint32_t pte, int wp);
397 	bool i386_translate_address(int intention, offs_t *address, vtlb_entry *entry);
398 	bool translate_address(int pl, int type, uint32_t *address, uint32_t *error);
399 	void CHANGE_PC(uint32_t pc);
400 	inline void NEAR_BRANCH(int32_t offs);
401 	inline uint8_t FETCH();
402 	inline uint16_t FETCH16();
403 	inline uint32_t FETCH32();
READ8(uint32_t ea)404 	inline uint8_t READ8(uint32_t ea) { return READ8PL(ea, m_CPL); }
READ16(uint32_t ea)405 	inline uint16_t READ16(uint32_t ea) { return READ16PL(ea, m_CPL); }
READ32(uint32_t ea)406 	inline uint32_t READ32(uint32_t ea) { return READ32PL(ea, m_CPL); }
READ64(uint32_t ea)407 	inline uint64_t READ64(uint32_t ea) { return READ64PL(ea, m_CPL); }
408 	virtual uint8_t READ8PL(uint32_t ea, uint8_t privilege);
409 	virtual uint16_t READ16PL(uint32_t ea, uint8_t privilege);
410 	virtual uint32_t READ32PL(uint32_t ea, uint8_t privilege);
411 	virtual uint64_t READ64PL(uint32_t ea, uint8_t privilege);
412 	inline void WRITE_TEST(uint32_t ea);
WRITE8(uint32_t ea,uint8_t value)413 	inline void WRITE8(uint32_t ea, uint8_t value) { WRITE8PL(ea, m_CPL, value); }
WRITE16(uint32_t ea,uint16_t value)414 	inline void WRITE16(uint32_t ea, uint16_t value) { WRITE16PL(ea, m_CPL, value); }
WRITE32(uint32_t ea,uint32_t value)415 	inline void WRITE32(uint32_t ea, uint32_t value) { WRITE32PL(ea, m_CPL, value); }
WRITE64(uint32_t ea,uint64_t value)416 	inline void WRITE64(uint32_t ea, uint64_t value) { WRITE64PL(ea, m_CPL, value); }
417 	virtual void WRITE8PL(uint32_t ea, uint8_t privilege, uint8_t value);
418 	virtual void WRITE16PL(uint32_t ea, uint8_t privilege, uint16_t value);
419 	virtual void WRITE32PL(uint32_t ea, uint8_t privilege, uint32_t value);
420 	virtual void WRITE64PL(uint32_t ea, uint8_t privilege, uint64_t value);
421 	inline uint8_t OR8(uint8_t dst, uint8_t src);
422 	inline uint16_t OR16(uint16_t dst, uint16_t src);
423 	inline uint32_t OR32(uint32_t dst, uint32_t src);
424 	inline uint8_t AND8(uint8_t dst, uint8_t src);
425 	inline uint16_t AND16(uint16_t dst, uint16_t src);
426 	inline uint32_t AND32(uint32_t dst, uint32_t src);
427 	inline uint8_t XOR8(uint8_t dst, uint8_t src);
428 	inline uint16_t XOR16(uint16_t dst, uint16_t src);
429 	inline uint32_t XOR32(uint32_t dst, uint32_t src);
430 	inline uint8_t SBB8(uint8_t dst, uint8_t src, uint8_t b);
431 	inline uint16_t SBB16(uint16_t dst, uint16_t src, uint16_t b);
432 	inline uint32_t SBB32(uint32_t dst, uint32_t src, uint32_t b);
433 	inline uint8_t ADC8(uint8_t dst, uint8_t src, uint8_t c);
434 	inline uint16_t ADC16(uint16_t dst, uint16_t src, uint8_t c);
435 	inline uint32_t ADC32(uint32_t dst, uint32_t src, uint32_t c);
436 	inline uint8_t INC8(uint8_t dst);
437 	inline uint16_t INC16(uint16_t dst);
438 	inline uint32_t INC32(uint32_t dst);
439 	inline uint8_t DEC8(uint8_t dst);
440 	inline uint16_t DEC16(uint16_t dst);
441 	inline uint32_t DEC32(uint32_t dst);
442 	inline void PUSH16(uint16_t value);
443 	inline void PUSH32(uint32_t value);
444 	inline void PUSH32SEG(uint32_t value);
445 	inline void PUSH8(uint8_t value);
446 	inline uint8_t POP8();
447 	inline uint16_t POP16();
448 	inline uint32_t POP32();
449 	inline void BUMP_SI(int adjustment);
450 	inline void BUMP_DI(int adjustment);
451 	inline void check_ioperm(offs_t port, uint8_t mask);
452 	inline uint8_t READPORT8(offs_t port);
453 	inline void WRITEPORT8(offs_t port, uint8_t value);
454 	virtual uint16_t READPORT16(offs_t port);
455 	virtual void WRITEPORT16(offs_t port, uint16_t value);
456 	virtual uint32_t READPORT32(offs_t port);
457 	virtual void WRITEPORT32(offs_t port, uint32_t value);
458 	uint32_t i386_load_protected_mode_segment(I386_SREG *seg, uint64_t *desc );
459 	void i386_load_call_gate(I386_CALL_GATE *gate);
460 	void i386_set_descriptor_accessed(uint16_t selector);
461 	void i386_load_segment_descriptor(int segment );
462 	uint32_t i386_get_stack_segment(uint8_t privilege);
463 	uint32_t i386_get_stack_ptr(uint8_t privilege);
464 	uint32_t get_flags() const;
465 	void set_flags(uint32_t f );
466 	void sib_byte(uint8_t mod, uint32_t* out_ea, uint8_t* out_segment);
467 	void modrm_to_EA(uint8_t mod_rm, uint32_t* out_ea, uint8_t* out_segment);
468 	uint32_t GetNonTranslatedEA(uint8_t modrm,uint8_t *seg);
469 	uint32_t GetEA(uint8_t modrm, int rwn);
470 	uint32_t Getx87EA(uint8_t modrm, int rwn);
471 	void i386_check_sreg_validity(int reg);
472 	int i386_limit_check(int seg, uint32_t offset);
473 	void i386_sreg_load(uint16_t selector, uint8_t reg, bool *fault);
474 	void i386_trap(int irq, int irq_gate, int trap_level);
475 	void i386_trap_with_error(int irq, int irq_gate, int trap_level, uint32_t error);
476 	void i286_task_switch(uint16_t selector, uint8_t nested);
477 	void i386_task_switch(uint16_t selector, uint8_t nested);
478 	void i386_check_irq_line();
479 	void i386_protected_mode_jump(uint16_t seg, uint32_t off, int indirect, int operand32);
480 	void i386_protected_mode_call(uint16_t seg, uint32_t off, int indirect, int operand32);
481 	void i386_protected_mode_retf(uint8_t count, uint8_t operand32);
482 	void i386_protected_mode_iret(int operand32);
483 	void build_cycle_table();
484 	void report_invalid_opcode();
485 	void report_invalid_modrm(const char* opcode, uint8_t modrm);
486 	void i386_decode_opcode();
487 	void i386_decode_two_byte();
488 	void i386_decode_three_byte38();
489 	void i386_decode_three_byte3a();
490 	void i386_decode_three_byte66();
491 	void i386_decode_three_bytef2();
492 	void i386_decode_three_bytef3();
493 	void i386_decode_four_byte3866();
494 	void i386_decode_four_byte3a66();
495 	void i386_decode_four_byte38f2();
496 	void i386_decode_four_byte3af2();
497 	void i386_decode_four_byte38f3();
498 	uint8_t read8_debug(uint32_t ea, uint8_t *data);
499 	uint32_t i386_get_debug_desc(I386_SREG *seg);
500 	void CYCLES(int x);
501 	inline void CYCLES_RM(int modrm, int r, int m);
502 	uint8_t i386_shift_rotate8(uint8_t modrm, uint32_t value, uint8_t shift);
503 	void i386_adc_rm8_r8();
504 	void i386_adc_r8_rm8();
505 	void i386_adc_al_i8();
506 	void i386_add_rm8_r8();
507 	void i386_add_r8_rm8();
508 	void i386_add_al_i8();
509 	void i386_and_rm8_r8();
510 	void i386_and_r8_rm8();
511 	void i386_and_al_i8();
512 	void i386_clc();
513 	void i386_cld();
514 	void i386_cli();
515 	void i386_cmc();
516 	void i386_cmp_rm8_r8();
517 	void i386_cmp_r8_rm8();
518 	void i386_cmp_al_i8();
519 	void i386_cmpsb();
520 	void i386_in_al_i8();
521 	void i386_in_al_dx();
522 	void i386_ja_rel8();
523 	void i386_jbe_rel8();
524 	void i386_jc_rel8();
525 	void i386_jg_rel8();
526 	void i386_jge_rel8();
527 	void i386_jl_rel8();
528 	void i386_jle_rel8();
529 	void i386_jnc_rel8();
530 	void i386_jno_rel8();
531 	void i386_jnp_rel8();
532 	void i386_jns_rel8();
533 	void i386_jnz_rel8();
534 	void i386_jo_rel8();
535 	void i386_jp_rel8();
536 	void i386_js_rel8();
537 	void i386_jz_rel8();
538 	void i386_jmp_rel8();
539 	void i386_lahf();
540 	void i386_lodsb();
541 	void i386_mov_rm8_r8();
542 	void i386_mov_r8_rm8();
543 	void i386_mov_rm8_i8();
544 	void i386_mov_r32_cr();
545 	void i386_mov_r32_dr();
546 	void i386_mov_cr_r32();
547 	void i386_mov_dr_r32();
548 	void i386_mov_al_m8();
549 	void i386_mov_m8_al();
550 	void i386_mov_rm16_sreg();
551 	void i386_mov_sreg_rm16();
552 	void i386_mov_al_i8();
553 	void i386_mov_cl_i8();
554 	void i386_mov_dl_i8();
555 	void i386_mov_bl_i8();
556 	void i386_mov_ah_i8();
557 	void i386_mov_ch_i8();
558 	void i386_mov_dh_i8();
559 	void i386_mov_bh_i8();
560 	void i386_movsb();
561 	void i386_or_rm8_r8();
562 	void i386_or_r8_rm8();
563 	void i386_or_al_i8();
564 	void i386_out_al_i8();
565 	void i386_out_al_dx();
566 	void i386_arpl();
567 	void i386_push_i8();
568 	void i386_ins_generic(int size);
569 	void i386_insb();
570 	void i386_insw();
571 	void i386_insd();
572 	void i386_outs_generic(int size);
573 	void i386_outsb();
574 	void i386_outsw();
575 	void i386_outsd();
576 	void i386_repeat(int invert_flag);
577 	void i386_rep();
578 	void i386_repne();
579 	void i386_sahf();
580 	void i386_sbb_rm8_r8();
581 	void i386_sbb_r8_rm8();
582 	void i386_sbb_al_i8();
583 	void i386_scasb();
584 	void i386_setalc();
585 	void i386_seta_rm8();
586 	void i386_setbe_rm8();
587 	void i386_setc_rm8();
588 	void i386_setg_rm8();
589 	void i386_setge_rm8();
590 	void i386_setl_rm8();
591 	void i386_setle_rm8();
592 	void i386_setnc_rm8();
593 	void i386_setno_rm8();
594 	void i386_setnp_rm8();
595 	void i386_setns_rm8();
596 	void i386_setnz_rm8();
597 	void i386_seto_rm8();
598 	void i386_setp_rm8();
599 	void i386_sets_rm8();
600 	void i386_setz_rm8();
601 	void i386_stc();
602 	void i386_std();
603 	void i386_sti();
604 	void i386_stosb();
605 	void i386_sub_rm8_r8();
606 	void i386_sub_r8_rm8();
607 	void i386_sub_al_i8();
608 	void i386_test_al_i8();
609 	void i386_test_rm8_r8();
610 	void i386_xchg_r8_rm8();
611 	void i386_xor_rm8_r8();
612 	void i386_xor_r8_rm8();
613 	void i386_xor_al_i8();
614 	void i386_group80_8();
615 	void i386_groupC0_8();
616 	void i386_groupD0_8();
617 	void i386_groupD2_8();
618 	void i386_groupF6_8();
619 	void i386_groupFE_8();
620 	void i386_segment_CS();
621 	void i386_segment_DS();
622 	void i386_segment_ES();
623 	void i386_segment_FS();
624 	void i386_segment_GS();
625 	void i386_segment_SS();
626 	void i386_operand_size();
627 	void i386_address_size();
628 	void i386_nop();
629 	void i386_int3();
630 	void i386_int();
631 	void i386_into();
632 	void i386_escape();
633 	void i386_hlt();
634 	void i386_decimal_adjust(int direction);
635 	void i386_daa();
636 	void i386_das();
637 	void i386_aaa();
638 	void i386_aas();
639 	void i386_aad();
640 	void i386_aam();
641 	void i386_clts();
642 	void i386_wait();
643 	void i486_wait();
644 	void i386_lock();
645 	void i386_mov_r32_tr();
646 	void i386_mov_tr_r32();
647 	void i386_loadall();
648 	void i386_invalid();
649 	void i386_xlat();
650 	uint16_t i386_shift_rotate16(uint8_t modrm, uint32_t value, uint8_t shift);
651 	void i386_adc_rm16_r16();
652 	void i386_adc_r16_rm16();
653 	void i386_adc_ax_i16();
654 	void i386_add_rm16_r16();
655 	void i386_add_r16_rm16();
656 	void i386_add_ax_i16();
657 	void i386_and_rm16_r16();
658 	void i386_and_r16_rm16();
659 	void i386_and_ax_i16();
660 	void i386_bsf_r16_rm16();
661 	void i386_bsr_r16_rm16();
662 	void i386_bt_rm16_r16();
663 	void i386_btc_rm16_r16();
664 	void i386_btr_rm16_r16();
665 	void i386_bts_rm16_r16();
666 	void i386_call_abs16();
667 	void i386_call_rel16();
668 	void i386_cbw();
669 	void i386_cmp_rm16_r16();
670 	void i386_cmp_r16_rm16();
671 	void i386_cmp_ax_i16();
672 	void i386_cmpsw();
673 	void i386_cwd();
674 	void i386_dec_ax();
675 	void i386_dec_cx();
676 	void i386_dec_dx();
677 	void i386_dec_bx();
678 	void i386_dec_sp();
679 	void i386_dec_bp();
680 	void i386_dec_si();
681 	void i386_dec_di();
682 	void i386_imul_r16_rm16();
683 	void i386_imul_r16_rm16_i16();
684 	void i386_imul_r16_rm16_i8();
685 	void i386_in_ax_i8();
686 	void i386_in_ax_dx();
687 	void i386_inc_ax();
688 	void i386_inc_cx();
689 	void i386_inc_dx();
690 	void i386_inc_bx();
691 	void i386_inc_sp();
692 	void i386_inc_bp();
693 	void i386_inc_si();
694 	void i386_inc_di();
695 	void i386_iret16();
696 	void i386_ja_rel16();
697 	void i386_jbe_rel16();
698 	void i386_jc_rel16();
699 	void i386_jg_rel16();
700 	void i386_jge_rel16();
701 	void i386_jl_rel16();
702 	void i386_jle_rel16();
703 	void i386_jnc_rel16();
704 	void i386_jno_rel16();
705 	void i386_jnp_rel16();
706 	void i386_jns_rel16();
707 	void i386_jnz_rel16();
708 	void i386_jo_rel16();
709 	void i386_jp_rel16();
710 	void i386_js_rel16();
711 	void i386_jz_rel16();
712 	void i386_jcxz16();
713 	void i386_jmp_rel16();
714 	void i386_jmp_abs16();
715 	void i386_lea16();
716 	void i386_enter16();
717 	void i386_leave16();
718 	void i386_lodsw();
719 	void i386_loop16();
720 	void i386_loopne16();
721 	void i386_loopz16();
722 	void i386_mov_rm16_r16();
723 	void i386_mov_r16_rm16();
724 	void i386_mov_rm16_i16();
725 	void i386_mov_ax_m16();
726 	void i386_mov_m16_ax();
727 	void i386_mov_ax_i16();
728 	void i386_mov_cx_i16();
729 	void i386_mov_dx_i16();
730 	void i386_mov_bx_i16();
731 	void i386_mov_sp_i16();
732 	void i386_mov_bp_i16();
733 	void i386_mov_si_i16();
734 	void i386_mov_di_i16();
735 	void i386_movsw();
736 	void i386_movsx_r16_rm8();
737 	void i386_movzx_r16_rm8();
738 	void i386_or_rm16_r16();
739 	void i386_or_r16_rm16();
740 	void i386_or_ax_i16();
741 	void i386_out_ax_i8();
742 	void i386_out_ax_dx();
743 	void i386_pop_ax();
744 	void i386_pop_cx();
745 	void i386_pop_dx();
746 	void i386_pop_bx();
747 	void i386_pop_sp();
748 	void i386_pop_bp();
749 	void i386_pop_si();
750 	void i386_pop_di();
751 	bool i386_pop_seg16(int segment);
752 	void i386_pop_ds16();
753 	void i386_pop_es16();
754 	void i386_pop_fs16();
755 	void i386_pop_gs16();
756 	void i386_pop_ss16();
757 	void i386_pop_rm16();
758 	void i386_popa();
759 	void i386_popf();
760 	void i386_push_ax();
761 	void i386_push_cx();
762 	void i386_push_dx();
763 	void i386_push_bx();
764 	void i386_push_sp();
765 	void i386_push_bp();
766 	void i386_push_si();
767 	void i386_push_di();
768 	void i386_push_cs16();
769 	void i386_push_ds16();
770 	void i386_push_es16();
771 	void i386_push_fs16();
772 	void i386_push_gs16();
773 	void i386_push_ss16();
774 	void i386_push_i16();
775 	void i386_pusha();
776 	void i386_pushf();
777 	void i386_ret_near16_i16();
778 	void i386_ret_near16();
779 	void i386_sbb_rm16_r16();
780 	void i386_sbb_r16_rm16();
781 	void i386_sbb_ax_i16();
782 	void i386_scasw();
783 	void i386_shld16_i8();
784 	void i386_shld16_cl();
785 	void i386_shrd16_i8();
786 	void i386_shrd16_cl();
787 	void i386_stosw();
788 	void i386_sub_rm16_r16();
789 	void i386_sub_r16_rm16();
790 	void i386_sub_ax_i16();
791 	void i386_test_ax_i16();
792 	void i386_test_rm16_r16();
793 	void i386_xchg_ax_cx();
794 	void i386_xchg_ax_dx();
795 	void i386_xchg_ax_bx();
796 	void i386_xchg_ax_sp();
797 	void i386_xchg_ax_bp();
798 	void i386_xchg_ax_si();
799 	void i386_xchg_ax_di();
800 	void i386_xchg_r16_rm16();
801 	void i386_xor_rm16_r16();
802 	void i386_xor_r16_rm16();
803 	void i386_xor_ax_i16();
804 	void i386_group81_16();
805 	void i386_group83_16();
806 	void i386_groupC1_16();
807 	void i386_groupD1_16();
808 	void i386_groupD3_16();
809 	void i386_groupF7_16();
810 	void i386_groupFF_16();
811 	void i386_group0F00_16();
812 	void i386_group0F01_16();
813 	void i386_group0FBA_16();
814 	void i386_lar_r16_rm16();
815 	void i386_lsl_r16_rm16();
816 	void i386_bound_r16_m16_m16();
817 	void i386_retf16();
818 	void i386_retf_i16();
819 	bool i386_load_far_pointer16(int s);
820 	void i386_lds16();
821 	void i386_lss16();
822 	void i386_les16();
823 	void i386_lfs16();
824 	void i386_lgs16();
825 	uint32_t i386_shift_rotate32(uint8_t modrm, uint32_t value, uint8_t shift);
826 	void i386_adc_rm32_r32();
827 	void i386_adc_r32_rm32();
828 	void i386_adc_eax_i32();
829 	void i386_add_rm32_r32();
830 	void i386_add_r32_rm32();
831 	void i386_add_eax_i32();
832 	void i386_and_rm32_r32();
833 	void i386_and_r32_rm32();
834 	void i386_and_eax_i32();
835 	void i386_bsf_r32_rm32();
836 	void i386_bsr_r32_rm32();
837 	void i386_bt_rm32_r32();
838 	void i386_btc_rm32_r32();
839 	void i386_btr_rm32_r32();
840 	void i386_bts_rm32_r32();
841 	void i386_call_abs32();
842 	void i386_call_rel32();
843 	void i386_cdq();
844 	void i386_cmp_rm32_r32();
845 	void i386_cmp_r32_rm32();
846 	void i386_cmp_eax_i32();
847 	void i386_cmpsd();
848 	void i386_cwde();
849 	void i386_dec_eax();
850 	void i386_dec_ecx();
851 	void i386_dec_edx();
852 	void i386_dec_ebx();
853 	void i386_dec_esp();
854 	void i386_dec_ebp();
855 	void i386_dec_esi();
856 	void i386_dec_edi();
857 	void i386_imul_r32_rm32();
858 	void i386_imul_r32_rm32_i32();
859 	void i386_imul_r32_rm32_i8();
860 	void i386_in_eax_i8();
861 	void i386_in_eax_dx();
862 	void i386_inc_eax();
863 	void i386_inc_ecx();
864 	void i386_inc_edx();
865 	void i386_inc_ebx();
866 	void i386_inc_esp();
867 	void i386_inc_ebp();
868 	void i386_inc_esi();
869 	void i386_inc_edi();
870 	void i386_iret32();
871 	void i386_ja_rel32();
872 	void i386_jbe_rel32();
873 	void i386_jc_rel32();
874 	void i386_jg_rel32();
875 	void i386_jge_rel32();
876 	void i386_jl_rel32();
877 	void i386_jle_rel32();
878 	void i386_jnc_rel32();
879 	void i386_jno_rel32();
880 	void i386_jnp_rel32();
881 	void i386_jns_rel32();
882 	void i386_jnz_rel32();
883 	void i386_jo_rel32();
884 	void i386_jp_rel32();
885 	void i386_js_rel32();
886 	void i386_jz_rel32();
887 	void i386_jcxz32();
888 	void i386_jmp_rel32();
889 	void i386_jmp_abs32();
890 	void i386_lea32();
891 	void i386_enter32();
892 	void i386_leave32();
893 	void i386_lodsd();
894 	void i386_loop32();
895 	void i386_loopne32();
896 	void i386_loopz32();
897 	void i386_mov_rm32_r32();
898 	void i386_mov_r32_rm32();
899 	void i386_mov_rm32_i32();
900 	void i386_mov_eax_m32();
901 	void i386_mov_m32_eax();
902 	void i386_mov_eax_i32();
903 	void i386_mov_ecx_i32();
904 	void i386_mov_edx_i32();
905 	void i386_mov_ebx_i32();
906 	void i386_mov_esp_i32();
907 	void i386_mov_ebp_i32();
908 	void i386_mov_esi_i32();
909 	void i386_mov_edi_i32();
910 	void i386_movsd();
911 	void i386_movsx_r32_rm8();
912 	void i386_movsx_r32_rm16();
913 	void i386_movzx_r32_rm8();
914 	void i386_movzx_r32_rm16();
915 	void i386_or_rm32_r32();
916 	void i386_or_r32_rm32();
917 	void i386_or_eax_i32();
918 	void i386_out_eax_i8();
919 	void i386_out_eax_dx();
920 	void i386_pop_eax();
921 	void i386_pop_ecx();
922 	void i386_pop_edx();
923 	void i386_pop_ebx();
924 	void i386_pop_esp();
925 	void i386_pop_ebp();
926 	void i386_pop_esi();
927 	void i386_pop_edi();
928 	bool i386_pop_seg32(int segment);
929 	void i386_pop_ds32();
930 	void i386_pop_es32();
931 	void i386_pop_fs32();
932 	void i386_pop_gs32();
933 	void i386_pop_ss32();
934 	void i386_pop_rm32();
935 	void i386_popad();
936 	void i386_popfd();
937 	void i386_push_eax();
938 	void i386_push_ecx();
939 	void i386_push_edx();
940 	void i386_push_ebx();
941 	void i386_push_esp();
942 	void i386_push_ebp();
943 	void i386_push_esi();
944 	void i386_push_edi();
945 	void i386_push_cs32();
946 	void i386_push_ds32();
947 	void i386_push_es32();
948 	void i386_push_fs32();
949 	void i386_push_gs32();
950 	void i386_push_ss32();
951 	void i386_push_i32();
952 	void i386_pushad();
953 	void i386_pushfd();
954 	void i386_ret_near32_i16();
955 	void i386_ret_near32();
956 	void i386_sbb_rm32_r32();
957 	void i386_sbb_r32_rm32();
958 	void i386_sbb_eax_i32();
959 	void i386_scasd();
960 	void i386_shld32_i8();
961 	void i386_shld32_cl();
962 	void i386_shrd32_i8();
963 	void i386_shrd32_cl();
964 	void i386_stosd();
965 	void i386_sub_rm32_r32();
966 	void i386_sub_r32_rm32();
967 	void i386_sub_eax_i32();
968 	void i386_test_eax_i32();
969 	void i386_test_rm32_r32();
970 	void i386_xchg_eax_ecx();
971 	void i386_xchg_eax_edx();
972 	void i386_xchg_eax_ebx();
973 	void i386_xchg_eax_esp();
974 	void i386_xchg_eax_ebp();
975 	void i386_xchg_eax_esi();
976 	void i386_xchg_eax_edi();
977 	void i386_xchg_r32_rm32();
978 	void i386_xor_rm32_r32();
979 	void i386_xor_r32_rm32();
980 	void i386_xor_eax_i32();
981 	void i386_group81_32();
982 	void i386_group83_32();
983 	void i386_groupC1_32();
984 	void i386_groupD1_32();
985 	void i386_groupD3_32();
986 	void i386_groupF7_32();
987 	void i386_groupFF_32();
988 	void i386_group0F00_32();
989 	void i386_group0F01_32();
990 	void i386_group0FBA_32();
991 	void i386_lar_r32_rm32();
992 	void i386_lsl_r32_rm32();
993 	void i386_bound_r32_m32_m32();
994 	void i386_retf32();
995 	void i386_retf_i32();
996 	void i386_load_far_pointer32(int s);
997 	void i386_lds32();
998 	void i386_lss32();
999 	void i386_les32();
1000 	void i386_lfs32();
1001 	void i386_lgs32();
1002 	void i486_cpuid();
1003 	void i486_invd();
1004 	void i486_wbinvd();
1005 	void i486_cmpxchg_rm8_r8();
1006 	void i486_cmpxchg_rm16_r16();
1007 	void i486_cmpxchg_rm32_r32();
1008 	void i486_xadd_rm8_r8();
1009 	void i486_xadd_rm16_r16();
1010 	void i486_xadd_rm32_r32();
1011 	void i486_group0F01_16();
1012 	void i486_group0F01_32();
1013 	void i486_bswap_eax();
1014 	void i486_bswap_ecx();
1015 	void i486_bswap_edx();
1016 	void i486_bswap_ebx();
1017 	void i486_bswap_esp();
1018 	void i486_bswap_ebp();
1019 	void i486_bswap_esi();
1020 	void i486_bswap_edi();
1021 	void i486_mov_cr_r32();
1022 	inline void MMXPROLOG();
1023 	inline void READMMX(uint32_t ea,MMX_REG &r);
1024 	inline void WRITEMMX(uint32_t ea,MMX_REG &r);
1025 	inline void READXMM(uint32_t ea,XMM_REG &r);
1026 	inline void WRITEXMM(uint32_t ea,XMM_REG &r);
1027 	inline void READXMM_LO64(uint32_t ea,XMM_REG &r);
1028 	inline void WRITEXMM_LO64(uint32_t ea,XMM_REG &r);
1029 	inline void READXMM_HI64(uint32_t ea,XMM_REG &r);
1030 	inline void WRITEXMM_HI64(uint32_t ea,XMM_REG &r);
1031 	void pentium_rdmsr();
1032 	void pentium_wrmsr();
1033 	void pentium_rdtsc();
1034 	void pentium_ud2();
1035 	void pentium_rsm();
1036 	void pentium_prefetch_m8();
1037 	void pentium_cmovo_r16_rm16();
1038 	void pentium_cmovo_r32_rm32();
1039 	void pentium_cmovno_r16_rm16();
1040 	void pentium_cmovno_r32_rm32();
1041 	void pentium_cmovb_r16_rm16();
1042 	void pentium_cmovb_r32_rm32();
1043 	void pentium_cmovae_r16_rm16();
1044 	void pentium_cmovae_r32_rm32();
1045 	void pentium_cmove_r16_rm16();
1046 	void pentium_cmove_r32_rm32();
1047 	void pentium_cmovne_r16_rm16();
1048 	void pentium_cmovne_r32_rm32();
1049 	void pentium_cmovbe_r16_rm16();
1050 	void pentium_cmovbe_r32_rm32();
1051 	void pentium_cmova_r16_rm16();
1052 	void pentium_cmova_r32_rm32();
1053 	void pentium_cmovs_r16_rm16();
1054 	void pentium_cmovs_r32_rm32();
1055 	void pentium_cmovns_r16_rm16();
1056 	void pentium_cmovns_r32_rm32();
1057 	void pentium_cmovp_r16_rm16();
1058 	void pentium_cmovp_r32_rm32();
1059 	void pentium_cmovnp_r16_rm16();
1060 	void pentium_cmovnp_r32_rm32();
1061 	void pentium_cmovl_r16_rm16();
1062 	void pentium_cmovl_r32_rm32();
1063 	void pentium_cmovge_r16_rm16();
1064 	void pentium_cmovge_r32_rm32();
1065 	void pentium_cmovle_r16_rm16();
1066 	void pentium_cmovle_r32_rm32();
1067 	void pentium_cmovg_r16_rm16();
1068 	void pentium_cmovg_r32_rm32();
1069 	void pentium_movnti_m16_r16();
1070 	void pentium_movnti_m32_r32();
1071 	void i386_cyrix_special();
1072 	void i386_cyrix_unknown();
1073 	void pentium_cmpxchg8b_m64();
1074 	void pentium_movntq_m64_r64();
1075 	void pentium_maskmovq_r64_r64();
1076 	void pentium_popcnt_r16_rm16();
1077 	void pentium_popcnt_r32_rm32();
1078 	void pentium_tzcnt_r16_rm16();
1079 	void pentium_tzcnt_r32_rm32();
1080 	void mmx_group_0f71();
1081 	void mmx_group_0f72();
1082 	void mmx_group_0f73();
1083 	void mmx_psrlw_r64_rm64();
1084 	void mmx_psrld_r64_rm64();
1085 	void mmx_psrlq_r64_rm64();
1086 	void mmx_paddq_r64_rm64();
1087 	void mmx_pmullw_r64_rm64();
1088 	void mmx_psubusb_r64_rm64();
1089 	void mmx_psubusw_r64_rm64();
1090 	void mmx_pand_r64_rm64();
1091 	void mmx_paddusb_r64_rm64();
1092 	void mmx_paddusw_r64_rm64();
1093 	void mmx_pandn_r64_rm64();
1094 	void mmx_psraw_r64_rm64();
1095 	void mmx_psrad_r64_rm64();
1096 	void mmx_pmulhw_r64_rm64();
1097 	void mmx_psubsb_r64_rm64();
1098 	void mmx_psubsw_r64_rm64();
1099 	void mmx_por_r64_rm64();
1100 	void mmx_paddsb_r64_rm64();
1101 	void mmx_paddsw_r64_rm64();
1102 	void mmx_pxor_r64_rm64();
1103 	void mmx_psllw_r64_rm64();
1104 	void mmx_pslld_r64_rm64();
1105 	void mmx_psllq_r64_rm64();
1106 	void mmx_pmaddwd_r64_rm64();
1107 	void mmx_psubb_r64_rm64();
1108 	void mmx_psubw_r64_rm64();
1109 	void mmx_psubd_r64_rm64();
1110 	void mmx_paddb_r64_rm64();
1111 	void mmx_paddw_r64_rm64();
1112 	void mmx_paddd_r64_rm64();
1113 	void mmx_emms();
1114 	void i386_cyrix_svdc();
1115 	void i386_cyrix_rsdc();
1116 	void i386_cyrix_svldt();
1117 	void i386_cyrix_rsldt();
1118 	void i386_cyrix_svts();
1119 	void i386_cyrix_rsts();
1120 	void mmx_movd_r64_rm32();
1121 	void mmx_movq_r64_rm64();
1122 	void mmx_movd_rm32_r64();
1123 	void mmx_movq_rm64_r64();
1124 	void mmx_pcmpeqb_r64_rm64();
1125 	void mmx_pcmpeqw_r64_rm64();
1126 	void mmx_pcmpeqd_r64_rm64();
1127 	void mmx_pshufw_r64_rm64_i8();
1128 	void mmx_punpcklbw_r64_r64m32();
1129 	void mmx_punpcklwd_r64_r64m32();
1130 	void mmx_punpckldq_r64_r64m32();
1131 	void mmx_packsswb_r64_rm64();
1132 	void mmx_pcmpgtb_r64_rm64();
1133 	void mmx_pcmpgtw_r64_rm64();
1134 	void mmx_pcmpgtd_r64_rm64();
1135 	void mmx_packuswb_r64_rm64();
1136 	void mmx_punpckhbw_r64_rm64();
1137 	void mmx_punpckhwd_r64_rm64();
1138 	void mmx_punpckhdq_r64_rm64();
1139 	void mmx_packssdw_r64_rm64();
1140 	void sse_group_0fae();
1141 	void sse_group_660f71();
1142 	void sse_group_660f72();
1143 	void sse_group_660f73();
1144 	void sse_cvttps2dq_r128_rm128();
1145 	void sse_cvtss2sd_r128_r128m32();
1146 	void sse_cvttss2si_r32_r128m32();
1147 	void sse_cvtss2si_r32_r128m32();
1148 	void sse_cvtsi2ss_r128_rm32();
1149 	void sse_cvtpi2ps_r128_rm64();
1150 	void sse_cvttps2pi_r64_r128m64();
1151 	void sse_cvtps2pi_r64_r128m64();
1152 	void sse_cvtps2pd_r128_r128m64();
1153 	void sse_cvtdq2ps_r128_rm128();
1154 	void sse_cvtdq2pd_r128_r128m64();
1155 	void sse_movss_r128_rm128();
1156 	void sse_movss_rm128_r128();
1157 	void sse_movsldup_r128_rm128();
1158 	void sse_movshdup_r128_rm128();
1159 	void sse_movaps_r128_rm128();
1160 	void sse_movaps_rm128_r128();
1161 	void sse_movups_r128_rm128();
1162 	void sse_movups_rm128_r128();
1163 	void sse_movlps_r128_m64();
1164 	void sse_movlps_m64_r128();
1165 	void sse_movhps_r128_m64();
1166 	void sse_movhps_m64_r128();
1167 	void sse_movntps_m128_r128();
1168 	void sse_movmskps_r16_r128();
1169 	void sse_movmskps_r32_r128();
1170 	void sse_movq2dq_r128_r64();
1171 	void sse_movdqu_r128_rm128();
1172 	void sse_movdqu_rm128_r128();
1173 	void sse_movd_m128_rm32();
1174 	void sse_movdqa_m128_rm128();
1175 	void sse_movq_r128_r128m64();
1176 	void sse_movd_rm32_r128();
1177 	void sse_movdqa_rm128_r128();
1178 	void sse_pmovmskb_r16_r64();
1179 	void sse_pmovmskb_r32_r64();
1180 	void sse_xorps();
1181 	void sse_addps();
1182 	void sse_sqrtps_r128_rm128();
1183 	void sse_rsqrtps_r128_rm128();
1184 	void sse_rcpps_r128_rm128();
1185 	void sse_andps_r128_rm128();
1186 	void sse_andnps_r128_rm128();
1187 	void sse_orps_r128_rm128();
1188 	void sse_mulps();
1189 	void sse_subps();
1190 	void sse_minps();
1191 	void sse_divps();
1192 	void sse_maxps();
1193 	void sse_maxss_r128_r128m32();
1194 	void sse_addss();
1195 	void sse_subss();
1196 	void sse_mulss();
1197 	void sse_divss();
1198 	void sse_rcpss_r128_r128m32();
1199 	void sse_sqrtss_r128_r128m32();
1200 	void sse_rsqrtss_r128_r128m32();
1201 	void sse_minss_r128_r128m32();
1202 	void sse_comiss_r128_r128m32();
1203 	void sse_ucomiss_r128_r128m32();
1204 	void sse_shufps();
1205 	void sse_punpcklbw_r128_rm128();
1206 	void sse_punpcklwd_r128_rm128();
1207 	void sse_punpckldq_r128_rm128();
1208 	void sse_punpcklqdq_r128_rm128();
1209 	void sse_unpcklps_r128_rm128();
1210 	void sse_unpckhps_r128_rm128();
1211 	void sse_cmpps_r128_rm128_i8();
1212 	void sse_cmpss_r128_r128m32_i8();
1213 	void sse_pinsrw_r64_r16m16_i8();
1214 	void sse_pinsrw_r64_r32m16_i8();
1215 	void sse_pinsrw_r128_r32m16_i8();
1216 	void sse_pextrw_r16_r64_i8();
1217 	void sse_pextrw_r32_r64_i8();
1218 	void sse_pextrw_reg_r128_i8();
1219 	void sse_pminub_r64_rm64();
1220 	void sse_pmaxub_r64_rm64();
1221 	void sse_pavgb_r64_rm64();
1222 	void sse_pavgw_r64_rm64();
1223 	void sse_pmulhuw_r64_rm64();
1224 	void sse_pminsw_r64_rm64();
1225 	void sse_pmaxsw_r64_rm64();
1226 	void sse_pmuludq_r64_rm64();
1227 	void sse_psadbw_r64_rm64();
1228 	void sse_psubq_r64_rm64();
1229 	void sse_pshufhw_r128_rm128_i8();
1230 	void sse_packsswb_r128_rm128();
1231 	void sse_packssdw_r128_rm128();
1232 	void sse_pcmpgtb_r128_rm128();
1233 	void sse_pcmpgtw_r128_rm128();
1234 	void sse_pcmpgtd_r128_rm128();
1235 	void sse_packuswb_r128_rm128();
1236 	void sse_punpckhbw_r128_rm128();
1237 	void sse_punpckhwd_r128_rm128();
1238 	void sse_unpckhdq_r128_rm128();
1239 	void sse_punpckhqdq_r128_rm128();
1240 	void sse_pcmpeqb_r128_rm128();
1241 	void sse_pcmpeqw_r128_rm128();
1242 	void sse_pcmpeqd_r128_rm128();
1243 	void sse_paddq_r128_rm128();
1244 	void sse_pmullw_r128_rm128();
1245 	void sse_pmuludq_r128_rm128();
1246 	void sse_psubq_r128_rm128();
1247 	void sse_paddb_r128_rm128();
1248 	void sse_paddw_r128_rm128();
1249 	void sse_paddd_r128_rm128();
1250 	void sse_psubusb_r128_rm128();
1251 	void sse_psubusw_r128_rm128();
1252 	void sse_pminub_r128_rm128();
1253 	void sse_pand_r128_rm128();
1254 	void sse_pandn_r128_rm128();
1255 	void sse_paddusb_r128_rm128();
1256 	void sse_paddusw_r128_rm128();
1257 	void sse_pmaxub_r128_rm128();
1258 	void sse_pmulhuw_r128_rm128();
1259 	void sse_pmulhw_r128_rm128();
1260 	void sse_psubsw_r128_rm128();
1261 	void sse_psubsb_r128_rm128();
1262 	void sse_pminsw_r128_rm128();
1263 	void sse_pmaxsw_r128_rm128();
1264 	void sse_paddsb_r128_rm128();
1265 	void sse_paddsw_r128_rm128();
1266 	void sse_por_r128_rm128();
1267 	void sse_pxor_r128_rm128();
1268 	void sse_pmaddwd_r128_rm128();
1269 	void sse_psubb_r128_rm128();
1270 	void sse_psubw_r128_rm128();
1271 	void sse_psubd_r128_rm128();
1272 	void sse_psadbw_r128_rm128();
1273 	void sse_pavgb_r128_rm128();
1274 	void sse_pavgw_r128_rm128();
1275 	void sse_pmovmskb_r32_r128();
1276 	void sse_maskmovdqu_r128_r128();
1277 	void sse_andpd_r128_rm128();
1278 	void sse_andnpd_r128_rm128();
1279 	void sse_orpd_r128_rm128();
1280 	void sse_xorpd_r128_rm128();
1281 	void sse_unpcklpd_r128_rm128();
1282 	void sse_unpckhpd_r128_rm128();
1283 	void sse_shufpd_r128_rm128_i8();
1284 	void sse_pshufd_r128_rm128_i8();
1285 	void sse_pshuflw_r128_rm128_i8();
1286 	void sse_movmskpd_r32_r128();
1287 	void sse_ucomisd_r128_r128m64();
1288 	void sse_comisd_r128_r128m64();
1289 	void sse_psrlw_r128_rm128();
1290 	void sse_psrld_r128_rm128();
1291 	void sse_psrlq_r128_rm128();
1292 	void sse_psllw_r128_rm128();
1293 	void sse_pslld_r128_rm128();
1294 	void sse_psllq_r128_rm128();
1295 	void sse_psraw_r128_rm128();
1296 	void sse_psrad_r128_rm128();
1297 	void sse_movntdq_m128_r128();
1298 	void sse_cvttpd2dq_r128_rm128();
1299 	void sse_movq_r128m64_r128();
1300 	void sse_addsubpd_r128_rm128();
1301 	void sse_cmppd_r128_rm128_i8();
1302 	void sse_haddpd_r128_rm128();
1303 	void sse_hsubpd_r128_rm128();
1304 	void sse_sqrtpd_r128_rm128();
1305 	void sse_cvtpi2pd_r128_rm64();
1306 	void sse_cvttpd2pi_r64_rm128();
1307 	void sse_cvtpd2pi_r64_rm128();
1308 	void sse_cvtpd2ps_r128_rm128();
1309 	void sse_cvtps2dq_r128_rm128();
1310 	void sse_addpd_r128_rm128();
1311 	void sse_mulpd_r128_rm128();
1312 	void sse_subpd_r128_rm128();
1313 	void sse_minpd_r128_rm128();
1314 	void sse_divpd_r128_rm128();
1315 	void sse_maxpd_r128_rm128();
1316 	void sse_movntpd_m128_r128();
1317 	void sse_movapd_r128_rm128();
1318 	void sse_movapd_rm128_r128();
1319 	void sse_movhpd_r128_m64();
1320 	void sse_movhpd_m64_r128();
1321 	void sse_movupd_r128_rm128();
1322 	void sse_movupd_rm128_r128();
1323 	void sse_movlpd_r128_m64();
1324 	void sse_movlpd_m64_r128();
1325 	void sse_movsd_r128_r128m64();
1326 	void sse_movsd_r128m64_r128();
1327 	void sse_movddup_r128_r128m64();
1328 	void sse_cvtsi2sd_r128_rm32();
1329 	void sse_cvttsd2si_r32_r128m64();
1330 	void sse_cvtsd2si_r32_r128m64();
1331 	void sse_sqrtsd_r128_r128m64();
1332 	void sse_addsd_r128_r128m64();
1333 	void sse_mulsd_r128_r128m64();
1334 	void sse_cvtsd2ss_r128_r128m64();
1335 	void sse_subsd_r128_r128m64();
1336 	void sse_minsd_r128_r128m64();
1337 	void sse_divsd_r128_r128m64();
1338 	void sse_maxsd_r128_r128m64();
1339 	void sse_haddps_r128_rm128();
1340 	void sse_hsubps_r128_rm128();
1341 	void sse_cmpsd_r128_r128m64_i8();
1342 	void sse_addsubps_r128_rm128();
1343 	void sse_movdq2q_r64_r128();
1344 	void sse_cvtpd2dq_r128_rm128();
1345 	void sse_lddqu_r128_m128();
1346 	inline void sse_predicate_compare_single(uint8_t imm8, XMM_REG d, XMM_REG s);
1347 	inline void sse_predicate_compare_double(uint8_t imm8, XMM_REG d, XMM_REG s);
1348 	inline void sse_predicate_compare_single_scalar(uint8_t imm8, XMM_REG d, XMM_REG s);
1349 	inline void sse_predicate_compare_double_scalar(uint8_t imm8, XMM_REG d, XMM_REG s);
1350 	inline floatx80 READ80(uint32_t ea);
1351 	inline void WRITE80(uint32_t ea, floatx80 t);
1352 	inline void x87_set_stack_top(int top);
1353 	inline void x87_set_tag(int reg, int tag);
1354 	void x87_write_stack(int i, floatx80 value, bool update_tag);
1355 	inline void x87_set_stack_underflow();
1356 	inline void x87_set_stack_overflow();
1357 	int x87_inc_stack();
1358 	int x87_dec_stack();
1359 	int x87_check_exceptions(bool store = false);
1360 	int x87_mf_fault();
1361 	inline void x87_write_cw(uint16_t cw);
1362 	void x87_reset();
1363 	floatx80 x87_add(floatx80 a, floatx80 b);
1364 	floatx80 x87_sub(floatx80 a, floatx80 b);
1365 	floatx80 x87_mul(floatx80 a, floatx80 b);
1366 	floatx80 x87_div(floatx80 a, floatx80 b);
1367 	void x87_fadd_m32real(uint8_t modrm);
1368 	void x87_fadd_m64real(uint8_t modrm);
1369 	void x87_fadd_st_sti(uint8_t modrm);
1370 	void x87_fadd_sti_st(uint8_t modrm);
1371 	void x87_faddp(uint8_t modrm);
1372 	void x87_fiadd_m32int(uint8_t modrm);
1373 	void x87_fiadd_m16int(uint8_t modrm);
1374 	void x87_fsub_m32real(uint8_t modrm);
1375 	void x87_fsub_m64real(uint8_t modrm);
1376 	void x87_fsub_st_sti(uint8_t modrm);
1377 	void x87_fsub_sti_st(uint8_t modrm);
1378 	void x87_fsubp(uint8_t modrm);
1379 	void x87_fisub_m32int(uint8_t modrm);
1380 	void x87_fisub_m16int(uint8_t modrm);
1381 	void x87_fsubr_m32real(uint8_t modrm);
1382 	void x87_fsubr_m64real(uint8_t modrm);
1383 	void x87_fsubr_st_sti(uint8_t modrm);
1384 	void x87_fsubr_sti_st(uint8_t modrm);
1385 	void x87_fsubrp(uint8_t modrm);
1386 	void x87_fisubr_m32int(uint8_t modrm);
1387 	void x87_fisubr_m16int(uint8_t modrm);
1388 	void x87_fdiv_m32real(uint8_t modrm);
1389 	void x87_fdiv_m64real(uint8_t modrm);
1390 	void x87_fdiv_st_sti(uint8_t modrm);
1391 	void x87_fdiv_sti_st(uint8_t modrm);
1392 	void x87_fdivp(uint8_t modrm);
1393 	void x87_fidiv_m32int(uint8_t modrm);
1394 	void x87_fidiv_m16int(uint8_t modrm);
1395 	void x87_fdivr_m32real(uint8_t modrm);
1396 	void x87_fdivr_m64real(uint8_t modrm);
1397 	void x87_fdivr_st_sti(uint8_t modrm);
1398 	void x87_fdivr_sti_st(uint8_t modrm);
1399 	void x87_fdivrp(uint8_t modrm);
1400 	void x87_fidivr_m32int(uint8_t modrm);
1401 	void x87_fidivr_m16int(uint8_t modrm);
1402 	void x87_fmul_m32real(uint8_t modrm);
1403 	void x87_fmul_m64real(uint8_t modrm);
1404 	void x87_fmul_st_sti(uint8_t modrm);
1405 	void x87_fmul_sti_st(uint8_t modrm);
1406 	void x87_fmulp(uint8_t modrm);
1407 	void x87_fimul_m32int(uint8_t modrm);
1408 	void x87_fimul_m16int(uint8_t modrm);
1409 	void x87_fprem(uint8_t modrm);
1410 	void x87_fprem1(uint8_t modrm);
1411 	void x87_fsqrt(uint8_t modrm);
1412 	void x87_f2xm1(uint8_t modrm);
1413 	void x87_fyl2x(uint8_t modrm);
1414 	void x87_fyl2xp1(uint8_t modrm);
1415 	void x87_fptan(uint8_t modrm);
1416 	void x87_fpatan(uint8_t modrm);
1417 	void x87_fsin(uint8_t modrm);
1418 	void x87_fcos(uint8_t modrm);
1419 	void x87_fsincos(uint8_t modrm);
1420 	void x87_fld_m32real(uint8_t modrm);
1421 	void x87_fld_m64real(uint8_t modrm);
1422 	void x87_fld_m80real(uint8_t modrm);
1423 	void x87_fld_sti(uint8_t modrm);
1424 	void x87_fild_m16int(uint8_t modrm);
1425 	void x87_fild_m32int(uint8_t modrm);
1426 	void x87_fild_m64int(uint8_t modrm);
1427 	void x87_fbld(uint8_t modrm);
1428 	void x87_fst_m32real(uint8_t modrm);
1429 	void x87_fst_m64real(uint8_t modrm);
1430 	void x87_fst_sti(uint8_t modrm);
1431 	void x87_fstp_m32real(uint8_t modrm);
1432 	void x87_fstp_m64real(uint8_t modrm);
1433 	void x87_fstp_m80real(uint8_t modrm);
1434 	void x87_fstp_sti(uint8_t modrm);
1435 	void x87_fist_m16int(uint8_t modrm);
1436 	void x87_fist_m32int(uint8_t modrm);
1437 	void x87_fistp_m16int(uint8_t modrm);
1438 	void x87_fistp_m32int(uint8_t modrm);
1439 	void x87_fistp_m64int(uint8_t modrm);
1440 	void x87_fbstp(uint8_t modrm);
1441 	void x87_fld1(uint8_t modrm);
1442 	void x87_fldl2t(uint8_t modrm);
1443 	void x87_fldl2e(uint8_t modrm);
1444 	void x87_fldpi(uint8_t modrm);
1445 	void x87_fldlg2(uint8_t modrm);
1446 	void x87_fldln2(uint8_t modrm);
1447 	void x87_fldz(uint8_t modrm);
1448 	void x87_fnop(uint8_t modrm);
1449 	void x87_fchs(uint8_t modrm);
1450 	void x87_fabs(uint8_t modrm);
1451 	void x87_fscale(uint8_t modrm);
1452 	void x87_frndint(uint8_t modrm);
1453 	void x87_fxtract(uint8_t modrm);
1454 	void x87_ftst(uint8_t modrm);
1455 	void x87_fxam(uint8_t modrm);
1456 	void x87_fcmovb_sti(uint8_t modrm);
1457 	void x87_fcmove_sti(uint8_t modrm);
1458 	void x87_fcmovbe_sti(uint8_t modrm);
1459 	void x87_fcmovu_sti(uint8_t modrm);
1460 	void x87_fcmovnb_sti(uint8_t modrm);
1461 	void x87_fcmovne_sti(uint8_t modrm);
1462 	void x87_fcmovnbe_sti(uint8_t modrm);
1463 	void x87_fcmovnu_sti(uint8_t modrm);
1464 	void x87_ficom_m16int(uint8_t modrm);
1465 	void x87_ficom_m32int(uint8_t modrm);
1466 	void x87_ficomp_m16int(uint8_t modrm);
1467 	void x87_ficomp_m32int(uint8_t modrm);
1468 	void x87_fcom_m32real(uint8_t modrm);
1469 	void x87_fcom_m64real(uint8_t modrm);
1470 	void x87_fcom_sti(uint8_t modrm);
1471 	void x87_fcomp_m32real(uint8_t modrm);
1472 	void x87_fcomp_m64real(uint8_t modrm);
1473 	void x87_fcomp_sti(uint8_t modrm);
1474 	void x87_fcomi_sti(uint8_t modrm);
1475 	void x87_fcomip_sti(uint8_t modrm);
1476 	void x87_fucomi_sti(uint8_t modrm);
1477 	void x87_fucomip_sti(uint8_t modrm);
1478 	void x87_fcompp(uint8_t modrm);
1479 	void x87_fucom_sti(uint8_t modrm);
1480 	void x87_fucomp_sti(uint8_t modrm);
1481 	void x87_fucompp(uint8_t modrm);
1482 	void x87_fdecstp(uint8_t modrm);
1483 	void x87_fincstp(uint8_t modrm);
1484 	void x87_fclex(uint8_t modrm);
1485 	void x87_ffree(uint8_t modrm);
1486 	void x87_finit(uint8_t modrm);
1487 	void x87_fldcw(uint8_t modrm);
1488 	void x87_fstcw(uint8_t modrm);
1489 	void x87_fldenv(uint8_t modrm);
1490 	void x87_fstenv(uint8_t modrm);
1491 	void x87_fsave(uint8_t modrm);
1492 	void x87_frstor(uint8_t modrm);
1493 	void x87_fxch(uint8_t modrm);
1494 	void x87_fxch_sti(uint8_t modrm);
1495 	void x87_fstsw_ax(uint8_t modrm);
1496 	void x87_fstsw_m2byte(uint8_t modrm);
1497 	void x87_invalid(uint8_t modrm);
1498 	void i386_x87_group_d8();
1499 	void i386_x87_group_d9();
1500 	void i386_x87_group_da();
1501 	void i386_x87_group_db();
1502 	void i386_x87_group_dc();
1503 	void i386_x87_group_dd();
1504 	void i386_x87_group_de();
1505 	void i386_x87_group_df();
1506 	void build_x87_opcode_table_d8();
1507 	void build_x87_opcode_table_d9();
1508 	void build_x87_opcode_table_da();
1509 	void build_x87_opcode_table_db();
1510 	void build_x87_opcode_table_dc();
1511 	void build_x87_opcode_table_dd();
1512 	void build_x87_opcode_table_de();
1513 	void build_x87_opcode_table_df();
1514 	void build_x87_opcode_table();
1515 	void i386_postload();
1516 	void i386_common_init();
1517 	void build_opcode_table(uint32_t features);
1518 	void zero_state();
1519 	void i386_set_a20_line(int state);
1520 
1521 };
1522 
1523 
1524 class i386sx_device : public i386_device
1525 {
1526 public:
1527 	// construction/destruction
1528 	i386sx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
1529 
1530 protected:
mem_pr8(offs_t address)1531 	virtual u8 mem_pr8(offs_t address) override { return macache16.read_byte(address); };
mem_pr16(offs_t address)1532 	virtual u16 mem_pr16(offs_t address) override { return macache16.read_word(address); };
mem_pr32(offs_t address)1533 	virtual u32 mem_pr32(offs_t address) override { return macache16.read_dword(address); };
1534 
1535 	virtual uint16_t READ16PL(uint32_t ea, uint8_t privilege) override;
1536 	virtual uint32_t READ32PL(uint32_t ea, uint8_t privilege) override;
1537 	virtual uint64_t READ64PL(uint32_t ea, uint8_t privilege) override;
1538 	virtual void WRITE16PL(uint32_t ea, uint8_t privilege, uint16_t value) override;
1539 	virtual void WRITE32PL(uint32_t ea, uint8_t privilege, uint32_t value) override;
1540 	virtual void WRITE64PL(uint32_t ea, uint8_t privilege, uint64_t value) override;
1541 	virtual uint16_t READPORT16(offs_t port) override;
1542 	virtual void WRITEPORT16(offs_t port, uint16_t value) override;
1543 	virtual uint32_t READPORT32(offs_t port) override;
1544 	virtual void WRITEPORT32(offs_t port, uint32_t value) override;
1545 };
1546 
1547 class i486_device : public i386_device
1548 {
1549 public:
1550 	// construction/destruction
1551 	i486_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
1552 
1553 protected:
1554 	i486_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
1555 
1556 	virtual void device_start() override;
1557 	virtual void device_reset() override;
1558 };
1559 
1560 class i486dx4_device : public i486_device
1561 {
1562 public:
1563 	// construction/destruction
1564 	i486dx4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
1565 
1566 protected:
1567 	virtual void device_reset() override;
1568 };
1569 
1570 
1571 class pentium_device : public i386_device
1572 {
1573 public:
1574 	// construction/destruction
1575 	pentium_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
1576 
1577 protected:
1578 	pentium_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
1579 
execute_input_edge_triggered(int inputnum)1580 	virtual bool execute_input_edge_triggered(int inputnum) const noexcept override { return inputnum == INPUT_LINE_NMI || inputnum == INPUT_LINE_SMI; }
1581 	virtual void execute_set_input(int inputnum, int state) override;
1582 	virtual uint64_t opcode_rdmsr(bool &valid_msr) override;
1583 	virtual void opcode_wrmsr(uint64_t data, bool &valid_msr) override;
1584 	virtual void device_start() override;
1585 	virtual void device_reset() override;
1586 };
1587 
1588 
1589 class pentium_mmx_device : public pentium_device
1590 {
1591 public:
1592 	// construction/destruction
1593 	pentium_mmx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
1594 
1595 protected:
1596 	virtual void device_start() override;
1597 	virtual void device_reset() override;
1598 };
1599 
1600 
1601 class mediagx_device : public i386_device
1602 {
1603 public:
1604 	// construction/destruction
1605 	mediagx_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
1606 
1607 protected:
1608 	virtual void device_start() override;
1609 	virtual void device_reset() override;
1610 };
1611 
1612 
1613 class pentium_pro_device : public pentium_device
1614 {
1615 public:
1616 	// construction/destruction
1617 	pentium_pro_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
1618 
1619 protected:
1620 	pentium_pro_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
1621 
1622 	virtual uint64_t opcode_rdmsr(bool &valid_msr) override;
1623 	virtual void opcode_wrmsr(uint64_t data, bool &valid_msr) override;
1624 	virtual void device_start() override;
1625 	virtual void device_reset() override;
1626 };
1627 
1628 
1629 class pentium2_device : public pentium_pro_device
1630 {
1631 public:
1632 	// construction/destruction
1633 	pentium2_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
1634 
1635 protected:
1636 	virtual void device_start() override;
1637 	virtual void device_reset() override;
1638 };
1639 
1640 
1641 class pentium3_device : public pentium_pro_device
1642 {
1643 public:
1644 	// construction/destruction
1645 	pentium3_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
1646 
1647 protected:
1648 	virtual void device_start() override;
1649 	virtual void device_reset() override;
1650 };
1651 
1652 
1653 class pentium4_device : public pentium_device
1654 {
1655 public:
1656 	// construction/destruction
1657 	pentium4_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
1658 
1659 protected:
1660 	virtual uint64_t opcode_rdmsr(bool &valid_msr) override;
1661 	virtual void opcode_wrmsr(uint64_t data, bool &valid_msr) override;
1662 	virtual void device_start() override;
1663 	virtual void device_reset() override;
1664 };
1665 
1666 
1667 DECLARE_DEVICE_TYPE(I386,        i386_device)
1668 DECLARE_DEVICE_TYPE(I386SX,      i386sx_device)
1669 DECLARE_DEVICE_TYPE(I486,        i486_device)
1670 DECLARE_DEVICE_TYPE(I486DX4,     i486dx4_device)
1671 DECLARE_DEVICE_TYPE(PENTIUM,     pentium_device)
1672 DECLARE_DEVICE_TYPE(PENTIUM_MMX, pentium_mmx_device)
1673 DECLARE_DEVICE_TYPE(MEDIAGX,     mediagx_device)
1674 DECLARE_DEVICE_TYPE(PENTIUM_PRO, pentium_pro_device)
1675 DECLARE_DEVICE_TYPE(PENTIUM2,    pentium2_device)
1676 DECLARE_DEVICE_TYPE(PENTIUM3,    pentium3_device)
1677 DECLARE_DEVICE_TYPE(PENTIUM4,    pentium4_device)
1678 
1679 #endif // MAME_CPU_I386_I386_H
1680